/ Hex Artifact Content
Login

Artifact 5a89e0341297fade9a8f2c7aecc1ebd2e7e0989da84ece4d287a153da73cf0e6:


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: 28 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3d 3d  (pConfig->pgsz==
83b0: 30 20 7c 7c 20 70 43 6f 6e 66 69 67 2d 3e 69 43  0 || pConfig->iC
83c0: 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69 65 29 20  ookie!=iCookie) 
83d0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
83e0: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
83f0: 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20  igLoad(pConfig, 
8400: 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 20 20 7d 0a  iCookie);.    }.
8410: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
8420: 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
8430: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
8440: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 74  E_OK ){.      ft
8450: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8460: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20  se(pRet);.      
8470: 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pRet = 0;.    }.
8480: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
8490: 65 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36  et;.}..static i6
84a0: 34 20 66 74 73 35 49 6e 64 65 78 44 61 74 61 56  4 fts5IndexDataV
84b0: 65 72 73 69 6f 6e 28 46 74 73 35 49 6e 64 65 78  ersion(Fts5Index
84c0: 20 2a 70 29 7b 0a 20 20 69 36 34 20 69 56 65 72   *p){.  i64 iVer
84d0: 73 69 6f 6e 20 3d 20 30 3b 0a 0a 20 20 69 66 28  sion = 0;..  if(
84e0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
84f0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
8500: 70 44 61 74 61 56 65 72 73 69 6f 6e 3d 3d 30 20  pDataVersion==0 
8510: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
8520: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
8530: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 44 61  eStmt(p, &p->pDa
8540: 74 61 56 65 72 73 69 6f 6e 2c 20 0a 20 20 20 20  taVersion, .    
8550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 70        sqlite3_mp
8560: 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20 25 51  rintf("PRAGMA %Q
8570: 2e 64 61 74 61 5f 76 65 72 73 69 6f 6e 22 2c 20  .data_version", 
8580: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 29  p->pConfig->zDb)
8590: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
85a0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
85b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
85c0: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
85d0: 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
85e0: 70 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f  p(p->pDataVersio
85f0: 6e 29 20 29 7b 0a 20 20 20 20 20 20 69 56 65 72  n) ){.      iVer
8600: 73 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  sion = sqlite3_c
8610: 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 2d 3e 70  olumn_int64(p->p
8620: 44 61 74 61 56 65 72 73 69 6f 6e 2c 20 30 29 3b  DataVersion, 0);
8630: 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63  .    }.    p->rc
8640: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
8650: 28 70 2d 3e 70 44 61 74 61 56 65 72 73 69 6f 6e  (p->pDataVersion
8660: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
8670: 20 69 56 65 72 73 69 6f 6e 3b 0a 7d 0a 0a 2f 2a   iVersion;.}../*
8680: 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69  .** Read, deseri
8690: 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e  alize and return
86a0: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72   the structure r
86b0: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ecord..**.** The
86c0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61   Fts5Structure.a
86d0: 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68  Level[] and each
86e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
86f0: 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79  vel.aSeg[] array
8700: 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c  .** are over-all
8710: 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69  ocated as descri
8720: 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  bed for function
8730: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
8740: 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65  code() .** above
8750: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
8760: 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
8770: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
8780: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c   an error code l
8790: 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74  eft in the.** Ft
87a0: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20  s5Index handle. 
87b0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
87c0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
87d0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
87e0: 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
87f0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
8800: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53  .*/.static Fts5S
8810: 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74  tructure *fts5St
8820: 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35  ructureRead(Fts5
8830: 49 6e 64 65 78 20 2a 70 29 7b 0a 0a 20 20 69 66  Index *p){..  if
8840: 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30 20  ( p->pStruct==0 
8850: 29 7b 0a 20 20 20 20 70 2d 3e 69 53 74 72 75 63  ){.    p->iStruc
8860: 74 56 65 72 73 69 6f 6e 20 3d 20 66 74 73 35 49  tVersion = fts5I
8870: 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e 28  ndexDataVersion(
8880: 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  p);.    if( p->r
8890: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
88a0: 20 20 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74        p->pStruct
88b0: 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
88c0: 52 65 61 64 55 6e 63 61 63 68 65 64 28 70 29 3b  ReadUncached(p);
88d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20  .    }.  }..#if 
88e0: 30 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 46 74  0.  else{.    Ft
88f0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 54 65  s5Structure *pTe
8900: 73 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  st = fts5Structu
8910: 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28 70  reReadUncached(p
8920: 29 3b 0a 20 20 20 20 69 66 28 20 70 54 65 73 74  );.    if( pTest
8930: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   ){.      int i,
8940: 20 6a 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   j;.      assert
8950: 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d  _nc( p->pStruct-
8960: 3e 6e 53 65 67 6d 65 6e 74 3d 3d 70 54 65 73 74  >nSegment==pTest
8970: 2d 3e 6e 53 65 67 6d 65 6e 74 20 29 3b 0a 20 20  ->nSegment );.  
8980: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8990: 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ->pStruct->nLeve
89a0: 6c 3d 3d 70 54 65 73 74 2d 3e 6e 4c 65 76 65 6c  l==pTest->nLevel
89b0: 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   );.      for(i=
89c0: 30 3b 20 69 3c 70 54 65 73 74 2d 3e 6e 4c 65 76  0; i<pTest->nLev
89d0: 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  el; i++){.      
89e0: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d 3e    assert_nc( p->
89f0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
8a00: 69 5d 2e 6e 4d 65 72 67 65 3d 3d 70 54 65 73 74  i].nMerge==pTest
8a10: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72  ->aLevel[i].nMer
8a20: 67 65 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ge );.        as
8a30: 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72  sert_nc( p->pStr
8a40: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  uct->aLevel[i].n
8a50: 53 65 67 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76  Seg==pTest->aLev
8a60: 65 6c 5b 69 5d 2e 6e 53 65 67 20 29 3b 0a 20 20  el[i].nSeg );.  
8a70: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
8a80: 3c 70 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69  <pTest->aLevel[i
8a90: 5d 2e 6e 53 65 67 3b 20 6a 2b 2b 29 7b 0a 20 20  ].nSeg; j++){.  
8aa0: 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
8ab0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 31  ctureSegment *p1
8ac0: 20 3d 20 26 70 54 65 73 74 2d 3e 61 4c 65 76 65   = &pTest->aLeve
8ad0: 6c 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20  l[i].aSeg[j];.  
8ae0: 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
8af0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 32  ctureSegment *p2
8b00: 20 3d 20 26 70 2d 3e 70 53 74 72 75 63 74 2d 3e   = &p->pStruct->
8b10: 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65 67 5b 6a  aLevel[i].aSeg[j
8b20: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ];.          ass
8b30: 65 72 74 5f 6e 63 28 20 70 31 2d 3e 69 53 65 67  ert_nc( p1->iSeg
8b40: 69 64 3d 3d 70 32 2d 3e 69 53 65 67 69 64 20 29  id==p2->iSegid )
8b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
8b60: 72 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 46  rt_nc( p1->pgnoF
8b70: 69 72 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 46 69  irst==p2->pgnoFi
8b80: 72 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 20  rst );.         
8b90: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 31 2d 3e   assert_nc( p1->
8ba0: 70 67 6e 6f 4c 61 73 74 3d 3d 70 32 2d 3e 70 67  pgnoLast==p2->pg
8bb0: 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 20 20  noLast );.      
8bc0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8bd0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
8be0: 65 6c 65 61 73 65 28 70 54 65 73 74 29 3b 0a 20  elease(pTest);. 
8bf0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
8c00: 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51  .  if( p->rc!=SQ
8c10: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8c20: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   0;.  assert( p-
8c30: 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f 6e 21  >iStructVersion!
8c40: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
8c50: 70 2d 3e 70 53 74 72 75 63 74 21 3d 30 20 29 3b  p->pStruct!=0 );
8c60: 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
8c70: 52 65 66 28 70 2d 3e 70 53 74 72 75 63 74 29 3b  Ref(p->pStruct);
8c80: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 53 74  .  return p->pSt
8c90: 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ruct;.}..static 
8ca0: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
8cb0: 72 65 49 6e 76 61 6c 69 64 61 74 65 28 46 74 73  reInvalidate(Fts
8cc0: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 66  5Index *p){.  if
8cd0: 28 20 70 2d 3e 70 53 74 72 75 63 74 20 29 7b 0a  ( p->pStruct ){.
8ce0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
8cf0: 65 52 65 6c 65 61 73 65 28 70 2d 3e 70 53 74 72  eRelease(p->pStr
8d00: 75 63 74 29 3b 0a 20 20 20 20 70 2d 3e 70 53 74  uct);.    p->pSt
8d10: 72 75 63 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  ruct = 0;.  }.}.
8d20: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
8d30: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
8d40: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
8d50: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53  dex structure pS
8d60: 74 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  truct. This.** f
8d70: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
8d80: 65 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72  ever used as par
8d90: 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f  t of assert() co
8da0: 6e 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66  nditions..*/.#if
8db0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
8dc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
8dd0: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8de0: 67 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63  gments(Fts5Struc
8df0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
8e00: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
8e10: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8e20: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
8e30: 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f  r of segments */
8e40: 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
8e50: 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
8e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e70: 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
8e80: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
8e90: 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72  evels */.    for
8ea0: 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
8eb0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
8ec0: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53  Lvl++){.      nS
8ed0: 65 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63  egment += pStruc
8ee0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
8ef0: 6e 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nSeg;.    }.  }.
8f00: 0a 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65  .  return nSegme
8f10: 6e 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  nt;.}.#endif..#d
8f20: 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72  efine fts5Buffer
8f30: 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
8f40: 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  Buf, pBlob, nBlo
8f50: 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73 73  b) {     \.  ass
8f60: 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70  ert( (pBuf)->nSp
8f70: 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b  ace>=((pBuf)->n+
8f80: 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20  nBlob) );       
8f90: 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79        \.  memcpy
8fa0: 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75  (&(pBuf)->p[(pBu
8fb0: 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e  f)->n], pBlob, n
8fc0: 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20  Blob);          
8fd0: 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e     \.  (pBuf)->n
8fe0: 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20   += nBlob;      
8ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9010: 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  \.}..#define fts
9020: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
9030: 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 56  dVarint(pBuf, iV
9040: 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  al) {           
9050: 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d       \.  (pBuf)-
9060: 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
9070: 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42 75  5PutVarint(&(pBu
9080: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
9090: 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20  , (iVal));  \.  
90a0: 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e  assert( (pBuf)->
90b0: 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e  nSpace>=(pBuf)->
90c0: 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  n );            
90d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
90e0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c  }.../*.** Serial
90f0: 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ize and store th
9100: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
9110: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
9120: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
9130: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
9140: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
9150: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
9160: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
9170: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
9180: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
9190: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
91a0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
91b0: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
91c0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
91d0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
91e0: 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ct){.  if( p->rc
91f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
9200: 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75     Fts5Buffer bu
9210: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9220: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65   /* Buffer to se
9230: 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69  rialize record i
9240: 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nto */.    int i
9250: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
9260: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
9270: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
9280: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
9290: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
92a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
92b0: 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20  /* Cookie value 
92c0: 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20  to store */..   
92d0: 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
92e0: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
92f0: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
9300: 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
9310: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  );.    memset(&b
9320: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
9330: 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
9340: 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63   /* Append the c
9350: 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61  urrent configura
9360: 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20  tion cookie */. 
9370: 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e     iCookie = p->
9380: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
9390: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69  ;.    if( iCooki
93a0: 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20  e<0 ) iCookie = 
93b0: 30 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  0;..    if( 0==s
93c0: 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
93d0: 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75  Size(&p->rc, &bu
93e0: 66 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20  f, 4+9+9+9) ){. 
93f0: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
9400: 50 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43 6f  Put32(buf.p, iCo
9410: 6f 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75 66  okie);.      buf
9420: 2e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66 74  .n = 4;.      ft
9430: 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
9440: 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70  ndVarint(&buf, p
9450: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b  Struct->nLevel);
9460: 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
9470: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
9480: 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d  t(&buf, pStruct-
9490: 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  >nSegment);.    
94a0: 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
94b0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75  AppendVarint(&bu
94c0: 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d  f, (i64)pStruct-
94d0: 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b  >nWriteCounter);
94e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
94f0: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
9500: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
9510: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  vl++){.      int
9520: 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
9530: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
9540: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
9550: 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
9560: 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  /.      Fts5Stru
9570: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
9580: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9590: 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20  vel[iLvl];.     
95a0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
95b0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
95c0: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  &buf, pLvl->nMer
95d0: 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  ge);.      fts5B
95e0: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
95f0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
9600: 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20  pLvl->nSeg);.   
9610: 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d     assert( pLvl-
9620: 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e  >nMerge<=pLvl->n
9630: 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f  Seg );..      fo
9640: 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
9650: 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl->nSeg; iSeg+
9660: 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  +){.        fts5
9670: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
9680: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
9690: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
96a0: 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20  ].iSegid);.     
96b0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
96c0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
96d0: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
96e0: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
96f0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  st);.        fts
9700: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
9710: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
9720: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
9730: 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  g].pgnoLast);.  
9740: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
9750: 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
9760: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
9770: 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62  _ROWID, buf.p, b
9780: 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42  uf.n);.    fts5B
9790: 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
97a0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74  .  }.}..#if 0.st
97b0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
97c0: 62 75 67 53 74 72 75 63 74 75 72 65 28 69 6e 74  bugStructure(int
97d0: 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74  *,Fts5Buffer*,Ft
97e0: 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73  s5Structure*);.s
97f0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
9800: 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f  rintStructure(co
9810: 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69  nst char *zCapti
9820: 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  on, Fts5Structur
9830: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
9840: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
9850: 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  K;.  Fts5Buffer 
9860: 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
9870: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75  uf, 0, sizeof(bu
9880: 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67  f));.  fts5Debug
9890: 53 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26  Structure(&rc, &
98a0: 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  buf, pStruct);. 
98b0: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c   fprintf(stdout,
98c0: 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61   "%s: %s\n", zCa
98d0: 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20  ption, buf.p);. 
98e0: 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
98f0: 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
9900: 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65  e(&buf);.}.#else
9910: 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72  .# define fts5Pr
9920: 69 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79  intStructure(x,y
9930: 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  ).#endif..static
9940: 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74   int fts5Segment
9950: 53 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75  Size(Fts5Structu
9960: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29  reSegment *pSeg)
9970: 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70  {.  return 1 + p
9980: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9990: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
99a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
99b0: 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78   a copy of index
99c0: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
99d0: 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d  ct. Except, prom
99e0: 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20  ote as many .** 
99f0: 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73  segments as poss
9a00: 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50  ible to level iP
9a10: 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f  romote. If an OO
9a20: 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  M occurs, NULL i
9a30: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a  s .** returned..
9a40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
9a50: 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d  ts5StructureProm
9a60: 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64  oteTo(.  Fts5Ind
9a70: 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72  ex *p,.  int iPr
9a80: 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50  omote,.  int szP
9a90: 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74  romote,.  Fts5St
9aa0: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9ab0: 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73  .){.  int il, is
9ac0: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
9ad0: 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26  eLevel *pOut = &
9ae0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9af0: 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66  iPromote];..  if
9b00: 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d  ( pOut->nMerge==
9b10: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d  0 ){.    for(il=
9b20: 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70  iPromote+1; il<p
9b30: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
9b40: 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73  il++){.      Fts
9b50: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
9b60: 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74  *pLvl = &pStruct
9b70: 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20  ->aLevel[il];.  
9b80: 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d      if( pLvl->nM
9b90: 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  erge ) return;. 
9ba0: 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c       for(is=pLvl
9bb0: 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b  ->nSeg-1; is>=0;
9bc0: 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20   is--){.        
9bd0: 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67  int sz = fts5Seg
9be0: 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e  mentSize(&pLvl->
9bf0: 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20  aSeg[is]);.     
9c00: 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d     if( sz>szProm
9c10: 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ote ) return;.  
9c20: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
9c30: 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26  ureExtendLevel(&
9c40: 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20  p->rc, pStruct, 
9c50: 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b  iPromote, 1, 1);
9c60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
9c70: 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rc ) return;.   
9c80: 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74       memcpy(pOut
9c90: 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
9ca0: 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28  Seg[is], sizeof(
9cb0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9cc0: 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20  ment));.        
9cd0: 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20  pOut->nSeg++;.  
9ce0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67        pLvl->nSeg
9cf0: 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
9d00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
9d10: 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73   new segment has
9d20: 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74 74   just been writt
9d30: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c  en to level iLvl
9d40: 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74   of index struct
9d50: 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20  ure.** pStruct. 
9d60: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
9d70: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20  termines if any 
9d80: 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  segments should 
9d90: 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61  be promoted.** a
9da0: 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d  s a result. Segm
9db0: 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65  ents are promote
9dc0: 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69  d in two scenari
9dd0: 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49  os:.**.**   a) I
9de0: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75  f the segment ju
9df0: 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d  st written is sm
9e00: 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f  aller than one o
9e10: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a  r more segments.
9e20: 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20 74  **      within t
9e30: 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75  he previous popu
9e40: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20  lated level, it 
9e50: 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74  is promoted to t
9e60: 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20  he previous.**  
9e70: 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65      populated le
9e80: 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  vel..**.**   b) 
9e90: 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a  If the segment j
9ea0: 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c  ust written is l
9eb0: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e  arger than the n
9ec0: 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e  ewest segment on
9ed0: 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78  .**      the nex
9ee0: 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  t populated leve
9ef0: 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65 67  l, then that seg
9f00: 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74  ment, and any ot
9f10: 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20  her adjacent.** 
9f20: 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68       segments th
9f30: 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c  at are also smal
9f40: 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65  ler than the one
9f50: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61   just written, a
9f60: 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d  re .**      prom
9f70: 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  oted. .**.** If 
9f80: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
9f90: 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65  ents are promote
9fa0: 64 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65  d, the structure
9fb0: 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61 74   object is updat
9fc0: 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74  ed.** to reflect
9fd0: 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   this..*/.static
9fe0: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
9ff0: 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74  urePromote(.  Ft
a000: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a020: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
a030: 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ject */.  int iL
a040: 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
a050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
a060: 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70  ex level just up
a070: 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53  dated */.  Fts5S
a080: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
a090: 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t          /* In
a0a0: 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
a0b0: 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
a0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
a0d0: 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20    int iTst;.    
a0e0: 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d  int iPromote = -
a0f0: 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f  1;.    int szPro
a100: 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20  mote = 0;       
a110: 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20       /* Promote 
a120: 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73 69  anything this si
a130: 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f  ze or smaller */
a140: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
a150: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
a160: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75     /* Segment ju
a170: 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  st written */.  
a180: 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20    int szSeg;    
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65  /* Size of segme
a1b0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
a1c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20  */.    int nSeg 
a1d0: 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
a1e0: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20  l[iLvl].nSeg;.. 
a1f0: 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 29     if( nSeg==0 )
a200: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 65   return;.    pSe
a210: 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
a220: 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
a230: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a240: 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20  iLvl].nSeg-1];. 
a250: 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20     szSeg = (1 + 
a260: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d  pSeg->pgnoLast -
a270: 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
a280: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
a290: 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28   for condition (
a2a0: 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54  a) */.    for(iT
a2b0: 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e  st=iLvl-1; iTst>
a2c0: 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  =0 && pStruct->a
a2d0: 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67  Level[iTst].nSeg
a2e0: 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20  ==0; iTst--);.  
a2f0: 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b    if( iTst>=0 ){
a300: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
a310: 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20      int szMax = 
a320: 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  0;.      Fts5Str
a330: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73  uctureLevel *pTs
a340: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
a350: 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20  evel[iTst];.    
a360: 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e    assert( pTst->
a370: 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20  nMerge==0 );.   
a380: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54     for(i=0; i<pT
a390: 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  st->nSeg; i++){.
a3a0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d          int sz =
a3b0: 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70   pTst->aSeg[i].p
a3c0: 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e  gnoLast - pTst->
a3d0: 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73  aSeg[i].pgnoFirs
a3e0: 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69  t + 1;.        i
a3f0: 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a  f( sz>szMax ) sz
a400: 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  Max = sz;.      
a410: 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61  }.      if( szMa
a420: 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20  x>=szSeg ){.    
a430: 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e      /* Condition
a440: 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72   (a) is true. Pr
a450: 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74  omote the newest
a460: 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65   segment on leve
a470: 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c  l .        ** iL
a480: 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74  vl to level iTst
a490: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50  .  */.        iP
a4a0: 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20  romote = iTst;. 
a4b0: 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65         szPromote
a4c0: 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20   = szMax;.      
a4d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a4e0: 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29  If condition (a)
a4f0: 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73   is not met, ass
a500: 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e  ume (b) is true.
a510: 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74   StructurePromot
a520: 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20  eTo().    ** is 
a530: 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73  a no-op if it is
a540: 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66   not.  */.    if
a550: 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a  ( iPromote<0 ){.
a560: 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d        iPromote =
a570: 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50   iLvl;.      szP
a580: 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a  romote = szSeg;.
a590: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
a5a0: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
a5b0: 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a  (p, iPromote, sz
a5c0: 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74  Promote, pStruct
a5d0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
a5e0: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
a5f0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
a600: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
a610: 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66  t. If the end of
a620: 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74   the .** doclist
a630: 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 72  -index page is r
a640: 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e  eached, return n
a650: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
a660: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a670: 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64  LvlNext(Fts5Dlid
a680: 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46  xLvl *pLvl){.  F
a690: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
a6a0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20   pLvl->pData;.. 
a6b0: 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d   if( pLvl->iOff=
a6c0: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
a6d0: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
a6e0: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
a6f0: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d  f = 1;.    pLvl-
a700: 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  >iOff += fts5Get
a710: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d  Varint32(&pData-
a720: 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65  >p[1], pLvl->iLe
a730: 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76  afPgno);.    pLv
a740: 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  l->iOff += fts5G
a750: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
a760: 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20  >p[pLvl->iOff], 
a770: 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f  (u64*)&pLvl->iRo
a780: 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  wid);.    pLvl->
a790: 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c  iFirstOff = pLvl
a7a0: 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ->iOff;.  }else{
a7b0: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
a7c0: 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c     for(iOff=pLvl
a7d0: 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61  ->iOff; iOff<pDa
a7e0: 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b  ta->nn; iOff++){
a7f0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
a800: 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61  ->p[iOff] ) brea
a810: 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  k; .    }..    i
a820: 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  f( iOff<pData->n
a830: 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
a840: 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d  Val;.      pLvl-
a850: 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69  >iLeafPgno += (i
a860: 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off - pLvl->iOff
a870: 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66  ) + 1;.      iOf
a880: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a890: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66  nt(&pData->p[iOf
a8a0: 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  f], (u64*)&iVal)
a8b0: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52  ;.      pLvl->iR
a8c0: 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20  owid += iVal;.  
a8d0: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
a8e0: 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65   iOff;.    }else
a8f0: 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45  {.      pLvl->bE
a900: 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
a910: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c  }..  return pLvl
a920: 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->bEof;.}../*.**
a930: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
a940: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
a950: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
a960: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
a970: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
a980: 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70  xtR(Fts5Index *p
a990: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
a9a0: 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c  *pIter, int iLvl
a9b0: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76  ){.  Fts5DlidxLv
a9c0: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
a9d0: 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20  ->aLvl[iLvl];.. 
a9e0: 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49   assert( iLvl<pI
a9f0: 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69  ter->nLvl );.  i
aa00: 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  f( fts5DlidxLvlN
aa10: 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20  ext(pLvl) ){.   
aa20: 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20   if( (iLvl+1) < 
aa30: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20  pIter->nLvl ){. 
aa40: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
aa50: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
aa60: 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20  , iLvl+1);.     
aa70: 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f   if( pLvl[1].bEo
aa80: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
aa90: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
aaa0: 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20  pLvl->pData);.  
aab0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76        memset(pLv
aac0: 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  l, 0, sizeof(Fts
aad0: 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20  5DlidxLvl));.   
aae0: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
aaf0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
ab00: 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  p, .            
ab10: 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
ab20: 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  (pIter->iSegid, 
ab30: 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c  iLvl, pLvl[1].iL
ab40: 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20  eafPgno).       
ab50: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
ab60: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74  pLvl->pData ) ft
ab70: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
ab80: 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lvl);.      }.  
ab90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
aba0: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
abb0: 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20  .bEof;.}.static 
abc0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
abd0: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20  rNext(Fts5Index 
abe0: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
abf0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
ac00: 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65  urn fts5DlidxIte
ac10: 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c  rNextR(p, pIter,
ac20: 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
ac30: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
ac40: 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
ac50: 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20  rgument has the 
ac60: 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
ac70: 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f   set.** as follo
ac80: 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ws. This functio
ac90: 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65  n sets up the re
aca0: 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  st of the iterat
acb0: 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  or so that it.**
acc0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
acd0: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
ace0: 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e  e doclist-index.
acf0: 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a  .**.**   pData:.
ad00: 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74  **     pointer t
ad10: 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  o doclist-index 
ad20: 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57  record, .**.** W
ad30: 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
ad40: 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65  n is called pIte
ad50: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20  r->iLeafPgno is 
ad60: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
ad70: 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69  the.** doclist i
ad80: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
ad90: 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75  h (the one featu
ada0: 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a  ring the term)..
adb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
adc0: 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74  s5DlidxIterFirst
add0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
ade0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
adf0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49  .  for(i=0; i<pI
ae00: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
ae10: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76  .    fts5DlidxLv
ae20: 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c  lNext(&pIter->aL
ae30: 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  vl[i]);.  }.  re
ae40: 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c  turn pIter->aLvl
ae50: 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74  [0].bEof;.}...st
ae60: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
ae70: 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  dxIterEof(Fts5In
ae80: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
ae90: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
aea0: 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53   return p->rc!=S
aeb0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65  QLITE_OK || pIte
aec0: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
aed0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
aee0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73  fts5DlidxIterLas
aef0: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
af00: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
af10: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
af20: 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61  .  /* Advance ea
af30: 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20  ch level to the 
af40: 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68  last entry on th
af50: 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20  e last page */. 
af60: 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c   for(i=pIter->nL
af70: 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  vl-1; p->rc==SQL
af80: 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20  ITE_OK && i>=0; 
af90: 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  i--){.    Fts5Dl
afa0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26  idxLvl *pLvl = &
afb0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a  pIter->aLvl[i];.
afc0: 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44      while( fts5D
afd0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
afe0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c  )==0 );.    pLvl
aff0: 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20  ->bEof = 0;..   
b000: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
b010: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
b020: 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d  pChild = &pLvl[-
b030: 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  1];.      fts5Da
b040: 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64  taRelease(pChild
b050: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
b060: 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30  memset(pChild, 0
b070: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
b080: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70  dxLvl));.      p
b090: 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66  Child->pData = f
b0a0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
b0b0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
b0c0: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
b0d0: 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70  ->iSegid, i-1, p
b0e0: 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a  Lvl->iLeafPgno).
b0f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
b100: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65   }.}../*.** Move
b110: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
b120: 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
b130: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   argument to the
b140: 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e   previous entry.
b150: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
b160: 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28  ts5DlidxLvlPrev(
b170: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
b180: 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20  vl){.  int iOff 
b190: 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20  = pLvl->iOff;.. 
b1a0: 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62   assert( pLvl->b
b1b0: 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Eof==0 );.  if( 
b1c0: 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72  iOff<=pLvl->iFir
b1d0: 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76  stOff ){.    pLv
b1e0: 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d  l->bEof = 1;.  }
b1f0: 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20  else{.    u8 *a 
b200: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70  = pLvl->pData->p
b210: 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a  ;.    i64 iVal;.
b220: 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a      int iLimit;.
b230: 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
b240: 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a  int nZero = 0;..
b250: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79      /* Currently
b260: 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20   iOff points to 
b270: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
b280: 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73  f a varint. This
b290: 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64   block .    ** d
b2a0: 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75  ecrements iOff u
b2b0: 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
b2c0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
b2d0: 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   of the previous
b2e0: 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e   .    ** varint.
b2f0: 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74   Taking care not
b300: 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d   to read any mem
b310: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68  ory locations th
b320: 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20  at occur.    ** 
b330: 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65  before the buffe
b340: 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f  r in memory.  */
b350: 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69  .    iLimit = (i
b360: 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a  Off>9 ? iOff-9 :
b370: 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66   0);.    for(iOf
b380: 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74  f--; iOff>iLimit
b390: 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20  ; iOff--){.     
b3a0: 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20   if( (a[iOff-1] 
b3b0: 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65  & 0x80)==0 ) bre
b3c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  ak;.    }..    f
b3d0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
b3e0: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56  iOff], (u64*)&iV
b3f0: 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  al);.    pLvl->i
b400: 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20  Rowid -= iVal;. 
b410: 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67     pLvl->iLeafPg
b420: 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b  no--;..    /* Sk
b430: 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73  ip backwards pas
b440: 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e  t any 0x00 varin
b450: 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ts. */.    for(i
b460: 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c  i=iOff-1; ii>=pL
b470: 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26  vl->iFirstOff &&
b480: 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69   a[ii]==0x00; ii
b490: 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f  --){.      nZero
b4a0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
b4b0: 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72  ( ii>=pLvl->iFir
b4c0: 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20  stOff && (a[ii] 
b4d0: 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20  & 0x80) ){.     
b4e0: 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d   /* The byte imm
b4f0: 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20  ediately before 
b500: 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62 79  the last 0x00 by
b510: 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30 20  te has the 0x80 
b520: 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  bit.      ** set
b530: 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78  . So the last 0x
b540: 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72  00 is only a var
b550: 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20 61  int 0 if there a
b560: 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20  re 8 more 0x80. 
b570: 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65       ** bytes be
b580: 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20  fore a[ii]. */. 
b590: 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d       int bZero =
b5a0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b5b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74   /* True if last
b5c0: 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a   0x00 counts */.
b5d0: 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38 29        if( (ii-8)
b5e0: 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66  >=pLvl->iFirstOf
b5f0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  f ){.        int
b600: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
b610: 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b  j=1; j<=8 && (a[
b620: 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a  ii-j] & 0x80); j
b630: 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65  ++);.        bZe
b640: 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20  ro = (j>8);.    
b650: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a    }.      if( bZ
b660: 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d  ero==0 ) nZero--
b670: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c  ;.    }.    pLvl
b680: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e  ->iLeafPgno -= n
b690: 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Zero;.    pLvl->
b6a0: 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a  iOff = iOff - nZ
b6b0: 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ero;.  }..  retu
b6c0: 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d  rn pLvl->bEof;.}
b6d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
b6e0: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28  5DlidxIterPrevR(
b6f0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
b700: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b710: 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20  er, int iLvl){. 
b720: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
b730: 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c  Lvl = &pIter->aL
b740: 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73  vl[iLvl];..  ass
b750: 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d  ert( iLvl<pIter-
b760: 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66  >nLvl );.  if( f
b770: 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28  ts5DlidxLvlPrev(
b780: 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pLvl) ){.    if(
b790: 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65   (iLvl+1) < pIte
b7a0: 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20  r->nLvl ){.     
b7b0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
b7c0: 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c  evR(p, pIter, iL
b7d0: 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28  vl+1);.      if(
b7e0: 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30   pLvl[1].bEof==0
b7f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
b800: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c  DataRelease(pLvl
b810: 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
b820: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
b830: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
b840: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20  dxLvl));.       
b850: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
b860: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
b870: 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35              FTS5
b880: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
b890: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c  er->iSegid, iLvl
b8a0: 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50  , pLvl[1].iLeafP
b8b0: 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  gno).        );.
b8c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
b8d0: 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ->pData ){.     
b8e0: 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35       while( fts5
b8f0: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
b900: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  l)==0 );.       
b910: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
b920: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
b930: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
b940: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
b950: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
b960: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
b970: 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73  lidxIterPrev(Fts
b980: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
b990: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
b9a0: 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44  {.  return fts5D
b9b0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
b9c0: 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f   pIter, 0);.}../
b9d0: 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c  *.** Free a docl
b9e0: 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74  ist-index iterat
b9f0: 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61  or object alloca
ba00: 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78  ted by fts5Dlidx
ba10: 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73  IterInit()..*/.s
ba20: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
ba30: 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73  lidxIterFree(Fts
ba40: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
ba50: 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
ba60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
ba70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
ba80: 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
ba90: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
baa0: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76  lease(pIter->aLv
bab0: 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20  l[i].pData);.   
bac0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
bad0: 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a  ree(pIter);.  }.
bae0: 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c  }..static Fts5Dl
baf0: 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69  idxIter *fts5Dli
bb00: 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74  dxIterInit(.  Ft
bb10: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bb30: 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f   Fts5 Backend to
bb40: 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
bb50: 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20  */.  int bRev,  
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
bb80: 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f   ORDER BY ASC */
bb90: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20  .  int iSegid,  
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
bbc0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
bbd0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
bbe0: 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61        /* Leaf pa
bbf0: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61  ge number to loa
bc00: 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29  d dlidx for */.)
bc10: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
bc20: 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20  r *pIter = 0;.  
bc30: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f  int i;.  int bDo
bc40: 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69  ne = 0;..  for(i
bc50: 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  =0; p->rc==SQLIT
bc60: 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30  E_OK && bDone==0
bc70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
bc80: 74 65 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 20  te3_int64 nByte 
bc90: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  = sizeof(Fts5Dli
bca0: 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73 69  dxIter) + i * si
bcb0: 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76  zeof(Fts5DlidxLv
bcc0: 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  l);.    Fts5Dlid
bcd0: 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20  xIter *pNew;..  
bce0: 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44 6c    pNew = (Fts5Dl
bcf0: 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65 33  idxIter*)sqlite3
bd00: 5f 72 65 61 6c 6c 6f 63 36 34 28 70 49 74 65 72  _realloc64(pIter
bd10: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
bd20: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
bd30: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
bd40: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
bd50: 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52  se{.      i64 iR
bd60: 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49 44  owid = FTS5_DLID
bd70: 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  X_ROWID(iSegid, 
bd80: 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20 20  i, iLeafPg);.   
bd90: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
bda0: 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61  *pLvl = &pNew->a
bdb0: 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49  Lvl[i];.      pI
bdc0: 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ter = pNew;.    
bdd0: 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30    memset(pLvl, 0
bde0: 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
bdf0: 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70  dxLvl));.      p
be00: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
be10: 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f  5DataRead(p, iRo
be20: 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
be30: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20 28  pLvl->pData && (
be40: 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30  pLvl->pData->p[0
be50: 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20 29  ] & 0x0001)==0 )
be60: 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20  {.        bDone 
be70: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
be80: 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d     pIter->nLvl =
be90: 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   i+1;.    }.  }.
bea0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
beb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
bec0: 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69  Iter->iSegid = i
bed0: 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20 62  Segid;.    if( b
bee0: 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Rev==0 ){.      
bef0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
bf00: 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  st(pIter);.    }
bf10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
bf20: 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 2c  DlidxIterLast(p,
bf30: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
bf40: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21   }..  if( p->rc!
bf50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bf60: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
bf70: 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ree(pIter);.    
bf80: 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pIter = 0;.  }..
bf90: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a    return pIter;.
bfa0: 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  }..static i64 ft
bfb0: 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
bfc0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
bfd0: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
bfe0: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
bff0: 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63  iRowid;.}.static
c000: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
c010: 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64 78  erPgno(Fts5Dlidx
c020: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
c030: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
c040: 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b  vl[0].iLeafPgno;
c050: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74  .}../*.** Load t
c060: 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67  he next leaf pag
c070: 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65  e into the segme
c080: 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a  nt iterator..*/.
c090: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
c0a0: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c0b0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0d0: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
c0e0: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
c0f0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
c100: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
c110: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
c120: 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61  vance to next pa
c130: 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  ge */.){.  Fts5D
c140: 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74  ata *pLeaf;.  Ft
c150: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
c160: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
c170: 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61  ->pSeg;.  fts5Da
c180: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
c190: 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72  >pLeaf);.  pIter
c1a0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20  ->iLeafPgno++;. 
c1b0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65 78   if( pIter->pNex
c1c0: 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74  tLeaf ){.    pIt
c1d0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74 65  er->pLeaf = pIte
c1e0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20  r->pNextLeaf;.  
c1f0: 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65    pIter->pNextLe
c200: 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20  af = 0;.  }else 
c210: 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  if( pIter->iLeaf
c220: 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f  Pgno<=pSeg->pgno
c230: 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65  Last ){.    pIte
c240: 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 4c  r->pLeaf = fts5L
c250: 65 61 66 52 65 61 64 28 70 2c 20 0a 20 20 20 20  eafRead(p, .    
c260: 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54      FTS5_SEGMENT
c270: 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
c280: 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  gid, pIter->iLea
c290: 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20  fPgno).    );.  
c2a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72  }else{.    pIter
c2b0: 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d  ->pLeaf = 0;.  }
c2c0: 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72  .  pLeaf = pIter
c2d0: 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20  ->pLeaf;..  if( 
c2e0: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74  pLeaf ){.    pIt
c2f0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
c300: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
c310: 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
c320: 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29  sTermless(pLeaf)
c330: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
c340: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
c350: 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20   pLeaf->nn+1;.  
c360: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
c370: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
c380: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
c390: 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74  32(&pLeaf->p[pIt
c3a0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a  er->iPgidxOff],.
c3b0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
c3c0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20  >iEndofDoclist. 
c3d0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
c3e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  }.}../*.** Argum
c3f0: 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20  ent p points to 
c400: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
c410: 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20  ing a varint to 
c420: 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  be interpreted a
c430: 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20  s a.** position 
c440: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
c450: 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e 74   Read the varint
c460: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
c470: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
c480: 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20  ** read. Before 
c490: 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a  returning, set *
c4a0: 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62  pnSz to the numb
c4b0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
c4c0: 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c  he position.** l
c4d0: 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20  ist, and *pbDel 
c4e0: 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 64  to true if the d
c4f0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
c500: 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  t, or false othe
c510: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
c520: 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c   int fts5GetPosl
c530: 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38  istSize(const u8
c540: 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20   *p, int *pnSz, 
c550: 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69  int *pbDel){.  i
c560: 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20  nt nSz;.  int n 
c570: 3d 20 30 3b 0a 20 20 66 74 73 35 46 61 73 74 47  = 0;.  fts5FastG
c580: 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e 2c  etVarint32(p, n,
c590: 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74 5f   nSz);.  assert_
c5a0: 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20 20  nc( nSz>=0 );.  
c5b0: 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a 20  *pnSz = nSz/2;. 
c5c0: 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26 20   *pbDel = nSz & 
c5d0: 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72 6e  0x0001;.  return
c5e0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73   n;.}../*.** Fts
c5f0: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
c600: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
c610: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
c620: 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a 20  st byte of a.** 
c630: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
c640: 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20 74  ze field. Read t
c650: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
c660: 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65 20  field and store 
c670: 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f 6c  it.** in the fol
c680: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73  lowing variables
c690: 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65  :.**.**   Fts5Se
c6a0: 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20 20  gIter.nPos.**   
c6b0: 46 74 73 35 53 65 67 49 74 65 72 2e 62 44 65 6c  Fts5SegIter.bDel
c6c0: 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74 73  .**.** Leave Fts
c6d0: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
c6e0: 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  fset pointing to
c6f0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c700: 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69 74  of the .** posit
c710: 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74  ion list content
c720: 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73 74   (if any)..*/.st
c730: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
c740: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46 74  gIterLoadNPos(Ft
c750: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
c760: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
c770: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
c780: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
c790: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
c7a0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
c7b0: 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64  * Offset to read
c7c0: 20 61 74 20 2a 2f 0a 20 20 20 20 41 53 53 45 52   at */.    ASSER
c7d0: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
c7e0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 69  r->pLeaf);.    i
c7f0: 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  f( p->pConfig->e
c800: 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
c810: 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
c820: 20 20 69 6e 74 20 69 45 6f 64 20 3d 20 4d 49 4e    int iEod = MIN
c830: 28 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  (pIter->iEndofDo
c840: 63 6c 69 73 74 2c 20 70 49 74 65 72 2d 3e 70 4c  clist, pIter->pL
c850: 65 61 66 2d 3e 73 7a 4c 65 61 66 29 3b 0a 20 20  eaf->szLeaf);.  
c860: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
c870: 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72  = 0;.      pIter
c880: 2d 3e 6e 50 6f 73 20 3d 20 31 3b 0a 20 20 20 20  ->nPos = 1;.    
c890: 20 20 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20    if( iOff<iEod 
c8a0: 26 26 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  && pIter->pLeaf-
c8b0: 3e 70 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  >p[iOff]==0 ){. 
c8c0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44         pIter->bD
c8d0: 65 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  el = 1;.        
c8e0: 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
c8f0: 69 66 28 20 69 4f 66 66 3c 69 45 6f 64 20 26 26  if( iOff<iEod &&
c900: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
c910: 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOff]==0 ){.   
c920: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50         pIter->nP
c930: 6f 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  os = 1;.        
c940: 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
c950: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
c960: 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d     pIter->nPos =
c970: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
c980: 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
c990: 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a  .      int nSz;.
c9a0: 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65        fts5FastGe
c9b0: 74 56 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d  tVarint32(pIter-
c9c0: 3e 70 4c 65 61 66 2d 3e 70 2c 20 69 4f 66 66 2c  >pLeaf->p, iOff,
c9d0: 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20 70 49 74   nSz);.      pIt
c9e0: 65 72 2d 3e 62 44 65 6c 20 3d 20 28 6e 53 7a 20  er->bDel = (nSz 
c9f0: 26 20 30 78 30 30 30 31 29 3b 0a 20 20 20 20 20  & 0x0001);.     
ca00: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e   pIter->nPos = n
ca10: 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 61 73 73  Sz>>1;.      ass
ca20: 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 6e  ert_nc( pIter->n
ca30: 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Pos>=0 );.    }.
ca40: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ca50: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
ca60: 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
ca70: 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  d fts5SegIterLoa
ca80: 64 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  dRowid(Fts5Index
ca90: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
caa0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a   *pIter){.  u8 *
cab0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
cac0: 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42  ->p;        /* B
cad0: 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61  uffer to read da
cae0: 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ta from */.  int
caf0: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
cb00: 4c 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41  LeafOffset;..  A
cb10: 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
cb20: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
cb30: 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72   if( iOff>=pIter
cb40: 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
cb50: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
cb60: 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
cb70: 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ter);.    if( pI
cb80: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b  ter->pLeaf==0 ){
cb90: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
cba0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d  ==SQLITE_OK ) p-
cbb0: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
cbc0: 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
cbd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66  ;.    }.    iOff
cbe0: 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49   = 4;.    a = pI
cbf0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
cc00: 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c   }.  iOff += sql
cc10: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
cc20: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
cc30: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
cc40: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
cc50: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
cc60: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67  }../*.** Fts5Seg
cc70: 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74  Iter.iLeafOffset
cc80: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
cc90: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62  s to the first b
cca0: 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22  yte of the .** "
ccb0: 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f  nSuffix" field o
ccc0: 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69  f a term. Functi
ccd0: 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65  on parameter nKe
cce0: 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  ep contains the 
ccf0: 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20  value.** of the 
cd00: 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64 20  "nPrefix" field 
cd10: 28 69 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e  (if there was on
cd20: 65 20 2d 20 69 74 20 69 73 20 70 61 73 73 65 64  e - it is passed
cd30: 20 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a   0 if this is.**
cd40: 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
cd50: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e  in the segment).
cd60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
cd70: 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a  tion populates:.
cd80: 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  **.**   Fts5SegI
cd90: 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74  ter.term.**   Ft
cda0: 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a  s5SegIter.rowid.
cdb0: 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c  **.** accordingl
cdc0: 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74  y and leaves (Ft
cdd0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
cde0: 66 66 73 65 74 29 20 73 65 74 20 74 6f 20 74 68  ffset) set to th
cdf0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20  e content of.** 
ce00: 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69  the first positi
ce10: 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73  on list. The pos
ce20: 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e  ition list belon
ce30: 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74  ging to document
ce40: 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65   .** (Fts5SegIte
ce50: 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74  r.iRowid)..*/.st
ce60: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
ce70: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74  gIterLoadTerm(Ft
ce80: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
ce90: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
cea0: 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38  int nKeep){.  u8
ceb0: 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65   *a = pIter->pLe
cec0: 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a  af->p;        /*
ced0: 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20   Buffer to read 
cee0: 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  data from */.  i
cef0: 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d  nt iOff = pIter-
cf00: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f  >iLeafOffset;  /
cf10: 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64  * Offset to read
cf20: 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65   at */.  int nNe
cf30: 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
cf40: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
cf50: 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f  s of new data */
cf60: 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35  ..  iOff += fts5
cf70: 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
cf80: 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 69  Off], nNew);.  i
cf90: 66 28 20 69 4f 66 66 2b 6e 4e 65 77 3e 70 49 74  f( iOff+nNew>pIt
cfa0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
cfb0: 66 20 7c 7c 20 6e 4b 65 65 70 3e 70 49 74 65 72  f || nKeep>pIter
cfc0: 2d 3e 74 65 72 6d 2e 6e 20 7c 7c 20 6e 4e 65 77  ->term.n || nNew
cfd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ==0 ){.    p->rc
cfe0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
cff0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
d000: 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e  .  pIter->term.n
d010: 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35   = nKeep;.  fts5
d020: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
d030: 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
d040: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b  >term, nNew, &a[
d050: 69 4f 66 66 5d 29 3b 0a 20 20 61 73 73 65 72 74  iOff]);.  assert
d060: 28 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 3c  ( pIter->term.n<
d070: 3d 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 53 70  =pIter->term.nSp
d080: 61 63 65 20 29 3b 0a 20 20 69 4f 66 66 20 2b 3d  ace );.  iOff +=
d090: 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e   nNew;.  pIter->
d0a0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20  iTermLeafOffset 
d0b0: 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d  = iOff;.  pIter-
d0c0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d  >iTermLeafPgno =
d0d0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
d0e0: 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  o;.  pIter->iLea
d0f0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
d100: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 50  .  if( pIter->iP
d110: 67 69 64 78 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  gidxOff>=pIter->
d120: 70 4c 65 61 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pLeaf->nn ){.   
d130: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
d140: 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
d150: 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
d160: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
d170: 74 72 61 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  tra;.    pIter->
d180: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
d190: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
d1a0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
d1b0: 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  ], nExtra);.    
d1c0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
d1d0: 6c 69 73 74 20 2b 3d 20 6e 45 78 74 72 61 3b 0a  list += nExtra;.
d1e0: 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74    }..  fts5SegIt
d1f0: 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70  erLoadRowid(p, p
d200: 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  Iter);.}..static
d210: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d220: 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 2a  rNext(Fts5Index*
d230: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20  , Fts5SegIter*, 
d240: 69 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f  int*);.static vo
d250: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
d260: 78 74 5f 52 65 76 65 72 73 65 28 46 74 73 35 49  xt_Reverse(Fts5I
d270: 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67 49 74  ndex*, Fts5SegIt
d280: 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74 61 74  er*, int*);.stat
d290: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d2a0: 74 65 72 4e 65 78 74 5f 4e 6f 6e 65 28 46 74 73  terNext_None(Fts
d2b0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
d2c0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 73  Iter*, int*);..s
d2d0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
d2e0: 65 67 49 74 65 72 53 65 74 4e 65 78 74 28 46 74  egIterSetNext(Ft
d2f0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
d300: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
d310: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c  .  if( pIter->fl
d320: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d330: 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20  ER_REVERSE ){.  
d340: 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d    pIter->xNext =
d350: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d360: 5f 52 65 76 65 72 73 65 3b 0a 20 20 7d 65 6c 73  _Reverse;.  }els
d370: 65 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67  e if( p->pConfig
d380: 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
d390: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
d3a0: 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 20     pIter->xNext 
d3b0: 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  = fts5SegIterNex
d3c0: 74 5f 4e 6f 6e 65 3b 0a 20 20 7d 65 6c 73 65 7b  t_None;.  }else{
d3d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 78 4e 65 78  .    pIter->xNex
d3e0: 74 20 3d 20 66 74 73 35 53 65 67 49 74 65 72 4e  t = fts5SegIterN
d3f0: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ext;.  }.}../*.*
d400: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
d410: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
d420: 20 70 49 74 65 72 20 74 6f 20 69 74 65 72 61 74   pIter to iterat
d430: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 65 6e  e through the en
d440: 74 72 69 65 73 20 69 6e 0a 2a 2a 20 73 65 67 6d  tries in.** segm
d450: 65 6e 74 20 70 53 65 67 2e 20 54 68 65 20 69 74  ent pSeg. The it
d460: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
d470: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
d480: 69 72 73 74 20 65 6e 74 72 79 20 77 68 65 6e 20  irst entry when 
d490: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
d4a0: 6e 20 72 65 74 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a  n returns..**.**
d4b0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
d4c0: 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
d4d0: 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
d4e0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
d4f0: 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
d500: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
d510: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
d520: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
d530: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
d540: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
d550: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
d560: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
d570: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
d580: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
d590: 53 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a  S index object *
d5a0: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
d5b0: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
d5c0: 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
d5d0: 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a 2f  on of segment */
d5e0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
d5f0: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
d600: 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20     /* Object to 
d610: 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20  populate */.){. 
d620: 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46   if( pSeg->pgnoF
d630: 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  irst==0 ){.    /
d640: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
d650: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 73  f the segment is
d660: 20 62 65 69 6e 67 20 75 73 65 64 20 61 73 20 61   being used as a
d670: 6e 20 69 6e 70 75 74 20 74 6f 20 61 6e 20 69 6e  n input to an in
d680: 63 72 65 6d 65 6e 74 61 6c 0a 20 20 20 20 2a 2a  cremental.    **
d690: 20 6d 65 72 67 65 20 61 6e 64 20 61 6c 6c 20 64   merge and all d
d6a0: 61 74 61 20 68 61 73 20 61 6c 72 65 61 64 79 20  ata has already 
d6b0: 62 65 65 6e 20 22 74 72 69 6d 6d 65 64 22 2e 20  been "trimmed". 
d6c0: 53 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  See function.   
d6d0: 20 2a 2a 20 66 74 73 35 54 72 69 6d 53 65 67 6d   ** fts5TrimSegm
d6e0: 65 6e 74 73 28 29 20 66 6f 72 20 64 65 74 61 69  ents() for detai
d6f0: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
d700: 20 6c 65 61 76 65 20 74 68 65 20 69 74 65 72 61   leave the itera
d710: 74 6f 72 20 65 6d 70 74 79 2e 0a 20 20 20 20 2a  tor empty..    *
d720: 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  * The caller wil
d730: 6c 20 73 65 65 20 74 68 65 20 28 70 49 74 65 72  l see the (pIter
d740: 2d 3e 70 4c 65 61 66 3d 3d 30 29 20 61 6e 64 20  ->pLeaf==0) and 
d750: 61 73 73 75 6d 65 20 74 68 65 20 69 74 65 72 61  assume the itera
d760: 74 6f 72 20 69 73 0a 20 20 20 20 2a 2a 20 61 74  tor is.    ** at
d770: 20 45 4f 46 20 61 6c 72 65 61 64 79 2e 20 2a 2f   EOF already. */
d780: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
d790: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a  er->pLeaf==0 );.
d7a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
d7b0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
d7c0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
d7d0: 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
d7e0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b  sizeof(*pIter));
d7f0: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
d800: 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72  SetNext(p, pIter
d810: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 53  );.    pIter->pS
d820: 65 67 20 3d 20 70 53 65 67 3b 0a 20 20 20 20 70  eg = pSeg;.    p
d830: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
d840: 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
d850: 74 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  t-1;.    fts5Seg
d860: 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
d870: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69  pIter);.  }..  i
d880: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
d890: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72  _OK ){.    pIter
d8a0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d8b0: 34 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63  4;.    assert_nc
d8c0: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  ( pIter->pLeaf->
d8d0: 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61 73 73 65  nn>4 );.    asse
d8e0: 72 74 5f 6e 63 28 20 66 74 73 35 4c 65 61 66 46  rt_nc( fts5LeafF
d8f0: 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65  irstTermOff(pIte
d900: 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29 3b 0a  r->pLeaf)==4 );.
d910: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
d920: 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  xOff = pIter->pL
d930: 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20  eaf->szLeaf+1;. 
d940: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d950: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
d960: 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67   0);.    fts5Seg
d970: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
d980: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
d990: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
d9a0: 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  on is only ever 
d9b0: 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74  called on iterat
d9c0: 6f 72 73 20 63 72 65 61 74 65 64 20 62 79 20 63  ors created by c
d9d0: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49  alls to.** Fts5I
d9e0: 6e 64 65 78 51 75 65 72 79 28 29 20 77 69 74 68  ndexQuery() with
d9f0: 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51   the FTS5INDEX_Q
da00: 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67 20 73  UERY_DESC flag s
da10: 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  et..**.** The it
da20: 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61 6e 20  erator is in an 
da30: 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20 77 68  unusual state wh
da40: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
da50: 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a   is called: the.
da60: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
da70: 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72 69 61  LeafOffset varia
da80: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
da90: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
daa0: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
dab0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
dac0: 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ze field for the
dad0: 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
dae0: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
daf0: 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  e..** Fts5SegIte
db00: 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74 2c 20  r.rowid is set, 
db10: 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62 44 65  but nPos and bDe
db20: 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  l are not..**.**
db30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
db40: 64 76 61 6e 63 65 73 20 74 68 65 20 69 74 65 72  dvances the iter
db50: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  ator so that it 
db60: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
db70: 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20  st .** relevant 
db80: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
db90: 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  e and, if necess
dba0: 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73  ary, initializes
dbb0: 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f   the .** aRowidO
dbc0: 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77  ffset[] and iRow
dbd0: 69 64 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c  idOffset variabl
dbe0: 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  es. At this poin
dbf0: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a  t the iterator.*
dc00: 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65 67 75  * is in its regu
dc10: 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74 73 35  lar state - Fts5
dc20: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
dc30: 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  set points to th
dc40: 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65 20  e first.** byte 
dc50: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
dc60: 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61 73 73  list content ass
dc70: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 61 69  ociated with sai
dc80: 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74  d rowid..*/.stat
dc90: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
dca0: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
dcb0: 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ge(Fts5Index *p,
dcc0: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
dcd0: 74 65 72 29 7b 0a 20 20 69 6e 74 20 65 44 65 74  ter){.  int eDet
dce0: 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
dcf0: 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 69 6e 74  ->eDetail;.  int
dd00: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
dd10: 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74  f->szLeaf;.  int
dd20: 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61   i = pIter->iLea
dd30: 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61  fOffset;.  u8 *a
dd40: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
dd50: 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64  >p;.  int iRowid
dd60: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69  Offset = 0;..  i
dd70: 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64  f( n>pIter->iEnd
dd80: 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  ofDoclist ){.   
dd90: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64   n = pIter->iEnd
dda0: 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a  ofDoclist;.  }..
ddb0: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
ddc0: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
ddd0: 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
dde0: 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d      i64 iDelta =
ddf0: 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65   0;..    if( eDe
de00: 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
de10: 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  L_NONE ){.      
de20: 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 20  /* todo */.     
de30: 20 69 66 28 20 69 3c 6e 20 26 26 20 61 5b 69 5d   if( i<n && a[i]
de40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
de50: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
de60: 69 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29  i<n && a[i]==0 )
de70: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i++;.      }.  
de80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
de90: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69  nt nPos;.      i
dea0: 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20  nt bDummy;.     
deb0: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73   i += fts5GetPos
dec0: 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20  listSize(&a[i], 
ded0: 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b  &nPos, &bDummy);
dee0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73  .      i += nPos
def0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
df00: 69 3e 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20  i>=n ) break;.  
df10: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
df20: 72 69 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34  rint(&a[i], (u64
df30: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
df40: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d  pIter->iRowid +=
df50: 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a   iDelta;..    /*
df60: 20 49 66 20 6e 65 63 65 73 73 61 72 79 2c 20 67   If necessary, g
df70: 72 6f 77 20 74 68 65 20 70 49 74 65 72 2d 3e 61  row the pIter->a
df80: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 72  RowidOffset[] ar
df90: 72 61 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ray. */.    if( 
dfa0: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49  iRowidOffset>=pI
dfb0: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
dfc0: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
dfd0: 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f  New = pIter->nRo
dfe0: 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20  widOffset + 8;. 
dff0: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d       int *aNew =
e000: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
e010: 65 61 6c 6c 6f 63 36 34 28 70 49 74 65 72 2d 3e  ealloc64(pIter->
e020: 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 6e 4e 65  aRowidOffset,nNe
e030: 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  w*sizeof(int));.
e040: 20 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d        if( aNew==
e050: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
e060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
e070: 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  M;.        break
e080: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e090: 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
e0a0: 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  set = aNew;.    
e0b0: 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f    pIter->nRowidO
e0c0: 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20  ffset = nNew;.  
e0d0: 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e    }..    pIter->
e0e0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f  aRowidOffset[iRo
e0f0: 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70  widOffset++] = p
e100: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e110: 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
e120: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20  eafOffset = i;. 
e130: 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77   }.  pIter->iRow
e140: 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69  idOffset = iRowi
e150: 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53  dOffset;.  fts5S
e160: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
e170: 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  , pIter);.}../*.
e180: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  **.*/.static voi
e190: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
e1a0: 65 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35  erseNewPage(Fts5
e1b0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
e1c0: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
e1d0: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
e1e0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e1f0: 49 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a  ITER_REVERSE );.
e200: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
e210: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e220: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
e230: 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
e240: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
e250: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  );.  pIter->pLea
e260: 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
e270: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
e280: 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   && pIter->iLeaf
e290: 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72  Pgno>pIter->iTer
e2a0: 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  mLeafPgno ){.   
e2b0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b   Fts5Data *pNew;
e2c0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
e2d0: 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65  fPgno--;.    pNe
e2e0: 77 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  w = fts5DataRead
e2f0: 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
e300: 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20  _ROWID(.        
e310: 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69    pIter->pSeg->i
e320: 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c  Segid, pIter->iL
e330: 65 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a  eafPgno.    ));.
e340: 20 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a      if( pNew ){.
e350: 20 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65        /* iTermLe
e360: 61 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65 20  afOffset may be 
e370: 65 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20  equal to szLeaf 
e380: 69 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 74  if the term is t
e390: 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a  he last.      **
e3a0: 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70 61   thing on the pa
e3b0: 67 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66 69  ge - i.e. the fi
e3c0: 72 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e 20  rst rowid is on 
e3d0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
e3e0: 67 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20  ge..      ** In 
e3f0: 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20  this case leave 
e400: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c  pIter->pLeaf==0,
e410: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 69   this iterator i
e420: 73 20 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20  s at EOF. */.   
e430: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c     if( pIter->iL
e440: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
e450: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
e460: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
e470: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
e480: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
e490: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
e4a0: 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c  Offset<pNew->szL
e4b0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
e4c0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
e4d0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  pNew;.          
e4e0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e4f0: 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72  et = pIter->iTer
e500: 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  mLeafOffset;.   
e510: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e520: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
e530: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
e540: 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
e550: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
e560: 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  dOff(pNew);.    
e570: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
e580: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
e590: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
e5a0: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
e5b0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
e5c0: 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
e5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e5e0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e5f0: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
e600: 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65     u8 *a = &pIte
e610: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  r->pLeaf->p[pIte
e620: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  r->iLeafOffset];
e630: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
e640: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66  iLeafOffset += f
e650: 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
e660: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
e670: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
e680: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
e690: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  e{.        fts5D
e6a0: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
e6b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e6c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
e6d0: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70  ->pLeaf ){.    p
e6e0: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
e6f0: 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  ist = pIter->pLe
e700: 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74  af->nn+1;.    ft
e710: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
e720: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
e730: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
e740: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
e750: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
e760: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
e770: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
e780: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
e790: 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  o a delete marke
e7a0: 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b  r. A delete mark
e7b0: 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77  er is an entry w
e7c0: 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20  ith a 0 byte.** 
e7d0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a  position-list..*
e7e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
e7f0: 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
e800: 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
e810: 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 29  Fts5Iter *pIter)
e820: 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
e830: 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
e840: 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
e850: 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
e860: 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
e870: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65  SQLITE_OK && pSe
e880: 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67  g->pLeaf && pSeg
e890: 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f  ->nPos==0);.}../
e8a0: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
e8b0: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
e8c0: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 0a 2a  he next entry..*
e8d0: 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f  *.** This versio
e8e0: 6e 20 6f 66 20 66 74 73 35 53 65 67 49 74 65 72  n of fts5SegIter
e8f0: 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c 79 20 75  Next() is only u
e900: 73 65 64 20 62 79 20 72 65 76 65 72 73 65 20 69  sed by reverse i
e910: 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61  terators..*/.sta
e920: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
e930: 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72 73 65  IterNext_Reverse
e940: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
e950: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e960: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
e970: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
e980: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
e990: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
e9a0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
e9b0: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
e9c0: 2a 70 62 55 6e 75 73 65 64 20 20 20 20 20 20 20  *pbUnused       
e9d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
e9e0: 6e 75 73 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73  nused */.){.  as
e9f0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
ea00: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
ea10: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
ea20: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e  ssert( pIter->pN
ea30: 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  extLeaf==0 );.  
ea40: 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 62 55  UNUSED_PARAM(pbU
ea50: 6e 75 73 65 64 29 3b 0a 0a 20 20 69 66 28 20 70  nused);..  if( p
ea60: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
ea70: 65 74 3e 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  et>0 ){.    u8 *
ea80: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
ea90: 2d 3e 70 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  ->p;.    int iOf
eaa0: 66 3b 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  f;.    i64 iDelt
eab0: 61 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a;..    pIter->i
eac0: 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20  RowidOffset--;. 
ead0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
eae0: 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 61  ffset = pIter->a
eaf0: 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65  RowidOffset[pIte
eb00: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d  r->iRowidOffset]
eb10: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
eb20: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
eb30: 65 72 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  er);.    iOff = 
eb40: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
eb50: 65 74 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  et;.    if( p->p
eb60: 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21  Config->eDetail!
eb70: 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
eb80: 45 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  E ){.      iOff 
eb90: 2b 3d 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a  += pIter->nPos;.
eba0: 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 47 65      }.    fts5Ge
ebb0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
ebc0: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
ebd0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
ebe0: 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a 20  wid -= iDelta;. 
ebf0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
ec00: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
ec10: 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
ec20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
ec30: 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 70  vance iterator p
ec40: 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78 74  Iter to the next
ec50: 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   entry..**.** Th
ec60: 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 74  is version of ft
ec70: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29 20  s5SegIterNext() 
ec80: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  is only used if 
ec90: 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 61 6e 64 20  detail=none and 
eca0: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
ecb0: 69 73 20 6e 6f 74 20 61 20 72 65 76 65 72 73 65  is not a reverse
ecc0: 20 64 69 72 65 63 74 69 6f 6e 20 69 74 65 72 61   direction itera
ecd0: 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tor..*/.static v
ece0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e  oid fts5SegIterN
ecf0: 65 78 74 5f 4e 6f 6e 65 28 0a 20 20 46 74 73 35  ext_None(.  Fts5
ed00: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
ed10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ed20: 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
ed30: 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  ct */.  Fts5SegI
ed40: 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20  ter *pIter,     
ed50: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
ed60: 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a  tor to advance *
ed70: 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65  /.  int *pbNewTe
ed80: 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rm              
ed90: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20      /* OUT: Set 
eda0: 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a  for new term */.
edb0: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  ){.  int iOff;..
edc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
edd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
ede0: 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d 3e  assert( (pIter->
edf0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
ee00: 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30  ITER_REVERSE)==0
ee10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ee20: 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69  >pConfig->eDetai
ee30: 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
ee40: 4f 4e 45 20 29 3b 0a 0a 20 20 41 53 53 45 52 54  ONE );..  ASSERT
ee50: 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72  _SZLEAF_OK(pIter
ee60: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 4f 66 66  ->pLeaf);.  iOff
ee70: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
ee80: 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 4e 65 78  ffset;..  /* Nex
ee90: 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68  t entry is on th
eea0: 65 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 20  e next page */. 
eeb0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67   if( pIter->pSeg
eec0: 20 26 26 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d   && iOff>=pIter-
eed0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
eee0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
eef0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
ef00: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  er);.    if( p->
ef10: 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65  rc || pIter->pLe
ef20: 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  af==0 ) return;.
ef30: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
ef40: 64 20 3d 20 30 3b 0a 20 20 20 20 69 4f 66 66 20  d = 0;.    iOff 
ef50: 3d 20 34 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  = 4;.  }..  if( 
ef60: 69 4f 66 66 3c 70 49 74 65 72 2d 3e 69 45 6e 64  iOff<pIter->iEnd
ef70: 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  ofDoclist ){.   
ef80: 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69   /* Next entry i
ef90: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
efa0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 36 34   page */.    i64
efb0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 69 4f 66   iDelta;.    iOf
efc0: 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
efd0: 47 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72  GetVarint(&pIter
efe0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
eff0: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
f000: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
f010: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f020: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77  .    pIter->iRow
f030: 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20  id += iDelta;.  
f040: 7d 65 6c 73 65 20 69 66 28 20 28 70 49 74 65 72  }else if( (pIter
f050: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f060: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 3d  EGITER_ONETERM)=
f070: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49  =0 ){.    if( pI
f080: 74 65 72 2d 3e 70 53 65 67 20 29 7b 0a 20 20 20  ter->pSeg ){.   
f090: 20 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30     int nKeep = 0
f0a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
f0b0: 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54  !=fts5LeafFirstT
f0c0: 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c  ermOff(pIter->pL
f0d0: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
f0e0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
f0f0: 61 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e  arint32(&pIter->
f100: 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
f110: 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeep);.      }.
f120: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
f130: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f140: 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
f150: 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49  erLoadTerm(p, pI
f160: 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ter, nKeep);.   
f170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f   }else{.      co
f180: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
f190: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  0;.      const c
f1a0: 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a  har *zTerm = 0;.
f1b0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 3b        int nList;
f1c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
f1d0: 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
f1e0: 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 20 20  ->pHash);.      
f1f0: 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
f200: 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73  canEntry(p->pHas
f210: 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73  h, &zTerm, &pLis
f220: 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
f230: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
f240: 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f   goto next_none_
f250: 65 6f 66 3b 0a 20 20 20 20 20 20 70 49 74 65 72  eof;.      pIter
f260: 2d 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38  ->pLeaf->p = (u8
f270: 2a 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  *)pList;.      p
f280: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
f290: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70  = nList;.      p
f2a0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
f2b0: 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
f2c0: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
f2d0: 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69 73 74 3b  Doclist = nList;
f2e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
f2f0: 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
f300: 72 63 2c 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  rc,&pIter->term,
f310: 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65   (int)strlen(zTe
f320: 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29  rm), (u8*)zTerm)
f330: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
f340: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73  LeafOffset = fts
f350: 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74  5GetVarint(pList
f360: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
f370: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
f380: 20 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72      if( pbNewTer
f390: 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d  m ) *pbNewTerm =
f3a0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
f3b0: 20 67 6f 74 6f 20 6e 65 78 74 5f 6e 6f 6e 65 5f   goto next_none_
f3c0: 65 6f 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  eof;.  }..  fts5
f3d0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
f3e0: 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 72 65  p, pIter);..  re
f3f0: 74 75 72 6e 3b 0a 20 6e 65 78 74 5f 6e 6f 6e 65  turn;. next_none
f400: 5f 65 6f 66 3a 0a 20 20 66 74 73 35 44 61 74 61  _eof:.  fts5Data
f410: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
f420: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
f430: 70 4c 65 61 66 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f  pLeaf = 0;.}.../
f440: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
f450: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
f460: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
f470: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
f480: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
f490: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
f4a0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
f4b0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a  error code. It .
f4c0: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
f4d0: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
f4e0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
f4f0: 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e  aches EOF. If an
f500: 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
f510: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
f520: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
f530: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
f540: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
f550: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
f560: 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46  SegIterNext(.  F
f570: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
f580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f590: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
f5a0: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
f5b0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
f5c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
f5d0: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
f5e0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65  e */.  int *pbNe
f5f0: 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  wTerm           
f600: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
f610: 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20  et for new term 
f620: 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61  */.){.  Fts5Data
f630: 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
f640: 3e 70 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 4f  >pLeaf;.  int iO
f650: 66 66 3b 0a 20 20 69 6e 74 20 62 4e 65 77 54 65  ff;.  int bNewTe
f660: 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  rm = 0;.  int nK
f670: 65 65 70 20 3d 20 30 3b 0a 20 20 75 38 20 2a 61  eep = 0;.  u8 *a
f680: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 61 73  ;.  int n;..  as
f690: 73 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d  sert( pbNewTerm=
f6a0: 3d 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d  =0 || *pbNewTerm
f6b0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
f6c0: 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
f6d0: 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
f6e0: 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 2f 2a 20  L_NONE );..  /* 
f6f0: 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 65  Search for the e
f700: 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  nd of the positi
f710: 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20 74  on list within t
f720: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
f730: 20 2a 2f 0a 20 20 61 20 3d 20 70 4c 65 61 66 2d   */.  a = pLeaf-
f740: 3e 70 3b 0a 20 20 6e 20 3d 20 70 4c 65 61 66 2d  >p;.  n = pLeaf-
f750: 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 41 53 53 45  >szLeaf;..  ASSE
f760: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
f770: 61 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49  af);.  iOff = pI
f780: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
f790: 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a   + pIter->nPos;.
f7a0: 0a 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b  .  if( iOff<n ){
f7b0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  .    /* The next
f7c0: 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74 68 65   entry is on the
f7d0: 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 2a   current page. *
f7e0: 2f 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  /.    assert_nc(
f7f0: 20 69 4f 66 66 3c 3d 70 49 74 65 72 2d 3e 69 45   iOff<=pIter->iE
f800: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 3b 0a 20  ndofDoclist );. 
f810: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74     if( iOff>=pIt
f820: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f830: 74 20 29 7b 0a 20 20 20 20 20 20 62 4e 65 77 54  t ){.      bNewT
f840: 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  erm = 1;.      i
f850: 66 28 20 69 4f 66 66 21 3d 66 74 73 35 4c 65 61  f( iOff!=fts5Lea
f860: 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70 4c  fFirstTermOff(pL
f870: 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eaf) ){.        
f880: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
f890: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
f8a0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
f8b0: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
f8c0: 20 20 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20     u64 iDelta;. 
f8d0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
f8e0: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
f8f0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
f900: 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74 65  lta);.      pIte
f910: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
f920: 6c 74 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72  lta;.      asser
f930: 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20 29  t_nc( iDelta>0 )
f940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 74 65  ;.    }.    pIte
f950: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f960: 20 69 4f 66 66 3b 0a 0a 20 20 7d 65 6c 73 65 20   iOff;..  }else 
f970: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
f980: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
f990: 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
f9a0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f9b0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Term = 0;.    in
f9c0: 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  t nList = 0;.   
f9d0: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
f9e0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
f9f0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c  GITER_ONETERM) |
fa00: 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20  | pbNewTerm );. 
fa10: 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72     if( 0==(pIter
fa20: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
fa30: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20  EGITER_ONETERM) 
fa40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
fa50: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
fa60: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
fa70: 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
fa80: 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48  hScanEntry(p->pH
fa90: 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 4c  ash, &zTerm, &pL
faa0: 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
fab0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4c 69 73    }.    if( pLis
fac0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  t==0 ){.      ft
fad0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
fae0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
faf0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
fb00: 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
fb10: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
fb20: 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
fb30: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
fb40: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
fb50: 73 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  st;.      pIter-
fb60: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d  >pLeaf->szLeaf =
fb70: 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49   nList;.      pI
fb80: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
fb90: 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20  st = nList+1;.  
fba0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
fbb0: 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
fbc0: 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28   &pIter->term, (
fbd0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d  int)strlen(zTerm
fbe0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 28 75 38  ),.          (u8
fbf0: 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  *)zTerm);.      
fc00: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
fc10: 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
fc20: 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29  nt(pList, (u64*)
fc30: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
fc40: 0a 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72  .      *pbNewTer
fc50: 6d 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  m = 1;.    }.  }
fc60: 65 6c 73 65 7b 0a 20 20 20 20 69 4f 66 66 20 3d  else{.    iOff =
fc70: 20 30 3b 0a 20 20 20 20 2f 2a 20 4e 65 78 74 20   0;.    /* Next 
fc80: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20  entry is not on 
fc90: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
fca0: 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 69   */.    while( i
fcb0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off==0 ){.      
fcc0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
fcd0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
fce0: 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49 74       pLeaf = pIt
fcf0: 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20  er->pLeaf;.     
fd00: 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
fd10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 41 53 53  break;.      ASS
fd20: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c  ERT_SZLEAF_OK(pL
fd30: 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eaf);.      if( 
fd40: 28 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  (iOff = fts5Leaf
fd50: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
fd60: 65 61 66 29 29 20 26 26 20 69 4f 66 66 3c 70 4c  eaf)) && iOff<pL
fd70: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
fd80: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73         iOff += s
fd90: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
fda0: 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  int(&pLeaf->p[iO
fdb0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
fdc0: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
fdd0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
fde0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
fdf0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61          if( pLea
fe00: 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c  f->nn>pLeaf->szL
fe10: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
fe20: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
fe30: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
fe40: 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  f + fts5GetVarin
fe50: 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20  t32(.           
fe60: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
fe70: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49 74  af->szLeaf], pIt
fe80: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
fe90: 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  t.          );. 
fea0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
feb0: 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20  .      else if( 
fec0: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
fed0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
fee0: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
fef0: 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  Off = pLeaf->szL
ff00: 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61 72  eaf + fts5GetVar
ff10: 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20 20  int32(.         
ff20: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
ff30: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66  af->szLeaf], iOf
ff40: 66 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  f.        );.   
ff50: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
ff60: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
ff70: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
ff80: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69  EndofDoclist = i
ff90: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 62 4e 65  Off;.        bNe
ffa0: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
ffb0: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f   }.      assert_
ffc0: 6e 63 28 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e  nc( iOff<pLeaf->
ffd0: 73 7a 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  szLeaf );.      
ffe0: 69 66 28 20 69 4f 66 66 3e 70 4c 65 61 66 2d 3e  if( iOff>pLeaf->
fff0: 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
10000 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
10010 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
10020 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
10030 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10040 43 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65  Check if the ite
10050 72 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20  rator is now at 
10060 45 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75  EOF. If so, retu
10070 72 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 69  rn early. */.  i
10080 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
10090 29 7b 0a 20 20 20 20 69 66 28 20 62 4e 65 77 54  ){.    if( bNewT
100a0 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 66 28  erm ){.      if(
100b0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
100c0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
100d0 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  TERM ){.        
100e0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
100f0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
10100 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
10110 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  eaf = 0;.      }
10120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
10130 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
10140 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65  m(p, pIter, nKee
10150 70 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  p);.        fts5
10160 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
10170 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
10180 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
10190 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
101a0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
101b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
101c0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75  he following cou
101d0 6c 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63 61  ld be done by ca
101e0 6c 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74 65  lling fts5SegIte
101f0 72 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75 74  rLoadNPos(). But
10200 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62  .      ** this b
10210 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75 6c  lock is particul
10220 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63 65  arly performance
10230 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65 71   critical, so eq
10240 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 2a  uivalent.      *
10250 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c 69 6e 65  * code is inline
10260 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
10270 20 20 20 2a 2a 20 4c 61 74 65 72 3a 20 53 77 69     ** Later: Swi
10280 74 63 68 65 64 20 62 61 63 6b 20 74 6f 20 66 74  tched back to ft
10290 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
102a0 73 28 29 20 62 65 63 61 75 73 65 20 69 74 20 73  s() because it s
102b0 75 70 70 6f 72 74 73 0a 20 20 20 20 20 20 2a 2a  upports.      **
102c0 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 6d 6f 64   detail=none mod
102d0 65 2e 20 4e 6f 74 20 69 64 65 61 6c 2e 0a 20 20  e. Not ideal..  
102e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
102f0 20 6e 53 7a 3b 0a 20 20 20 20 20 20 61 73 73 65   nSz;.      asse
10300 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
10310 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 61 73  E_OK );.      as
10320 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c 65  sert( pIter->iLe
10330 61 66 4f 66 66 73 65 74 3c 3d 70 49 74 65 72 2d  afOffset<=pIter-
10340 3e 70 4c 65 61 66 2d 3e 6e 6e 20 29 3b 0a 20 20  >pLeaf->nn );.  
10350 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56      fts5FastGetV
10360 61 72 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70  arint32(pIter->p
10370 4c 65 61 66 2d 3e 70 2c 20 70 49 74 65 72 2d 3e  Leaf->p, pIter->
10380 69 4c 65 61 66 4f 66 66 73 65 74 2c 20 6e 53 7a  iLeafOffset, nSz
10390 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  );.      pIter->
103a0 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78  bDel = (nSz & 0x
103b0 30 30 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74  0001);.      pIt
103c0 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e  er->nPos = nSz>>
103d0 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f  1;.      assert_
103e0 6e 63 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e  nc( pIter->nPos>
103f0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  =0 );.    }.  }.
10400 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56  }..#define SWAPV
10410 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20  AL(T, a, b) { T 
10420 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b  tmp; tmp=a; a=b;
10430 20 62 3d 74 6d 70 3b 20 7d 0a 0a 23 64 65 66 69   b=tmp; }..#defi
10440 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70  ne fts5IndexSkip
10450 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29 20  Varint(a, iOff) 
10460 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20  {            \. 
10470 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66 66   int iEnd = iOff
10480 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  +9;             
10490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104a0 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b 69   \.  while( (a[i
104b0 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20 26  Off++] & 0x80) &
104c0 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20  & iOff<iEnd );  
104d0 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20       \.}../*.** 
104e0 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
104f0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
10500 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
10510 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e  id in a doclist.
10520 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
10530 6e 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61  n sets the itera
10540 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69  tor up so that i
10550 74 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72  terates in rever
10560 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68  se order through
10570 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e  .** the doclist.
10580 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10590 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
105a0 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  se(Fts5Index *p,
105b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
105c0 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64  ter){.  Fts5Dlid
105d0 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
105e0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
105f0 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74   Fts5Data *pLast
10600 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f   = 0;.  int pgno
10610 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  Last = 0;..  if(
10620 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69   pDlidx ){.    i
10630 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65  nt iSegid = pIte
10640 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
10650 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20  .    pgnoLast = 
10660 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
10670 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70  o(pDlidx);.    p
10680 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52  Last = fts5DataR
10690 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
106a0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
106b0 2c 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20  , pgnoLast));.  
106c0 7d 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44  }else{.    Fts5D
106d0 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
106e0 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20  er->pLeaf;      
106f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
10700 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20  af data */..    
10710 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74  /* Currently, Ft
10720 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
10730 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
10740 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
10750 66 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f  f.    ** positio
10760 6e 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66  n-list content f
10770 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  or the current r
10780 6f 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70  owid. Back it up
10790 20 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20   so that it.    
107a0 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
107b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f   start of the po
107c0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
107d0 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 69   field. */.    i
107e0 6e 74 20 69 50 6f 73 6c 69 73 74 3b 0a 20 20 20  nt iPoslist;.   
107f0 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72   if( pIter->iTer
10800 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72  mLeafPgno==pIter
10810 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
10820 20 20 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20       iPoslist = 
10830 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
10840 4f 66 66 73 65 74 3b 0a 20 20 20 20 7d 65 6c 73  Offset;.    }els
10850 65 7b 0a 20 20 20 20 20 20 69 50 6f 73 6c 69 73  e{.      iPoslis
10860 74 20 3d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 4;.    }.   
10870 20 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61   fts5IndexSkipVa
10880 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 69  rint(pLeaf->p, i
10890 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49  Poslist);.    pI
108a0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
108b0 20 3d 20 69 50 6f 73 6c 69 73 74 3b 0a 0a 20 20   = iPoslist;..  
108c0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e    /* If this con
108d0 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74  dition is true t
108e0 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  hen the largest 
108f0 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  rowid for the cu
10900 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72  rrent.    ** ter
10910 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f  m may not be sto
10920 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  red on the curre
10930 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72  nt page. So sear
10940 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20  ch forward to.  
10950 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73    ** see where s
10960 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79  aid rowid really
10970 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28   is.  */.    if(
10980 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
10990 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a  clist>=pLeaf->sz
109a0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e  Leaf ){.      in
109b0 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74  t pgno;.      Ft
109c0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
109d0 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
109e0 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f  ->pSeg;..      /
109f0 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64  * The last rowid
10a00 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
10a10 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68  may not be on th
10a20 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
10a30 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20  Search.      ** 
10a40 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20  forward to find 
10a50 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
10a60 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77  ing the last row
10a70 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  id.  */.      fo
10a80 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c  r(pgno=pIter->iL
10a90 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72  eafPgno+1; !p->r
10aa0 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d  c && pgno<=pSeg-
10ab0 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b  >pgnoLast; pgno+
10ac0 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  +){.        i64 
10ad0 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d  iAbs = FTS5_SEGM
10ae0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
10af0 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20  iSegid, pgno);. 
10b00 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20         Fts5Data 
10b10 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61  *pNew = fts5Data
10b20 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20  Read(p, iAbs);. 
10b30 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
10b40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
10b50 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65   iRowid, bTermle
10b60 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52  ss;.          iR
10b70 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46  owid = fts5LeafF
10b80 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65  irstRowidOff(pNe
10b90 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54  w);.          bT
10ba0 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65  ermless = fts5Le
10bb0 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65  afIsTermless(pNe
10bc0 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
10bd0 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ( iRowid ){.    
10be0 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28          SWAPVAL(
10bf0 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c  Fts5Data*, pNew,
10c00 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20   pLast);.       
10c10 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20       pgnoLast = 
10c20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  pgno;.          
10c30 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  }.          fts5
10c40 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
10c50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
10c60 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20   bTermless==0 ) 
10c70 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10c90 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73   }..  /* If pLas
10ca0 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69  t is NULL at thi
10cb0 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
10cc0 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72  e last rowid for
10cd0 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20   this doclist.  
10ce0 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  ** lies on the p
10cf0 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  age currently in
10d00 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
10d10 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73  terator. In this
10d20 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65   case .  ** pIte
10d30 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69  r->iLeafOffset i
10d40 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
10d50 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f   point to the po
10d60 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
10d70 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f  .  ** field asso
10d80 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
10d90 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72  first relevant r
10da0 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
10db0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20  ..  **.  ** Or, 
10dc0 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d  if pLast is non-
10dd0 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
10de0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63   the page that c
10df0 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74  ontains the last
10e00 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20  .  ** rowid. In 
10e10 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67  this case config
10e20 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ure the iterator
10e30 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
10e40 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  ts to the.  ** f
10e50 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
10e60 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  is page..  */.  
10e70 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20  if( pLast ){.   
10e80 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66   int iOff;.    f
10e90 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
10ea0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
10eb0 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
10ec0 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65   pLast;.    pIte
10ed0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  r->iLeafPgno = p
10ee0 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66  gnoLast;.    iOf
10ef0 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
10f00 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29  tRowidOff(pLast)
10f10 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
10f20 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61  s5GetVarint(&pLa
10f30 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  st->p[iOff], (u6
10f40 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
10f50 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
10f60 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
10f70 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35  f;..    if( fts5
10f80 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
10f90 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Last) ){.      p
10fa0 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
10fb0 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b  ist = pLast->nn+
10fc0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10fd0 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
10fe0 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c  fDoclist = fts5L
10ff0 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
11000 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLast);.    }.. 
11010 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
11020 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
11030 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
11040 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
11050 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
11060 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
11070 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63  t rowid of a doc
11080 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69  list..** There i
11090 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
110a0 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
110b0 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d  h the final term
110c0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
110d0 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65  .** page. If the
110e0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
110f0 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f   the last term o
11100 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64  n the page, load
11110 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74   the .** doclist
11120 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b  -index from disk
11130 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
11140 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 28  an iterator at (
11150 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a  pIter->pDlidx)..
11160 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11170 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
11180 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
11190 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
111a0 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65  Iter){.  int iSe
111b0 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  g = pIter->pSeg-
111c0 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62  >iSegid;.  int b
111d0 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
111e0 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
111f0 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
11200 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
11210 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f   pIter->pLeaf; /
11220 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
11230 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ata */..  assert
11240 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
11250 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
11260 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72  ETERM );.  asser
11270 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t( pIter->pDlidx
11280 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
11290 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ck if the curren
112a0 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f  t doclist ends o
112b0 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20  n this page. If 
112c0 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a  it does, return.
112d0 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f    ** early witho
112e0 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  ut loading the d
112f0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73  oclist-index (as
11300 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61   it belongs to a
11310 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
11320 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70  term. */.  if( p
11330 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
11340 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno==pIter->iLea
11350 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74  fPgno .   && pIt
11360 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
11370 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  t<pLeaf->szLeaf 
11380 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
11390 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
113a0 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69  pDlidx = fts5Dli
113b0 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52  dxIterInit(p, bR
113c0 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d  ev, iSeg, pIter-
113d0 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
113e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74  .}../*.** The it
113f0 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
11400 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
11410 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72  nd argument curr
11420 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a  ently contains.*
11430 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65  * no valid value
11440 73 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65  s except for the
11450 20 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65   Fts5SegIter.pLe
11460 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62  af member variab
11470 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  le. This.** func
11480 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68  tion searches th
11490 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20  e leaf page for 
114a0 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20  a term matching 
114b0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a  (pTerm/nTerm)..*
114c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63  *.** If the spec
114d0 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f  ified term is fo
114e0 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c  und on the page,
114f0 20 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74   then the iterat
11500 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f  or is left.** po
11510 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66  inting to it. If
11520 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73   argument bGe is
11530 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65   zero and the te
11540 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  rm is not found,
11550 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72  .** the iterator
11560 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
11570 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20  g at EOF..**.** 
11580 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65  If bGe is non-ze
11590 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69  ro and the speci
115a0 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74  fied term is not
115b0 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65   found, then the
115c0 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20  .** iterator is 
115d0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f  left pointing to
115e0 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65   the smallest te
115f0 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
11600 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  t that.** is lar
11610 67 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65  ger than the spe
11620 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65  cified term, eve
11630 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69  n if this term i
11640 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20  s not on the.** 
11650 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f  current page..*/
11660 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
11670 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73  5LeafSeek(.  Fts
11680 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
11690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
116a0 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20  Leave any error 
116b0 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  code here */.  i
116c0 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20  nt bGe,         
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116e0 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20  * True for a >= 
116f0 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35  search */.  Fts5
11700 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
11710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
11720 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20  terator to seek 
11730 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
11740 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20  Term, int nTerm 
11750 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
11760 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b  search for */.){
11770 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63  .  int iOff;.  c
11780 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74  onst u8 *a = pIt
11790 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
117a0 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74  int szLeaf = pIt
117b0 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
117c0 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74  f;.  int n = pIt
117d0 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a  er->pLeaf->nn;..
117e0 20 20 75 33 32 20 6e 4d 61 74 63 68 20 3d 20 30    u32 nMatch = 0
117f0 3b 0a 20 20 75 33 32 20 6e 4b 65 65 70 20 3d 20  ;.  u32 nKeep = 
11800 30 3b 0a 20 20 75 33 32 20 6e 4e 65 77 20 3d 20  0;.  u32 nNew = 
11810 30 3b 0a 20 20 75 33 32 20 69 54 65 72 6d 4f 66  0;.  u32 iTermOf
11820 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b  f;.  int iPgidx;
11830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11840 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
11850 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20  offset in pgidx 
11860 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50  */.  int bEndOfP
11870 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  age = 0;..  asse
11880 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
11890 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64  E_OK );..  iPgid
118a0 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50  x = szLeaf;.  iP
118b0 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
118c0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
118d0 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  x], iTermOff);. 
118e0 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
118f0 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 6e 20 29  ;.  if( iOff>n )
11900 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54  {.    p->rc = FT
11910 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
11920 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 77  return;.  }..  w
11930 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
11940 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
11950 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73  w many new bytes
11960 20 61 72 65 20 69 6e 20 74 68 69 73 20 74 65 72   are in this ter
11970 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73  m */.    fts5Fas
11980 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  tGetVarint32(a, 
11990 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  iOff, nNew);.   
119a0 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63   if( nKeep<nMatc
119b0 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  h ){.      goto 
119c0 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
119d0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
119e0 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20  ( nKeep>=nMatch 
119f0 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70  );.    if( nKeep
11a00 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
11a10 20 20 75 33 32 20 6e 43 6d 70 3b 0a 20 20 20 20    u32 nCmp;.    
11a20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 20 20 6e    u32 i;.      n
11a30 43 6d 70 20 3d 20 28 75 33 32 29 4d 49 4e 28 6e  Cmp = (u32)MIN(n
11a40 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63  New, nTerm-nMatc
11a50 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  h);.      for(i=
11a60 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b  0; i<nCmp; i++){
11a70 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 69  .        if( a[i
11a80 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d  Off+i]!=pTerm[nM
11a90 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b  atch+i] ) break;
11aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
11ab0 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20  Match += i;..   
11ac0 20 20 20 69 66 28 20 28 75 33 32 29 6e 54 65 72     if( (u32)nTer
11ad0 6d 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20  m==nMatch ){.   
11ae0 20 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77       if( i==nNew
11af0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
11b00 74 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73  to search_succes
11b10 73 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  s;.        }else
11b20 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
11b30 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a   search_failed;.
11b40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11b50 7d 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77  }else if( i<nNew
11b60 20 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54   && a[iOff+i]>pT
11b70 65 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20  erm[nMatch] ){. 
11b80 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72         goto sear
11b90 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  ch_failed;.     
11ba0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
11bb0 28 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20  ( iPgidx>=n ){. 
11bc0 20 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20       bEndOfPage 
11bd0 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
11be0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67  ;.    }..    iPg
11bf0 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
11c00 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
11c10 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69  ], nKeep);.    i
11c20 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70  TermOff += nKeep
11c30 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65  ;.    iOff = iTe
11c40 72 6d 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20  rmOff;..    if( 
11c50 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20  iOff>=n ){.     
11c60 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
11c70 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74  RRUPT;.      ret
11c80 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  urn;.    }..    
11c90 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65  /* Read the nKee
11ca0 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e  p field of the n
11cb0 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20  ext term. */.   
11cc0 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
11cd0 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b  nt32(a, iOff, nK
11ce0 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72  eep);.  }.. sear
11cf0 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28  ch_failed:.  if(
11d00 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66   bGe==0 ){.    f
11d10 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
11d20 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
11d30 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
11d40 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   0;.    return;.
11d50 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45 6e 64    }else if( bEnd
11d60 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20 64 6f  OfPage ){.    do
11d70 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67   {.      fts5Seg
11d80 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20  IterNextPage(p, 
11d90 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  pIter);.      if
11da0 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
11db0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
11dc0 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65    a = pIter->pLe
11dd0 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 66 28  af->p;.      if(
11de0 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
11df0 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ess(pIter->pLeaf
11e00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
11e10 69 50 67 69 64 78 20 3d 20 70 49 74 65 72 2d 3e  iPgidx = pIter->
11e20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
11e30 20 20 20 20 20 20 20 69 50 67 69 64 78 20 2b 3d         iPgidx +=
11e40 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
11e50 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  (&pIter->pLeaf->
11e60 70 5b 69 50 67 69 64 78 5d 2c 20 69 4f 66 66 29  p[iPgidx], iOff)
11e70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
11e80 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49  ff<4 || iOff>=pI
11e90 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
11ea0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
11eb0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
11ec0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
11ed0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
11ee0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
11ef0 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
11f00 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 3d        iTermOff =
11f10 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20   iOff;.         
11f20 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
11f30 66 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 20 20 20  f->nn;.         
11f40 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
11f50 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
11f60 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20 20 20  ], nNew);.      
11f70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11f80 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11f90 20 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a 20 20   }while( 1 );.  
11fa0 7d 0a 0a 20 73 65 61 72 63 68 5f 73 75 63 63 65  }.. search_succe
11fb0 73 73 3a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  ss:.  pIter->iLe
11fc0 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20  afOffset = iOff 
11fd0 2b 20 6e 4e 65 77 3b 0a 20 20 69 66 28 20 70 49  + nNew;.  if( pI
11fe0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
11ff0 3e 6e 20 7c 7c 20 6e 4e 65 77 3c 31 20 29 7b 0a  >n || nNew<1 ){.
12000 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
12010 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 65  _CORRUPT;.    re
12020 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74 65  turn;.  }.  pIte
12030 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
12040 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  et = pIter->iLea
12050 66 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65 72  fOffset;.  pIter
12060 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
12070 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
12080 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65  no;..  fts5Buffe
12090 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
120a0 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65 70  ter->term, nKeep
120b0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73 35  , pTerm);.  fts5
120c0 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
120d0 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
120e0 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b  >term, nNew, &a[
120f0 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20 69  iOff]);..  if( i
12100 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20  Pgidx>=n ){.    
12110 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
12120 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c  list = pIter->pL
12130 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c  eaf->nn+1;.  }el
12140 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78 74  se{.    int nExt
12150 72 61 3b 0a 20 20 20 20 69 50 67 69 64 78 20 2b  ra;.    iPgidx +
12160 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
12170 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 45  2(&a[iPgidx], nE
12180 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72  xtra);.    pIter
12190 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
121a0 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45 78  = iTermOff + nEx
121b0 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72  tra;.  }.  pIter
121c0 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 69 50  ->iPgidxOff = iP
121d0 67 69 64 78 3b 0a 0a 20 20 66 74 73 35 53 65 67  gidx;..  fts5Seg
121e0 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70 2c  IterLoadRowid(p,
121f0 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35 53   pIter);.  fts5S
12200 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
12210 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 73 74 61  , pIter);.}..sta
12220 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  tic sqlite3_stmt
12230 20 2a 66 74 73 35 49 64 78 53 65 6c 65 63 74 53   *fts5IdxSelectS
12240 74 6d 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  tmt(Fts5Index *p
12250 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78  ){.  if( p->pIdx
12260 53 65 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Select==0 ){.   
12270 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
12280 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
12290 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
122a0 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
122b0 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73  p->pIdxSelect, s
122c0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
122d0 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
122e0 54 20 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27  T pgno FROM '%q'
122f0 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
12300 22 0a 20 20 20 20 20 20 20 20 20 20 22 73 65 67  ".          "seg
12310 69 64 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f  id=? AND term<=?
12320 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 44   ORDER BY term D
12330 45 53 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20  ESC LIMIT 1",.  
12340 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
12350 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
12360 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d  Name.    ));.  }
12370 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 49 64  .  return p->pId
12380 78 53 65 6c 65 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xSelect;.}../*.*
12390 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
123a0 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
123b0 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
123c0 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
123d0 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65  n segment.** pSe
123e0 67 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  g. If there is n
123f0 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e 20 74  o such term in t
12400 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20 69 74  he index, the it
12410 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f  erator is set to
12420 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61   EOF..**.** If a
12430 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
12440 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
12450 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
12460 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
12470 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
12480 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
12490 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
124a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
124b0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
124c0 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
124d0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 53 65  id fts5SegIterSe
124e0 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  ekInit(.  Fts5In
124f0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12510 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 63  5 backend */.  c
12520 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
12530 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
12540 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
12550 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  o */.  int flags
12560 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
12570 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
12580 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20  f FTS5INDEX_XXX 
12590 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53  flags */.  Fts5S
125a0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
125b0 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65  *pSeg,     /* De
125c0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67  scription of seg
125d0 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ment */.  Fts5Se
125e0 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20  gIter *pIter    
125f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a            /* Obj
12600 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  ect to populate 
12610 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20  */.){.  int iPg 
12620 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d  = 1;.  int bGe =
12630 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
12640 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b  DEX_QUERY_SCAN);
12650 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20  .  int bDlidx = 
12660 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12670 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
12680 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
12690 2d 69 6e 64 65 78 20 2a 2f 0a 20 20 73 71 6c 69  -index */.  sqli
126a0 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65  te3_stmt *pIdxSe
126b0 6c 65 63 74 20 3d 20 30 3b 0a 0a 20 20 61 73 73  lect = 0;..  ass
126c0 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28  ert( bGe==0 || (
126d0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
126e0 58 5f 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30  X_QUERY_DESC)==0
126f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
12700 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a  erm && nTerm );.
12710 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20    memset(pIter, 
12720 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72  0, sizeof(*pIter
12730 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65  ));.  pIter->pSe
12740 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20  g = pSeg;..  /* 
12750 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20  This block sets 
12760 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69  stack variable i
12770 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70  Pg to the leaf p
12780 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20  age number that 
12790 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  may.  ** contain
127a0 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65   term (pTerm/nTe
127b0 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20 70 72  rm), if it is pr
127c0 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67  esent in the seg
127d0 6d 65 6e 74 2e 20 2a 2f 0a 20 20 70 49 64 78 53  ment. */.  pIdxS
127e0 65 6c 65 63 74 20 3d 20 66 74 73 35 49 64 78 53  elect = fts5IdxS
127f0 65 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a 20 20  electStmt(p);.  
12800 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
12810 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  rn;.  sqlite3_bi
12820 6e 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63  nd_int(pIdxSelec
12830 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67  t, 1, pSeg->iSeg
12840 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  id);.  sqlite3_b
12850 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65 6c  ind_blob(pIdxSel
12860 65 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e  ect, 2, pTerm, n
12870 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41  Term, SQLITE_STA
12880 54 49 43 29 3b 0a 20 20 69 66 28 20 53 51 4c 49  TIC);.  if( SQLI
12890 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
128a0 73 74 65 70 28 70 49 64 78 53 65 6c 65 63 74 29  step(pIdxSelect)
128b0 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20   ){.    i64 val 
128c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
128d0 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74 2c  _int(pIdxSelect,
128e0 20 30 29 3b 0a 20 20 20 20 69 50 67 20 3d 20 28   0);.    iPg = (
128f0 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20  int)(val>>1);.  
12900 20 20 62 44 6c 69 64 78 20 3d 20 28 76 61 6c 20    bDlidx = (val 
12910 26 20 30 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20  & 0x0001);.  }. 
12920 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
12930 5f 72 65 73 65 74 28 70 49 64 78 53 65 6c 65 63  _reset(pIdxSelec
12940 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  t);.  sqlite3_bi
12950 6e 64 5f 6e 75 6c 6c 28 70 49 64 78 53 65 6c 65  nd_null(pIdxSele
12960 63 74 2c 20 32 29 3b 0a 0a 20 20 69 66 28 20 69  ct, 2);..  if( i
12970 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  Pg<pSeg->pgnoFir
12980 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d 20  st ){.    iPg = 
12990 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b  pSeg->pgnoFirst;
129a0 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30 3b  .    bDlidx = 0;
129b0 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 69  .  }..  pIter->i
129c0 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20 2d  LeafPgno = iPg -
129d0 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65   1;.  fts5SegIte
129e0 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
129f0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74 65  er);..  if( pIte
12a00 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  r->pLeaf ){.    
12a10 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c 20  fts5LeafSeek(p, 
12a20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65 72  bGe, pIter, pTer
12a30 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a  m, nTerm);.  }..
12a40 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12a50 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d 30  ITE_OK && bGe==0
12a60 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66   ){.    pIter->f
12a70 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
12a80 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
12a90 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
12aa0 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  af ){.      if( 
12ab0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
12ac0 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a  X_QUERY_DESC ){.
12ad0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66          pIter->f
12ae0 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
12af0 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20  ITER_REVERSE;.  
12b00 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
12b10 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  bDlidx ){.      
12b20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
12b30 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72 29  dDlidx(p, pIter)
12b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12b50 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
12b60 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
12b70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12b80 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28 70  SegIterReverse(p
12b90 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
12ba0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66  }.    }.  }..  f
12bb0 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
12bc0 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  t(p, pIter);..  
12bd0 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a 0a  /* Either:.  **.
12be0 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72 72    **   1) an err
12bf0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
12c00 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74 68   or.  **   2) th
12c10 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
12c20 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20 2a  s to EOF, or.  *
12c30 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72 61  *   3) the itera
12c40 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  tor points to an
12c50 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72 6d   entry with term
12c60 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20   (pTerm/nTerm), 
12c70 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68 65  or.  **   4) the
12c80 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
12c90 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20 73  _SCAN flag was s
12ca0 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  et and the itera
12cb0 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  tor points.  ** 
12cc0 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72 79       to an entry
12cd0 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72 65   with a term gre
12ce0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
12cf0 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54 65  al to (pTerm/nTe
12d00 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rm)..  */.  asse
12d10 72 74 5f 6e 63 28 20 70 2d 3e 72 63 21 3d 53 51  rt_nc( p->rc!=SQ
12d20 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20  LITE_OK         
12d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d50 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74 65   1 */.   || pIte
12d60 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20 20  r->pLeaf==0     
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20 2a            /* 2 *
12da0 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66  /.   || fts5Buff
12db0 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70  erCompareBlob(&p
12dc0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72  Iter->term, pTer
12dd0 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20 20  m, nTerm)==0    
12de0 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20        /* 3 */.  
12df0 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73 35   || (bGe && fts5
12e00 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f  BufferCompareBlo
12e10 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  b(&pIter->term, 
12e20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30 29  pTerm, nTerm)>0)
12e30 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d    /* 4 */.  );.}
12e40 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
12e50 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49  ze the object pI
12e60 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ter to point to 
12e70 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
12e80 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69   within the.** i
12e90 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
12ea0 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ble. If there is
12eb0 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e   no such term in
12ec0 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 2c   the hash-table,
12ed0 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f   the .** iterato
12ee0 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e  r is set to EOF.
12ef0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12f00 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
12f10 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
12f20 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
12f30 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
12f40 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
12f50 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
12f60 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
12f70 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
12f80 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
12f90 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
12fa0 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69  s5SegIterHashIni
12fb0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
12fc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12fd0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
12fe0 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  kend */.  const 
12ff0 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
13000 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
13010 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a  m to seek to */.
13020 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
13030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13040 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
13050 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73  5INDEX_XXX flags
13060 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
13070 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
13080 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
13090 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
130a0 7b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20  {.  int nList = 
130b0 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  0;.  const u8 *z
130c0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   = 0;.  int n = 
130d0 30 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  0;.  Fts5Data *p
130e0 4c 65 61 66 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Leaf = 0;..  ass
130f0 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b  ert( p->pHash );
13100 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
13110 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
13120 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c    if( pTerm==0 |
13130 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
13140 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
13150 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38   ){.    const u8
13160 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 0a 20 20   *pList = 0;..  
13170 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
13180 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
13190 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  t(p->pHash, (con
131a0 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
131b0 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
131c0 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
131d0 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  ntry(p->pHash, (
131e0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c  const char**)&z,
131f0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
13200 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28  ;.    n = (z ? (
13210 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73  int)strlen((cons
13220 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b  t char*)z) : 0);
13230 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 20 29  .    if( pList )
13240 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20  {.      pLeaf = 
13250 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
13260 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61   sizeof(Fts5Data
13270 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  ));.      if( pL
13280 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eaf ){.        p
13290 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
132a0 4c 69 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  List;.      }.  
132b0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
132c0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
132d0 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d  Fts5HashQuery(p-
132e0 3e 70 48 61 73 68 2c 20 73 69 7a 65 6f 66 28 46  >pHash, sizeof(F
132f0 74 73 35 44 61 74 61 29 2c 20 0a 20 20 20 20 20  ts5Data), .     
13300 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29     (const char*)
13310 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 28 76  pTerm, nTerm, (v
13320 6f 69 64 2a 2a 29 26 70 4c 65 61 66 2c 20 26 6e  oid**)&pLeaf, &n
13330 4c 69 73 74 0a 20 20 20 20 29 3b 0a 20 20 20 20  List.    );.    
13340 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
13350 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75     pLeaf->p = (u
13360 38 2a 29 26 70 4c 65 61 66 5b 31 5d 3b 0a 20 20  8*)&pLeaf[1];.  
13370 20 20 7d 0a 20 20 20 20 7a 20 3d 20 70 54 65 72    }.    z = pTer
13380 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d  m;.    n = nTerm
13390 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61  ;.    pIter->fla
133a0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
133b0 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 7d 0a  ER_ONETERM;.  }.
133c0 0a 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a  .  if( pLeaf ){.
133d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
133e0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
133f0 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
13400 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66 2d  , z);.    pLeaf-
13410 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  >nn = pLeaf->szL
13420 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
13430 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
13440 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
13450 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
13460 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
13470 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
13480 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
13490 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
134a0 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
134b0 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  >nn;..    if( fl
134c0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
134d0 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
134e0 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
134f0 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
13500 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
13510 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
13520 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
13530 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
13540 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
13550 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
13560 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
13570 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65  .  fts5SegIterSe
13580 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
13590 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
135a0 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
135b0 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
135c0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
135d0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
135e0 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
135f0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13600 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
13610 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
13620 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
13630 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
13640 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
13650 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
13660 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
13670 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
13680 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
13690 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
136a0 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
136b0 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
136c0 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
136d0 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
136e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
136f0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13700 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
13710 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
13720 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
13730 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
13740 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
13750 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
13760 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
13770 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
13780 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
13790 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
137a0 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
137b0 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
137c0 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
137d0 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
137e0 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
137f0 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
13800 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13810 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  t(.  Fts5Iter *p
13820 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
13830 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
13840 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
13850 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13860 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
13870 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
13880 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
13890 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
138a0 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
138b0 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
138c0 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
138d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
138e0 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
138f0 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
13900 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
13910 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13920 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13930 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
13940 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
13950 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
13960 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
13970 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
13980 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 31 2d  = fts5Memcmp(p1-
13990 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72  >term.p, p2->ter
139a0 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  m.p, nMin);.    
139b0 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
139c0 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20  es = p1->term.n 
139d0 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20  - p2->term.n;.. 
139e0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
139f0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
13a00 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
13a10 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
13a20 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69  ssert( p1->iRowi
13a30 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b  d!=p2->iRowid );
13a40 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
13a50 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
13a60 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
13a70 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31  ->bRev) ? -1 : 1
13a80 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
13a90 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13aa0 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
13ab0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13ac0 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
13ad0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13ae0 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
13af0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13b00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13b10 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
13b20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
13b30 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
13b40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13b50 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
13b60 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
13b70 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73  efined when this
13b80 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f   module.** is co
13b90 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20  mpiled. In that 
13ba0 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  case, this funct
13bb0 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c  ion is essential
13bc0 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a  ly an assert() .
13bd0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  ** statement use
13be0 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
13bf0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
13c00 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
13c10 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  st[] array.** ar
13c20 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  e correct..*/.st
13c30 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
13c40 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
13c50 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  up(Fts5Index *p,
13c60 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
13c70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
13c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13c90 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46   Fts5SegIter *pF
13ca0 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61  irst = &pIter->a
13cb0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
13cc0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
13cd0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
13ce0 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d  assert( (pFirst-
13cf0 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65  >pLeaf==0)==pIte
13d00 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b 0a  r->base.bEof );.
13d10 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
13d20 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  at pIter->iSwitc
13d30 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f  hRowid is set co
13d40 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
13d50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
13d60 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
13d70 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13d80 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
13d90 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  eg[i];.      ass
13da0 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20  ert( p1==pFirst 
13db0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13dc0 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20  1->pLeaf==0 .   
13dd0 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42          || fts5B
13de0 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46  ufferCompare(&pF
13df0 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d  irst->term, &p1-
13e00 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20  >term) .        
13e10 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64     || p1->iRowid
13e20 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
13e30 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  Rowid.          
13e40 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c   || (p1->iRowid<
13e50 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13e60 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
13e70 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  v.      );.    }
13e80 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
13e90 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
13ea0 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
13eb0 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13ec0 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
13ed0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13ee0 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
13ef0 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46  eg[i+1];.      F
13f00 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13f10 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13f20 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b  t[(pIter->nSeg +
13f30 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20   i) / 2];.      
13f40 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
13f50 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
13f60 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
13f70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
13f80 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e  i=1; i<(pIter->n
13f90 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b  Seg / 2); i+=2){
13fa0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13fb0 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13fc0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
13fd0 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74  irst[i*2].iFirst
13fe0 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ];.      Fts5Se
13ff0 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
14000 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
14010 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69  >aFirst[i*2+1].i
14020 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
14030 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
14040 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
14050 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  t[i];.      fts5
14060 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
14070 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
14080 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
14090 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
140a0 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65   define fts5Asse
140b0 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
140c0 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
140d0 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61  .** Do the compa
140e0 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20  rison necessary 
140f0 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65  to populate pIte
14100 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e  r->aFirst[iOut].
14110 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
14120 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
14130 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
14140 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
14150 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  f an entry.** in
14160 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67   the pIter->aSeg
14170 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73  [] array that is
14180 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c   (a) not at EOF,
14190 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e   and (b) pointin
141a0 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68  g.** to a key th
141b0 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  at is a duplicat
141c0 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69  e of another, hi
141d0 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a  gher priority, .
141e0 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61  ** segment-itera
141f0 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d  tor in the pSeg-
14200 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aSeg[] array..*
14210 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
14220 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
14230 61 72 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  are(Fts5Iter *pI
14240 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a  ter, int iOut){.
14250 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20    int i1;       
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14270 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65    /* Index of le
14280 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
14290 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b  ter */.  int i2;
142a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142b0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
142c0 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  x of right-hand 
142d0 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
142e0 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73   int iRes;.  Fts
142f0 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20  5SegIter *p1;   
14300 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14310 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  Left-hand Fts5Se
14320 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53  gIter */.  Fts5S
14330 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20  egIter *p2;     
14340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
14350 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  ght-hand Fts5Seg
14360 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52  Iter */.  Fts5CR
14370 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
14380 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
14390 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  t];..  assert( i
143a0 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20  Out<pIter->nSeg 
143b0 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61  && iOut>0 );.  a
143c0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52  ssert( pIter->bR
143d0 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e  ev==0 || pIter->
143e0 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  bRev==1 );..  if
143f0 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e  ( iOut>=(pIter->
14400 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69  nSeg/2) ){.    i
14410 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65  1 = (iOut - pIte
14420 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a  r->nSeg/2) * 2;.
14430 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b      i2 = i1 + 1;
14440 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31  .  }else{.    i1
14450 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
14460 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b  [iOut*2].iFirst;
14470 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d  .    i2 = pIter-
14480 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31  >aFirst[iOut*2+1
14490 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20  ].iFirst;.  }.  
144a0 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
144b0 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70  g[i1];.  p2 = &p
144c0 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a  Iter->aSeg[i2];.
144d0 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  .  pRes->bTermEq
144e0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e   = 0;.  if( p1->
144f0 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
14500 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69        /* If p1 i
14510 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
14520 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c  iRes = i2;.  }el
14530 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
14540 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66  ==0 ){     /* If
14550 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p2 is at EOF */
14560 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a  .    iRes = i1;.
14570 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
14580 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
14590 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65  rCompare(&p1->te
145a0 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a  rm, &p2->term);.
145b0 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
145c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e  {.      assert_n
145d0 63 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  c( i2>i1 );.    
145e0 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 32 21    assert_nc( i2!
145f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73  =0 );.      pRes
14600 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20  ->bTermEq = 1;. 
14610 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f       if( p1->iRo
14620 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20  wid==p2->iRowid 
14630 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62  ){.        p1->b
14640 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a  Del = p2->bDel;.
14650 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
14660 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
14670 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f   res = ((p1->iRo
14680 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64  wid > p2->iRowid
14690 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20  )==pIter->bRev) 
146a0 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d  ? -1 : +1;.    }
146b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73  .    assert( res
146c0 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72  !=0 );.    if( r
146d0 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52  es<0 ){.      iR
146e0 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c  es = i1;.    }el
146f0 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d  se{.      iRes =
14700 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   i2;.    }.  }..
14710 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d    pRes->iFirst =
14720 20 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65   (u16)iRes;.  re
14730 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
14740 20 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74   Move the seg-it
14750 65 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f  er so that it po
14760 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
14770 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20  t rowid on page 
14780 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74  iLeafPgno..** It
14790 20 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20   is an error if 
147a0 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64  leaf iLeafPgno d
147b0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
147c0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77   contains no row
147d0 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ids..*/.static v
147e0 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47  oid fts5SegIterG
147f0 6f 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49  otoPage(.  Fts5I
14800 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
14810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
14820 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
14830 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
14840 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20  er *pIter,      
14850 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
14860 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f  or to advance */
14870 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
14880 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c  .){.  assert( iL
14890 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
148a0 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69  LeafPgno );..  i
148b0 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  f( iLeafPgno>pIt
148c0 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  er->pSeg->pgnoLa
148d0 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  st ){.    p->rc 
148e0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
148f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
14900 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
14910 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a  er->pNextLeaf);.
14920 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74      pIter->pNext
14930 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49  Leaf = 0;.    pI
14940 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d  ter->iLeafPgno =
14950 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20   iLeafPgno-1;.  
14960 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
14970 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
14980 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
14990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
149a0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
149b0 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  o==iLeafPgno );.
149c0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
149d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
149e0 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
149f0 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72     u8 *a = pIter
14a00 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
14a10 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d    int n = pIter-
14a20 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a  >pLeaf->szLeaf;.
14a30 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
14a40 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
14a50 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  Off(pIter->pLeaf
14a60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  );.      if( iOf
14a70 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29  f<4 || iOff>=n )
14a80 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
14a90 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
14aa0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14ab0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
14ac0 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
14ad0 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
14ae0 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
14af0 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
14b00 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
14b10 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
14b20 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
14b30 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
14b40 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14b50 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
14b60 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
14b70 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
14b80 65 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20  ent until it is 
14b90 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72  at or .** past r
14ba0 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61  owid iFrom. Rega
14bb0 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
14bc0 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68  lue of iFrom, th
14bd0 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a  e iterator is.**
14be0 20 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64   always advanced
14bf0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a   at least once..
14c00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
14c10 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72  ts5SegIterNextFr
14c20 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  om(.  Fts5Index 
14c30 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
14c40 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
14c50 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
14c60 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
14c70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
14c80 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
14c90 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36   advance */.  i6
14ca0 34 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20  4 iMatch        
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14cc0 20 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f   Advance iterato
14cd0 72 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20  r at least this 
14ce0 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  far */.){.  int 
14cf0 62 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66  bRev = (pIter->f
14d00 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
14d10 54 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20  TER_REVERSE);.  
14d20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
14d30 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Dlidx = pIter->p
14d40 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65  Dlidx;.  int iLe
14d50 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e  afPgno = pIter->
14d60 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74  iLeafPgno;.  int
14d70 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61   bMove = 1;..  a
14d80 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
14d90 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
14da0 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20  ER_ONETERM );.  
14db0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
14dc0 44 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72  Dlidx );.  asser
14dd0 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  t( pIter->pLeaf 
14de0 29 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d  );..  if( bRev==
14df0 30 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  0 ){.    while( 
14e00 21 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f  !fts5DlidxIterEo
14e10 66 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20  f(p, pDlidx) && 
14e20 69 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78  iMatch>fts5Dlidx
14e30 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
14e40 29 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66  ) ){.      iLeaf
14e50 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  Pgno = fts5Dlidx
14e60 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
14e70 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
14e80 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
14e90 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  idx);.    }.    
14ea0 61 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66  assert_nc( iLeaf
14eb0 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno>=pIter->iLe
14ec0 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20  afPgno || p->rc 
14ed0 29 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66  );.    if( iLeaf
14ee0 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
14ef0 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66  fPgno ){.      f
14f00 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61  ts5SegIterGotoPa
14f10 67 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65  ge(p, pIter, iLe
14f20 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62  afPgno);.      b
14f30 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Move = 0;.    }.
14f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
14f50 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78  ert( pIter->pNex
14f60 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20  tLeaf==0 );.    
14f70 61 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70  assert( iMatch<p
14f80 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a  Iter->iRowid );.
14f90 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35      while( !fts5
14fa0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
14fb0 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63  pDlidx) && iMatc
14fc0 68 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  h<fts5DlidxIterR
14fd0 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a  owid(pDlidx) ){.
14fe0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
14ff0 74 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64  terPrev(p, pDlid
15000 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c  x);.    }.    iL
15010 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c  eafPgno = fts5Dl
15020 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
15030 64 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  dx);..    assert
15040 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45  ( fts5DlidxIterE
15050 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c  of(p, pDlidx) ||
15060 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65   iLeafPgno<=pIte
15070 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  r->iLeafPgno );.
15080 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67  .    if( iLeafPg
15090 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no<pIter->iLeafP
150a0 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74  gno ){.      pIt
150b0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
150c0 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20  iLeafPgno+1;.   
150d0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
150e0 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
150f0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d  pIter);.      bM
15100 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
15110 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66   }..  do{.    if
15120 28 20 62 4d 6f 76 65 20 26 26 20 70 2d 3e 72 63  ( bMove && p->rc
15130 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 49  ==SQLITE_OK ) pI
15140 74 65 72 2d 3e 78 4e 65 78 74 28 70 2c 20 70 49  ter->xNext(p, pI
15150 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ter, 0);.    if(
15160 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30   pIter->pLeaf==0
15170 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
15180 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74  ( bRev==0 && pIt
15190 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74  er->iRowid>=iMat
151a0 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
151b0 69 66 28 20 62 52 65 76 21 3d 30 20 26 26 20 70  if( bRev!=0 && p
151c0 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d  Iter->iRowid<=iM
151d0 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
151e0 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d    bMove = 1;.  }
151f0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
15200 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f  LITE_OK );.}.../
15210 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74  *.** Free the it
15220 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61  erator object pa
15230 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15240 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
15250 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15260 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 46 74  MultiIterFree(Ft
15270 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
15280 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20    if( pIter ){. 
15290 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
152a0 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
152b0 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
152c0 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65    fts5SegIterCle
152d0 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  ar(&pIter->aSeg[
152e0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
152f0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
15300 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
15310 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15320 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pIter);.  }.}..
15330 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
15340 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
15350 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
15360 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
15370 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
15380 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
15390 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
153a0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
153b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
153c0 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74  terator to updat
153d0 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79  e aFirst[] array
153e0 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43   for */.  int iC
153f0 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20  hanged,         
15400 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
15410 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74  ex of sub-iterat
15420 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64  or just advanced
15430 20 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65   */.  int iMinse
15440 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
15450 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
15460 20 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74   entry in aFirst
15470 5b 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a  [] to set */.){.
15480 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
15490 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43  =(pIter->nSeg+iC
154a0 68 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d  hanged)/2; i>=iM
154b0 69 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d  inset && p->rc==
154c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32  SQLITE_OK; i=i/2
154d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  ){.    int iEq;.
154e0 20 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66      if( (iEq = f
154f0 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f  ts5MultiIterDoCo
15500 6d 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29  mpare(pIter, i))
15510 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ){.      Fts5Se
15520 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
15530 49 74 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 3b  Iter->aSeg[iEq];
15540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
15550 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15560 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
15570 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 30 29  Next(p, pSeg, 0)
15580 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74 65  ;.      i = pIte
15590 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20  r->nSeg + iEq;. 
155a0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
155b0 2a 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20 69  * Sub-iterator i
155c0 43 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72 61  Changed of itera
155d0 74 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a 75  tor pIter has ju
155e0 73 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65 64  st been advanced
155f0 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f  . It still.** po
15600 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ints to the same
15610 20 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a   term though - j
15620 75 73 74 20 61 20 64 69 66 66 65 72 65 6e 74 20  ust a different 
15630 72 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e 63  rowid. This func
15640 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73  tion.** attempts
15650 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
15660 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
15670 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
15680 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49  ccordingly..** I
15690 66 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75 63  f it does so suc
156a0 63 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73 20  cessfully, 0 is 
156b0 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
156c0 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ise 1..**.** If 
156d0 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74 75  non-zero is retu
156e0 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65 72  rned, the caller
156f0 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73   should call fts
15700 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
15710 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69  ed().** on the i
15720 74 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64 2e  terator instead.
15730 20 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20 64   That function d
15740 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73 20  oes the same as 
15750 74 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70 74  this one, except
15760 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61 6c  .** that it deal
15770 73 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70  s with more comp
15780 6c 69 63 61 74 65 64 20 63 61 73 65 73 20 61 73  licated cases as
15790 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69   well..*/ .stati
157a0 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
157b0 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
157c0 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
157d0 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
157e0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
157f0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
15800 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
15810 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
15820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15830 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
15840 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
15850 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 46 74 73  dvanced */.  Fts
15860 35 53 65 67 49 74 65 72 20 2a 2a 70 70 46 69 72  5SegIter **ppFir
15870 73 74 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49  st.){.  Fts5SegI
15880 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74  ter *pNew = &pIt
15890 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
158a0 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d  d];..  if( pNew-
158b0 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
158c0 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
158d0 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64  || (pNew->iRowid
158e0 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
158f0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
15900 65 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  ev.  ){.    int 
15910 69 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  i;.    Fts5SegIt
15920 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
15930 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
15940 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20  ed ^ 0x0001];.  
15950 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
15960 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62  Rowid = pIter->b
15970 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  Rev ? SMALLEST_I
15980 4e 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49  NT64 : LARGEST_I
15990 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NT64;.    for(i=
159a0 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
159b0 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69  anged)/2; 1; i=i
159c0 2f 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  /2){.      Fts5C
159d0 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
159e0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
159f0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
15a00 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a   pNew->pLeaf );.
15a10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
15a20 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
15a30 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
15a40 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  );..      if( pR
15a50 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20  es->bTermEq ){. 
15a60 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
15a70 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
15a80 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
15a90 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
15aa0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15ab0 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
15ac0 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d  >pNew->iRowid)==
15ad0 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
15ae0 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
15af0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15b00 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15b10 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
15b20 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20  pOther;.        
15b30 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
15b40 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d  r->iRowid>pIter-
15b50 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
15b60 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
15b70 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
15b80 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15b90 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
15ba0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
15bb0 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69  .      pRes->iFi
15bc0 72 73 74 20 3d 20 28 75 31 36 29 28 70 4e 65 77  rst = (u16)(pNew
15bd0 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b   - pIter->aSeg);
15be0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
15bf0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
15c00 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
15c10 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15c20 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d  irst[i ^ 0x0001]
15c30 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d  .iFirst ];.    }
15c40 0a 20 20 7d 0a 0a 20 20 2a 70 70 46 69 72 73 74  .  }..  *ppFirst
15c50 20 3d 20 70 4e 65 77 3b 0a 20 20 72 65 74 75 72   = pNew;.  retur
15c60 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
15c70 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f  t the pIter->bEo
15c80 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64  f variable based
15c90 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66   on the state of
15ca0 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f   the sub-iterato
15cb0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
15cc0 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
15cd0 53 65 74 45 6f 66 28 46 74 73 35 49 74 65 72 20  SetEof(Fts5Iter 
15ce0 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53  *pIter){.  Fts5S
15cf0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
15d00 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
15d10 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
15d20 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d  irst ];.  pIter-
15d30 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 70 53 65  >base.bEof = pSe
15d40 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70  g->pLeaf==0;.  p
15d50 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
15d60 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
15d70 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
15d80 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
15d90 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
15da0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
15db0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
15dc0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
15dd0 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
15de0 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
15df0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
15e00 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
15e10 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
15e20 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
15e30 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
15e40 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
15e50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
15e60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
15e70 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
15e80 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
15e90 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49   .  Fts5Iter *pI
15ea0 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d  ter,.  int bFrom
15eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15ec0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
15ed0 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d  f argument iFrom
15ee0 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69   is valid */.  i
15ef0 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20  64 iFrom        
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15f10 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61  * Advance at lea
15f20 73 74 20 61 73 20 66 61 72 20 61 73 20 74 68 69  st as far as thi
15f30 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 55  s */.){.  int bU
15f40 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
15f50 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
15f60 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 3b  >base.bEof==0 );
15f70 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
15f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15f90 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
15fa0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15fb0 69 46 69 72 73 74 3b 0a 20 20 20 20 69 6e 74 20  iFirst;.    int 
15fc0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
15fd0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15fe0 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
15ff0 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  eg[iFirst];.    
16000 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
16010 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
16020 69 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20  if( bUseFrom && 
16030 70 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a  pSeg->pDlidx ){.
16040 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
16050 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65  rNextFrom(p, pSe
16060 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 7d  g, iFrom);.    }
16070 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 53 65 67  else{.      pSeg
16080 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
16090 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
160a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 53 65 67   }..    if( pSeg
160b0 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e  ->pLeaf==0 || bN
160c0 65 77 54 65 72 6d 20 0a 20 20 20 20 20 7c 7c 20  ewTerm .     || 
160d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
160e0 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c  anceRowid(pIter,
160f0 20 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a   iFirst, &pSeg).
16100 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 74 73      ){.      fts
16110 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
16120 65 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  ed(p, pIter, iFi
16130 72 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 66  rst, 1);.      f
16140 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
16150 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
16160 20 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e   pSeg = &pIter->
16170 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
16180 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
16190 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
161a0 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
161b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
161c0 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
161d0 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b  Setup(p, pIter);
161e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
161f0 67 3d 3d 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  g==&pIter->aSeg[
16200 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
16210 2e 69 46 69 72 73 74 5d 20 26 26 20 70 53 65 67  .iFirst] && pSeg
16220 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 69  ->pLeaf );.    i
16230 66 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45  f( pIter->bSkipE
16240 6d 70 74 79 3d 3d 30 20 7c 7c 20 70 53 65 67 2d  mpty==0 || pSeg-
16250 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 70  >nPos ){.      p
16260 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
16270 73 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a  s(pIter, pSeg);.
16280 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
16290 20 20 7d 0a 20 20 20 20 62 55 73 65 46 72 6f 6d    }.    bUseFrom
162a0 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61   = 0;.  }.}..sta
162b0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
162c0 74 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46  tiIterNext2(.  F
162d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
162e0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
162f0 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72  .  int *pbNewTer
16300 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
16310 20 20 20 2f 2a 20 4f 55 54 3a 20 54 72 75 65 20     /* OUT: True 
16320 69 66 20 2a 6d 69 67 68 74 2a 20 62 65 20 6e 65  if *might* be ne
16330 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61  w term */.){.  a
16340 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 53  ssert( pIter->bS
16350 6b 69 70 45 6d 70 74 79 20 29 3b 0a 20 20 69 66  kipEmpty );.  if
16360 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16370 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 62 4e 65 77  OK ){.    *pbNew
16380 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 64 6f  Term = 0;.    do
16390 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72  {.      int iFir
163a0 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
163b0 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
163c0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
163d0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
163e0 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
163f0 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
16400 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 61 73 73   = 0;..      ass
16410 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
16420 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70  TE_OK );.      p
16430 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53  Seg->xNext(p, pS
16440 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a  eg, &bNewTerm);.
16450 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
16460 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77  pLeaf==0 || bNew
16470 54 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20  Term .       || 
16480 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
16490 61 6e 63 65 52 6f 77 69 64 28 70 49 74 65 72 2c  anceRowid(pIter,
164a0 20 69 46 69 72 73 74 2c 20 26 70 53 65 67 29 0a   iFirst, &pSeg).
164b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
164c0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
164d0 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
164e0 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
164f0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
16500 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
16510 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54  .        *pbNewT
16520 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
16530 0a 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72  .      fts5Asser
16540 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
16550 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
16560 7d 77 68 69 6c 65 28 20 66 74 73 35 4d 75 6c 74  }while( fts5Mult
16570 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
16580 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a  pIter) );.  }.}.
16590 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
165a0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
165b0 4e 6f 6f 70 28 46 74 73 35 49 74 65 72 20 2a 70  Noop(Fts5Iter *p
165c0 55 6e 75 73 65 64 31 2c 20 46 74 73 35 53 65 67  Unused1, Fts5Seg
165d0 49 74 65 72 20 2a 70 55 6e 75 73 65 64 32 29 7b  Iter *pUnused2){
165e0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 32  .  UNUSED_PARAM2
165f0 28 70 55 6e 75 73 65 64 31 2c 20 70 55 6e 75 73  (pUnused1, pUnus
16600 65 64 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  ed2);.}..static 
16610 46 74 73 35 49 74 65 72 20 2a 66 74 73 35 4d 75  Fts5Iter *fts5Mu
16620 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20  ltiIterAlloc(.  
16630 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
16660 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
16670 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a  n */.  int nSeg.
16680 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
16690 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74  New;.  int nSlot
166a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
166b0 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20         /* Power 
166c0 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a  of two >= nSeg *
166d0 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32  /..  for(nSlot=2
166e0 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53  ; nSlot<nSeg; nS
166f0 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20  lot=nSlot*2);.  
16700 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61  pNew = fts5IdxMa
16710 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73  lloc(p, .      s
16720 69 7a 65 6f 66 28 46 74 73 35 49 74 65 72 29 20  izeof(Fts5Iter) 
16730 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
16740 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20     /* pNew */.  
16750 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
16760 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74  egIter) * (nSlot
16770 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d  -1) +   /* pNew-
16780 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20  >aSeg[] */.     
16790 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73   sizeof(Fts5CRes
167a0 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20  ult) * nSlot    
167b0 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46       /* pNew->aF
167c0 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20  irst[] */.  );. 
167d0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
167e0 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53   pNew->nSeg = nS
167f0 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  lot;.    pNew->a
16800 46 69 72 73 74 20 3d 20 28 46 74 73 35 43 52 65  First = (Fts5CRe
16810 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65  sult*)&pNew->aSe
16820 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e  g[nSlot];.    pN
16830 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a  ew->pIndex = p;.
16840 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75      pNew->xSetOu
16850 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
16860 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 3b  SetOutputs_Noop;
16870 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
16880 65 77 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  ew;.}..static vo
16890 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61  id fts5PoslistCa
168a0 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
168b0 64 65 78 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20  dex *pUnused, . 
168c0 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
168d0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
168e0 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
168f0 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  .){.  UNUSED_PAR
16900 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61  AM(pUnused);.  a
16910 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b  ssert_nc( nChunk
16920 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68  >=0 );.  if( nCh
16930 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74 73  unk>0 ){.    fts
16940 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
16950 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66 65  dBlob((Fts5Buffe
16960 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43 68  r*)pContext, pCh
16970 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20  unk, nChunk);.  
16980 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  }.}..typedef str
16990 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62  uct PoslistCallb
169a0 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43 61  ackCtx PoslistCa
169b0 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75 63  llbackCtx;.struc
169c0 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  t PoslistCallbac
169d0 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66  kCtx {.  Fts5Buf
169e0 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20  fer *pBuf;      
169f0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
16a00 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  nd to this buffe
16a10 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  r */.  Fts5Colse
16a20 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20  t *pColset;     
16a30 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
16a40 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68  ct matches to th
16a50 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69  is column */.  i
16a60 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20 20  nt eState;      
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16a80 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d  * See above */.}
16a90 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
16aa0 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  t PoslistOffsets
16ab0 43 74 78 20 50 6f 73 6c 69 73 74 4f 66 66 73 65  Ctx PoslistOffse
16ac0 74 73 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f  tsCtx;.struct Po
16ad0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20  slistOffsetsCtx 
16ae0 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  {.  Fts5Buffer *
16af0 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
16b00 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f      /* Append to
16b10 20 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a   this buffer */.
16b20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
16b30 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  olset;          
16b40 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
16b50 74 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f  tches to this co
16b60 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 52  lumn */.  int iR
16b70 65 61 64 3b 0a 20 20 69 6e 74 20 69 57 72 69 74  ead;.  int iWrit
16b80 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44  e;.};../*.** TOD
16b90 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72  O: Make this mor
16ba0 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a  e efficient!.*/.
16bb0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
16bc0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 46  ndexColsetTest(F
16bd0 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
16be0 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20  et, int iCol){. 
16bf0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
16c00 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43  0; i<pColset->nC
16c10 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ol; i++){.    if
16c20 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  ( pColset->aiCol
16c30 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75  [i]==iCol ) retu
16c40 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
16c50 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn 0;.}..static 
16c60 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
16c70 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b 28  OffsetsCallback(
16c80 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55  .  Fts5Index *pU
16c90 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20 2a  nused, .  void *
16ca0 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
16cb0 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
16cc0 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50  nt nChunk.){.  P
16cd0 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78  oslistOffsetsCtx
16ce0 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73   *pCtx = (Poslis
16cf0 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43 6f  tOffsetsCtx*)pCo
16d00 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44 5f  ntext;.  UNUSED_
16d10 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b 0a  PARAM(pUnused);.
16d20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
16d30 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
16d40 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
16d50 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 77  int i = 0;.    w
16d60 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29  hile( i<nChunk )
16d70 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c  {.      int iVal
16d80 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  ;.      i += fts
16d90 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 43  5GetVarint32(&pC
16da0 68 75 6e 6b 5b 69 5d 2c 20 69 56 61 6c 29 3b 0a  hunk[i], iVal);.
16db0 20 20 20 20 20 20 69 56 61 6c 20 2b 3d 20 70 43        iVal += pC
16dc0 74 78 2d 3e 69 52 65 61 64 20 2d 20 32 3b 0a 20  tx->iRead - 2;. 
16dd0 20 20 20 20 20 70 43 74 78 2d 3e 69 52 65 61 64       pCtx->iRead
16de0 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 69   = iVal;.      i
16df0 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  f( fts5IndexCols
16e00 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f  etTest(pCtx->pCo
16e10 6c 73 65 74 2c 20 69 56 61 6c 29 20 29 7b 0a 20  lset, iVal) ){. 
16e20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
16e30 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
16e40 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 69 56  t(pCtx->pBuf, iV
16e50 61 6c 20 2b 20 32 20 2d 20 70 43 74 78 2d 3e 69  al + 2 - pCtx->i
16e60 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Write);.        
16e70 70 43 74 78 2d 3e 69 57 72 69 74 65 20 3d 20 69  pCtx->iWrite = i
16e80 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Val;.      }.   
16e90 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
16ea0 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
16eb0 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28  tFilterCallback(
16ec0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 55  .  Fts5Index *pU
16ed0 6e 75 73 65 64 2c 0a 20 20 76 6f 69 64 20 2a 70  nused,.  void *p
16ee0 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73  Context, .  cons
16ef0 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
16f00 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50 6f  t nChunk.){.  Po
16f10 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16f20 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69 73   *pCtx = (Poslis
16f30 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70 43  tCallbackCtx*)pC
16f40 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55 53 45 44  ontext;.  UNUSED
16f50 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
16f60 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
16f70 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
16f80 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
16f90 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75   /* Search throu
16fa0 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66  gh to find the f
16fb0 69 72 73 74 20 76 61 72 69 6e 74 20 77 69 74 68  irst varint with
16fc0 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69   value 1. This i
16fd0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61  s the.    ** sta
16fe0 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63  rt of the next c
16ff0 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a  olumns hits. */.
17000 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
17010 20 20 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20     int iStart = 
17020 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78  0;..    if( pCtx
17030 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20  ->eState==2 ){. 
17040 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20       int iCol;. 
17050 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
17060 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c  Varint32(pChunk,
17070 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20   i, iCol);.     
17080 20 69 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f   if( fts5IndexCo
17090 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70  lsetTest(pCtx->p
170a0 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b  Colset, iCol) ){
170b0 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65  .        pCtx->e
170c0 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  State = 1;.     
170d0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
170e0 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43  eAppendVarint(pC
170f0 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20  tx->pBuf, 1);.  
17100 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17110 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
17120 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
17130 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   }..    do {.   
17140 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75     while( i<nChu
17150 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21  nk && pChunk[i]!
17160 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20  =0x01 ){.       
17170 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69   while( pChunk[i
17180 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a  ] & 0x80 ) i++;.
17190 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
171a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
171b0 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Ctx->eState ){. 
171c0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
171d0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
171e0 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68  pCtx->pBuf, &pCh
171f0 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69  unk[iStart], i-i
17200 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Start);.      }.
17210 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75        if( i<nChu
17220 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  nk ){.        in
17230 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  t iCol;.        
17240 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20  iStart = i;.    
17250 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20      i++;.       
17260 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29   if( i>=nChunk )
17270 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78  {.          pCtx
17280 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20  ->eState = 2;.  
17290 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
172a0 20 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47         fts5FastG
172b0 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e  etVarint32(pChun
172c0 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  k, i, iCol);.   
172d0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
172e0 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43  ate = fts5IndexC
172f0 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e  olsetTest(pCtx->
17300 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a  pColset, iCol);.
17310 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
17320 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  tx->eState ){.  
17330 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
17340 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
17350 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26  ob(pCtx->pBuf, &
17360 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20  pChunk[iStart], 
17370 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20  i-iStart);.     
17380 20 20 20 20 20 20 20 69 53 74 61 72 74 20 3d 20         iStart = 
17390 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  i;.          }. 
173a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
173b0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  .    }while( i<n
173c0 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Chunk );.  }.}..
173d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
173e0 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20  ChunkIterate(.  
173f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
17400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17410 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  /* Index object 
17420 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
17430 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20   *pSeg,         
17440 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20       /* Poslist 
17450 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  of this iterator
17460 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   */.  void *pCtx
17470 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17480 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
17490 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68   pointer for xCh
174a0 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  unk callback */.
174b0 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29    void (*xChunk)
174c0 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69  (Fts5Index*, voi
174d0 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69  d*, const u8*, i
174e0 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nt).){.  int nRe
174f0 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20  m = pSeg->nPos; 
17500 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
17510 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c  er of bytes stil
17520 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46  l to come */.  F
17530 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
17540 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b   0;.  u8 *pChunk
17550 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
17560 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
17570 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68  fset];.  int nCh
17580 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
17590 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
175a0 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61  eaf - pSeg->iLea
175b0 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20  fOffset);.  int 
175c0 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65  pgno = pSeg->iLe
175d0 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67  afPgno;.  int pg
175e0 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 2f  noSave = 0;..  /
175f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17600 64 6f 65 73 20 6e 6f 74 6d 77 6f 72 6b 20 77 69  does notmwork wi
17610 74 68 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 64  th detail=none d
17620 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20 61  atabases. */.  a
17630 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69  ssert( p->pConfi
17640 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35  g->eDetail!=FTS5
17650 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a  _DETAIL_NONE );.
17660 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c  .  if( (pSeg->fl
17670 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
17680 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29  ER_REVERSE)==0 )
17690 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d  {.    pgnoSave =
176a0 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20   pgno+1;.  }..  
176b0 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20  while( 1 ){.    
176c0 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20  xChunk(p, pCtx, 
176d0 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b  pChunk, nChunk);
176e0 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68  .    nRem -= nCh
176f0 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74  unk;.    fts5Dat
17700 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
17710 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30  .    if( nRem<=0
17720 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
17730 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17740 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20    pgno++;.      
17750 70 44 61 74 61 20 3d 20 66 74 73 35 4c 65 61 66  pData = fts5Leaf
17760 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
17770 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
17780 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  >pSeg->iSegid, p
17790 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28  gno));.      if(
177a0 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61   pData==0 ) brea
177b0 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20  k;.      pChunk 
177c0 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a  = &pData->p[4];.
177d0 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d        nChunk = M
177e0 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e  IN(nRem, pData->
177f0 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20  szLeaf - 4);.   
17800 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e     if( pgno==pgn
17810 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20  oSave ){.       
17820 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70   assert( pSeg->p
17830 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
17840 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65         pSeg->pNe
17850 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a  xtLeaf = pData;.
17860 20 20 20 20 20 20 20 20 70 44 61 74 61 20 3d 20          pData = 
17870 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
17880 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  .  }.}../*.** It
17890 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
178a0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
178b0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28   a valid entry (
178c0 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a  not EOF). This.*
178d0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
178e0 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  ds the position 
178f0 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20 74 68  list data for th
17900 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20  e current entry 
17910 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  to.** buffer pBu
17920 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d  f. It does not m
17930 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
17940 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
17950 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a  size.** field..*
17960 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17970 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
17980 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
17990 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  ,.  Fts5SegIter 
179a0 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43 6f 6c  *pSeg,.  Fts5Col
179b0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a 20 20  set *pColset,.  
179c0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
179d0 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66 74 73  .){.  if( 0==fts
179e0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
179f0 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e  rc, pBuf, pSeg->
17a00 6e 50 6f 73 2b 46 54 53 35 5f 44 41 54 41 5f 5a  nPos+FTS5_DATA_Z
17a10 45 52 4f 5f 50 41 44 44 49 4e 47 29 20 29 7b 0a  ERO_PADDING) ){.
17a20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 42 75 66      memset(&pBuf
17a30 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 70 53 65 67  ->p[pBuf->n+pSeg
17a40 2d 3e 6e 50 6f 73 5d 2c 20 30 2c 20 46 54 53 35  ->nPos], 0, FTS5
17a50 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
17a60 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  NG);.    if( pCo
17a70 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lset==0 ){.     
17a80 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74   fts5ChunkIterat
17a90 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64  e(p, pSeg, (void
17aa0 2a 29 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c  *)pBuf, fts5Posl
17ab0 69 73 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  istCallback);.  
17ac0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
17ad0 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65  f( p->pConfig->e
17ae0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
17af0 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  AIL_FULL ){.    
17b00 20 20 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62      PoslistCallb
17b10 61 63 6b 43 74 78 20 73 43 74 78 3b 0a 20 20 20  ackCtx sCtx;.   
17b20 20 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d       sCtx.pBuf =
17b30 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73   pBuf;.        s
17b40 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43  Ctx.pColset = pC
17b50 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 73  olset;.        s
17b60 43 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73  Ctx.eState = fts
17b70 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
17b80 28 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20  (pColset, 0);.  
17b90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 43        assert( sC
17ba0 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20  tx.eState==0 || 
17bb0 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20 29  sCtx.eState==1 )
17bc0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68  ;.        fts5Ch
17bd0 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53  unkIterate(p, pS
17be0 65 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78  eg, (void*)&sCtx
17bf0 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c  , fts5PoslistFil
17c00 74 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  terCallback);.  
17c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17c20 20 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74     PoslistOffset
17c30 73 43 74 78 20 73 43 74 78 3b 0a 20 20 20 20 20  sCtx sCtx;.     
17c40 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74 78 2c     memset(&sCtx,
17c50 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74 78 29   0, sizeof(sCtx)
17c60 29 3b 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e  );.        sCtx.
17c70 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20  pBuf = pBuf;.   
17c80 20 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65       sCtx.pColse
17c90 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20  t = pColset;.   
17ca0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
17cb0 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28  erate(p, pSeg, (
17cc0 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73  void*)&sCtx, fts
17cd0 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43  5PoslistOffsetsC
17ce0 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
17cf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
17d00 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20 70 61 72 61  *.** IN/OUT para
17d10 6d 65 74 65 72 20 28 2a 70 61 29 20 70 6f 69 6e  meter (*pa) poin
17d20 74 73 20 74 6f 20 61 20 70 6f 73 69 74 69 6f 6e  ts to a position
17d30 20 6c 69 73 74 20 6e 20 62 79 74 65 73 20 69 6e   list n bytes in
17d40 20 73 69 7a 65 2e 20 49 66 0a 2a 2a 20 74 68 65   size. If.** the
17d50 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
17d60 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20  ontains entries 
17d70 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c  for column iCol,
17d80 20 74 68 65 6e 20 28 2a 70 61 29 20 69 73 20 73   then (*pa) is s
17d90 65 74 0a 2a 2a 20 74 6f 20 70 6f 69 6e 74 20 74  et.** to point t
17da0 6f 20 74 68 65 20 73 75 62 2d 70 6f 73 69 74 69  o the sub-positi
17db0 6f 6e 2d 6c 69 73 74 20 66 6f 72 20 74 68 61 74  on-list for that
17dc0 20 63 6f 6c 75 6d 6e 20 61 6e 64 20 74 68 65 20   column and the 
17dd0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 62 79 74  number of.** byt
17de0 65 73 20 69 6e 20 69 74 20 72 65 74 75 72 6e 65  es in it returne
17df0 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 61 72  d. Or, if the ar
17e00 67 75 6d 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20  gument position 
17e10 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  list does not.**
17e20 20 63 6f 6e 74 61 69 6e 20 61 6e 79 20 65 6e 74   contain any ent
17e30 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  ries for column 
17e40 69 43 6f 6c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  iCol, return 0..
17e50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
17e60 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
17e70 6c 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a  l(.  const u8 **
17e80 70 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pa,             
17e90 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
17ea0 50 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 6c 69  Pointer to posli
17eb0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  st */.  int n,  
17ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ed0 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 3a 20 53          /* IN: S
17ee0 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73 74 20 69  ize of poslist i
17ef0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
17f00 20 69 43 6f 6c 20 20 20 20 20 20 20 20 20 20 20   iCol           
17f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17f20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72 61 63  Column to extrac
17f30 74 20 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a  t from poslist *
17f40 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 72  /.){.  int iCurr
17f50 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
17f60 20 20 20 20 20 20 20 2f 2a 20 41 6e 79 74 68 69         /* Anythi
17f70 6e 67 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ng before the fi
17f80 72 73 74 20 30 78 30 31 20 69 73 20 63 6f 6c 20  rst 0x01 is col 
17f90 30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  0 */.  const u8 
17fa0 2a 70 20 3d 20 2a 70 61 3b 0a 20 20 63 6f 6e 73  *p = *pa;.  cons
17fb0 74 20 75 38 20 2a 70 45 6e 64 20 3d 20 26 70 5b  t u8 *pEnd = &p[
17fc0 6e 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  n];         /* O
17fd0 6e 65 20 62 79 74 65 20 70 61 73 74 20 65 6e 64  ne byte past end
17fe0 20 6f 66 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73   of position lis
17ff0 74 20 2a 2f 0a 0a 20 20 77 68 69 6c 65 28 20 69  t */..  while( i
18000 43 6f 6c 3e 69 43 75 72 72 65 6e 74 20 29 7b 0a  Col>iCurrent ){.
18010 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 70      /* Advance p
18020 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20 69  ointer p until i
18030 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e 64  t points to pEnd
18040 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74 65   or an 0x01 byte
18050 20 74 68 61 74 20 69 73 0a 20 20 20 20 2a 2a 20   that is.    ** 
18060 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61  not part of a va
18070 72 69 6e 74 2e 20 4e 6f 74 65 20 74 68 61 74 20  rint. Note that 
18080 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
18090 6c 65 20 66 6f 72 20 61 20 6e 65 67 61 74 69 76  le for a negativ
180a0 65 0a 20 20 20 20 2a 2a 20 6f 72 20 65 78 74 72  e.    ** or extr
180b0 65 6d 65 6c 79 20 6c 61 72 67 65 20 76 61 72 69  emely large vari
180c0 6e 74 20 74 6f 20 6f 63 63 75 72 20 77 69 74 68  nt to occur with
180d0 69 6e 20 61 6e 20 75 6e 63 6f 72 72 75 70 74 65  in an uncorrupte
180e0 64 20 70 6f 73 69 74 69 6f 6e 20 0a 20 20 20 20  d position .    
180f0 2a 2a 20 6c 69 73 74 2e 20 53 6f 20 74 68 65 20  ** list. So the 
18100 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65 61 63  last byte of eac
18110 68 20 76 61 72 69 6e 74 20 6d 61 79 20 62 65 20  h varint may be 
18120 61 73 73 75 6d 65 64 20 74 6f 20 68 61 76 65 20  assumed to have 
18130 61 20 63 6c 65 61 72 0a 20 20 20 20 2a 2a 20 30  a clear.    ** 0
18140 78 38 30 20 62 69 74 2e 20 20 2a 2f 0a 20 20 20  x80 bit.  */.   
18150 20 77 68 69 6c 65 28 20 2a 70 21 3d 30 78 30 31   while( *p!=0x01
18160 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
18170 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a   *p++ & 0x80 );.
18180 20 20 20 20 20 20 69 66 28 20 70 3e 3d 70 45 6e        if( p>=pEn
18190 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  d ) return 0;.  
181a0 20 20 7d 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b    }.    *pa = p+
181b0 2b 3b 0a 20 20 20 20 69 43 75 72 72 65 6e 74 20  +;.    iCurrent 
181c0 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 69 66 28 20  = *p++;.    if( 
181d0 69 43 75 72 72 65 6e 74 20 26 20 30 78 38 30 20  iCurrent & 0x80 
181e0 29 7b 0a 20 20 20 20 20 20 70 2d 2d 3b 0a 20 20  ){.      p--;.  
181f0 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74      p += fts5Get
18200 56 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72  Varint32(p, iCur
18210 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rent);.    }.  }
18220 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d 69 43 75  .  if( iCol!=iCu
18230 72 72 65 6e 74 20 29 20 72 65 74 75 72 6e 20 30  rrent ) return 0
18240 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  ;..  /* Advance 
18250 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69 6c 20  pointer p until 
18260 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70 45 6e  it points to pEn
18270 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62 79 74  d or an 0x01 byt
18280 65 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6e  e that is.  ** n
18290 6f 74 20 70 61 72 74 20 6f 66 20 61 20 76 61 72  ot part of a var
182a0 69 6e 74 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  int */.  while( 
182b0 70 3c 70 45 6e 64 20 26 26 20 2a 70 21 3d 30 78  p<pEnd && *p!=0x
182c0 30 31 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  01 ){.    while(
182d0 20 2a 70 2b 2b 20 26 20 30 78 38 30 20 29 3b 0a   *p++ & 0x80 );.
182e0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 20    }..  return p 
182f0 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 73 74 61 74  - (*pa);.}..stat
18300 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
18310 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28 0a  xExtractColset(.
18320 20 20 69 6e 74 20 2a 70 52 63 2c 0a 20 20 46 74    int *pRc,.  Ft
18330 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
18340 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
18350 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74 65   Colset to filte
18360 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  r on */.  const 
18370 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e 50  u8 *pPos, int nP
18380 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f 73  os,       /* Pos
18390 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
183a0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
183b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
183c0 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65 72  /* Output buffer
183d0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52   */.){.  if( *pR
183e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
183f0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
18400 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42  ts5BufferZero(pB
18410 75 66 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  uf);.    for(i=0
18420 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f  ; i<pColset->nCo
18430 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  l; i++){.      c
18440 6f 6e 73 74 20 75 38 20 2a 70 53 75 62 20 3d 20  onst u8 *pSub = 
18450 70 50 6f 73 3b 0a 20 20 20 20 20 20 69 6e 74 20  pPos;.      int 
18460 6e 53 75 62 20 3d 20 66 74 73 35 49 6e 64 65 78  nSub = fts5Index
18470 45 78 74 72 61 63 74 43 6f 6c 28 26 70 53 75 62  ExtractCol(&pSub
18480 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d  , nPos, pColset-
18490 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20  >aiCol[i]);.    
184a0 20 20 69 66 28 20 6e 53 75 62 20 29 7b 0a 20 20    if( nSub ){.  
184b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
184c0 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63 2c 20  AppendBlob(pRc, 
184d0 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75 62  pBuf, nSub, pSub
184e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
184f0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  .  }.}../*.** xS
18500 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
18510 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
18520 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a  l=none tables..*
18530 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18540 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18550 5f 4e 6f 6e 65 28 46 74 73 35 49 74 65 72 20 2a  _None(Fts5Iter *
18560 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49 74  pIter, Fts5SegIt
18570 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 61 73 73  er *pSeg){.  ass
18580 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
18590 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
185a0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
185b0 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 70 49 74 65  L_NONE );.  pIte
185c0 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d  r->base.iRowid =
185d0 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20   pSeg->iRowid;. 
185e0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61   pIter->base.nDa
185f0 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b  ta = pSeg->nPos;
18600 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75  .}../*.** xSetOu
18610 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75  tputs callback u
18620 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75  sed by detail=fu
18630 6c 6c 20 61 6e 64 20 64 65 74 61 69 6c 3d 63 6f  ll and detail=co
18640 6c 20 74 61 62 6c 65 73 20 77 68 65 6e 20 6e 6f  l tables when no
18650 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65  .** column filte
18660 72 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  rs are specified
18670 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18680 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18690 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 28 46 74 73  uts_Nocolset(Fts
186a0 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74  5Iter *pIter, Ft
186b0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29  s5SegIter *pSeg)
186c0 7b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  {.  pIter->base.
186d0 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
186e0 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72 2d 3e  Rowid;.  pIter->
186f0 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 53 65  base.nData = pSe
18700 67 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 61 73 73 65  g->nPos;..  asse
18710 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
18720 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
18730 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail!=FTS5_DETAIL
18740 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  _NONE );.  asser
18750 74 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65  t( pIter->pColse
18760 74 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 70  t==0 );..  if( p
18770 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
18780 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65  +pSeg->nPos<=pSe
18790 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
187a0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64   ){.    /* All d
187b0 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f 6e  ata is stored on
187c0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
187d0 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  e. Populate the 
187e0 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20 76  output .    ** v
187f0 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e  ariables to poin
18800 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79 20  t into the body 
18810 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65  of the page obje
18820 63 74 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72  ct. */.    pIter
18830 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 26  ->base.pData = &
18840 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70  pSeg->pLeaf->p[p
18850 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
18860 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ];.  }else{.    
18870 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73 20 64  /* The data is d
18880 69 73 74 72 69 62 75 74 65 64 20 6f 76 65 72 20  istributed over 
18890 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65  two or more page
188a0 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74 6f 20  s. Copy it into 
188b0 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73 35 49  the.    ** Fts5I
188c0 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75 66 66  ter.poslist buff
188d0 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65 74 20  er and then set 
188e0 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69 6e 74  the output point
188f0 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20 20 20  er to point.    
18900 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66 66 65  ** to this buffe
18910 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  r.  */.    fts5B
18920 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
18930 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  ->poslist);.    
18940 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
18950 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  st(pIter->pIndex
18960 2c 20 70 53 65 67 2c 20 30 2c 20 26 70 49 74 65  , pSeg, 0, &pIte
18970 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
18980 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
18990 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
189a0 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ist.p;.  }.}../*
189b0 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
189c0 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68  callback used wh
189d0 65 6e 20 74 68 65 20 46 74 73 35 43 6f 6c 73 65  en the Fts5Colse
189e0 74 20 6f 62 6a 65 63 74 20 68 61 73 20 6e 43 6f  t object has nCo
189f0 6c 3d 3d 30 20 28 6d 61 74 63 68 0a 2a 2a 20 61  l==0 (match.** a
18a00 67 61 69 6e 73 74 20 6e 6f 20 63 6f 6c 75 6d 6e  gainst no column
18a10 73 20 61 74 20 61 6c 6c 29 2e 0a 2a 2f 0a 73 74  s at all)..*/.st
18a20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
18a30 65 72 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72  erSetOutputs_Zer
18a40 6f 43 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72  oColset(Fts5Iter
18a50 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
18a60 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 55  Iter *pSeg){.  U
18a70 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 53 65 67  NUSED_PARAM(pSeg
18a80 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  );.  pIter->base
18a90 2e 6e 44 61 74 61 20 3d 20 30 3b 0a 7d 0a 0a 2f  .nData = 0;.}../
18aa0 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73  *.** xSetOutputs
18ab0 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62   callback used b
18ac0 79 20 64 65 74 61 69 6c 3d 63 6f 6c 20 77 68 65  y detail=col whe
18ad0 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c  n there is a col
18ae0 75 6d 6e 20 66 69 6c 74 65 72 0a 2a 2a 20 61 6e  umn filter.** an
18af0 64 20 74 68 65 72 65 20 61 72 65 20 31 30 30 20  d there are 100 
18b00 6f 72 20 6d 6f 72 65 20 63 6f 6c 75 6d 6e 73 2e  or more columns.
18b10 20 41 6c 73 6f 20 63 61 6c 6c 65 64 20 61 73 20   Also called as 
18b20 61 20 66 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 0a  a fallback from.
18b30 2a 2a 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  ** fts5IterSetOu
18b40 74 70 75 74 73 5f 43 6f 6c 31 30 30 20 69 66 20  tputs_Col100 if 
18b50 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c 69 73 74 20  the column-list 
18b60 73 70 61 6e 73 20 6d 6f 72 65 20 74 68 61 6e 20  spans more than 
18b70 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61  one page..*/.sta
18b80 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65  tic void fts5Ite
18b90 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28  rSetOutputs_Col(
18ba0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
18bb0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
18bc0 65 67 29 7b 0a 20 20 66 74 73 35 42 75 66 66 65  eg){.  fts5Buffe
18bd0 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
18be0 73 6c 69 73 74 29 3b 0a 20 20 66 74 73 35 53 65  slist);.  fts5Se
18bf0 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74  giterPoslist(pIt
18c00 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67  er->pIndex, pSeg
18c10 2c 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  , pIter->pColset
18c20 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
18c30 74 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73  t);.  pIter->bas
18c40 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
18c50 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72  >iRowid;.  pIter
18c60 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
18c70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
18c80 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e  .  pIter->base.n
18c90 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
18ca0 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  slist.n;.}../*.*
18cb0 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
18cc0 6c 6c 62 61 63 6b 20 75 73 65 64 20 77 68 65 6e  llback used when
18cd0 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 64 65 74  : .**.**   * det
18ce0 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20 20 20 2a 20  ail=col,.**   * 
18cf0 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75 6d  there is a colum
18d00 6e 20 66 69 6c 74 65 72 2c 20 61 6e 64 0a 2a 2a  n filter, and.**
18d10 20 20 20 2a 20 74 68 65 20 74 61 62 6c 65 20 63     * the table c
18d20 6f 6e 74 61 69 6e 73 20 31 30 30 20 6f 72 20 66  ontains 100 or f
18d30 65 77 65 72 20 63 6f 6c 75 6d 6e 73 2e 20 0a 2a  ewer columns. .*
18d40 2a 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20 70 6f  *.** The last po
18d50 69 6e 74 20 69 73 20 74 6f 20 65 6e 73 75 72 65  int is to ensure
18d60 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   all column numb
18d70 65 72 73 20 61 72 65 20 73 74 6f 72 65 64 20 61  ers are stored a
18d80 73 20 0a 2a 2a 20 73 69 6e 67 6c 65 2d 62 79 74  s .** single-byt
18d90 65 20 76 61 72 69 6e 74 73 2e 0a 2a 2f 0a 73 74  e varints..*/.st
18da0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
18db0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
18dc0 31 30 30 28 46 74 73 35 49 74 65 72 20 2a 70 49  100(Fts5Iter *pI
18dd0 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18de0 20 2a 70 53 65 67 29 7b 0a 0a 20 20 61 73 73 65   *pSeg){..  asse
18df0 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
18e00 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  x->pConfig->eDet
18e10 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
18e20 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 61 73  _COLUMNS );.  as
18e30 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43 6f  sert( pIter->pCo
18e40 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20 70  lset );..  if( p
18e50 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
18e60 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e 70 53 65 67  +pSeg->nPos>pSeg
18e70 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  ->pLeaf->szLeaf 
18e80 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72 53  ){.    fts5IterS
18e90 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 28 70 49  etOutputs_Col(pI
18ea0 74 65 72 2c 20 70 53 65 67 29 3b 0a 20 20 7d 65  ter, pSeg);.  }e
18eb0 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  lse{.    u8 *a =
18ec0 20 28 75 38 2a 29 26 70 53 65 67 2d 3e 70 4c 65   (u8*)&pSeg->pLe
18ed0 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
18ee0 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 75 38  fOffset];.    u8
18ef0 20 2a 70 45 6e 64 20 3d 20 28 75 38 2a 29 26 61   *pEnd = (u8*)&a
18f00 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d 3b 20 0a 20  [pSeg->nPos]; . 
18f10 20 20 20 69 6e 74 20 69 50 72 65 76 20 3d 20 30     int iPrev = 0
18f20 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43 6f 6c  ;.    int *aiCol
18f30 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65   = pIter->pColse
18f40 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20 20 20 69 6e  t->aiCol;.    in
18f50 74 20 2a 61 69 43 6f 6c 45 6e 64 20 3d 20 26 61  t *aiColEnd = &a
18f60 69 43 6f 6c 5b 70 49 74 65 72 2d 3e 70 43 6f 6c  iCol[pIter->pCol
18f70 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a 0a 20 20 20  set->nCol];..   
18f80 20 75 38 20 2a 61 4f 75 74 20 3d 20 70 49 74 65   u8 *aOut = pIte
18f90 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
18fa0 20 20 69 6e 74 20 69 50 72 65 76 4f 75 74 20 3d    int iPrevOut =
18fb0 20 30 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e   0;..    pIter->
18fc0 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53  base.iRowid = pS
18fd0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20  eg->iRowid;..   
18fe0 20 77 68 69 6c 65 28 20 61 3c 70 45 6e 64 20 29   while( a<pEnd )
18ff0 7b 0a 20 20 20 20 20 20 69 50 72 65 76 20 2b 3d  {.      iPrev +=
19000 20 28 69 6e 74 29 61 2b 2b 5b 30 5d 20 2d 20 32   (int)a++[0] - 2
19010 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a  ;.      while( *
19020 61 69 43 6f 6c 3c 69 50 72 65 76 20 29 7b 0a 20  aiCol<iPrev ){. 
19030 20 20 20 20 20 20 20 61 69 43 6f 6c 2b 2b 3b 0a         aiCol++;.
19040 20 20 20 20 20 20 20 20 69 66 28 20 61 69 43 6f          if( aiCo
19050 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20 29 20 67 6f  l==aiColEnd ) go
19060 74 6f 20 73 65 74 6f 75 74 70 75 74 73 5f 63 6f  to setoutputs_co
19070 6c 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  l_out;.      }. 
19080 20 20 20 20 20 69 66 28 20 2a 61 69 43 6f 6c 3d       if( *aiCol=
19090 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
190a0 20 20 2a 61 4f 75 74 2b 2b 20 3d 20 28 75 38 29    *aOut++ = (u8)
190b0 28 28 69 50 72 65 76 20 2d 20 69 50 72 65 76 4f  ((iPrev - iPrevO
190c0 75 74 29 20 2b 20 32 29 3b 0a 20 20 20 20 20 20  ut) + 2);.      
190d0 20 20 69 50 72 65 76 4f 75 74 20 3d 20 69 50 72    iPrevOut = iPr
190e0 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
190f0 7d 0a 0a 73 65 74 6f 75 74 70 75 74 73 5f 63 6f  }..setoutputs_co
19100 6c 5f 6f 75 74 3a 0a 20 20 20 20 70 49 74 65 72  l_out:.    pIter
19110 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
19120 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
19130 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
19140 2e 6e 44 61 74 61 20 3d 20 61 4f 75 74 20 2d 20  .nData = aOut - 
19150 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
19160 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78  ;.  }.}../*.** x
19170 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
19180 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
19190 69 6c 3d 66 75 6c 6c 20 77 68 65 6e 20 74 68 65  il=full when the
191a0 72 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66  re is a column f
191b0 69 6c 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilter..*/.static
191c0 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
191d0 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 28 46 74  tOutputs_Full(Ft
191e0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
191f0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
19200 29 7b 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  ){.  Fts5Colset 
19210 2a 70 43 6f 6c 73 65 74 20 3d 20 70 49 74 65 72  *pColset = pIter
19220 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20 20 70 49 74  ->pColset;.  pIt
19230 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
19240 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
19250 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
19260 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69  ->pIndex->pConfi
19270 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
19280 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 3b 0a  _DETAIL_FULL );.
19290 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 73 65    assert( pColse
192a0 74 20 29 3b 0a 0a 20 20 69 66 28 20 70 53 65 67  t );..  if( pSeg
192b0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53  ->iLeafOffset+pS
192c0 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e  eg->nPos<=pSeg->
192d0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
192e0 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61  .    /* All data
192f0 20 69 73 20 73 74 6f 72 65 64 20 6f 6e 20 74 68   is stored on th
19300 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
19310 50 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 75 74  Populate the out
19320 70 75 74 20 0a 20 20 20 20 2a 2a 20 76 61 72 69  put .    ** vari
19330 61 62 6c 65 73 20 74 6f 20 70 6f 69 6e 74 20 69  ables to point i
19340 6e 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20  nto the body of 
19350 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63 74 2e  the page object.
19360 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38   */.    const u8
19370 20 2a 61 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65   *a = &pSeg->pLe
19380 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
19390 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66  fOffset];.    if
193a0 28 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d  ( pColset->nCol=
193b0 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =1 ){.      pIte
193c0 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20  r->base.nData = 
193d0 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74  fts5IndexExtract
193e0 43 6f 6c 28 26 61 2c 20 70 53 65 67 2d 3e 6e 50  Col(&a, pSeg->nP
193f0 6f 73 2c 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  os,pColset->aiCo
19400 6c 5b 30 5d 29 3b 0a 20 20 20 20 20 20 70 49 74  l[0]);.      pIt
19410 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
19420 20 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   a;.    }else{. 
19430 20 20 20 20 20 69 6e 74 20 2a 70 52 63 20 3d 20       int *pRc = 
19440 26 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e  &pIter->pIndex->
19450 72 63 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  rc;.      fts5Bu
19460 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
19470 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
19480 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
19490 74 43 6f 6c 73 65 74 28 70 52 63 2c 20 70 43 6f  tColset(pRc, pCo
194a0 6c 73 65 74 2c 20 61 2c 20 70 53 65 67 2d 3e 6e  lset, a, pSeg->n
194b0 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  Pos, &pIter->pos
194c0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 70 49 74  list);.      pIt
194d0 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
194e0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
194f0 70 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  p;.      pIter->
19500 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74  base.nData = pIt
19510 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
19520 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
19530 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 69 73    /* The data is
19540 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 76 65   distributed ove
19550 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 70 61  r two or more pa
19560 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69 6e 74  ges. Copy it int
19570 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46 74 73  o the.    ** Fts
19580 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20 62 75  5Iter.poslist bu
19590 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20 73 65  ffer and then se
195a0 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 6f 69  t the output poi
195b0 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a 20 20  nter to point.  
195c0 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62 75 66    ** to this buf
195d0 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66 74 73  fer.  */.    fts
195e0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74  5BufferZero(&pIt
195f0 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
19600 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73    fts5SegiterPos
19610 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64  list(pIter->pInd
19620 65 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65  ex, pSeg, pColse
19630 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  t, &pIter->posli
19640 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  st);.    pIter->
19650 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74  base.pData = pIt
19660 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20  er->poslist.p;. 
19670 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
19680 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
19690 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 7d 0a 0a  slist.n;.  }.}..
196a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
196b0 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
196c0 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 49 74  int *pRc, Fts5It
196d0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
196e0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
196f0 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  K ){.    Fts5Con
19700 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
19710 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43  Iter->pIndex->pC
19720 6f 6e 66 69 67 3b 0a 20 20 20 20 69 66 28 20 70  onfig;.    if( p
19730 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d  Config->eDetail=
19740 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
19750 45 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  E ){.      pIter
19760 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
19770 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
19780 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a  ts_None;.    }..
19790 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49 74      else if( pIt
197a0 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29  er->pColset==0 )
197b0 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78  {.      pIter->x
197c0 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73  SetOutputs = fts
197d0 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
197e0 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a  Nocolset;.    }.
197f0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 49  .    else if( pI
19800 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e 43  ter->pColset->nC
19810 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol==0 ){.      p
19820 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
19830 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
19840 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65  utputs_ZeroColse
19850 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c  t;.    }..    el
19860 73 65 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e  se if( pConfig->
19870 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
19880 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  TAIL_FULL ){.   
19890 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
198a0 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
198b0 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c 6c 3b  SetOutputs_Full;
198c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65  .    }..    else
198d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
198e0 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
198f0 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f  ==FTS5_DETAIL_CO
19900 4c 55 4d 4e 53 20 29 3b 0a 20 20 20 20 20 20 69  LUMNS );.      i
19910 66 28 20 70 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c  f( pConfig->nCol
19920 3c 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  <=100 ){.       
19930 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70   pIter->xSetOutp
19940 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53 65  uts = fts5IterSe
19950 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 3b  tOutputs_Col100;
19960 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
19970 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 70  Fts5BufferSize(p
19980 52 63 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c  Rc, &pIter->posl
19990 69 73 74 2c 20 70 43 6f 6e 66 69 67 2d 3e 6e 43  ist, pConfig->nC
199a0 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ol);.      }else
199b0 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
199c0 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66  >xSetOutputs = f
199d0 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
199e0 73 5f 43 6f 6c 3b 0a 20 20 20 20 20 20 7d 0a 20  s_Col;.      }. 
199f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a     }.  }.}.../*.
19a00 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
19a10 77 20 46 74 73 35 49 74 65 72 20 6f 62 6a 65 63  w Fts5Iter objec
19a20 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
19a30 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20   object will be 
19a40 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
19a50 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20  through data in 
19a60 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
19a70 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20  t..** If iLevel 
19a80 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c  is -ve, then all
19a90 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67   data in all seg
19aa0 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e  ments is merged.
19ab0 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a   Or, if iLevel.*
19ac0 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65  * is zero or gre
19ad0 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20  ater, data from 
19ae0 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65  the first nSegme
19af0 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  nt segments on l
19b00 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  evel iLevel.** i
19b10 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  s merged..**.** 
19b20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69  The iterator ini
19b30 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tially points to
19b40 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f   the first term/
19b50 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74  rowid entry in t
19b60 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20  he .** iterated 
19b70 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
19b80 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
19b90 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64  erNew(.  Fts5Ind
19ba0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
19bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
19bc0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
19bd0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
19be0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
19bf0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20  Struct,         
19c00 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20  /* Structure of 
19c10 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a  specific index *
19c20 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
19c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c40 20 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58      /* FTS5INDEX
19c50 5f 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73  _QUERY_XXX flags
19c60 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
19c70 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
19c80 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20        /* Colset 
19c90 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 28 6f 72  to filter on (or
19ca0 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 63 6f 6e 73   NULL) */.  cons
19cb0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
19cc0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
19cd0 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28  erm to seek to (
19ce0 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20  or NULL/0) */.  
19cf0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
19d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d10 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72  /* Level to iter
19d20 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29  ate (-1 for all)
19d30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
19d40 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
19d50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19d60 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
19d70 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29  erge (iLevel>=0)
19d80 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
19d90 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20  *ppOut          
19da0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
19db0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
19dc0 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  nSeg = 0;       
19dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19de0 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
19df0 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f  -iters in use */
19e00 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30  .  int iIter = 0
19e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19e20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69     /* */.  int i
19e30 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
19e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
19e50 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
19e60 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
19e70 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
19e80 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20  eLevel *pLvl;.  
19e90 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a  Fts5Iter *pNew;.
19ea0 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72  .  assert( (pTer
19eb0 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30  m==0 && nTerm==0
19ec0 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b  ) || iLevel<0 );
19ed0 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
19ee0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
19ef0 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72  w multi-seg-iter
19f00 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70  ator. */.  if( p
19f10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
19f20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65  ){.    if( iLeve
19f30 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  l<0 ){.      ass
19f40 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
19f50 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
19f60 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
19f70 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
19f80 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72       nSeg = pStr
19f90 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
19fa0 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d       nSeg += (p-
19fb0 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b  >pHash ? 1 : 0);
19fc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
19fd0 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74    nSeg = MIN(pSt
19fe0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
19ff0 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d  vel].nSeg, nSegm
1a000 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ent);.    }.  }.
1a010 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20    *ppOut = pNew 
1a020 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  = fts5MultiIterA
1a030 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20  lloc(p, nSeg);. 
1a040 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
1a050 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62  eturn;.  pNew->b
1a060 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73  Rev = (0!=(flags
1a070 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
1a080 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65  RY_DESC));.  pNe
1a090 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20  w->bSkipEmpty = 
1a0a0 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53  (0!=(flags & FTS
1a0b0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49  5INDEX_QUERY_SKI
1a0c0 50 45 4d 50 54 59 29 29 3b 0a 20 20 70 4e 65 77  PEMPTY));.  pNew
1a0d0 2d 3e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c  ->pColset = pCol
1a0e0 73 65 74 3b 0a 20 20 69 66 28 20 28 66 6c 61 67  set;.  if( (flag
1a0f0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
1a100 45 52 59 5f 4e 4f 4f 55 54 50 55 54 29 3d 3d 30  ERY_NOOUTPUT)==0
1a110 20 29 7b 0a 20 20 20 20 66 74 73 35 49 74 65 72   ){.    fts5Iter
1a120 53 65 74 4f 75 74 70 75 74 43 62 28 26 70 2d 3e  SetOutputCb(&p->
1a130 72 63 2c 20 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  rc, pNew);.  }..
1a140 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1a150 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70  each of the comp
1a160 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74  onent segment it
1a170 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66  erators. */.  if
1a180 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a190 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c  OK ){.    if( iL
1a1a0 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  evel<0 ){.      
1a1b0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1a1c0 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72  el *pEnd = &pStr
1a1d0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  uct->aLevel[pStr
1a1e0 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
1a1f0 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68      if( p->pHash
1a200 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
1a210 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69 74 65  dd a segment ite
1a220 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75  rator for the cu
1a230 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f  rrent contents o
1a240 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  f the hash table
1a250 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 46 74 73  . */.        Fts
1a260 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
1a270 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
1a280 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
1a290 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49  fts5SegIterHashI
1a2a0 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54  nit(p, pTerm, nT
1a2b0 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65  erm, flags, pIte
1a2c0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1a2d0 20 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72    for(pLvl=&pStr
1a2e0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20  uct->aLevel[0]; 
1a2f0 70 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b  pLvl<pEnd; pLvl+
1a300 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
1a310 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d  iSeg=pLvl->nSeg-
1a320 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67  1; iSeg>=0; iSeg
1a330 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 20 46  --){.          F
1a340 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1a350 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
1a360 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
1a370 20 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67           Fts5Seg
1a380 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
1a390 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
1a3a0 2b 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +];.          if
1a3b0 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20  ( pTerm==0 ){.  
1a3c0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
1a3d0 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  gIterInit(p, pSe
1a3e0 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
1a3f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1a400 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
1a410 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 70  terSeekInit(p, p
1a420 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
1a430 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29  gs, pSeg, pIter)
1a440 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1a450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1a460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a470 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74   pLvl = &pStruct
1a480 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d  ->aLevel[iLevel]
1a490 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ;.      for(iSeg
1a4a0 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30  =nSeg-1; iSeg>=0
1a4b0 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20  ; iSeg--){.     
1a4c0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e     fts5SegIterIn
1a4d0 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  it(p, &pLvl->aSe
1a4e0 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e  g[iSeg], &pNew->
1a4f0 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a  aSeg[iIter++]);.
1a500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1a510 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d    assert( iIter=
1a520 3d 6e 53 65 67 20 29 3b 0a 20 20 7d 0a 0a 20 20  =nSeg );.  }..  
1a530 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20  /* If the above 
1a540 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20  was successful, 
1a550 65 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69  each component i
1a560 74 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69  terators now poi
1a570 6e 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65  nts .  ** to the
1a580 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1a590 69 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20  its segment. In 
1a5a0 74 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61  this case initia
1a5b0 6c 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61  lize the .  ** a
1a5c0 46 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f  First[] array. O
1a5d0 72 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  r, if an error h
1a5e0 61 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65  as occurred, fre
1a5f0 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20  e the iterator. 
1a600 20 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73   ** object and s
1a610 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  et the output va
1a620 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20  riable to NULL. 
1a630 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
1a640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a650 20 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77    for(iIter=pNew
1a660 2d 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e  ->nSeg-1; iIter>
1a670 30 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20  0; iIter--){.   
1a680 20 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20     int iEq;.    
1a690 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73    if( (iEq = fts
1a6a0 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
1a6b0 61 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29  are(pNew, iIter)
1a6c0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  ) ){.        Fts
1a6d0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1a6e0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71   &pNew->aSeg[iEq
1a6f0 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
1a700 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a710 29 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c  ) pSeg->xNext(p,
1a720 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20 20   pSeg, 0);.     
1a730 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1a740 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77  Advanced(p, pNew
1a750 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20  , iEq, iIter);. 
1a760 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a770 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65   fts5MultiIterSe
1a780 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  tEof(pNew);.    
1a790 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
1a7a0 74 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65 77  terSetup(p, pNew
1a7b0 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77  );..    if( pNew
1a7c0 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20  ->bSkipEmpty && 
1a7d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
1a7e0 6d 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29 7b  mpty(p, pNew) ){
1a7f0 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1a800 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77  IterNext(p, pNew
1a810 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  , 0, 0);.    }el
1a820 73 65 20 69 66 28 20 70 4e 65 77 2d 3e 62 61 73  se if( pNew->bas
1a830 65 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20  e.bEof==0 ){.   
1a840 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1a850 70 53 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53  pSeg = &pNew->aS
1a860 65 67 5b 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b  eg[pNew->aFirst[
1a870 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 20 20  1].iFirst];.    
1a880 20 20 70 4e 65 77 2d 3e 78 53 65 74 4f 75 74 70    pNew->xSetOutp
1a890 75 74 73 28 70 4e 65 77 2c 20 70 53 65 67 29 3b  uts(pNew, pSeg);
1a8a0 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b  .    }..  }else{
1a8b0 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
1a8c0 65 72 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  erFree(pNew);.  
1a8d0 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20    *ppOut = 0;.  
1a8e0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  }.}../*.** Creat
1a8f0 65 20 61 6e 20 46 74 73 35 49 74 65 72 20 74 68  e an Fts5Iter th
1a900 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f  at iterates thro
1a910 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ugh the doclist 
1a920 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20 74  provided.** as t
1a930 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
1a940 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1a950 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
1a960 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64 65  New2(.  Fts5Inde
1a970 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
1a980 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
1a990 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  backend to itera
1a9a0 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46  te within */.  F
1a9b0 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c 20  ts5Data *pData, 
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a9d0 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74 65  * Doclist to ite
1a9e0 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
1a9f0 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20    int bDesc,    
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64 65    /* True for de
1aa20 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
1aa30 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49 74  rder */.  Fts5It
1aa40 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  er **ppOut      
1aa50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
1aa60 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
1aa70 46 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a  Fts5Iter *pNew;.
1aa80 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c    pNew = fts5Mul
1aa90 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32  tiIterAlloc(p, 2
1aaa0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
1aab0 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
1aac0 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d   *pIter = &pNew-
1aad0 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70  >aSeg[1];..    p
1aae0 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54  Iter->flags = FT
1aaf0 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
1ab00 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74  RM;.    if( pDat
1ab10 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20  a->szLeaf>0 ){. 
1ab20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
1ab30 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20  f = pData;.     
1ab40 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
1ab50 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
1ab60 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75  int(pData->p, (u
1ab70 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
1ab80 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  id);.      pIter
1ab90 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
1aba0 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20  = pData->nn;.   
1abb0 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b     pNew->aFirst[
1abc0 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a 20  1].iFirst = 1;. 
1abd0 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20 29       if( bDesc )
1abe0 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e  {.        pNew->
1abf0 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20 20  bRev = 1;.      
1ac00 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
1ac10 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
1ac20 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20  EVERSE;.        
1ac30 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
1ac40 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
1ac50 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ter);.      }els
1ac60 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  e{.        fts5S
1ac70 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
1ac80 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
1ac90 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  }.      pData = 
1aca0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
1acb0 20 20 20 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62      pNew->base.b
1acc0 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
1acd0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65     fts5SegIterSe
1ace0 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
1acf0 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70  ..    *ppOut = p
1ad00 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  New;.  }..  fts5
1ad10 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
1ad20 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  a);.}../*.** Ret
1ad30 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
1ad40 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
1ad50 4f 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f  OF or if an erro
1ad60 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20  r has occurred. 
1ad70 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77  .** False otherw
1ad80 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ise..*/.static i
1ad90 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
1ada0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
1adb0 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  , Fts5Iter *pIte
1adc0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  r){.  assert( p-
1add0 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28 70  >rc .      || (p
1ade0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1adf0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1ae00 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d  rst ].pLeaf==0)=
1ae10 3d 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f  =pIter->base.bEo
1ae20 66 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  f .  );.  return
1ae30 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72   (p->rc || pIter
1ae40 2d 3e 62 61 73 65 2e 62 45 6f 66 29 3b 0a 7d 0a  ->base.bEof);.}.
1ae50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1ae60 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65  e rowid of the e
1ae70 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
1ae80 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
1ae90 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49   points.** to. I
1aea0 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
1aeb0 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65  oints to EOF whe
1aec0 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
1aed0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a  is called the.**
1aee0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64   results are und
1aef0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
1af00 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49  c i64 fts5MultiI
1af10 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 74 65  terRowid(Fts5Ite
1af20 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
1af30 65 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67  ert( pIter->aSeg
1af40 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
1af50 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61  1].iFirst ].pLea
1af60 66 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  f );.  return pI
1af70 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1af80 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1af90 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  st ].iRowid;.}..
1afa0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
1afb0 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
1afc0 65 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20  ext entry at or 
1afd0 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68  following iMatch
1afe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1aff0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
1b000 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
1b010 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49  dex *p, .  Fts5I
1b020 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69  ter *pIter, .  i
1b030 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77  64 iMatch.){.  w
1b040 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
1b050 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66  64 iRowid;.    f
1b060 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
1b070 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d  (p, pIter, 1, iM
1b080 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66  atch);.    if( f
1b090 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1b0a0 70 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61  p, pIter) ) brea
1b0b0 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20  k;.    iRowid = 
1b0c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1b0d0 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69  id(pIter);.    i
1b0e0 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  f( pIter->bRev==
1b0f0 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61  0 && iRowid>=iMa
1b100 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  tch ) break;.   
1b110 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
1b120 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  !=0 && iRowid<=i
1b130 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
1b140 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1b150 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1b160 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
1b170 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73  ing the term ass
1b180 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1b190 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20   .** entry that 
1b1a0 74 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72  the iterator cur
1b1b0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1b1c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
1b1d0 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49  t u8 *fts5MultiI
1b1e0 74 65 72 54 65 72 6d 28 46 74 73 35 49 74 65 72  terTerm(Fts5Iter
1b1f0 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e   *pIter, int *pn
1b200 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
1b210 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   *p = &pIter->aS
1b220 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
1b230 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
1b240 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e   *pn = p->term.n
1b250 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65  ;.  return p->te
1b260 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  rm.p;.}../*.** A
1b270 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65  llocate a new se
1b280 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65  gment-id for the
1b290 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
1b2a0 63 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d  ct. The new segm
1b2b0 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62  ent.** id must b
1b2c0 65 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  e between 1 and 
1b2d0 36 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c  65335 inclusive,
1b2e0 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65   and must not be
1b2f0 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79   used by .** any
1b300 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
1b310 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20  ing segment. If 
1b320 61 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69  a free segment i
1b330 64 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e  d cannot be foun
1b340 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  d,.** SQLITE_FUL
1b350 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  L is returned..*
1b360 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1b370 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
1b380 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1b390 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1b3a0 20 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e   0 is .** return
1b3b0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
1b3c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1b3d0 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64  ts5AllocateSegid
1b3e0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
1b3f0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1b400 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 53  truct){.  int iS
1b410 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  egid = 0;..  if(
1b420 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b430 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74  K ){.    if( pSt
1b440 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d  ruct->nSegment>=
1b450 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54  FTS5_MAX_SEGMENT
1b460 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1b470 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1b480 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b490 2f 2a 20 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  /* FTS5_MAX_SEGM
1b4a0 45 4e 54 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ENT is currently
1b4b0 20 64 65 66 69 6e 65 64 20 61 73 20 32 30 30 30   defined as 2000
1b4c0 2e 20 53 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  . So the followi
1b4d0 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 72 72 61  ng.      ** arra
1b4e0 79 20 69 73 20 36 33 20 65 6c 65 6d 65 6e 74 73  y is 63 elements
1b4f0 2c 20 6f 72 20 32 35 32 20 62 79 74 65 73 2c 20  , or 252 bytes, 
1b500 69 6e 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  in size.  */.   
1b510 20 20 20 75 33 32 20 61 55 73 65 64 5b 28 46 54     u32 aUsed[(FT
1b520 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 2b 33  S5_MAX_SEGMENT+3
1b530 31 29 20 2f 20 33 32 5d 3b 0a 20 20 20 20 20 20  1) / 32];.      
1b540 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
1b550 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
1b560 20 20 20 75 33 32 20 6d 61 73 6b 3b 0a 20 20 20     u32 mask;.   
1b570 20 20 20 6d 65 6d 73 65 74 28 61 55 73 65 64 2c     memset(aUsed,
1b580 20 30 2c 20 73 69 7a 65 6f 66 28 61 55 73 65 64   0, sizeof(aUsed
1b590 29 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c  ));.      for(iL
1b5a0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1b5b0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1b5c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1b5d0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
1b5e0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b5f0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
1b600 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1b610 20 69 49 64 20 3d 20 70 53 74 72 75 63 74 2d 3e   iId = pStruct->
1b620 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
1b630 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 3b 0a  g[iSeg].iSegid;.
1b640 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 49            if( iI
1b650 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  d<=FTS5_MAX_SEGM
1b660 45 4e 54 20 26 26 20 69 49 64 3e 30 20 29 7b 0a  ENT && iId>0 ){.
1b670 20 20 20 20 20 20 20 20 20 20 20 20 61 55 73 65              aUse
1b680 64 5b 28 69 49 64 2d 31 29 20 2f 20 33 32 5d 20  d[(iId-1) / 32] 
1b690 7c 3d 20 28 75 33 32 29 31 20 3c 3c 20 28 28 69  |= (u32)1 << ((i
1b6a0 49 64 2d 31 29 20 25 20 33 32 29 3b 0a 20 20 20  Id-1) % 32);.   
1b6b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b6c0 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
1b6d0 20 20 66 6f 72 28 69 3d 30 3b 20 61 55 73 65 64    for(i=0; aUsed
1b6e0 5b 69 5d 3d 3d 30 78 46 46 46 46 46 46 46 46 3b  [i]==0xFFFFFFFF;
1b6f0 20 69 2b 2b 29 3b 0a 20 20 20 20 20 20 6d 61 73   i++);.      mas
1b700 6b 20 3d 20 61 55 73 65 64 5b 69 5d 3b 0a 20 20  k = aUsed[i];.  
1b710 20 20 20 20 66 6f 72 28 69 53 65 67 69 64 3d 30      for(iSegid=0
1b720 3b 20 6d 61 73 6b 20 26 20 28 28 75 33 32 29 31  ; mask & ((u32)1
1b730 20 3c 3c 20 69 53 65 67 69 64 29 3b 20 69 53 65   << iSegid); iSe
1b740 67 69 64 2b 2b 29 3b 0a 20 20 20 20 20 20 69 53  gid++);.      iS
1b750 65 67 69 64 20 2b 3d 20 31 20 2b 20 69 2a 33 32  egid += 1 + i*32
1b760 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1b770 5f 44 45 42 55 47 0a 20 20 20 20 20 20 66 6f 72  _DEBUG.      for
1b780 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1b790 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1b7a0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1b7b0 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
1b7c0 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  <pStruct->aLevel
1b7d0 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65  [iLvl].nSeg; iSe
1b7e0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
1b7f0 61 73 73 65 72 74 5f 6e 63 28 20 69 53 65 67 69  assert_nc( iSegi
1b800 64 21 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  d!=pStruct->aLev
1b810 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1b820 65 67 5d 2e 69 53 65 67 69 64 20 29 3b 0a 20 20  eg].iSegid );.  
1b830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1b840 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
1b850 20 69 53 65 67 69 64 3e 30 20 26 26 20 69 53 65   iSegid>0 && iSe
1b860 67 69 64 3c 3d 46 54 53 35 5f 4d 41 58 5f 53 45  gid<=FTS5_MAX_SE
1b870 47 4d 45 4e 54 20 29 3b 0a 0a 20 20 20 20 20 20  GMENT );..      
1b880 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1b890 33 5f 73 74 6d 74 20 2a 70 49 64 78 53 65 6c 65  3_stmt *pIdxSele
1b8a0 63 74 20 3d 20 66 74 73 35 49 64 78 53 65 6c 65  ct = fts5IdxSele
1b8b0 63 74 53 74 6d 74 28 70 29 3b 0a 20 20 20 20 20  ctStmt(p);.     
1b8c0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1b8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b8e0 20 20 20 20 20 75 38 20 61 42 6c 6f 62 5b 32 5d       u8 aBlob[2]
1b8f0 20 3d 20 7b 30 78 66 66 2c 20 30 78 66 66 7d 3b   = {0xff, 0xff};
1b900 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1b910 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 64 78  e3_bind_int(pIdx
1b920 53 65 6c 65 63 74 2c 20 31 2c 20 69 53 65 67 69  Select, 1, iSegi
1b930 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  d);.          sq
1b940 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
1b950 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 61  pIdxSelect, 2, a
1b960 42 6c 6f 62 2c 20 32 2c 20 53 51 4c 49 54 45 5f  Blob, 2, SQLITE_
1b970 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
1b980 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 73 71     assert_nc( sq
1b990 6c 69 74 65 33 5f 73 74 65 70 28 70 49 64 78 53  lite3_step(pIdxS
1b9a0 65 6c 65 63 74 29 21 3d 53 51 4c 49 54 45 5f 52  elect)!=SQLITE_R
1b9b0 4f 57 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OW );.          
1b9c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1b9d0 72 65 73 65 74 28 70 49 64 78 53 65 6c 65 63 74  reset(pIdxSelect
1b9e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1b9f0 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
1ba00 49 64 78 53 65 6c 65 63 74 2c 20 32 29 3b 0a 20  IdxSelect, 2);. 
1ba10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1ba20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
1ba30 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65 67  }..  return iSeg
1ba40 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  id;.}../*.** Dis
1ba50 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63 75  card all data cu
1ba60 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 69  rrently cached i
1ba70 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
1ba80 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1ba90 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61  d fts5IndexDisca
1baa0 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65 78  rdData(Fts5Index
1bab0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
1bac0 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e  p->pHash || p->n
1bad0 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20 29  PendingData==0 )
1bae0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68  ;.  if( p->pHash
1baf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46   ){.    sqlite3F
1bb00 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d 3e  ts5HashClear(p->
1bb10 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e  pHash);.    p->n
1bb20 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
1bb30 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
1bb40 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66  turn the size of
1bb50 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e 20   the prefix, in 
1bb60 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66 66  bytes, that buff
1bb70 65 72 20 0a 2a 2a 20 28 70 4e 65 77 2f 3c 6c 65  er .** (pNew/<le
1bb80 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 73  ngth-unknown>) s
1bb90 68 61 72 65 73 20 77 69 74 68 20 62 75 66 66 65  hares with buffe
1bba0 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a  r (pOld/nOld)..*
1bbb0 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 4e 65  *.** Buffer (pNe
1bbc0 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77  w/<length-unknow
1bbd0 6e 3e 29 20 69 73 20 67 75 61 72 61 6e 74 65 65  n>) is guarantee
1bbe0 64 20 74 6f 20 62 65 20 67 72 65 61 74 65 72 20  d to be greater 
1bbf0 0a 2a 2a 20 74 68 61 6e 20 62 75 66 66 65 72 20  .** than buffer 
1bc00 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e 0a 2a 2f 0a  (pOld/nOld)..*/.
1bc10 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
1bc20 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 69 6e  refixCompress(in
1bc30 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38  t nOld, const u8
1bc40 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38   *pOld, const u8
1bc50 20 2a 70 4e 65 77 29 7b 0a 20 20 69 6e 74 20 69   *pNew){.  int i
1bc60 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1bc70 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Old; i++){.    i
1bc80 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77  f( pOld[i]!=pNew
1bc90 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  [i] ) break;.  }
1bca0 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a  .  return i;.}..
1bcb0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1bcc0 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28  WriteDlidxClear(
1bcd0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1bce0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
1bcf0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
1bd00 74 20 62 46 6c 75 73 68 20 20 20 20 20 20 20 20  t bFlush        
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bd20 20 49 66 20 74 72 75 65 2c 20 77 72 69 74 65 20   If true, write 
1bd30 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f  dlidx to disk */
1bd40 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  .){.  int i;.  a
1bd50 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d 3d 30  ssert( bFlush==0
1bd60 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44   || (pWriter->nD
1bd70 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65  lidx>0 && pWrite
1bd80 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
1bd90 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72 28 69  .n>0) );.  for(i
1bda0 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e  =0; i<pWriter->n
1bdb0 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Dlidx; i++){.   
1bdc0 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
1bdd0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
1bde0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1bdf0 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
1be00 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b  buf.n==0 ) break
1be10 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75 73 68  ;.    if( bFlush
1be20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1be30 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d  ( pDlidx->pgno!=
1be40 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  0 );.      fts5D
1be50 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20  ataWrite(p, .   
1be60 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
1be70 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d  X_ROWID(pWriter-
1be80 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69  >iSegid, i, pDli
1be90 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20  dx->pgno),.     
1bea0 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66       pDlidx->buf
1beb0 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  .p, pDlidx->buf.
1bec0 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  n.      );.    }
1bed0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1bee0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69  BufferZero(&pDli
1bef0 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 70 44  dx->buf);.    pD
1bf00 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1bf10 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
1bf20 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57 72 69  ** Grow the pWri
1bf30 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72  ter->aDlidx[] ar
1bf40 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73 74 20  ray to at least 
1bf50 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e  nLvl elements in
1bf60 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65   size..** Any ne
1bf70 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 73  w array elements
1bf80 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65 66 6f   are zeroed befo
1bf90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  re returning..*/
1bfa0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1bfb0 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 0a  WriteDlidxGrow(.
1bfc0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
1bfd0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1bfe0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1bff0 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d  nLvl.){.  if( p-
1c000 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1c010 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d  & nLvl>=pWriter-
1c020 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46  >nDlidx ){.    F
1c030 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
1c040 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35 44 6c  aDlidx = (Fts5Dl
1c050 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c 69 74  idxWriter*)sqlit
1c060 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 0a 20 20  e3_realloc64(.  
1c070 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
1c080 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74  Dlidx, sizeof(Ft
1c090 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
1c0a0 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20   nLvl.    );.   
1c0b0 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29   if( aDlidx==0 )
1c0c0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
1c0d0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1c0e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1c0f0 69 7a 65 5f 74 20 6e 42 79 74 65 20 3d 20 73 69  ize_t nByte = si
1c100 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72  zeof(Fts5DlidxWr
1c110 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20  iter) * (nLvl - 
1c120 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29  pWriter->nDlidx)
1c130 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26  ;.      memset(&
1c140 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e  aDlidx[pWriter->
1c150 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74  nDlidx], 0, nByt
1c160 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  e);.      pWrite
1c170 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69  r->aDlidx = aDli
1c180 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65  dx;.      pWrite
1c190 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c  r->nDlidx = nLvl
1c1a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1c1b0 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f  turn p->rc;.}../
1c1c0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
1c1d0 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  ent doclist-inde
1c1e0 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69  x accumulating i
1c1f0 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  n pWriter->aDlid
1c200 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20  x[] is large.** 
1c210 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74  enough, flush it
1c220 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74   to disk and ret
1c230 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65  urn 1. Otherwise
1c240 20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64 20   discard it and 
1c250 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a  return.** zero..
1c260 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1c270 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64  s5WriteFlushDlid
1c280 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  x(Fts5Index *p, 
1c290 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1c2a0 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62  Writer){.  int b
1c2b0 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  Flag = 0;..  /* 
1c2c0 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54  If there were FT
1c2d0 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a  S5_MIN_DLIDX_SIZ
1c2e0 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20  E or more empty 
1c2f0 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
1c300 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64  en.  ** to the d
1c310 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72  atabase, also wr
1c320 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ite the doclist-
1c330 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20  index to disk.  
1c340 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  */.  if( pWriter
1c350 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
1c360 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e  n>0 && pWriter->
1c370 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e  nEmpty>=FTS5_MIN
1c380 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20  _DLIDX_SIZE ){. 
1c390 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20     bFlag = 1;.  
1c3a0 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69  }.  fts5WriteDli
1c3b0 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74  dxClear(p, pWrit
1c3c0 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57  er, bFlag);.  pW
1c3d0 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20  riter->nEmpty = 
1c3e0 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61  0;.  return bFla
1c3f0 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
1c400 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1c410 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f  led whenever pro
1c420 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64  cessing of the d
1c430 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a  oclist for the .
1c440 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20  ** last term on 
1c450 6c 65 61 66 20 70 61 67 65 20 28 70 57 72 69 74  leaf page (pWrit
1c460 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20  er->iBtPage) is 
1c470 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a  completed. .**.*
1c480 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  * The doclist-in
1c490 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 65 72  dex for that ter
1c4a0 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73  m is currently s
1c4b0 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  tored in-memory 
1c4c0 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74  within the.** Ft
1c4d0 73 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69  s5SegWriter.aDli
1c4e0 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69  dx[] array. If i
1c4f0 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67  t is large enoug
1c500 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  h, this function
1c510 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75  .** writes it ou
1c520 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69  t to disk. Or, i
1c530 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c  f it is too smal
1c540 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68  l to bother with
1c550 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74  , discards.** it
1c560 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57  ..**.** Fts5SegW
1c570 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72  riter.btterm cur
1c580 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20  rently contains 
1c590 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f  the first term o
1c5a0 6e 20 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a  n page iBtPage..
1c5b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1c5c0 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1c5d0 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ee(Fts5Index *p,
1c5e0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c5f0 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20  pWriter){.  int 
1c600 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74  bFlag;..  assert
1c610 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  ( pWriter->iBtPa
1c620 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e  ge || pWriter->n
1c630 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66  Empty==0 );.  if
1c640 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61  ( pWriter->iBtPa
1c650 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  ge==0 ) return;.
1c660 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72    bFlag = fts5Wr
1c670 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c  iteFlushDlidx(p,
1c680 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66   pWriter);..  if
1c690 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1c6a0 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
1c6b0 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74  char *z = (pWrit
1c6c0 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28  er->btterm.n>0?(
1c6d0 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69  const char*)pWri
1c6e0 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22  ter->btterm.p:""
1c6f0 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f  );.    /* The fo
1c700 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65  llowing was alre
1c710 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35  ady done in fts5
1c720 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a  WriteInit(): */.
1c730 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62      /* sqlite3_b
1c740 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57  ind_int(p->pIdxW
1c750 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65  riter, 1, pWrite
1c760 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20  r->iSegid); */. 
1c770 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1c780 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74  blob(p->pIdxWrit
1c790 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65  er, 2, z, pWrite
1c7a0 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c  r->btterm.n, SQL
1c7b0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1c7c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1c7d0 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65  t64(p->pIdxWrite
1c7e0 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28  r, 3, bFlag + ((
1c7f0 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74  i64)pWriter->iBt
1c800 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73  Page<<1));.    s
1c810 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
1c820 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20  IdxWriter);.    
1c830 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
1c840 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69  reset(p->pIdxWri
1c850 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
1c860 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e 70  3_bind_null(p->p
1c870 49 64 78 57 72 69 74 65 72 2c 20 32 29 3b 0a 20  IdxWriter, 2);. 
1c880 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42   }.  pWriter->iB
1c890 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  tPage = 0;.}../*
1c8a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c  .** This is call
1c8b0 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
1c8c0 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70   leaf page excep
1c8d0 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74  t the first that
1c8e0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20   contains.** at 
1c8f0 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20  least one term. 
1c900 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f  Argument (nTerm/
1c910 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70  pTerm) is the sp
1c920 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d  lit-key - a term
1c930 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
1c940 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d  er than all term
1c950 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72  s written to ear
1c960 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64  lier leaves, and
1c970 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20   equal to or.** 
1c980 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1c990 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74   first term on t
1c9a0 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a  he new leaf..**.
1c9b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
1c9c0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
1c9d0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
1c9e0 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66  Fts5Index.rc. If
1c9f0 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73   an error.** has
1ca00 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1ca10 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
1ca20 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
1ca30 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
1ca40 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1ca50 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1ca60 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1ca70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ca80 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1ca90 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1caa0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1cab0 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20  Writer,         
1cac0 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
1cad0 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c   */.  int nTerm,
1cae0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1caf0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74        /* First t
1cb00 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20  erm on new page 
1cb10 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74  */.){.  fts5Writ
1cb20 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1cb30 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28 20 70  Writer);.  if( p
1cb40 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1cb50 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
1cb60 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57  rSet(&p->rc, &pW
1cb70 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e  riter->btterm, n
1cb80 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1cb90 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61    pWriter->iBtPa
1cba0 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77 72  ge = pWriter->wr
1cbb0 69 74 65 72 2e 70 67 6e 6f 3b 0a 20 20 7d 0a 7d  iter.pgno;.  }.}
1cbc0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1cbd0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1cbe0 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61 20  when flushing a 
1cbf0 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20 63  leaf page that c
1cc00 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65  ontains no.** te
1cc10 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64 69  rms at all to di
1cc20 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sk..*/.static vo
1cc30 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65  id fts5WriteBtre
1cc40 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35 49  eNoTerm(.  Fts5I
1cc50 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1cc60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1cc70 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1cc80 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
1cc90 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20 20  iter *pWriter   
1cca0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1ccb0 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
1ccc0 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65  /* If there were
1ccd0 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74 68   no rowids on th
1cce0 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74 68  e leaf page eith
1ccf0 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c 69  er and the docli
1cd00 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61  st-index.  ** ha
1cd10 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  s already been s
1cd20 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20 61  tarted, append a
1cd30 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20 69  n 0x00 byte to i
1cd40 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  t.  */.  if( pWr
1cd50 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1cd60 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69 74  dInPage && pWrit
1cd70 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1cd80 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74 73  f.n>0 ){.    Fts
1cd90 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
1cda0 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
1cdb0 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20  >aDlidx[0];.    
1cdc0 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e  assert( pDlidx->
1cdd0 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20 20  bPrevValid );.  
1cde0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1cdf0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1ce00 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d  &p->rc, &pDlidx-
1ce10 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  >buf, 0);.  }.. 
1ce20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
1ce30 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65 71  e "number of seq
1ce40 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20 77  uential leaves w
1ce50 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20 63  ithout a term" c
1ce60 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72  ounter. */.  pWr
1ce70 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a  iter->nEmpty++;.
1ce80 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  }..static i64 ft
1ce90 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46 69  s5DlidxExtractFi
1cea0 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75 66  rstRowid(Fts5Buf
1ceb0 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69 36  fer *pBuf){.  i6
1cec0 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20  4 iRowid;.  int 
1ced0 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20  iOff;..  iOff = 
1cee0 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  1 + fts5GetVarin
1cef0 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28  t(&pBuf->p[1], (
1cf00 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
1cf10 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1cf20 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  pBuf->p[iOff], (
1cf30 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20  u64*)&iRowid);. 
1cf40 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a   return iRowid;.
1cf50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69  }../*.** Rowid i
1cf60 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20 62  Rowid has just b
1cf70 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20  een appended to 
1cf80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1cf90 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68 65   page. It is the
1cfa0 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68 65  .** first on the
1cfb0 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e 63   page. This func
1cfc0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e 20  tion appends an 
1cfd0 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74 72  appropriate entr
1cfe0 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  y to the current
1cff0 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
1d000 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  x..*/.static voi
1d010 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78  d fts5WriteDlidx
1d020 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49 6e  Append(.  Fts5In
1d030 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1d040 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1d050 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69 64  r, .  i64 iRowid
1d060 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
1d070 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20  nt bDone = 0;.. 
1d080 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
1d090 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44  =SQLITE_OK && bD
1d0a0 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  one==0; i++){.  
1d0b0 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    i64 iVal;.    
1d0c0 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
1d0d0 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74  *pDlidx = &pWrit
1d0e0 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a  er->aDlidx[i];..
1d0f0 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
1d100 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
1d110 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  g->pgsz ){.     
1d120 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74 20   /* The current 
1d130 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70 61  doclist-index pa
1d140 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69 74  ge is full. Writ
1d150 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64  e it to disk and
1d160 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20 61   push.      ** a
1d170 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64 20   copy of iRowid 
1d180 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63 6f  (which will beco
1d190 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  me the first row
1d1a0 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20  id on the next. 
1d1b0 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d       ** doclist-
1d1c0 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65 29  index leaf page)
1d1d0 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65 78   up into the nex
1d1e0 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 62  t level of the b
1d1f0 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a 20  -tree .      ** 
1d200 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74 68  hierarchy. If th
1d210 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c 75  e node being flu
1d220 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74 6c  shed is currentl
1d230 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c  y the root node,
1d240 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70  .      ** also p
1d250 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f  ush its first ro
1d260 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a  wid upwards. */.
1d270 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 75        pDlidx->bu
1d280 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20  f.p[0] = 0x01;  
1d290 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f    /* Not the roo
1d2a0 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  t node */.      
1d2b0 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
1d2c0 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35   .          FTS5
1d2d0 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72  _DLIDX_ROWID(pWr
1d2e0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c  iter->iSegid, i,
1d2f0 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a   pDlidx->pgno),.
1d300 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78            pDlidx
1d310 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d  ->buf.p, pDlidx-
1d320 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a  >buf.n.      );.
1d330 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
1d340 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69  lidxGrow(p, pWri
1d350 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20  ter, i+2);.     
1d360 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74   pDlidx = &pWrit
1d370 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20  er->aDlidx[i];. 
1d380 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1d390 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c  SQLITE_OK && pDl
1d3a0 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20  idx[1].buf.n==0 
1d3b0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  ){.        i64 i
1d3c0 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69 64  First = fts5Dlid
1d3d0 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77  xExtractFirstRow
1d3e0 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29  id(&pDlidx->buf)
1d3f0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1d400 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74 20  is was the root 
1d410 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20 66  node. Push its f
1d420 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74 6f  irst rowid up to
1d430 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a   the new root. *
1d440 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  /.        pDlidx
1d450 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64  [1].pgno = pDlid
1d460 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20  x->pgno;.       
1d470 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d480 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d490 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1d4a0 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20  ].buf, 0);.     
1d4b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d4c0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1d4d0 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1d4e0 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d  [1].buf, pDlidx-
1d4f0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1d500 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
1d510 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1d520 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
1d530 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a 20  .buf, iFirst);. 
1d540 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
1d550 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b  .bPrevValid = 1;
1d560 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
1d570 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72 73  1].iPrev = iFirs
1d580 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  t;.      }..    
1d590 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d5a0 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d  ferZero(&pDlidx-
1d5b0 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44 6c  >buf);.      pDl
1d5c0 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1d5d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69 64  = 0;.      pDlid
1d5e0 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d  x->pgno++;.    }
1d5f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e  else{.      bDon
1d600 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 1;.    }..  
1d610 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 50    if( pDlidx->bP
1d620 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20 20  revValid ){.    
1d630 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 20    iVal = iRowid 
1d640 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b  - pDlidx->iPrev;
1d650 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d660 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28 69    i64 iPgno = (i
1d670 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e 77  ==0 ? pWriter->w
1d680 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c  riter.pgno : pDl
1d690 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20  idx[-1].pgno);. 
1d6a0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c       assert( pDl
1d6b0 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b  idx->buf.n==0 );
1d6c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1d6d0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d6e0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1d6f0 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e  lidx->buf, !bDon
1d700 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1d710 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d720 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d730 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50  &pDlidx->buf, iP
1d740 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61 6c  gno);.      iVal
1d750 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d   = iRowid;.    }
1d760 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ..    sqlite3Fts
1d770 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1d780 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
1d790 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b  idx->buf, iVal);
1d7a0 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72  .    pDlidx->bPr
1d7b0 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20  evValid = 1;.   
1d7c0 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d   pDlidx->iPrev =
1d7d0 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a   iRowid;.  }.}..
1d7e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1d7f0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 46  WriteFlushLeaf(F
1d800 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1d810 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1d820 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 63  ter){.  static c
1d830 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d  onst u8 zero[] =
1d840 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30   { 0x00, 0x00, 0
1d850 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46  x00, 0x00 };.  F
1d860 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1d870 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1d880 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20 69  >writer;.  i64 i
1d890 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72 74  Rowid;..  assert
1d8a0 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  ( (pPage->pgidx.
1d8b0 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72 2d  n==0)==(pWriter-
1d8c0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
1d8d0 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20  e) );..  /* Set 
1d8e0 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65  the szLeaf heade
1d8f0 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73  r field. */.  as
1d900 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74  sert( 0==fts5Get
1d910 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e  U16(&pPage->buf.
1d920 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35 50  p[2]) );.  fts5P
1d930 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  utU16(&pPage->bu
1d940 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50 61  f.p[2], (u16)pPa
1d950 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69  ge->buf.n);..  i
1d960 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
1d970 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a  stTermInPage ){.
1d980 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77      /* No term w
1d990 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  as written to th
1d9a0 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  is page. */.    
1d9b0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
1d9c0 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20  gidx.n==0 );.   
1d9d0 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e   fts5WriteBtreeN
1d9e0 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72  oTerm(p, pWriter
1d9f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1da00 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 67  /* Append the pg
1da10 69 64 78 20 74 6f 20 74 68 65 20 70 61 67 65 20  idx to the page 
1da20 62 75 66 66 65 72 2e 20 53 65 74 20 74 68 65 20  buffer. Set the 
1da30 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69  szLeaf header fi
1da40 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  eld. */.    fts5
1da50 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1da60 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1da70 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69  >buf, pPage->pgi
1da80 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69  dx.n, pPage->pgi
1da90 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  dx.p);.  }..  /*
1daa0 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
1dab0 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  out to disk */. 
1dac0 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53   iRowid = FTS5_S
1dad0 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72  EGMENT_ROWID(pWr
1dae0 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50  iter->iSegid, pP
1daf0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74  age->pgno);.  ft
1db00 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
1db10 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75  Rowid, pPage->bu
1db20 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
1db30 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  n);..  /* Initia
1db40 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61  lize the next pa
1db50 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
1db60 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
1db70 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66  buf);.  fts5Buff
1db80 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70  erZero(&pPage->p
1db90 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66  gidx);.  fts5Buf
1dba0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1dbb0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1dbc0 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70  f, 4, zero);.  p
1dbd0 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78  Page->iPrevPgidx
1dbe0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70   = 0;.  pPage->p
1dbf0 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63  gno++;..  /* Inc
1dc00 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73  rease the leaves
1dc10 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72   written counter
1dc20 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
1dc30 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a  LeafWritten++;..
1dc40 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61    /* The new lea
1dc50 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73  f holds no terms
1dc60 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20   or rowids */.  
1dc70 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
1dc80 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20  ermInPage = 1;. 
1dc90 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1dca0 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b  RowidInPage = 1;
1dcb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
1dcc0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
1dcd0 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74  m to the segment
1dce0 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62   being written b
1dcf0 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73  y the writer pas
1dd00 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65  sed.** as the se
1dd10 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
1dd20 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
1dd30 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65   occurs, set the
1dd40 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72   Fts5Index.rc er
1dd50 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20  ror code. If an 
1dd60 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c  error has .** al
1dd70 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20  ready occurred, 
1dd80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1dd90 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
1dda0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1ddb0 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20  teAppendTerm(.  
1ddc0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1ddd0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1dde0 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e  pWriter,.  int n
1ddf0 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a  Term, const u8 *
1de00 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20  pTerm .){.  int 
1de10 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20  nPrefix;        
1de20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
1de30 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63  ytes of prefix c
1de40 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74  ompression for t
1de50 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67  erm */.  Fts5Pag
1de60 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1de70 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1de80 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  r;.  Fts5Buffer 
1de90 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72 69 74  *pPgidx = &pWrit
1dea0 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1deb0 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d  ;.  int nMin = M
1dec0 49 4e 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  IN(pPage->term.n
1ded0 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 61 73 73  , nTerm);..  ass
1dee0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
1def0 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
1df00 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
1df10 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
1df20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c  pPage->buf.n>4 |
1df30 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
1df40 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a  tTermInPage );..
1df50 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
1df60 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ent leaf page is
1df70 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20   full, flush it 
1df80 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66  to disk. */.  if
1df90 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
1dfa0 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54  + pPgidx->n + nT
1dfb0 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f  erm + 2)>=p->pCo
1dfc0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
1dfd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
1dfe0 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74  .n>4 ){.      ft
1dff0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1e000 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1e010 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53      if( p->rc!=S
1e020 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1e030 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  n;.    }.    fts
1e040 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1e050 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e060 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41   nTerm+FTS5_DATA
1e070 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20  _PADDING);.  }. 
1e080 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70   .  /* TODO1: Up
1e090 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65 72  dating pgidx her
1e0a0 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e  e. */.  pPgidx->
1e0b0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1e0c0 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20  PutVarint(.     
1e0d0 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69   &pPgidx->p[pPgi
1e0e0 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62  dx->n], pPage->b
1e0f0 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50  uf.n - pPage->iP
1e100 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20  revPgidx.  );.  
1e110 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1e120 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  x = pPage->buf.n
1e130 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50 75  ;.#if 0.  fts5Pu
1e140 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b  tU16(&pPgidx->p[
1e150 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67  pPgidx->n], pPag
1e160 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67  e->buf.n);.  pPg
1e170 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e  idx->n += 2;.#en
1e180 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74  dif..  if( pWrit
1e190 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1e1a0 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65  Page ){.    nPre
1e1b0 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
1e1c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20   pPage->pgno!=1 
1e1d0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
1e1e0 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
1e1f0 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61  rm on a leaf tha
1e200 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
1e210 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20  tmost leaf in.  
1e220 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65      ** the segme
1e230 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68  nt b-tree. In th
1e240 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65  is case it is ne
1e250 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61  cessary to add a
1e260 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a   term to.      *
1e270 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  * the b-tree hie
1e280 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28  rarchy that is (
1e290 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  a) larger than t
1e2a0 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
1e2b0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
1e2c0 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
1e2d0 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29   segment and (b)
1e2e0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
1e2f0 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20   equal to.      
1e300 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e  ** this term. In
1e310 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
1e320 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d  prefix of (pTerm
1e330 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20  /nTerm) that is 
1e340 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  one.      ** byt
1e350 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  e longer than th
1e360 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78  e longest prefix
1e370 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73   (pTerm/nTerm) s
1e380 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20  hares with the. 
1e390 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
1e3a0 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a   term. .      **
1e3b0 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c  .      ** Usuall
1e3c0 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  y, the previous 
1e3d0 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c  term is availabl
1e3e0 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d  e in pPage->term
1e3f0 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
1e400 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74        ** is if t
1e410 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
1e420 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e   term written in
1e430 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
1e440 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20  merge step..    
1e450 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
1e460 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  e the previous t
1e470 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  erm is not avail
1e480 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72  able, so just wr
1e490 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ite a.      ** c
1e4a0 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  opy of (pTerm/nT
1e4b0 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61  erm) into the pa
1e4c0 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20  rent node. This 
1e4d0 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  is slightly.    
1e4e0 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74    ** inefficient
1e4f0 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72  , but still corr
1e500 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ect.  */.      i
1e510 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  nt n = nTerm;.  
1e520 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74      if( pPage->t
1e530 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20  erm.n ){.       
1e540 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65   n = 1 + fts5Pre
1e550 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69 6e  fixCompress(nMin
1e560 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
1e570 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
1e580 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1e590 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
1e5a0 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b  iter, n, pTerm);
1e5b0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
1e5c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1e5d0 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 50 61 67  turn;.      pPag
1e5e0 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
1e5f0 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  iter;.    }.  }e
1e600 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78  lse{.    nPrefix
1e610 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   = fts5PrefixCom
1e620 70 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67  press(nMin, pPag
1e630 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d  e->term.p, pTerm
1e640 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
1e650 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1e660 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e670 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d  f, nPrefix);.  }
1e680 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68  ..  /* Append th
1e690 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1e6a0 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74  s of new data, t
1e6b0 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74  hen the term dat
1e6c0 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f  a itself.  ** to
1e6d0 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20   the page. */.  
1e6e0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e6f0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1e700 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
1e710 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  m - nPrefix);.  
1e720 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1e730 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1e740 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
1e750 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72  - nPrefix, &pTer
1e760 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20  m[nPrefix]);..  
1e770 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
1e780 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65 72  s5PageWriter.ter
1e790 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74  m field. */.  ft
1e7a0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1e7b0 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d  rc, &pPage->term
1e7c0 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
1e7d0 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1e7e0 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30  stTermInPage = 0
1e7f0 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  ;..  pWriter->bF
1e800 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1e810 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 0;.  pWriter->
1e820 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63  bFirstRowidInDoc
1e830 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73  list = 1;..  ass
1e840 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70  ert( p->rc || (p
1e850 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30  Writer->nDlidx>0
1e860 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
1e870 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29  idx[0].buf.n==0)
1e880 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61   );.  pWriter->a
1e890 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20  Dlidx[0].pgno = 
1e8a0 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  pPage->pgno;.}..
1e8b0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72  /*.** Append a r
1e8c0 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69 6f  owid and positio
1e8d0 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c  n-list size fiel
1e8e0 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72 73  d to the writers
1e8f0 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61   output. .*/.sta
1e900 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1e910 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20  teAppendRowid(. 
1e920 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1e930 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1e940 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20  *pWriter,.  i64 
1e950 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28 20  iRowid.){.  if( 
1e960 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e970 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65   ){.    Fts5Page
1e980 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
1e990 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1e9a0 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61 67  ;..    if( (pPag
1e9b0 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65  e->buf.n + pPage
1e9c0 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70  ->pgidx.n)>=p->p
1e9d0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a  Config->pgsz ){.
1e9e0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1e9f0 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1ea00 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ter);.    }..   
1ea10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
1ea20 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 72  o be the first r
1ea30 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
1ea40 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74 68  the page, set th
1ea50 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d  e .    ** rowid-
1ea60 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70  pointer in the p
1ea70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f  age-header. Also
1ea80 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20   append a value 
1ea90 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20  to the dlidx.   
1eaa0 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63   ** buffer, in c
1eab0 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ase a doclist-in
1eac0 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e  dex is required.
1ead0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
1eae0 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
1eaf0 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
1eb00 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61 67   fts5PutU16(pPag
1eb10 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29 70  e->buf.p, (u16)p
1eb20 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20  Page->buf.n);.  
1eb30 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69      fts5WriteDli
1eb40 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72 69  dxAppend(p, pWri
1eb50 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  ter, iRowid);.  
1eb60 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74    }..    /* Writ
1eb70 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a  e the rowid. */.
1eb80 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72 2d      if( pWriter-
1eb90 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1eba0 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65 72  clist || pWriter
1ebb0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1ebc0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74 73  age ){.      fts
1ebd0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
1ebe0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
1ebf0 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 29  ge->buf, iRowid)
1ec00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1ec10 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 2d     assert_nc( p-
1ec20 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57  >rc || iRowid>pW
1ec30 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1ec40 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  d );.      fts5B
1ec50 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1ec60 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1ec70 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20  ->buf, iRowid - 
1ec80 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1ec90 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
1eca0 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1ecb0 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
1ecc0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1ecd0 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
1ece0 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 0;.    pWriter
1ecf0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1ed00 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  age = 0;.  }.}..
1ed10 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1ed20 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
1ed30 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e  stData(.  Fts5In
1ed40 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1ed50 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1ed60 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  r, .  const u8 *
1ed70 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44  aData, .  int nD
1ed80 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67  ata.){.  Fts5Pag
1ed90 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1eda0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1edb0 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  r;.  const u8 *a
1edc0 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20   = aData;.  int 
1edd0 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20  n = nData;.  .  
1ede0 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
1edf0 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20  ig->pgsz>0 );.  
1ee00 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1ee10 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26  LITE_OK .     &&
1ee20 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
1ee30 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 20   pPage->pgidx.n 
1ee40 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  + n)>=p->pConfig
1ee50 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20 20  ->pgsz .  ){.   
1ee60 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70   int nReq = p->p
1ee70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70  Config->pgsz - p
1ee80 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50  Page->buf.n - pP
1ee90 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20 20  age->pgidx.n;.  
1eea0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b    int nCopy = 0;
1eeb0 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70  .    while( nCop
1eec0 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20  y<nReq ){.      
1eed0 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20  i64 dummy;.     
1eee0 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65   nCopy += fts5Ge
1eef0 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79  tVarint(&a[nCopy
1ef00 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29  ], (u64*)&dummy)
1ef10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1ef20 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1ef30 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
1ef40 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b  >buf, nCopy, a);
1ef50 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b  .    a += nCopy;
1ef60 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b  .    n -= nCopy;
1ef70 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c  .    fts5WriteFl
1ef80 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
1ef90 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  er);.  }.  if( n
1efa0 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75  >0 ){.    fts5Bu
1efb0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1efc0 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1efd0 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d  uf, n, a);.  }.}
1efe0 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
1eff0 79 20 64 61 74 61 20 63 61 63 68 65 64 20 62 79  y data cached by
1f000 20 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65   the writer obje
1f010 63 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ct to the databa
1f020 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20  se. Free any.** 
1f030 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
1f040 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
1f050 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  writer..*/.stati
1f060 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
1f070 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e  Finish(.  Fts5In
1f080 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1f090 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1f0a0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
1f0b0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
1f0c0 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20   int *pnLeaf    
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0e0 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20   /* OUT: Number 
1f0f0 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e  of leaf pages in
1f100 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20   b-tree */.){.  
1f110 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67  int i;.  Fts5Pag
1f120 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d  eWriter *pLeaf =
1f130 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1f140 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  r;.  if( p->rc==
1f150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1f160 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 2d 3e   assert( pLeaf->
1f170 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20 69  pgno>=1 );.    i
1f180 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e  f( pLeaf->buf.n>
1f190 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57  4 ){.      fts5W
1f1a0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1f1b0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d   pWriter);.    }
1f1c0 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70  .    *pnLeaf = p
1f1d0 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20  Leaf->pgno-1;.  
1f1e0 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e    if( pLeaf->pgn
1f1f0 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73  o>1 ){.      fts
1f200 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65  5WriteFlushBtree
1f210 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
1f220 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
1f230 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1f240 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42 75  >term);.  fts5Bu
1f250 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1f260 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
1f270 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e  ferFree(&pLeaf->
1f280 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75  pgidx);.  fts5Bu
1f290 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65  fferFree(&pWrite
1f2a0 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66  r->btterm);..  f
1f2b0 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
1f2c0 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b  r->nDlidx; i++){
1f2d0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1f2e0 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69  BufferFree(&pWri
1f2f0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62  ter->aDlidx[i].b
1f300 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  uf);.  }.  sqlit
1f310 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72 2d  e3_free(pWriter-
1f320 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61  >aDlidx);.}..sta
1f330 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1f340 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e  teInit(.  Fts5In
1f350 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
1f360 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1f370 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69 64  r, .  int iSegid
1f380 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20  .){.  const int 
1f390 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f  nBuffer = p->pCo
1f3a0 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53  nfig->pgsz + FTS
1f3b0 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a  5_DATA_PADDING;.
1f3c0 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65  .  memset(pWrite
1f3d0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
1f3e0 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
1f3f0 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20  pWriter->iSegid 
1f400 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74 73  = iSegid;..  fts
1f410 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1f420 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b 0a  p, pWriter, 1);.
1f430 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65    pWriter->write
1f440 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57  r.pgno = 1;.  pW
1f450 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
1f460 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70  mInPage = 1;.  p
1f470 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
1f480 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
1f490 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1f4a0 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  buf.n==0 );.  as
1f4b0 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77  sert( pWriter->w
1f4c0 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30  riter.pgidx.n==0
1f4d0 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74   );..  /* Grow t
1f4e0 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 74  he two buffers t
1f4f0 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69 6e 67  o pgsz + padding
1f500 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
1f510 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  */.  sqlite3Fts5
1f520 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
1f530 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69  c, &pWriter->wri
1f540 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75 66 66  ter.pgidx, nBuff
1f550 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  er);.  sqlite3Ft
1f560 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
1f570 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
1f580 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75 66 66  riter.buf, nBuff
1f590 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  er);..  if( p->p
1f5a0 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a  IdxWriter==0 ){.
1f5b0 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
1f5c0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
1f5d0 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
1f5e0 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
1f5f0 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74 65 72  , &p->pIdxWriter
1f600 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
1f610 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49 4e  f(.          "IN
1f620 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27 2e 27  SERT INTO '%q'.'
1f630 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c 74 65  %q_idx'(segid,te
1f640 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45 53 28  rm,pgno) VALUES(
1f650 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20  ?,?,?)", .      
1f660 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
1f670 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
1f680 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20  .    ));.  }..  
1f690 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1f6a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49  E_OK ){.    /* I
1f6b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 34 2d  nitialize the 4-
1f6c0 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65 20 68  byte leaf-page h
1f6d0 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e 20 2a  eader to 0x00. *
1f6e0 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57 72  /.    memset(pWr
1f6f0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1f700 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70  .p, 0, 4);.    p
1f710 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62  Writer->writer.b
1f720 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f  uf.n = 4;..    /
1f730 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72 72 65  * Bind the curre
1f740 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  nt output segmen
1f750 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e 64 65  t id to the inde
1f760 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73 20 69  x-writer. This i
1f770 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69  s an.    ** opti
1f780 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20 62 69  mization over bi
1f790 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20 76  nding the same v
1f7a0 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20 6f 76  alue over and ov
1f7b0 65 72 20 61 73 20 72 6f 77 73 20 61 72 65 0a 20  er as rows are. 
1f7c0 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20 69     ** inserted i
1f7d0 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74 68 65  nto %_idx by the
1f7e0 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 72 2e   current writer.
1f7f0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1f800 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
1f810 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69  xWriter, 1, pWri
1f820 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20  ter->iSegid);.  
1f830 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61  }.}../*.** Itera
1f840 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75 73  tor pIter was us
1f850 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
1f860 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74 20  rough the input 
1f870 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61  segments of on a
1f880 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n.** incremental
1f890 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e   merge operation
1f8a0 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1f8b0 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65  is called if the
1f8c0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20   incremental.** 
1f8d0 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20 66  merge step has f
1f8e0 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65 20  inished but the 
1f8f0 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65  input has not be
1f900 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78  en completely ex
1f910 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  hausted..*/.stat
1f920 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d  ic void fts5Trim
1f930 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64  Segments(Fts5Ind
1f940 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20  ex *p, Fts5Iter 
1f950 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
1f960 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
1f970 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
1f980 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
1f990 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
1f9a0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1f9b0 53 65 67 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  Seg && p->rc==SQ
1f9c0 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
1f9d0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1f9e0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
1f9f0 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Seg[i];.    if( 
1fa00 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  pSeg->pSeg==0 ){
1fa10 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20  .      /* no-op 
1fa20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  */.    }else if(
1fa30 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20   pSeg->pLeaf==0 
1fa40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20  ){.      /* All 
1fa50 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69  keys from this i
1fa60 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76  nput segment hav
1fa70 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65  e been transfere
1fa80 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  d to the output.
1fa90 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f  .      ** Set bo
1faa0 74 68 20 74 68 65 20 66 69 72 73 74 20 61 6e 64  th the first and
1fab0 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65   last page-numbe
1fac0 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  rs to 0 to indic
1fad0 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ate that the.   
1fae0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73     ** segment is
1faf0 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20   now empty. */. 
1fb00 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
1fb10 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20  >pgnoLast = 0;. 
1fb20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d       pSeg->pSeg-
1fb30 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a  >pgnoFirst = 0;.
1fb40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fb50 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67   int iOff = pSeg
1fb60 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  ->iTermLeafOffse
1fb70 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74  t;     /* Offset
1fb80 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65   on new first le
1fb90 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  af page */.     
1fba0 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b   i64 iLeafRowid;
1fbb0 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20  .      Fts5Data 
1fbc0 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e  *pData;.      in
1fbd0 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53  t iId = pSeg->pS
1fbe0 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20  eg->iSegid;.    
1fbf0 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b    u8 aHdr[4] = {
1fc00 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1fc10 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20  , 0x00};..      
1fc20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53  iLeafRowid = FTS
1fc30 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
1fc40 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d  iId, pSeg->iTerm
1fc50 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20  LeafPgno);.     
1fc60 20 70 44 61 74 61 20 3d 20 66 74 73 35 4c 65 61   pData = fts5Lea
1fc70 66 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f  fRead(p, iLeafRo
1fc80 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20  wid);.      if( 
1fc90 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
1fca0 20 69 66 28 20 69 4f 66 66 3e 70 44 61 74 61 2d   if( iOff>pData-
1fcb0 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
1fcc0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6e       /* This can
1fcd0 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 61   occur if the pa
1fce0 67 65 73 20 74 68 61 74 20 74 68 65 20 73 65 67  ges that the seg
1fcf0 6d 65 6e 74 73 20 6f 63 63 75 70 79 20 6f 76 65  ments occupy ove
1fd00 72 6c 61 70 20 2d 20 69 66 0a 20 20 20 20 20 20  rlap - if.      
1fd10 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65 20      ** a single 
1fd20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61 73  page has been as
1fd30 73 69 67 6e 65 64 20 74 6f 20 6d 6f 72 65 20 74  signed to more t
1fd40 68 61 6e 20 6f 6e 65 20 73 65 67 6d 65 6e 74 2e  han one segment.
1fd50 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   In.          **
1fd60 20 74 68 69 73 20 63 61 73 65 20 61 20 70 72 69   this case a pri
1fd70 6f 72 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  or iteration of 
1fd80 74 68 69 73 20 6c 6f 6f 70 20 6d 61 79 20 68 61  this loop may ha
1fd90 76 65 20 63 6f 72 72 75 70 74 65 64 20 74 68 65  ve corrupted the
1fda0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 65  .          ** se
1fdb0 67 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  gment currently 
1fdc0 62 65 69 6e 67 20 74 72 69 6d 6d 65 64 2e 20 20  being trimmed.  
1fdd0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  */.          p->
1fde0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
1fdf0 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  T;.        }else
1fe00 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
1fe10 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66 29  BufferZero(&buf)
1fe20 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1fe30 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
1fe40 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e  c, &buf, pData->
1fe50 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  nn);.          f
1fe60 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1fe70 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1fe80 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20  , sizeof(aHdr), 
1fe90 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 20  aHdr);.         
1fea0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1feb0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1fec0 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d  &buf, pSeg->term
1fed0 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  .n);.          f
1fee0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
1fef0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  lob(&p->rc, &buf
1ff00 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20  , pSeg->term.n, 
1ff10 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20  pSeg->term.p);. 
1ff20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1ff30 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1ff40 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1ff50 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 26  a->szLeaf-iOff,&
1ff60 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b  pData->p[iOff]);
1ff70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1ff80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ff90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
1ffa0 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66  * Set the szLeaf
1ffb0 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20   field */.      
1ffc0 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
1ffd0 28 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36  (&buf.p[2], (u16
1ffe0 29 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20  )buf.n);.       
1fff0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
20000 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e 65  /* Set up the ne
20010 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72 72  w page-index arr
20020 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ay */.          
20030 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20040 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
20050 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  buf, 4);.       
20060 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65     if( pSeg->iLe
20070 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54  afPgno==pSeg->iT
20080 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20  ermLeafPgno .   
20090 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d          && pSeg-
200a0 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70  >iEndofDoclist<p
200b0 44 61 74 61 2d 3e 73 7a 4c 65 61 66 0a 20 20 20  Data->szLeaf.   
200c0 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67 2d          && pSeg-
200d0 3e 69 50 67 69 64 78 4f 66 66 3c 3d 70 44 61 74  >iPgidxOff<=pDat
200e0 61 2d 3e 6e 6e 0a 20 20 20 20 20 20 20 20 20 20  a->nn.          
200f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
20100 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61  nt nDiff = pData
20110 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d  ->szLeaf - pSeg-
20120 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a  >iEndofDoclist;.
20130 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
20140 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
20150 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
20160 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69   buf.n - 1 - nDi
20170 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20  ff - 4);.       
20180 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
20190 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
201a0 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20  , &buf, .       
201b0 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e           pData->
201c0 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64  nn - pSeg->iPgid
201d0 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  xOff, &pData->p[
201e0 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d  pSeg->iPgidxOff]
201f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a  .            );.
20200 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
20210 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65         pSeg->pSe
20220 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 70  g->pgnoFirst = p
20230 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
20240 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  no;.          ft
20250 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c 20  s5DataDelete(p, 
20260 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
20270 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c 65 61  ID(iId, 1), iLea
20280 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  fRowid);.       
20290 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
202a0 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20  (p, iLeafRowid, 
202b0 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20  buf.p, buf.n);. 
202c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
202d0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
202e0 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d  (pData);.      }
202f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73  .    }.  }.  fts
20300 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
20310 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
20320 64 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b  d fts5MergeChunk
20330 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
20340 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69  Index *p, .  voi
20350 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73  d *pCtx, .  cons
20360 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e  t u8 *pChunk, in
20370 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74  t nChunk.){.  Ft
20380 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
20390 69 74 65 72 20 3d 20 28 46 74 73 35 53 65 67 57  iter = (Fts5SegW
203a0 72 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66  riter*)pCtx;.  f
203b0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f  ts5WriteAppendPo
203c0 73 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57 72  slistData(p, pWr
203d0 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43  iter, pChunk, nC
203e0 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  hunk);.}../*.**.
203f0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
20400 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
20410 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  el(.  Fts5Index 
20420 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
20430 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
20440 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
20450 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
20460 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20  **ppStruct,     
20470 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75    /* IN/OUT: Stu
20480 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
20490 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
204a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204b0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
204c0 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20  read input from 
204d0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20  */.  int *pnRem 
204e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204f0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70       /* Write up
20500 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75   to this many ou
20510 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29  tput leaves */.)
20520 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
20530 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
20540 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74  Struct;.  Fts5St
20550 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
20560 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
20570 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46  Level[iLvl];.  F
20580 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
20590 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74  l *pLvlOut;.  Ft
205a0 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
205b0 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72  0;       /* Iter
205c0 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e 70  ator to read inp
205d0 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  ut data */.  int
205e0 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20   nRem = pnRem ? 
205f0 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20  *pnRem : 0;  /* 
20600 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67 65  Output leaf page
20610 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20  s left to write 
20620 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b  */.  int nInput;
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20640 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
20650 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  f input segments
20660 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
20670 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20  ter writer;     
20680 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
20690 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
206a0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
206b0 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f   *pSeg;     /* O
206c0 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f  utput segment */
206d0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
206e0 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73  rm;.  int bOldes
206f0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
20700 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
20710 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
20720 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73  ent is the oldes
20730 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74 61  t */.  int eDeta
20740 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
20750 3e 65 44 65 74 61 69 6c 3b 0a 20 20 63 6f 6e 73  >eDetail;.  cons
20760 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54  t int flags = FT
20770 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
20780 4f 55 54 50 55 54 3b 0a 20 20 69 6e 74 20 62 54  OUTPUT;.  int bT
20790 65 72 6d 57 72 69 74 74 65 6e 20 3d 20 30 3b 20  ermWritten = 0; 
207a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
207b0 65 20 69 66 20 63 75 72 72 65 6e 74 20 74 65 72  e if current ter
207c0 6d 20 61 6c 72 65 61 64 79 20 6f 75 74 70 75 74  m already output
207d0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
207e0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
207f0 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  vel );.  assert(
20800 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70   pLvl->nMerge<=p
20810 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20  Lvl->nSeg );..  
20820 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20  memset(&writer, 
20830 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
20840 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d  gWriter));.  mem
20850 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
20860 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
20870 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e  );.  if( pLvl->n
20880 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76  Merge ){.    pLv
20890 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d  lOut = &pStruct-
208a0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b  >aLevel[iLvl+1];
208b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76  .    assert( pLv
208c0 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a  lOut->nSeg>0 );.
208d0 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76      nInput = pLv
208e0 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70  l->nMerge;.    p
208f0 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e  Seg = &pLvlOut->
20900 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53  aSeg[pLvlOut->nS
20910 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35  eg-1];..    fts5
20920 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
20930 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67  iter, pSeg->iSeg
20940 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e  id);.    writer.
20950 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53  writer.pgno = pS
20960 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a  eg->pgnoLast+1;.
20970 20 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61      writer.iBtPa
20980 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ge = 0;.  }else{
20990 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20  .    int iSegid 
209a0 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  = fts5AllocateSe
209b0 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b  gid(p, pStruct);
209c0 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20  ..    /* Extend 
209d0 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72  the Fts5Structur
209e0 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75  e object as requ
209f0 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  ired to ensure t
20a00 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a  he output.    **
20a10 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e   segment exists.
20a20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c   */.    if( iLvl
20a30 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ==pStruct->nLeve
20a40 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73  l-1 ){.      fts
20a50 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
20a60 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72  el(&p->rc, ppStr
20a70 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72  uct);.      pStr
20a80 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b  uct = *ppStruct;
20a90 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
20aa0 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
20ab0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
20ac0 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20  uct, iLvl+1, 1, 
20ad0 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  0);.    if( p->r
20ae0 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
20af0 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
20b00 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
20b10 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53     pLvlOut = &pS
20b20 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
20b30 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35  vl+1];..    fts5
20b40 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
20b50 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a  iter, iSegid);..
20b60 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
20b70 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68  ew segment to th
20b80 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a  e output level *
20b90 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c  /.    pSeg = &pL
20ba0 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c  vlOut->aSeg[pLvl
20bb0 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20  Out->nSeg];.    
20bc0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b  pLvlOut->nSeg++;
20bd0 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46  .    pSeg->pgnoF
20be0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53  irst = 1;.    pS
20bf0 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65  eg->iSegid = iSe
20c00 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74  gid;.    pStruct
20c10 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20  ->nSegment++;.. 
20c20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74     /* Read input
20c30 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e   from all segmen
20c40 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
20c50 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e  level */.    nIn
20c60 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67  put = pLvl->nSeg
20c70 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20  ;.  }.  bOldest 
20c80 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  = (pLvlOut->nSeg
20c90 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e  ==1 && pStruct->
20ca0 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b  nLevel==iLvl+2);
20cb0 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c  ..  assert( iLvl
20cc0 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73  >=0 );.  for(fts
20cd0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
20ce0 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73 2c   pStruct, flags,
20cf0 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20   0, 0, 0, iLvl, 
20d00 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b  nInput, &pIter);
20d10 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
20d20 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
20d30 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
20d40 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
20d50 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
20d60 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
20d70 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26  er *pSegIter = &
20d80 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
20d90 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
20da0 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20  irst ];.    int 
20db0 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20  nPos;           
20dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73            /* pos
20dd0 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
20de0 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20  field value */. 
20df0 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20     int nTerm;.  
20e00 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
20e10 6d 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  m;..    pTerm = 
20e20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
20e30 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29  m(pIter, &nTerm)
20e40 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21  ;.    if( nTerm!
20e50 3d 74 65 72 6d 2e 6e 20 7c 7c 20 66 74 73 35 4d  =term.n || fts5M
20e60 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65 72  emcmp(pTerm, ter
20e70 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a 20  m.p, nTerm) ){. 
20e80 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20 26       if( pnRem &
20e90 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57 72  & writer.nLeafWr
20ea0 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20  itten>nRem ){.  
20eb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
20ec0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42     }.      fts5B
20ed0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
20ee0 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70   &term, nTerm, p
20ef0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 54 65  Term);.      bTe
20f00 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b 0a 20 20  rmWritten =0;.  
20f10 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63    }..    /* Chec
20f20 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69  k for key annihi
20f30 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  lation. */.    i
20f40 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f  f( pSegIter->nPo
20f50 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74  s==0 && (bOldest
20f60 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44   || pSegIter->bD
20f70 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  el==0) ) continu
20f80 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  e;..    if( p->r
20f90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
20fa0 62 54 65 72 6d 57 72 69 74 74 65 6e 3d 3d 30 20  bTermWritten==0 
20fb0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
20fc0 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20   is a new term. 
20fd0 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f  Append a term to
20fe0 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d   the output segm
20ff0 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74  ent. */.      ft
21000 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72  s5WriteAppendTer
21010 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54  m(p, &writer, nT
21020 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20  erm, pTerm);.   
21030 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e 20     bTermWritten 
21040 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
21050 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f  /* Append the ro
21060 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  wid to the outpu
21070 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54  t */.    /* WRIT
21080 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
21090 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
210a0 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69  endRowid(p, &wri
210b0 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74  ter, fts5MultiIt
210c0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 29 3b  erRowid(pIter));
210d0 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61 69  ..    if( eDetai
210e0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
210f0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
21100 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 20   pSegIter->bDel 
21110 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
21120 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
21130 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74 65  t(&p->rc, &write
21140 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29  r.writer.buf, 0)
21150 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
21160 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20 29  egIter->nPos>0 )
21170 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
21180 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
21190 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74  nt(&p->rc, &writ
211a0 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30  er.writer.buf, 0
211b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
211c0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
211d0 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
211e0 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
211f0 74 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f 75  t data to the ou
21200 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e 50  tput */.      nP
21210 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e  os = pSegIter->n
21220 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72  Pos*2 + pSegIter
21230 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 66 74  ->bDel;.      ft
21240 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
21250 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72  rint(&p->rc, &wr
21260 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c  iter.writer.buf,
21270 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 66 74   nPos);.      ft
21280 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
21290 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76 6f 69  , pSegIter, (voi
212a0 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73 35  d*)&writer, fts5
212b0 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61  MergeChunkCallba
212c0 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ck);.    }.  }..
212d0 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c    /* Flush the l
212e0 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f  ast leaf page to
212f0 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f   disk. Set the o
21300 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d  utput segment b-
21310 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a  tree height.  **
21320 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70   and last leaf p
21330 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68  age number at th
21340 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f  e same time.  */
21350 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69  .  fts5WriteFini
21360 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
21370 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b  pSeg->pgnoLast);
21380 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74  ..  if( fts5Mult
21390 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
213a0 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  r) ){.    int i;
213b0 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
213c0 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65  the redundant se
213d0 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
213e0 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
213f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
21400 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  Input; i++){.   
21410 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76     fts5DataRemov
21420 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c  eSegment(p, pLvl
21430 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64  ->aSeg[i].iSegid
21440 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
21450 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75   Remove the redu
21460 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66  ndant segments f
21470 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65  rom the input le
21480 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  vel */.    if( p
21490 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75  Lvl->nSeg!=nInpu
214a0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
214b0 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Move = (pLvl->nS
214c0 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73  eg - nInput) * s
214d0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
214e0 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
214f0 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d     memmove(pLvl-
21500 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53  >aSeg, &pLvl->aS
21510 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76  eg[nInput], nMov
21520 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53  e);.    }.    pS
21530 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20  truct->nSegment 
21540 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70  -= nInput;.    p
21550 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e  Lvl->nSeg -= nIn
21560 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  put;.    pLvl->n
21570 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69  Merge = 0;.    i
21580 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  f( pSeg->pgnoLas
21590 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c  t==0 ){.      pL
215a0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20  vlOut->nSeg--;. 
215b0 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53       pStruct->nS
215c0 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a  egment--;.    }.
215d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
215e0 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  ert( pSeg->pgnoL
215f0 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73  ast>0 );.    fts
21600 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c  5TrimSegments(p,
21610 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76   pIter);.    pLv
21620 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70  l->nMerge = nInp
21630 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d  ut;.  }..  fts5M
21640 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49 74  ultiIterFree(pIt
21650 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  er);.  fts5Buffe
21660 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
21670 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52  if( pnRem ) *pnR
21680 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65  em -= writer.nLe
21690 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a  afWritten;.}../*
216a0 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67  .** Do up to nPg
216b0 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65   pages of autome
216c0 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20  rge work on the 
216d0 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  index..**.** Ret
216e0 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79 20  urn true if any 
216f0 63 68 61 6e 67 65 73 20 77 65 72 65 20 61 63 74  changes were act
21700 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72 20 66  ually made, or f
21710 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
21720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
21730 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20  s5IndexMerge(.  
21740 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
21750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21760 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
21770 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
21780 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
21790 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
217a0 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
217b0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
217c0 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 2c 20  x */.  int nPg, 
217d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217e0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
217f0 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f  of work to do */
21800 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20 20 20  .  int nMin     
21810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21820 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75     /* Minimum nu
21830 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
21840 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
21850 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67    int nRem = nPg
21860 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20 30  ;.  int bRet = 0
21870 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
21880 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70  e *pStruct = *pp
21890 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65 28  Struct;.  while(
218a0 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63   nRem>0 && p->rc
218b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
218c0 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
218d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
218e0 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68 72  * To iterate thr
218f0 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
21900 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c 20     int iBestLvl 
21910 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
21920 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e 67  * Level offering
21930 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74 20   the most input 
21940 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
21950 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20 20  int nBest = 0;  
21960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
21970 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73  umber of input s
21980 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74 20  egments on best 
21990 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a  level */..    /*
219a0 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74 6f   Set iBestLvl to
219b0 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72 65   the level to re
219c0 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  ad input segment
219d0 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61  s from. */.    a
219e0 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
219f0 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20  nLevel>0 );.    
21a00 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
21a10 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
21a20 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
21a30 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
21a40 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74  vel *pLvl = &pSt
21a50 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
21a60 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
21a70 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
21a80 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
21a90 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a  nMerge>nBest ){.
21aa0 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74 4c            iBestL
21ab0 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20  vl = iLvl;.     
21ac0 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
21ad0 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20  l->nMerge;.     
21ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65     }.        bre
21af0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
21b00 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67    if( pLvl->nSeg
21b10 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20  >nBest ){.      
21b20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
21b30 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69 42  nSeg;.        iB
21b40 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
21b50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
21b60 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69 73    /* If nBest is
21b70 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74   still 0, then t
21b80 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62 65  he index must be
21b90 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65   empty. */.#ifde
21ba0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
21bb0 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e     for(iLvl=0; n
21bc0 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c  Best==0 && iLvl<
21bd0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
21be0 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
21bf0 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
21c00 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
21c10 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23  eg==0 );.    }.#
21c20 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20 6e  endif..    if( n
21c30 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70 53 74  Best<nMin && pSt
21c40 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
21c50 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
21c60 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
21c70 0a 20 20 20 20 7d 0a 20 20 20 20 62 52 65 74 20  .    }.    bRet 
21c80 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  = 1;.    fts5Ind
21c90 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
21ca0 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c  &pStruct, iBestL
21cb0 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
21cc0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
21cd0 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d  E_OK && pStruct-
21ce0 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c  >aLevel[iBestLvl
21cf0 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ].nMerge==0 ){. 
21d00 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
21d10 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65  rePromote(p, iBe
21d20 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74  stLvl+1, pStruct
21d30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
21d40 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75  ppStruct = pStru
21d50 63 74 3b 0a 20 20 72 65 74 75 72 6e 20 62 52 65  ct;.  return bRe
21d60 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f  t;.}../*.** A to
21d70 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61  tal of nLeaf lea
21d80 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20  f pages of data 
21d90 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c  has just been fl
21da0 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c  ushed to a level
21db0 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54  -0.** segment. T
21dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64  his function upd
21dd0 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 63  ates the write-c
21de0 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67  ounter according
21df0 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65  ly and, if.** ne
21e00 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d  cessary, perform
21e10 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  s incremental me
21e20 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20  rge work..**.** 
21e30 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
21e40 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
21e50 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
21e60 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
21e70 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
21e80 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
21e90 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
21ea0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
21eb0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75 74  oid fts5IndexAut
21ec0 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  omerge(.  Fts5In
21ed0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
21ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
21ef0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
21f00 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
21f10 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
21f20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
21f30 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
21f40 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
21f50 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20   int nLeaf      
21f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
21f80 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74  tput leaves just
21f90 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20   written */.){. 
21fa0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
21fb0 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e  TE_OK && p->pCon
21fc0 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e  fig->nAutomerge>
21fd0 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
21fe0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
21ff0 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
22000 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20   u64 nWrite;    
22010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22020 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
22030 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  of write-counter
22040 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72   */.    int nWor
22050 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
22060 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
22070 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74  of work-quanta t
22080 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20  o perform */.   
22090 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20   int nRem;      
220a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
220b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
220c0 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
220d0 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rite */..    /* 
220e0 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65  Update the write
220f0 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20  -counter. While 
22100 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57  doing so, set nW
22110 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69  ork. */.    nWri
22120 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
22130 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
22140 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28 28   nWork = (int)((
22150 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29  (nWrite + nLeaf)
22160 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
22170 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e   - (nWrite / p->
22180 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20 20  nWorkUnit));.   
22190 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
221a0 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66  Counter += nLeaf
221b0 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69 6e  ;.    nRem = (in
221c0 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20  t)(p->nWorkUnit 
221d0 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63  * nWork * pStruc
221e0 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20 20  t->nLevel);..   
221f0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
22200 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65  p, ppStruct, nRe
22210 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e  m, p->pConfig->n
22220 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20 7d 0a  Automerge);.  }.
22230 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
22240 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
22250 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
22260 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
22270 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
22280 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
22290 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
222a0 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20   **ppStruct     
222b0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
222c0 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
222d0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  of index */.){. 
222e0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73   const int nCris
222f0 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  is = p->pConfig-
22300 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20  >nCrisisMerge;. 
22310 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
22320 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
22330 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20  uct;.  int iLvl 
22340 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
22350 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
22360 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
22370 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vel>0 );.  while
22380 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
22390 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
223a0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
223b0 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20  >=nCrisis ){.   
223c0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
223d0 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
223e0 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20  , iLvl, 0);.    
223f0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
22400 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72  QLITE_OK || pStr
22410 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76  uct->nLevel>(iLv
22420 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35  l+1) );.    fts5
22430 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
22440 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72  (p, iLvl+1, pStr
22450 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b  uct);.    iLvl++
22460 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63  ;.  }.  *ppStruc
22470 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a  t = pStruct;.}..
22480 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
22490 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49  ndexReturn(Fts5I
224a0 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  ndex *p){.  int 
224b0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d  rc = p->rc;.  p-
224c0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
224d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
224e0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
224f0 46 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73  Fts5FlushCtx Fts
22500 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63  5FlushCtx;.struc
22510 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b  t Fts5FlushCtx {
22520 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49  .  Fts5Index *pI
22530 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69  dx;.  Fts5SegWri
22540 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a  ter writer; .};.
22550 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42  ./*.** Buffer aB
22560 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20  uf[] contains a 
22570 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c  list of varints,
22580 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67   all small enoug
22590 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61  h to fit.** in a
225a0 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e   32-bit integer.
225b0 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65   Return the size
225c0 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20   of the largest 
225d0 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a  prefix of this .
225e0 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74  ** list nMax byt
225f0 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69  es or less in si
22600 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
22610 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65  t fts5PoslistPre
22620 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42  fix(const u8 *aB
22630 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20  uf, int nMax){. 
22640 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20   int ret;.  u32 
22650 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66  dummy;.  ret = f
22660 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61  ts5GetVarint32(a
22670 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69  Buf, dummy);.  i
22680 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20  f( ret<nMax ){. 
22690 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20     while( 1 ){. 
226a0 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73       int i = fts
226b0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42  5GetVarint32(&aB
226c0 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b  uf[ret], dummy);
226d0 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20  .      if( (ret 
226e0 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72  + i) > nMax ) br
226f0 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b  eak;.      ret +
22700 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = i;.    }.  }. 
22710 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a   return ret;.}..
22720 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20  /*.** Flush the 
22730 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d  contents of in-m
22740 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
22750 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20   iHash to a new 
22760 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d  level-0 .** segm
22770 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73  ent on disk. Als
22780 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 72  o update the cor
22790 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63  responding struc
227a0 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
227b0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
227c0 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46  ccurs, set the F
227d0 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f  ts5Index.rc erro
227e0 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72  r code. If an er
227f0 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65  ror has .** alre
22800 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68  ady occurred, th
22810 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
22820 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
22830 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68  c void fts5Flush
22840 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64 65  OneHash(Fts5Inde
22850 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73  x *p){.  Fts5Has
22860 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48  h *pHash = p->pH
22870 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63  ash;.  Fts5Struc
22880 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
22890 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69   int iSegid;.  i
228a0 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b  nt pgnoLast = 0;
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61   /* Last leaf pa
228d0 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67  ge number in seg
228e0 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62  ment */..  /* Ob
228f0 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65  tain a reference
22900 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74   to the index st
22910 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f  ructure and allo
22920 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
22930 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74  nt-id.  ** for t
22940 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73  he new level-0 s
22950 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53  egment.  */.  pS
22960 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
22970 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
22980 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c  iSegid = fts5All
22990 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70 53  ocateSegid(p, pS
229a0 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
229b0 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74  ructureInvalidat
229c0 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  e(p);..  if( iSe
229d0 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
229e0 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
229f0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20 20  Config->pgsz;.  
22a00 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
22a10 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
22a20 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53 74 72  ail;.    Fts5Str
22a30 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
22a40 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65  Seg;   /* New se
22a50 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74  gment within pSt
22a60 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35  ruct */.    Fts5
22a70 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
22a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
22a90 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
22aa0 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61  assemble leaf pa
22ab0 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ge */.    Fts5Bu
22ac0 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20  ffer *pPgidx;   
22ad0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
22ae0 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
22af0 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a  semble pgidx */.
22b00 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
22b10 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66  er writer;.    f
22b20 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
22b30 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
22b40 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  ;..    pBuf = &w
22b50 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
22b60 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20 26  ;.    pPgidx = &
22b70 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
22b80 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73  idx;..    /* fts
22b90 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f  5WriteInit() sho
22ba0 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c  uld have initial
22bb0 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72 73  ized the buffers
22bc0 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79   to (most likely
22bd0 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78  ).    ** the max
22be0 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69  imum space requi
22bf0 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  red. */.    asse
22c00 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75  rt( p->rc || pBu
22c10 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  f->nSpace>=(pgsz
22c20 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
22c30 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73  DING) );.    ass
22c40 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50  ert( p->rc || pP
22c50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  gidx->nSpace>=(p
22c60 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
22c70 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20  PADDING) );..   
22c80 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69   /* Begin scanni
22c90 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20  ng through hash 
22ca0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54  table entries. T
22cb0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  his loop runs on
22cc0 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  ce for each.    
22cd0 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  ** term/doclist 
22ce0 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
22cf0 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68   within the hash
22d00 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
22d10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
22d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
22d30 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
22d40 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61  HashScanInit(pHa
22d50 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  sh, 0, 0);.    }
22d60 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
22d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
22d80 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61  0==sqlite3Fts5Ha
22d90 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29  shScanEof(pHash)
22da0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
22db0 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
22dc0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
22dd0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
22de0 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
22df0 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
22e00 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
22e10 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
22e20 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
22e30 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
22e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22e50 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
22e60 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
22e70 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
22e80 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   term for this e
22e90 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  ntry to disk. */
22ea0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
22eb0 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
22ec0 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
22ed0 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c  pDoclist, &nDocl
22ee0 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ist);.      fts5
22ef0 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
22f00 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e 74  p, &writer, (int
22f10 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20  )strlen(zTerm), 
22f20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d  (const u8*)zTerm
22f30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
22f40 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
22f50 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 61 73  break;..      as
22f60 73 65 72 74 28 20 77 72 69 74 65 72 2e 62 46 69  sert( writer.bFi
22f70 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3d 3d  rstRowidInPage==
22f80 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  0 );.      if( p
22f90 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b 20  gsz>=(pBuf->n + 
22fa0 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f 63  pPgidx->n + nDoc
22fb0 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20 20  list + 1) ){.   
22fc0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
22fd0 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
22fe0 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
22ff0 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20  nt leaf. */.    
23000 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
23010 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
23020 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44 6f  f, pDoclist, nDo
23030 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d 65  clist);.      }e
23040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
23050 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20   iRowid = 0;.   
23060 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20       i64 iDelta 
23070 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
23080 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20 20   iOff = 0;..    
23090 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
230a0 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e  e doclist will n
230b0 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
230c0 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  eaf. The followi
230d0 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ng .        ** l
230e0 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68 72  oop iterates thr
230f0 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74  ough the poslist
23100 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
23110 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
23120 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20      ** doclist. 
23130 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
23140 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
23150 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63  _OK && iOff<nDoc
23160 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  list ){.        
23170 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
23180 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69 73  tVarint(&pDoclis
23190 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  t[iOff], (u64*)&
231a0 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
231b0 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44 65     iRowid += iDe
231c0 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  lta;.          .
231d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 72            if( wr
231e0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
231f0 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  InPage ){.      
23200 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36        fts5PutU16
23210 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28 75  (&pBuf->p[0], (u
23220 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f  16)pBuf->n);   /
23230 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  * first rowid on
23240 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
23250 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
23260 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
23270 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
23280 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b  uf->n], iRowid);
23290 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69  .            wri
232a0 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
232b0 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  nPage = 0;.     
232c0 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
232d0 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26  DlidxAppend(p, &
232e0 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  writer, iRowid);
232f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23300 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
23310 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K ) break;.     
23320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23330 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
23340 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
23350 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
23360 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74  [pBuf->n], iDelt
23370 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  a);.          }.
23380 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
23390 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
233a0 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20  >nSpace );..    
233b0 20 20 20 20 20 20 69 66 28 20 65 44 65 74 61 69        if( eDetai
233c0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e  l==FTS5_DETAIL_N
233d0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
233e0 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63     if( iOff<nDoc
233f0 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74  list && pDoclist
23400 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20  [iOff]==0 ){.   
23410 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d             pBuf-
23420 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20  >p[pBuf->n++] = 
23430 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
23440 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20   iOff++;.       
23450 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c         if( iOff<
23460 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63  nDoclist && pDoc
23470 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b  list[iOff]==0 ){
23480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23490 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e   pBuf->p[pBuf->n
234a0 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ++] = 0;.       
234b0 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b           iOff++;
234c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
234d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
234e0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
234f0 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78  pBuf->n + pPgidx
23500 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20  ->n)>=pgsz ){.  
23510 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
23520 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
23530 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
23540 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23560 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d         int bDumm
23570 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
23580 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
23590 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d       int nCopy =
235a0 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
235b0 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  ize(&pDoclist[iO
235c0 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  ff], &nPos, &bDu
235d0 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mmy);.          
235e0 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b    nCopy += nPos;
235f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
23600 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69   (pBuf->n + pPgi
23610 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c  dx->n + nCopy) <
23620 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  = pgsz ){.      
23630 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
23640 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69  ntire poslist wi
23650 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
23660 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63  rrent leaf. So c
23670 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  opy.            
23680 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67    ** it in one g
23690 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  o. */.          
236a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
236b0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
236c0 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  f, &pDoclist[iOf
236d0 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  f], nCopy);.    
236e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
236f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23700 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69  The entire posli
23710 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  st will not fit 
23720 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53 6f  on this leaf. So
23730 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20 20   it needs.      
23740 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65          ** to be
23750 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63   broken into sec
23760 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20  tions. The only 
23770 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65  qualification be
23780 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
23790 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76    ** that each v
237a0 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74  arint must be st
237b0 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c  ored contiguousl
237c0 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  y.  */.         
237d0 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
237e0 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c  Poslist = &pDocl
237f0 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  ist[iOff];.     
23800 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f           int iPo
23810 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
23820 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
23830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23850 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73  int nSpace = pgs
23860 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50  z - pBuf->n - pP
23870 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  gidx->n;.       
23880 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d           int n =
23890 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
238a0 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d      if( (nCopy -
238b0 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29   iPos)<=nSpace )
238c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
238d0 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20      n = nCopy - 
238e0 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20  iPos;.          
238f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
23910 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72   = fts5PoslistPr
23920 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69  efix(&pPoslist[i
23930 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20  Pos], nSpace);. 
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
23950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23960 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23980 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
23990 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26  pendBlob(pBuf, &
239a0 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20  pPoslist[iPos], 
239b0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
239c0 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20      iPos += n;. 
239d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
239e0 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
239f0 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29  gidx->n)>=pgsz )
23a00 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23a10 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
23a20 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
23a30 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
23a40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23a50 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d        if( iPos>=
23a60 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20  nCopy ) break;. 
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23a80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23a90 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
23aa0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   nCopy;.        
23ab0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
23ac0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
23ad0 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74  TODO2: Doclist t
23ae0 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74 74 65  erminator writte
23af0 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  n here. */.     
23b00 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75 66   /* pBuf->p[pBuf
23b10 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a  ->n++] = '\0'; *
23b20 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
23b30 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e  pBuf->n<=pBuf->n
23b40 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 69  Space );.      i
23b50 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
23b60 5f 4f 4b 20 29 20 73 71 6c 69 74 65 33 46 74 73  _OK ) sqlite3Fts
23b70 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70 48  5HashScanNext(pH
23b80 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ash);.    }.    
23b90 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43  sqlite3Fts5HashC
23ba0 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20  lear(pHash);.   
23bb0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
23bc0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 67  (p, &writer, &pg
23bd0 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a  noLast);..    /*
23be0 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
23bf0 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69 73  Structure. It is
23c00 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
23c10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 79   the database by
23c20 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73 35   the.    ** fts5
23c30 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
23c40 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20  () call below.  
23c50 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72 75  */.    if( pStru
23c60 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b  ct->nLevel==0 ){
23c70 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
23c80 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d  tureAddLevel(&p-
23c90 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a  >rc, &pStruct);.
23ca0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
23cb0 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
23cc0 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
23cd0 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20  ct, 0, 1, 0);.  
23ce0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
23cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23d00 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d  pSeg = &pStruct-
23d10 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b  >aLevel[0].aSeg[
23d20 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
23d30 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20  [0].nSeg++ ];.  
23d40 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64      pSeg->iSegid
23d50 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 20   = iSegid;.     
23d60 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
23d70 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65 67   = 1;.      pSeg
23d80 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e  ->pgnoLast = pgn
23d90 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53 74  oLast;.      pSt
23da0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b  ruct->nSegment++
23db0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
23dc0 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
23dd0 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29 3b  (p, 0, pStruct);
23de0 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65  .  }..  fts5Inde
23df0 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26 70  xAutomerge(p, &p
23e00 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74  Struct, pgnoLast
23e10 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43 72  );.  fts5IndexCr
23e20 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70 53  isismerge(p, &pS
23e30 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
23e40 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
23e50 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
23e60 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
23e70 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a  (pStruct);.}../*
23e80 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61  .** Flush any da
23e90 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ta stored in the
23ea0 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
23eb0 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61  tables to the da
23ec0 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
23ed0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
23ee0 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78 20  Flush(Fts5Index 
23ef0 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73  *p){.  /* Unless
23f00 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66 6c   it is empty, fl
23f10 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62  ush the hash tab
23f20 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  le to disk */.  
23f30 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  if( p->nPendingD
23f40 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ata ){.    asser
23f50 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20  t( p->pHash );. 
23f60 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61     p->nPendingDa
23f70 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  ta = 0;.    fts5
23f80 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29 3b  FlushOneHash(p);
23f90 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
23fa0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66 74  ts5Structure *ft
23fb0 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
23fc0 74 72 75 63 74 28 0a 20 20 46 74 73 35 49 6e 64  truct(.  Fts5Ind
23fd0 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 74  ex *p, .  Fts5St
23fe0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
23ff0 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
24000 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ure *pNew = 0;. 
24010 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
24020 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
24030 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20  s5Structure);.  
24040 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75  int nSeg = pStru
24050 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
24060 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69 67  int i;..  /* Fig
24070 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20  ure out if this 
24080 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69 72  structure requir
24090 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e  es optimization.
240a0 20 41 20 73 74 72 75 63 74 75 72 65 20 64 6f 65   A structure doe
240b0 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75 69  s.  ** not requi
240c0 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  re optimization 
240d0 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a 0a  if either:.  **.
240e0 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73 69    **  + it consi
240f0 73 74 73 20 6f 66 20 66 65 77 65 72 20 74 68 61  sts of fewer tha
24100 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c 20  n two segments, 
24110 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20  or .  **  + all 
24120 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e 20  segments are on 
24130 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c 20  the same level, 
24140 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20 73  or.  **  + all s
24150 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74 20 6f  egments except o
24160 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  ne are currently
24170 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d 65 72   inputs to a mer
24180 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20  ge operation..  
24190 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 66  **.  ** In the f
241a0 69 72 73 74 20 63 61 73 65 2c 20 72 65 74 75 72  irst case, retur
241b0 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20 73  n NULL. In the s
241c0 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74  econd, increment
241d0 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a 20   the ref-count. 
241e0 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74 20   ** on *pStruct 
241f0 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 6f 70  and return a cop
24200 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
24210 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69   to it..  */.  i
24220 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65 74 75  f( nSeg<2 ) retu
24230 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
24240 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   i<pStruct->nLev
24250 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  el; i++){.    in
24260 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72 75 63  t nThis = pStruc
24270 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65  t->aLevel[i].nSe
24280 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68 69 73  g;.    if( nThis
24290 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69 73  ==nSeg || (nThis
242a0 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53 74 72  ==nSeg-1 && pStr
242b0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e  uct->aLevel[i].n
242c0 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20 29 7b  Merge==nThis) ){
242d0 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
242e0 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74 29  tureRef(pStruct)
242f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
24300 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20  Struct;.    }.  
24310 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
24320 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
24330 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20 20  rge<=nThis );.  
24340 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28 70  }..  nByte += (p
24350 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31  Struct->nLevel+1
24360 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
24370 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a  tructureLevel);.
24380 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74    pNew = (Fts5St
24390 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
243a0 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
243b0 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a  p->rc, nByte);..
243c0 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
243d0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
243e0 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20  evel *pLvl;.    
243f0 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73  nByte = nSeg * s
24400 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
24410 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
24420 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20   pNew->nLevel = 
24430 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
24440 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65  1;.    pNew->nRe
24450 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d  f = 1;.    pNew-
24460 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d  >nWriteCounter =
24470 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
24480 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76  Counter;.    pLv
24490 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65  l = &pNew->aLeve
244a0 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
244b0 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53  l];.    pLvl->aS
244c0 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74  eg = (Fts5Struct
244d0 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69  ureSegment*)sqli
244e0 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
244f0 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29  o(&p->rc, nByte)
24500 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ;.    if( pLvl->
24510 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e  aSeg ){.      in
24520 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20  t iLvl, iSeg;.  
24530 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20      int iSegOut 
24540 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49 74  = 0;.      /* It
24550 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c  erate through al
24560 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f 6d  l segments, from
24570 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73   oldest to newes
24580 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a 20  t. Add them to. 
24590 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20       ** the new 
245a0 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63 74  Fts5Level object
245b0 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e 61   so that pLvl->a
245c0 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f 6c  Seg[0] is the ol
245d0 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73 65  dest.      ** se
245e0 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74  gment in the dat
245f0 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f  a structure.  */
24600 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
24610 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
24620 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76 6c  1; iLvl>=0; iLvl
24630 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  --){.        for
24640 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
24650 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
24660 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
24670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
24680 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
24690 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
246a0 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
246b0 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
246c0 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
246d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
246e0 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
246f0 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
24700 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
24710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24720 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
24730 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
24740 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
24750 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69  New;.}..int sqli
24760 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69  te3Fts5IndexOpti
24770 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a  mize(Fts5Index *
24780 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
24790 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
247a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
247b0 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  New = 0;..  asse
247c0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
247d0 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
247e0 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70  dexFlush(p);.  p
247f0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
24800 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
24810 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
24820 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20  validate(p);..  
24830 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
24840 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 6e     pNew = fts5In
24850 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63  dexOptimizeStruc
24860 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  t(p, pStruct);. 
24870 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74 75   }.  fts5Structu
24880 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
24890 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  t);..  assert( p
248a0 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d 3e  New==0 || pNew->
248b0 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  nSegment>0 );.  
248c0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
248d0 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66 6f  int iLvl;.    fo
248e0 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d 3e  r(iLvl=0; pNew->
248f0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
24900 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d 0a  g==0; iLvl++){}.
24910 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
24920 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
24930 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  New->aLevel[iLvl
24940 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20  ].nSeg>0 ){.    
24950 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53    int nRem = FTS
24960 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b  5_OPT_WORK_UNIT;
24970 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
24980 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
24990 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d  New, iLvl, &nRem
249a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  );.    }..    ft
249b0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
249c0 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66  (p, pNew);.    f
249d0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
249e0 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  ase(pNew);.  }..
249f0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24a00 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a  exReturn(p); .}.
24a10 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
24a20 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65  alled to impleme
24a30 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20 22  nt the special "
24a40 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c 20  VALUES('merge', 
24a50 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e 53  $nMerge)".** INS
24a60 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ERT command..*/.
24a70 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24a80 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
24a90 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
24aa0 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
24ab0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
24ac0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
24ad0 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72  d(p);.  if( pStr
24ae0 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  uct ){.    int n
24af0 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Min = p->pConfig
24b00 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20 20  ->nUsermerge;.  
24b10 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
24b20 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20  nvalidate(p);.  
24b30 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20 29    if( nMerge<0 )
24b40 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
24b50 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66 74  cture *pNew = ft
24b60 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53  s5IndexOptimizeS
24b70 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63 74  truct(p, pStruct
24b80 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  );.      fts5Str
24b90 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
24ba0 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
24bb0 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20 20  truct = pNew;.  
24bc0 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20 20      nMin = 2;.  
24bd0 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d 65      nMerge = nMe
24be0 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  rge*-1;.    }.  
24bf0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
24c00 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
24c10 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66 74   ){.      if( ft
24c20 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20  s5IndexMerge(p, 
24c30 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65  &pStruct, nMerge
24c40 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20 20  , nMin) ){.     
24c50 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24c60 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
24c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24c80 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
24c90 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
24ca0 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
24cb0 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
24cc0 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  (p);.}..static v
24cd0 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52 6f  oid fts5AppendRo
24ce0 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
24cf0 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74   *p,.  i64 iDelt
24d00 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  a,.  Fts5Iter *p
24d10 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42 75  Unused,.  Fts5Bu
24d20 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
24d30 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
24d40 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75 66  used);.  fts5Buf
24d50 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
24d60 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 44  &p->rc, pBuf, iD
24d70 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  elta);.}..static
24d80 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64   void fts5Append
24d90 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
24da0 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69  ndex *p,.  i64 i
24db0 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65  Delta,.  Fts5Ite
24dc0 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73  r *pMulti,.  Fts
24dd0 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
24de0 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70  .  int nData = p
24df0 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61 74  Multi->base.nDat
24e00 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  a;.  int nByte =
24e10 20 6e 44 61 74 61 20 2b 20 39 20 2b 20 39 20 2b   nData + 9 + 9 +
24e20 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f   FTS5_DATA_ZERO_
24e30 50 41 44 44 49 4e 47 3b 0a 20 20 61 73 73 65 72  PADDING;.  asser
24e40 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a 20 20  t( nData>0 );.  
24e50 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
24e60 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35 42  E_OK && 0==fts5B
24e70 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
24e80 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 20 29  , pBuf, nByte) )
24e90 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  {.    fts5Buffer
24ea0 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
24eb0 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a  (pBuf, iDelta);.
24ec0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24ed0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
24ee0 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a 20  Buf, nData*2);. 
24ef0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
24f00 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
24f10 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 70  , pMulti->base.p
24f20 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
24f30 20 20 6d 65 6d 73 65 74 28 26 70 42 75 66 2d 3e    memset(&pBuf->
24f40 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 30 2c 20 46  p[pBuf->n], 0, F
24f50 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
24f60 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  DDING);.  }.}...
24f70 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
24f80 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
24f90 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
24fa0 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 70  *pIter){.  u8 *p
24fb0 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69   = pIter->aPosli
24fc0 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a  st + pIter->nSiz
24fd0 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c  e + pIter->nPosl
24fe0 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ist;..  assert( 
24ff0 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
25000 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74 65  );.  if( p>=pIte
25010 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20 70  r->aEof ){.    p
25020 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
25030 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
25040 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
25050 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61    p += fts5GetVa
25060 72 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26 69  rint(p, (u64*)&i
25070 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
25080 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
25090 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  lta;..    /* Rea
250a0 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  d position list 
250b0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  size */.    if( 
250c0 70 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a 20  p[0] & 0x80 ){. 
250d0 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20       int nPos;. 
250e0 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a       pIter->nSiz
250f0 65 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  e = fts5GetVarin
25100 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20  t32(p, nPos);.  
25110 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c      pIter->nPosl
25120 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b  ist = (nPos>>1);
25130 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25140 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73    pIter->nPoslis
25150 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d 29  t = ((int)(p[0])
25160 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70 49  ) >> 1;.      pI
25170 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a  ter->nSize = 1;.
25180 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72      }..    pIter
25190 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a  ->aPoslist = p;.
251a0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
251b0 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
251c0 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42 75  erInit(.  Fts5Bu
251d0 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20 46  ffer *pBuf, .  F
251e0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
251f0 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65  pIter.){.  memse
25200 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
25210 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
25220 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d  Iter->aPoslist =
25230 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65   pBuf->p;.  pIte
25240 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66 2d  r->aEof = &pBuf-
25250 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66  >p[pBuf->n];.  f
25260 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
25270 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69  xt(pIter);.}..#i
25280 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  f 0./*.** Append
25290 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75   a doclist to bu
252a0 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a  ffer pBuf..**.**
252b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
252c0 73 73 75 6d 65 73 20 74 68 61 74 20 73 70 61 63  ssumes that spac
252d0 65 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66  e within the buf
252e0 66 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  fer has already 
252f0 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  been.** allocate
25300 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
25310 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  d fts5MergeAppen
25320 64 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42 75  dDocid(.  Fts5Bu
25330 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20  ffer *pBuf,     
25340 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
25350 66 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20  fer to write to 
25360 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73 74  */.  i64 *piLast
25370 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20  Rowid,          
25380 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
25390 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20 77  Previous rowid w
253a0 72 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29 20  ritten (if any) 
253b0 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 20  */.  i64 iRowid 
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253d0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f       /* Rowid to
253e0 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20   append */.){.  
253f0 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 21  assert( pBuf->n!
25400 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f  =0 || (*piLastRo
25410 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73  wid)==0 );.  fts
25420 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25430 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 52  dVarint(pBuf, iR
25440 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f  owid - *piLastRo
25450 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52  wid);.  *piLastR
25460 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d  owid = iRowid;.}
25470 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65  .#endif..#define
25480 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64   fts5MergeAppend
25490 44 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61 73  Docid(pBuf, iLas
254a0 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29 20  tRowid, iRowid) 
254b0 7b 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73 65  {       \.  asse
254c0 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30  rt( (pBuf)->n!=0
254d0 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64 29   || (iLastRowid)
254e0 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20 20  ==0 );          
254f0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74 73           \.  fts
25500 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
25510 64 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c 20  dVarint((pBuf), 
25520 28 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61 73  (iRowid) - (iLas
25530 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28 69  tRowid)); \.  (i
25540 4c 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69 52  LastRowid) = (iR
25550 6f 77 69 64 29 3b 20 20 20 20 20 20 20 20 20 20  owid);          
25560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25570 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
25580 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63  /*.** Swap the c
25590 6f 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65  ontents of buffe
255a0 72 20 2a 70 31 20 77 69 74 68 20 74 68 61 74 20  r *p1 with that 
255b0 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69  of *p2..*/.stati
255c0 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65  c void fts5Buffe
255d0 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72  rSwap(Fts5Buffer
255e0 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72   *p1, Fts5Buffer
255f0 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66   *p2){.  Fts5Buf
25600 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20  fer tmp = *p1;. 
25610 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70   *p1 = *p2;.  *p
25620 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74  2 = tmp;.}..stat
25630 69 63 20 76 6f 69 64 20 66 74 73 35 4e 65 78 74  ic void fts5Next
25640 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72  Rowid(Fts5Buffer
25650 20 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70 69 4f   *pBuf, int *piO
25660 66 66 2c 20 69 36 34 20 2a 70 69 52 6f 77 69 64  ff, i64 *piRowid
25670 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70 69  ){.  int i = *pi
25680 4f 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70 42  Off;.  if( i>=pB
25690 75 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70 69  uf->n ){.    *pi
256a0 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73  Off = -1;.  }els
256b0 65 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c 3b  e{.    u64 iVal;
256c0 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 69 20  .    *piOff = i 
256d0 2b 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  + sqlite3Fts5Get
256e0 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
256f0 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
25700 2a 70 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c  *piRowid += iVal
25710 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
25720 68 69 73 20 69 73 20 74 68 65 20 65 71 75 69 76  his is the equiv
25730 61 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d 65 72  alent of fts5Mer
25740 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 29 20  gePrefixLists() 
25750 66 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20  for detail=none 
25760 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69 73  mode..** In this
25770 20 63 61 73 65 20 74 68 65 20 62 75 66 66 65 72   case the buffer
25780 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20 64  s consist of a d
25790 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69 73  elta-encoded lis
257a0 74 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c 79  t of rowids only
257b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
257c0 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c   fts5MergeRowidL
257d0 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65  ists(.  Fts5Inde
257e0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
257f0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
25800 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
25810 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
25820 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
25830 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73      /* First lis
25840 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  t to merge */.  
25850 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20  Fts5Buffer *p2  
25860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25870 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74  /* Second list t
25880 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
25890 69 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20 69 6e  int i1 = 0;.  in
258a0 74 20 69 32 20 3d 20 30 3b 0a 20 20 69 36 34 20  t i2 = 0;.  i64 
258b0 69 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20 69  iRowid1 = 0;.  i
258c0 36 34 20 69 52 6f 77 69 64 32 20 3d 20 30 3b 0a  64 iRowid2 = 0;.
258d0 20 20 69 36 34 20 69 4f 75 74 20 3d 20 30 3b 0a    i64 iOut = 0;.
258e0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75  .  Fts5Buffer ou
258f0 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75 74  t;.  memset(&out
25900 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29  , 0, sizeof(out)
25910 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
25920 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
25930 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b  c, &out, p1->n +
25940 20 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 70   p2->n);.  if( p
25950 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 0a  ->rc ) return;..
25960 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25970 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64  p1, &i1, &iRowid
25980 31 29 3b 0a 20 20 66 74 73 35 4e 65 78 74 52 6f  1);.  fts5NextRo
25990 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69 52  wid(p2, &i2, &iR
259a0 6f 77 69 64 32 29 3b 0a 20 20 77 68 69 6c 65 28  owid2);.  while(
259b0 20 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30 20   i1>=0 || i2>=0 
259c0 29 7b 0a 20 20 20 20 69 66 28 20 69 31 3e 3d 30  ){.    if( i1>=0
259d0 20 26 26 20 28 69 32 3c 30 20 7c 7c 20 69 52 6f   && (i2<0 || iRo
259e0 77 69 64 31 3c 69 52 6f 77 69 64 32 29 20 29 7b  wid1<iRowid2) ){
259f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
25a00 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69 64  Out==0 || iRowid
25a10 31 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20 20  1>iOut );.      
25a20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
25a30 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c  pendVarint(&out,
25a40 20 69 52 6f 77 69 64 31 20 2d 20 69 4f 75 74 29   iRowid1 - iOut)
25a50 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20 69  ;.      iOut = i
25a60 52 6f 77 69 64 31 3b 0a 20 20 20 20 20 20 66 74  Rowid1;.      ft
25a70 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c 20  s5NextRowid(p1, 
25a80 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b 0a  &i1, &iRowid1);.
25a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25aa0 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d 30   assert( iOut==0
25ab0 20 7c 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75 74   || iRowid2>iOut
25ac0 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   );.      fts5Bu
25ad0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
25ae0 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77 69  rint(&out, iRowi
25af0 64 32 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20 20  d2 - iOut);.    
25b00 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64 32    iOut = iRowid2
25b10 3b 0a 20 20 20 20 20 20 69 66 28 20 69 31 3e 3d  ;.      if( i1>=
25b20 30 20 26 26 20 69 52 6f 77 69 64 31 3d 3d 69 52  0 && iRowid1==iR
25b30 6f 77 69 64 32 20 29 7b 0a 20 20 20 20 20 20 20  owid2 ){.       
25b40 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70   fts5NextRowid(p
25b50 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31  1, &i1, &iRowid1
25b60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25b70 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70   fts5NextRowid(p
25b80 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64 32  2, &i2, &iRowid2
25b90 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
25ba0 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28 26  fts5BufferSwap(&
25bb0 6f 75 74 2c 20 70 31 29 3b 0a 20 20 66 74 73 35  out, p1);.  fts5
25bc0 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29  BufferFree(&out)
25bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  ;.}../*.** Buffe
25be0 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e  rs p1 and p2 con
25bf0 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54  tain doclists. T
25c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72  his function mer
25c10 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ges the content.
25c20 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f  ** of the two do
25c30 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20  clists together 
25c40 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20  and sets buffer 
25c50 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  p1 to the result
25c60 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
25c70 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
25c80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
25c90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
25ca0 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
25cb0 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a  If an error has.
25cc0 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
25cd0 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
25ce0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
25cf0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
25d00 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
25d10 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
25d20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
25d30 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
25d40 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
25d50 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
25d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25d70 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
25d80 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
25d90 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25db0 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
25dc0 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  merge */.){.  if
25dd0 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  ( p2->n ){.    i
25de0 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  64 iLastRowid = 
25df0 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  0;.    Fts5Docli
25e00 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46  stIter i1;.    F
25e10 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
25e20 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  2;.    Fts5Buffe
25e30 72 20 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20 30  r out = {0, 0, 0
25e40 7d 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  };.    Fts5Buffe
25e50 72 20 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20 30  r tmp = {0, 0, 0
25e60 7d 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d  };..    /* The m
25e70 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
25e80 68 65 20 6f 75 74 70 75 74 20 69 73 20 65 71 75  he output is equ
25e90 61 6c 20 74 6f 20 74 68 65 20 73 75 6d 20 6f 66  al to the sum of
25ea0 20 74 68 65 20 74 77 6f 20 0a 20 20 20 20 2a 2a   the two .    **
25eb0 20 69 6e 70 75 74 20 73 69 7a 65 73 20 2b 20 31   input sizes + 1
25ec0 20 76 61 72 69 6e 74 20 28 39 20 62 79 74 65 73   varint (9 bytes
25ed0 29 2e 20 54 68 65 20 65 78 74 72 61 20 76 61 72  ). The extra var
25ee0 69 6e 74 20 69 73 20 62 65 63 61 75 73 65 20 69  int is because i
25ef0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
25f00 73 74 20 72 6f 77 69 64 20 69 6e 20 6f 6e 65 20  st rowid in one 
25f10 69 6e 70 75 74 20 69 73 20 61 20 6c 61 72 67 65  input is a large
25f20 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
25f30 2c 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20  , and the first 
25f40 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f 74  in.    ** the ot
25f50 68 65 72 20 61 20 6e 6f 6e 2d 6e 65 67 61 74 69  her a non-negati
25f60 76 65 20 6e 75 6d 62 65 72 2c 20 74 68 65 20 64  ve number, the d
25f70 65 6c 74 61 20 66 6f 72 20 74 68 65 20 6e 6f 6e  elta for the non
25f80 2d 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a 2a  -negative.    **
25f90 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 62 65 20   number will be 
25fa0 6c 61 72 67 65 72 20 6f 6e 20 64 69 73 6b 20 74  larger on disk t
25fb0 68 61 6e 20 74 68 65 20 6c 69 74 65 72 61 6c 20  han the literal 
25fc0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 20 20  integer value.  
25fd0 20 20 2a 2a 20 77 61 73 2e 20 20 0a 20 20 20 20    ** was.  .    
25fe0 2a 2a 0a 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66  **.    ** Or, if
25ff0 20 74 68 65 20 69 6e 70 75 74 20 70 6f 73 69 74   the input posit
26000 69 6f 6e 2d 6c 69 73 74 73 20 61 72 65 20 63 6f  ion-lists are co
26010 72 72 75 70 74 2c 20 74 68 65 6e 20 74 68 65 20  rrupt, then the 
26020 6f 75 74 70 75 74 20 6d 69 67 68 74 0a 20 20 20  output might.   
26030 20 2a 2a 20 69 6e 63 6c 75 64 65 20 75 70 20 74   ** include up t
26040 6f 20 32 20 65 78 74 72 61 20 31 30 2d 62 79 74  o 2 extra 10-byt
26050 65 20 70 6f 73 69 74 69 6f 6e 73 20 63 72 65 61  e positions crea
26060 74 65 64 20 62 79 20 69 6e 74 65 72 70 72 65 74  ted by interpret
26070 69 6e 67 20 2d 31 0a 20 20 20 20 2a 2a 20 28 74  ing -1.    ** (t
26080 68 65 20 76 61 6c 75 65 20 50 6f 73 6c 69 73 74  he value Poslist
26090 4e 65 78 74 36 34 28 29 20 75 73 65 73 20 66 6f  Next64() uses fo
260a0 72 20 45 4f 46 29 20 61 73 20 61 20 70 6f 73 69  r EOF) as a posi
260b0 74 69 6f 6e 20 61 6e 64 20 61 70 70 65 6e 64 69  tion and appendi
260c0 6e 67 0a 20 20 20 20 2a 2a 20 69 74 20 74 6f 20  ng.    ** it to 
260d0 74 68 65 20 6f 75 74 70 75 74 2e 20 54 68 69 73  the output. This
260e0 20 63 61 6e 20 68 61 70 70 65 6e 20 61 74 20 6d   can happen at m
260f0 6f 73 74 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ost once for eac
26100 68 20 69 6e 70 75 74 20 0a 20 20 20 20 2a 2a 20  h input .    ** 
26110 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2c 20 68  position-list, h
26120 65 6e 63 65 20 74 77 6f 20 31 30 20 62 79 74 65  ence two 10 byte
26130 20 70 61 64 64 69 6e 67 73 2e 20 20 2a 2f 0a 20   paddings.  */. 
26140 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
26150 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
26160 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e  >rc, &out, p1->n
26170 20 2b 20 70 32 2d 3e 6e 20 2b 20 39 2b 31 30 2b   + p2->n + 9+10+
26180 31 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  10) ) return;.  
26190 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
261a0 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a  rInit(p1, &i1);.
261b0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
261c0 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29  terInit(p2, &i2)
261d0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  ;..    while( 1 
261e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 31 2e  ){.      if( i1.
261f0 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64  iRowid<i2.iRowid
26200 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
26210 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
26220 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  1 */.        fts
26230 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
26240 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
26250 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a  id, i1.iRowid);.
26260 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26270 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
26280 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69  (&out, i1.aPosli
26290 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b  st, i1.nPoslist+
262a0 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  i1.nSize);.     
262b0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
262c0 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20  erNext(&i1);.   
262d0 20 20 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73       if( i1.aPos
262e0 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  list==0 ) break;
262f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26300 20 6f 75 74 2e 6e 3c 3d 28 28 69 31 2e 61 50 6f   out.n<=((i1.aPo
26310 73 6c 69 73 74 2d 70 31 2d 3e 70 29 20 2b 20 28  slist-p1->p) + (
26320 69 32 2e 61 50 6f 73 6c 69 73 74 2d 70 32 2d 3e  i2.aPoslist-p2->
26330 70 29 2b 39 2b 31 30 2b 31 30 29 20 29 3b 0a 20  p)+9+10+10) );. 
26340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
26350 65 20 69 66 28 20 69 32 2e 69 52 6f 77 69 64 21  e if( i2.iRowid!
26360 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  =i1.iRowid ){.  
26370 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
26380 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20  try from i2 */. 
26390 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
263a0 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
263b0 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32  , iLastRowid, i2
263c0 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
263d0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
263e0 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
263f0 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32   i2.aPoslist, i2
26400 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69  .nPoslist+i2.nSi
26410 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ze);.        fts
26420 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
26430 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 69  (&i2);.        i
26440 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i2.aPoslist==
26450 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
26460 20 20 20 61 73 73 65 72 74 28 20 6f 75 74 2e 6e     assert( out.n
26470 3c 3d 28 28 69 31 2e 61 50 6f 73 6c 69 73 74 2d  <=((i1.aPoslist-
26480 70 31 2d 3e 70 29 20 2b 20 28 69 32 2e 61 50 6f  p1->p) + (i2.aPo
26490 73 6c 69 73 74 2d 70 32 2d 3e 70 29 2b 39 2b 31  slist-p2->p)+9+1
264a0 30 2b 31 30 29 20 29 3b 0a 20 20 20 20 20 20 7d  0+10) );.      }
264b0 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  .      else{.   
264c0 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68       /* Merge th
264d0 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c  e two position l
264e0 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20  ists. */ .      
264f0 20 20 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b    i64 iPos1 = 0;
26500 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f  .        i64 iPo
26510 73 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s2 = 0;.        
26520 69 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20  int iOff1 = 0;. 
26530 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32         int iOff2
26540 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38   = 0;.        u8
26550 20 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c   *a1 = &i1.aPosl
26560 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20  ist[i1.nSize];. 
26570 20 20 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20         u8 *a2 = 
26580 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e  &i2.aPoslist[i2.
26590 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  nSize];.        
265a0 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20  int nCopy;.     
265b0 20 20 20 75 38 20 2a 61 43 6f 70 79 3b 0a 0a 20     u8 *aCopy;.. 
265c0 20 20 20 20 20 20 20 69 36 34 20 69 50 72 65 76         i64 iPrev
265d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 46 74   = 0;.        Ft
265e0 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20  s5PoslistWriter 
265f0 77 72 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20  writer;.        
26600 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20  memset(&writer, 
26610 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72  0, sizeof(writer
26620 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73  ));..        fts
26630 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
26640 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
26650 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
26660 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
26670 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20  erZero(&tmp);.  
26680 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26690 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
266a0 72 63 2c 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f  rc, &tmp, i1.nPo
266b0 73 6c 69 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c  slist + i2.nPosl
266c0 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ist);.        if
266d0 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
266e0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
266f0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
26700 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
26710 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
26720 73 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s1);.        sql
26730 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
26740 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f  ext64(a2, i2.nPo
26750 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26  slist, &iOff2, &
26760 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
26770 61 73 73 65 72 74 5f 6e 63 28 20 69 50 6f 73 31  assert_nc( iPos1
26780 3e 3d 30 20 26 26 20 69 50 6f 73 32 3e 3d 30 20  >=0 && iPos2>=0 
26790 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
267a0 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b 0a 20  iPos1<iPos2 ){. 
267b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
267c0 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41  Fts5PoslistSafeA
267d0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72  ppend(&tmp, &iPr
267e0 65 76 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20  ev, iPos1);.    
267f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26800 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
26810 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
26820 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
26830 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
26840 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26850 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61 66 65  3Fts5PoslistSafe
26860 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 69 50  Append(&tmp, &iP
26870 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20 20 20  rev, iPos2);.   
26880 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26890 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
268a0 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2c  a2, i2.nPoslist,
268b0 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32 29   &iOff2, &iPos2)
268c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
268d0 20 20 20 20 69 66 28 20 69 50 6f 73 31 3e 3d 30      if( iPos1>=0
268e0 20 26 26 20 69 50 6f 73 32 3e 3d 30 20 29 7b 0a   && iPos2>=0 ){.
268f0 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
26900 20 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   1 ){.          
26910 20 20 69 66 28 20 69 50 6f 73 31 3c 69 50 6f 73    if( iPos1<iPos
26920 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
26930 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d 69 50     if( iPos1!=iP
26940 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rev ){.         
26950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
26960 73 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70  s5PoslistSafeApp
26970 65 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76  end(&tmp, &iPrev
26980 2c 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20  , iPos1);.      
26990 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
269a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
269b0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
269c0 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  (a1, i1.nPoslist
269d0 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31  , &iOff1, &iPos1
269e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
269f0 20 69 66 28 20 69 50 6f 73 31 3c 30 20 29 20 62   if( iPos1<0 ) b
26a00 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
26a10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26a20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
26a30 28 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20 29  ( iPos2!=iPrev )
26a40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
26a50 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
26a60 73 74 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d  stSafeAppend(&tm
26a70 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32  p, &iPrev, iPos2
26a80 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
26a90 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
26aa0 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
26ab0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
26ac0 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20 20  2, &iPos2);.    
26ad0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
26ae0 6f 73 32 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20  os2<0 ) break;. 
26af0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
26b00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26b10 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
26b20 69 50 6f 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20  iPos1>=0 ){.    
26b30 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 21        if( iPos1!
26b40 3d 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20  =iPrev ){.      
26b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
26b60 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
26b70 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
26b80 20 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20   iPos1);.       
26b90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
26ba0 43 6f 70 79 20 3d 20 26 61 31 5b 69 4f 66 66 31  Copy = &a1[iOff1
26bb0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f  ];.          nCo
26bc0 70 79 20 3d 20 69 31 2e 6e 50 6f 73 6c 69 73 74  py = i1.nPoslist
26bd0 20 2d 20 69 4f 66 66 31 3b 0a 20 20 20 20 20 20   - iOff1;.      
26be0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26bf0 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 50     assert_nc( iP
26c00 6f 73 32 3e 3d 30 20 26 26 20 69 50 6f 73 32 21  os2>=0 && iPos2!
26c10 3d 69 50 72 65 76 20 29 3b 0a 20 20 20 20 20 20  =iPrev );.      
26c20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26c30 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
26c40 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
26c50 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
26c60 20 61 43 6f 70 79 20 3d 20 26 61 32 5b 69 4f 66   aCopy = &a2[iOf
26c70 66 32 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  f2];.          n
26c80 43 6f 70 79 20 3d 20 69 32 2e 6e 50 6f 73 6c 69  Copy = i2.nPosli
26c90 73 74 20 2d 20 69 4f 66 66 32 3b 0a 20 20 20 20  st - iOff2;.    
26ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
26cb0 28 20 6e 43 6f 70 79 3e 30 20 29 7b 0a 20 20 20  ( nCopy>0 ){.   
26cc0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
26cd0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
26ce0 26 74 6d 70 2c 20 61 43 6f 70 79 2c 20 6e 43 6f  &tmp, aCopy, nCo
26cf0 70 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  py);.        }..
26d00 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45          /* WRITE
26d10 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20  POSLISTSIZE */. 
26d20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
26d30 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
26d40 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20 2a 20  t(&out, tmp.n * 
26d50 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  2);.        fts5
26d60 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
26d70 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70 2e 70  Blob(&out, tmp.p
26d80 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20 20 20  , tmp.n);.      
26d90 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
26da0 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20  rNext(&i1);.    
26db0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
26dc0 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20  terNext(&i2);.  
26dd0 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
26de0 20 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b 70   out.n<=(p1->n+p
26df0 32 2d 3e 6e 2b 39 29 20 29 3b 0a 20 20 20 20 20  2->n+9) );.     
26e00 20 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69     if( i1.aPosli
26e10 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 61 50 6f 73  st==0 || i2.aPos
26e20 6c 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b  list==0 ) break;
26e30 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26e40 20 6f 75 74 2e 6e 3c 3d 28 28 69 31 2e 61 50 6f   out.n<=((i1.aPo
26e50 73 6c 69 73 74 2d 70 31 2d 3e 70 29 20 2b 20 28  slist-p1->p) + (
26e60 69 32 2e 61 50 6f 73 6c 69 73 74 2d 70 32 2d 3e  i2.aPoslist-p2->
26e70 70 29 2b 39 2b 31 30 2b 31 30 29 20 29 3b 0a 20  p)+9+10+10) );. 
26e80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
26e90 20 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73    if( i1.aPoslis
26ea0 74 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  t ){.      fts5M
26eb0 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
26ec0 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
26ed0 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i1.iRowid);.  
26ee0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
26ef0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
26f00 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i1.aPoslist, 
26f10 69 31 2e 61 45 6f 66 20 2d 20 69 31 2e 61 50 6f  i1.aEof - i1.aPo
26f20 73 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  slist);.    }.  
26f30 20 20 65 6c 73 65 20 69 66 28 20 69 32 2e 61 50    else if( i2.aP
26f40 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oslist ){.      
26f50 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
26f60 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
26f70 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
26f80 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
26f90 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
26fa0 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c  b(&out, i2.aPosl
26fb0 69 73 74 2c 20 69 32 2e 61 45 6f 66 20 2d 20 69  ist, i2.aEof - i
26fc0 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  2.aPoslist);.   
26fd0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63   }.    assert_nc
26fe0 28 20 6f 75 74 2e 6e 3c 3d 28 70 31 2d 3e 6e 2b  ( out.n<=(p1->n+
26ff0 70 32 2d 3e 6e 2b 39 29 20 29 3b 0a 0a 20 20 20  p2->n+9) );..   
27000 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
27010 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e  p->rc, p1, out.n
27020 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74  , out.p);.    ft
27030 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 6d  s5BufferFree(&tm
27040 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  p);.    fts5Buff
27050 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20  erFree(&out);.  
27060 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
27070 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
27080 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65  Iter(.  Fts5Inde
27090 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
270a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
270b0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
270c0 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
270d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270e0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22     /* True for "
270f0 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
27100 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ESC" */.  const 
27110 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20  u8 *pToken,     
27120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
27130 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
27140 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a  refix to match *
27150 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  /.  int nToken, 
27160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27170 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
27180 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20  uffer pToken in 
27190 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 43  bytes */.  Fts5C
271a0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20  olset *pColset, 
271b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
271c0 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
271d0 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
271e0 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a  */.  Fts5Iter **
271f0 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  ppIter          
27200 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
27210 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ator */.){.  Fts
27220 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
27230 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  uct;.  Fts5Buffe
27240 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74  r *aBuf;.  const
27250 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a   int nBuf = 32;.
27260 0a 20 20 76 6f 69 64 20 28 2a 78 4d 65 72 67 65  .  void (*xMerge
27270 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74  )(Fts5Index*, Ft
27280 73 35 42 75 66 66 65 72 2a 2c 20 46 74 73 35 42  s5Buffer*, Fts5B
27290 75 66 66 65 72 2a 29 3b 0a 20 20 76 6f 69 64 20  uffer*);.  void 
272a0 28 2a 78 41 70 70 65 6e 64 29 28 46 74 73 35 49  (*xAppend)(Fts5I
272b0 6e 64 65 78 2a 2c 20 69 36 34 2c 20 46 74 73 35  ndex*, i64, Fts5
272c0 49 74 65 72 2a 2c 20 46 74 73 35 42 75 66 66 65  Iter*, Fts5Buffe
272d0 72 2a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 43  r*);.  if( p->pC
272e0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
272f0 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
27300 20 29 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d   ){.    xMerge =
27310 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64 4c   fts5MergeRowidL
27320 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e  ists;.    xAppen
27330 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 52 6f  d = fts5AppendRo
27340 77 69 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  wid;.  }else{.  
27350 20 20 78 4d 65 72 67 65 20 3d 20 66 74 73 35 4d    xMerge = fts5M
27360 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 3b  ergePrefixLists;
27370 0a 20 20 20 20 78 41 70 70 65 6e 64 20 3d 20 66  .    xAppend = f
27380 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  ts5AppendPoslist
27390 3b 0a 20 20 7d 0a 0a 20 20 61 42 75 66 20 3d 20  ;.  }..  aBuf = 
273a0 28 46 74 73 35 42 75 66 66 65 72 2a 29 66 74 73  (Fts5Buffer*)fts
273b0 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
273c0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
273d0 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72 75 63  *nBuf);.  pStruc
273e0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
273f0 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28  eRead(p);..  if(
27400 20 61 42 75 66 20 26 26 20 70 53 74 72 75 63 74   aBuf && pStruct
27410 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
27420 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35 49 4e  t flags = FTS5IN
27430 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 0a  DEX_QUERY_SCAN .
27440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27450 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58 5f      | FTS5INDEX_
27460 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 20  QUERY_SKIPEMPTY 
27470 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27480 20 20 20 20 20 7c 20 46 54 53 35 49 4e 44 45 58       | FTS5INDEX
27490 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b  _QUERY_NOOUTPUT;
274a0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
274b0 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
274c0 20 30 3b 0a 20 20 20 20 46 74 73 35 49 74 65 72   0;.    Fts5Iter
274d0 20 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a   *p1 = 0;     /*
274e0 20 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74   Iterator used t
274f0 6f 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72  o gather data fr
27500 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20  om index */.    
27510 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b  Fts5Data *pData;
27520 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
27530 64 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74  doclist;.    int
27540 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 0a   bNewTerm = 1;..
27550 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c      memset(&docl
27560 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ist, 0, sizeof(d
27570 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 74  oclist));.    ft
27580 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
27590 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
275a0 2c 20 70 43 6f 6c 73 65 74 2c 20 70 54 6f 6b 65  , pColset, pToke
275b0 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30  n, nToken, -1, 0
275c0 2c 20 26 70 31 29 3b 0a 20 20 20 20 66 74 73 35  , &p1);.    fts5
275d0 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
275e0 26 70 2d 3e 72 63 2c 20 70 31 29 3b 0a 20 20 20  &p->rc, p1);.   
275f0 20 66 6f 72 28 20 2f 2a 20 6e 6f 2d 6f 70 20 2a   for( /* no-op *
27600 2f 20 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  / ;.        fts5
27610 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
27620 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  p1)==0;.        
27630 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
27640 74 32 28 70 2c 20 70 31 2c 20 26 62 4e 65 77 54  t2(p, p1, &bNewT
27650 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  erm).    ){.    
27660 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
27670 53 65 67 20 3d 20 26 70 31 2d 3e 61 53 65 67 5b  Seg = &p1->aSeg[
27680 20 70 31 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69   p1->aFirst[1].i
27690 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 69  First ];.      i
276a0 6e 74 20 6e 54 65 72 6d 20 3d 20 70 53 65 67 2d  nt nTerm = pSeg-
276b0 3e 74 65 72 6d 2e 6e 3b 0a 20 20 20 20 20 20 63  >term.n;.      c
276c0 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d  onst u8 *pTerm =
276d0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 3b 0a 20   pSeg->term.p;. 
276e0 20 20 20 20 20 70 31 2d 3e 78 53 65 74 4f 75 74       p1->xSetOut
276f0 70 75 74 73 28 70 31 2c 20 70 53 65 67 29 3b 0a  puts(p1, pSeg);.
27700 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
27710 28 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c  ( memcmp(pToken,
27720 20 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b   pTerm, MIN(nTok
27730 65 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29  en, nTerm))<=0 )
27740 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4e 65 77  ;.      if( bNew
27750 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  Term ){.        
27760 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e  if( nTerm<nToken
27770 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65   || memcmp(pToke
27780 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e  n, pTerm, nToken
27790 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ) ) break;.     
277a0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31   }..      if( p1
277b0 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3d 3d 30 20  ->base.nData==0 
277c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
277d0 20 20 20 69 66 28 20 70 31 2d 3e 62 61 73 65 2e     if( p1->base.
277e0 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74 52 6f 77  iRowid<=iLastRow
277f0 69 64 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3e  id && doclist.n>
27800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  0 ){.        for
27810 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
27820 49 54 45 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73  ITE_OK && doclis
27830 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  t.n; i++){.     
27840 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e       assert( i<n
27850 42 75 66 20 29 3b 0a 20 20 20 20 20 20 20 20 20  Buf );.         
27860 20 69 66 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d   if( aBuf[i].n==
27870 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
27880 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
27890 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66 5b  &doclist, &aBuf[
278a0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
278b0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
278c0 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20  &doclist);.     
278d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
278e0 20 20 20 20 20 20 20 20 78 4d 65 72 67 65 28 70          xMerge(p
278f0 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
27900 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  f[i]);.         
27910 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
27920 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  o(&aBuf[i]);.   
27930 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27940 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74   }.        iLast
27950 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 20  Rowid = 0;.     
27960 20 7d 0a 0a 20 20 20 20 20 20 78 41 70 70 65 6e   }..      xAppen
27970 64 28 70 2c 20 70 31 2d 3e 62 61 73 65 2e 69 52  d(p, p1->base.iR
27980 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c  owid-iLastRowid,
27990 20 70 31 2c 20 26 64 6f 63 6c 69 73 74 29 3b 0a   p1, &doclist);.
279a0 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
279b0 20 3d 20 70 31 2d 3e 62 61 73 65 2e 69 52 6f 77   = p1->base.iRow
279c0 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  id;.    }..    f
279d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20  or(i=0; i<nBuf; 
279e0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
279f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
27a00 20 29 7b 0a 20 20 20 20 20 20 20 20 78 4d 65 72   ){.        xMer
27a10 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ge(p, &doclist, 
27a20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
27a30 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
27a40 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69 5d  ferFree(&aBuf[i]
27a50 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
27a60 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
27a70 31 29 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d  1);..    pData =
27a80 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
27a90 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
27aa0 61 29 2b 64 6f 63 6c 69 73 74 2e 6e 2b 46 54 53  a)+doclist.n+FTS
27ab0 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
27ac0 49 4e 47 29 3b 0a 20 20 20 20 69 66 28 20 70 44  ING);.    if( pD
27ad0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ata ){.      pDa
27ae0 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44  ta->p = (u8*)&pD
27af0 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44  ata[1];.      pD
27b00 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d  ata->nn = pData-
27b10 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73  >szLeaf = doclis
27b20 74 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 64  t.n;.      if( d
27b30 6f 63 6c 69 73 74 2e 6e 20 29 20 6d 65 6d 63 70  oclist.n ) memcp
27b40 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c  y(pData->p, docl
27b50 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e  ist.p, doclist.n
27b60 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
27b70 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44  tiIterNew2(p, pD
27b80 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74  ata, bDesc, ppIt
27b90 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
27ba0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64  ts5BufferFree(&d
27bb0 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  oclist);.  }..  
27bc0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
27bd0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
27be0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
27bf0 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  uf);.}.../*.** I
27c00 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
27c10 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
27c20 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
27c30 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
27c40 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
27c50 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
27c60 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  id iRowid..*/.in
27c70 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
27c80 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
27c90 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
27ca0 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77  Delete, i64 iRow
27cb0 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
27cc0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27cd0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
27ce0 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
27cf0 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
27d00 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
27d10 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
27d20 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
27d30 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
27d40 33 46 74 73 35 48 61 73 68 4e 65 77 28 70 2d 3e  3Fts5HashNew(p->
27d50 70 43 6f 6e 66 69 67 2c 20 26 70 2d 3e 70 48 61  pConfig, &p->pHa
27d60 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67  sh, &p->nPending
27d70 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Data);.  }..  /*
27d80 20 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20   Flush the hash 
27d90 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66  table to disk if
27da0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
27db0 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72  f( iRowid<p->iWr
27dc0 69 74 65 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20  iteRowid .   || 
27dd0 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69  (iRowid==p->iWri
27de0 74 65 52 6f 77 69 64 20 26 26 20 70 2d 3e 62 44  teRowid && p->bD
27df0 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20  elete==0).   || 
27e00 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61  (p->nPendingData
27e10 20 3e 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   > p->pConfig->n
27e20 48 61 73 68 53 69 7a 65 29 20 0a 20 20 29 7b 0a  HashSize) .  ){.
27e30 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
27e40 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d  sh(p);.  }..  p-
27e50 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
27e60 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c  Rowid;.  p->bDel
27e70 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20  ete = bDelete;. 
27e80 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
27e90 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
27ea0 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61  *.** Commit data
27eb0 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
27ec0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27ed0 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
27ee0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
27ef0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27f00 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c  );.  fts5IndexFl
27f10 75 73 68 28 70 29 3b 0a 20 20 66 74 73 35 43 6c  ush(p);.  fts5Cl
27f20 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
27f30 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
27f40 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
27f50 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20  .** Discard any 
27f60 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
27f70 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
27f80 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74  h tables. Do not
27f90 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20   write it.** to 
27fa0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64  the database. Ad
27fb0 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75  ditionally, assu
27fc0 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  me that the cont
27fd0 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61  ents of the %_da
27fe0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20  ta.** table may 
27ff0 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20  have changed on 
28000 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d  disk. So any in-
28010 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66  memory caches of
28020 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f   %_data .** reco
28030 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61  rds must be inva
28040 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  lidated..*/.int 
28050 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28060 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64  Rollback(Fts5Ind
28070 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c  ex *p){.  fts5Cl
28080 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20  oseReader(p);.  
28090 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64  fts5IndexDiscard
280a0 44 61 74 61 28 70 29 3b 0a 20 20 66 74 73 35 53  Data(p);.  fts5S
280b0 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
280c0 74 65 28 70 29 3b 0a 20 20 2f 2a 20 61 73 73 65  te(p);.  /* asse
280d0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
280e0 45 5f 4f 4b 20 29 3b 20 2a 2f 0a 20 20 72 65 74  E_OK ); */.  ret
280f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
28100 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61  ../*.** The %_da
28110 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  ta table is comp
28120 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65  letely empty whe
28130 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
28140 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a  is called. This.
28150 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75  ** function popu
28160 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74 68  lates it with th
28170 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74  e initial struct
28180 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20  ure objects for 
28190 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61  each index,.** a
281a0 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  nd the initial v
281b0 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61  ersion of the "a
281c0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
281d0 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f  (a zero-byte blo
281e0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
281f0 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69  e3Fts5IndexReini
28200 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  t(Fts5Index *p){
28210 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
28220 20 73 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74   s;.  fts5Struct
28230 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
28240 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
28250 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
28260 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
28270 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
28280 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
28290 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
282a0 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
282b0 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
282c0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
282d0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
282e0 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
282f0 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
28300 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
28310 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
28320 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
28330 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
28340 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
28350 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
28360 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
28370 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
28380 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
28390 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
283a0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
283b0 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
283c0 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
283d0 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
283e0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
283f0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28400 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
28410 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
28420 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
28430 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
28440 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
28450 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
28460 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
28470 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
28480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
28490 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
284a0 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
284b0 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
284c0 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
284d0 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
284e0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
284f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
28500 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
28510 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
28520 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
28530 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44  _UNIT;.    p->zD
28540 61 74 61 54 62 6c 20 3d 20 73 71 6c 69 74 65 33  ataTbl = sqlite3
28550 46 74 73 35 4d 70 72 69 6e 74 66 28 26 72 63 2c  Fts5Mprintf(&rc,
28560 20 22 25 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e   "%s_data", pCon
28570 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  fig->zName);.   
28580 20 69 66 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c   if( p->zDataTbl
28590 20 26 26 20 62 43 72 65 61 74 65 20 29 7b 0a 20   && bCreate ){. 
285a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
285b0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
285c0 28 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  (.          pCon
285d0 66 69 67 2c 20 22 64 61 74 61 22 2c 20 22 69 64  fig, "data", "id
285e0 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
285f0 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42   KEY, block BLOB
28600 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20 20 20 20  ", 0, pzErr.    
28610 20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72    );.      if( r
28620 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28630 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28640 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
28650 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20 22 69 64  ble(pConfig, "id
28660 78 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  x", .           
28670 20 22 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70   "segid, term, p
28680 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59  gno, PRIMARY KEY
28690 28 73 65 67 69 64 2c 20 74 65 72 6d 29 22 2c 20  (segid, term)", 
286a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 31 2c 20  .            1, 
286b0 70 7a 45 72 72 0a 20 20 20 20 20 20 20 20 29 3b  pzErr.        );
286c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
286d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
286e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
286f0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28700 78 52 65 69 6e 69 74 28 70 29 3b 0a 20 20 20 20  xReinit(p);.    
28710 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
28720 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
28730 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d  ITE_OK || p->rc=
28740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
28750 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71  if( rc ){.    sq
28760 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
28770 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a 70 70 20  ose(p);.    *pp 
28780 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
28790 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
287a0 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65 20 6f 70  lose a handle op
287b0 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69  ened by an earli
287c0 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  er call to sqlit
287d0 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28  e3Fts5IndexOpen(
287e0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
287f0 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65 28  3Fts5IndexClose(
28800 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
28810 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
28820 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a  _OK;.  if( p ){.
28830 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
28840 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20  Reader==0 );.   
28850 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
28860 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20  validate(p);.   
28870 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28880 65 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20  e(p->pWriter);. 
28890 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
288a0 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74 65 72 29  ize(p->pDeleter)
288b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
288c0 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 57 72  nalize(p->pIdxWr
288d0 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
288e0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
288f0 49 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 20  IdxDeleter);.   
28900 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28910 65 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  e(p->pIdxSelect)
28920 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28930 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 61 74 61 56  nalize(p->pDataV
28940 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 73 71 6c  ersion);.    sql
28950 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
28960 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
28970 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
28980 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
28990 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
289a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
289b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
289c0 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
289d0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
289e0 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
289f0 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
28a00 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
28a10 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
28a20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
28a30 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
28a40 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
28a50 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
28a60 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
28a70 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
28a80 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
28a90 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
28aa0 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
28ab0 65 6c 65 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68  elen(.  const ch
28ac0 61 72 20 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42  ar *p, .  int nB
28ad0 79 74 65 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61  yte, .  int nCha
28ae0 72 0a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  r.){.  int n = 0
28af0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
28b00 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69  (i=0; i<nChar; i
28b10 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  ++){.    if( n>=
28b20 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e 20 30  nByte ) return 0
28b30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20  ;      /* Input 
28b40 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72 20 74  contains fewer t
28b50 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72 73 20  han nChar chars 
28b60 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69  */.    if( (unsi
28b70 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d  gned char)p[n++]
28b80 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20  >=0xc0 ){.      
28b90 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30  while( (p[n] & 0
28ba0 78 63 30 29 3d 3d 30 78 38 30 20 29 7b 0a 20 20  xc0)==0x80 ){.  
28bb0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
28bc0 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65 20     if( n>=nByte 
28bd0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
28be0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28bf0 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
28c00 70 49 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65  pIn is a UTF-8 e
28c10 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e  ncoded string, n
28c20 49 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  In bytes in size
28c30 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  . Return the num
28c40 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64  ber of.** unicod
28c50 65 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  e characters in 
28c60 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  the string..*/.s
28c70 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
28c80 64 65 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74  dexCharlen(const
28c90 20 63 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20   char *pIn, int 
28ca0 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61  nIn){.  int nCha
28cb0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
28cc0 20 20 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a    .  int i = 0;.
28cd0 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29    while( i<nIn )
28ce0 7b 0a 20 20 20 20 69 66 28 20 28 75 6e 73 69 67  {.    if( (unsig
28cf0 6e 65 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b  ned char)pIn[i++
28d00 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20  ]>=0xc0 ){.     
28d10 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26   while( i<nIn &&
28d20 20 28 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29   (pIn[i] & 0xc0)
28d30 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  ==0x80 ) i++;.  
28d40 20 20 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b    }.    nChar++;
28d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43  .  }.  return nC
28d60 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  har;.}../*.** In
28d70 73 65 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64  sert or remove d
28d80 61 74 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ata to or from t
28d90 68 65 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74  he index. Each t
28da0 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69  ime a document i
28db0 73 20 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f  s .** added to o
28dc0 72 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  r removed from t
28dd0 68 65 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66  he index, this f
28de0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
28df0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  d one or more.**
28e00 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   times..**.** Fo
28e10 72 20 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20  r an insert, it 
28e20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f  must be called o
28e30 6e 63 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b  nce for each tok
28e40 65 6e 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f  en in the new do
28e50 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68  cument..** If th
28e60 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61  e operation is a
28e70 20 64 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74   delete, it must
28e80 20 62 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c   be called (at l
28e90 65 61 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65  east) once for e
28ea0 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f  ach.** unique to
28eb0 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d  ken in the docum
28ec0 65 6e 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c  ent with an iCol
28ed0 20 76 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e   value less than
28ee0 20 7a 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a   zero. The iPos.
28ef0 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  ** argument is i
28f00 67 6e 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c  gnored for a del
28f10 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ete..*/.int sqli
28f20 74 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74  te3Fts5IndexWrit
28f30 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
28f40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
28f50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
28f60 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
28f70 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f90 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61  * Column token a
28fa0 70 70 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d  ppears in (-ve -
28fb0 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69  > delete) */.  i
28fc0 6e 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20  nt iPos,        
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28fe0 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f  * Position of to
28ff0 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d  ken within colum
29000 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
29010 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e  r *pToken, int n
29020 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20  Token  /* Token 
29030 74 6f 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65  to add or remove
29040 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65   to or from inde
29050 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  x */.){.  int i;
29060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
29080 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
29090 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
290a0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
290b0 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
290c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
290d0 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67   */.  Fts5Config
290e0 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
290f0 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72  Config;..  asser
29100 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
29110 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _OK );.  assert(
29120 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44   (iCol<0)==p->bD
29130 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41  elete );..  /* A
29140 64 64 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20  dd the entry to 
29150 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69  the main terms i
29160 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ndex. */.  rc = 
29170 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57  sqlite3Fts5HashW
29180 72 69 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70  rite(.      p->p
29190 48 61 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52  Hash, p->iWriteR
291a0 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73  owid, iCol, iPos
291b0 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  , FTS5_MAIN_PREF
291c0 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  IX, pToken, nTok
291d0 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69  en.  );..  for(i
291e0 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e  =0; i<pConfig->n
291f0 50 72 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51  Prefix && rc==SQ
29200 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20  LITE_OK; i++){. 
29210 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68     const int nCh
29220 61 72 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50  ar = pConfig->aP
29230 72 65 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e  refix[i];.    in
29240 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
29250 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
29260 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65  nToBytelen(pToke
29270 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72  n, nToken, nChar
29280 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
29290 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
292a0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72  qlite3Fts5HashWr
292b0 69 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20  ite(p->pHash, . 
292c0 20 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69           p->iWri
292d0 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
292e0 50 6f 73 2c 20 28 63 68 61 72 29 28 46 54 53 35  Pos, (char)(FTS5
292f0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31  _MAIN_PREFIX+i+1
29300 29 2c 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20  ), pToken,.     
29310 20 20 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20       nByte.     
29320 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
29330 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
29340 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
29350 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72  iterator to iter
29360 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72  ate though all r
29370 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68 20  owid that match 
29380 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  the .** specifie
29390 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e  d token or token
293a0 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20   prefix..*/.int 
293b0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
293c0 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64  Query(.  Fts5Ind
293d0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
293e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20           /* FTS 
293f0 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a  index to query *
29400 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
29410 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
29420 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72  en, /* Token (or
29430 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65 72   prefix) to quer
29440 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66  y for */.  int f
29450 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
29460 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
29470 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
29480 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f  QUERY_X flags */
29490 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
294a0 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
294b0 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73     /* Match thes
294c0 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a  e columns only *
294d0 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  /.  Fts5IndexIte
294e0 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20  r **ppIter      
294f0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
29500 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
29510 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
29520 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
29530 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35  >pConfig;.  Fts5
29540 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30 3b 0a  Iter *pRet = 0;.
29550 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
29560 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20   = {0, 0, 0};.. 
29570 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   /* If the QUERY
29580 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20 73 65  _SCAN flag is se
29590 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  t, all other fla
295a0 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65 61 72  gs must be clear
295b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  . */.  assert( (
295c0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
295d0 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 30  X_QUERY_SCAN)==0
295e0 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53 35 49   || flags==FTS5I
295f0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
29600 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  );..  if( sqlite
29610 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
29620 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54  &p->rc, &buf, nT
29630 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20  oken+1)==0 ){.  
29640 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 20    int iIdx = 0; 
29650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29660 2f 2a 20 49 6e 64 65 78 20 74 6f 20 73 65 61 72  /* Index to sear
29670 63 68 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 54  ch */.    if( nT
29680 6f 6b 65 6e 20 29 20 6d 65 6d 63 70 79 28 26 62  oken ) memcpy(&b
29690 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c  uf.p[1], pToken,
296a0 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 20 20 20 20 2f   nToken);..    /
296b0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69  * Figure out whi
296c0 63 68 20 69 6e 64 65 78 20 74 6f 20 73 65 61 72  ch index to sear
296d0 63 68 20 61 6e 64 20 73 65 74 20 69 49 64 78 20  ch and set iIdx 
296e0 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66 20  accordingly. If 
296f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 61  this.    ** is a
29700 20 70 72 65 66 69 78 20 71 75 65 72 79 20 66 6f   prefix query fo
29710 72 20 77 68 69 63 68 20 74 68 65 72 65 20 69 73  r which there is
29720 20 6e 6f 20 70 72 65 66 69 78 20 69 6e 64 65 78   no prefix index
29730 2c 20 73 65 74 20 69 49 64 78 20 74 6f 0a 20 20  , set iIdx to.  
29740 20 20 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61    ** greater tha
29750 6e 20 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  n pConfig->nPref
29760 69 78 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ix to indicate t
29770 68 61 74 20 74 68 65 20 71 75 65 72 79 20 77 69  hat the query wi
29780 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 73 61 74  ll be.    ** sat
29790 69 73 66 69 65 64 20 62 79 20 73 63 61 6e 6e 69  isfied by scanni
297a0 6e 67 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d  ng multiple term
297b0 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e  s in the main in
297c0 64 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  dex..    **.    
297d0 2a 2a 20 49 66 20 74 68 65 20 51 55 45 52 59 5f  ** If the QUERY_
297e0 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67 20  TEST_NOIDX flag 
297f0 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20 74  was specified, t
29800 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62 65  hen this must be
29810 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69 78   a.    ** prefix
29820 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64 20  -query. Instead 
29830 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66 69  of using a prefi
29840 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65 20  x-index (if one 
29850 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a 2a  exists), .    **
29860 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70 72   evaluate the pr
29870 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e 67  efix query using
29880 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69 6e   the main FTS in
29890 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73 65  dex. This is use
298a0 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e 74  d.    ** for int
298b0 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68 65  ernal sanity che
298c0 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e 74  cking by the int
298d0 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e 20  egrity-check in 
298e0 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d 6f  debug .    ** mo
298f0 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 23 69 66  de only.  */.#if
29900 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
29910 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
29920 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d  ->bPrefixIndex==
29930 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
29940 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
29950 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20  ST_NOIDX) ){.   
29960 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
29970 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
29980 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20  RY_PREFIX );.   
29990 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
299a0 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
299b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
299c0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
299d0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
299e0 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69  REFIX ){.      i
299f0 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
29a00 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
29a10 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
29a20 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
29a30 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
29a40 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
29a50 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
29a60 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
29a70 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
29a80 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
29a90 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78   }..    if( iIdx
29aa0 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
29ab0 69 78 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  ix ){.      /* S
29ac0 74 72 61 69 67 68 74 20 69 6e 64 65 78 20 6c 6f  traight index lo
29ad0 6f 6b 75 70 20 2a 2f 0a 20 20 20 20 20 20 46 74  okup */.      Ft
29ae0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
29af0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
29b00 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20  tureRead(p);.   
29b10 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 28 75     buf.p[0] = (u
29b20 38 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  8)(FTS5_MAIN_PRE
29b30 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 20  FIX + iIdx);.   
29b40 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
29b50 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
29b60 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
29b70 74 72 75 63 74 2c 20 66 6c 61 67 73 20 7c 20 46  truct, flags | F
29b80 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
29b90 4b 49 50 45 4d 50 54 59 2c 20 0a 20 20 20 20 20  KIPEMPTY, .     
29ba0 20 20 20 20 20 20 20 70 43 6f 6c 73 65 74 2c 20         pColset, 
29bb0 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c  buf.p, nToken+1,
29bc0 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 0a 20 20   -1, 0, &pRet.  
29bd0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
29be0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
29bf0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
29c00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
29c10 65 7b 0a 20 20 20 20 20 20 2f 2a 20 53 63 61 6e  e{.      /* Scan
29c20 20 6d 75 6c 74 69 70 6c 65 20 74 65 72 6d 73 20   multiple terms 
29c30 69 6e 20 74 68 65 20 6d 61 69 6e 20 69 6e 64 65  in the main inde
29c40 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 62  x */.      int b
29c50 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20  Desc = (flags & 
29c60 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
29c70 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20  DESC)!=0;.      
29c80 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
29c90 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20  MAIN_PREFIX;.   
29ca0 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65 66     fts5SetupPref
29cb0 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c  ixIter(p, bDesc,
29cc0 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
29cd0 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74  , pColset, &pRet
29ce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
29cf0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
29d00 4b 20 7c 7c 20 70 52 65 74 2d 3e 70 43 6f 6c 73  K || pRet->pCols
29d10 65 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  et==0 );.      f
29d20 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74  ts5IterSetOutput
29d30 43 62 28 26 70 2d 3e 72 63 2c 20 70 52 65 74 29  Cb(&p->rc, pRet)
29d40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
29d50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29d60 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49          Fts5SegI
29d70 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 52 65  ter *pSeg = &pRe
29d80 74 2d 3e 61 53 65 67 5b 70 52 65 74 2d 3e 61 46  t->aSeg[pRet->aF
29d90 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
29da0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
29db0 67 2d 3e 70 4c 65 61 66 20 29 20 70 52 65 74 2d  g->pLeaf ) pRet-
29dc0 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 52 65  >xSetOutputs(pRe
29dd0 74 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  t, pSeg);.      
29de0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
29df0 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20   p->rc ){.      
29e00 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43  sqlite3Fts5IterC
29e10 6c 6f 73 65 28 28 46 74 73 35 49 6e 64 65 78 49  lose((Fts5IndexI
29e20 74 65 72 2a 29 70 52 65 74 29 3b 0a 20 20 20 20  ter*)pRet);.    
29e30 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20    pRet = 0;.    
29e40 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65    fts5CloseReade
29e50 72 28 70 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  r(p);.    }..   
29e60 20 2a 70 70 49 74 65 72 20 3d 20 28 46 74 73 35   *ppIter = (Fts5
29e70 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74 3b  IndexIter*)pRet;
29e80 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
29e90 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
29ea0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
29eb0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
29ec0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
29ed0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
29ee0 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
29ef0 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
29f00 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a  ent is at EOF..*
29f10 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  /./*.** Move to 
29f20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
29f30 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74  g rowid. .*/.int
29f40 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
29f50 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74  Next(Fts5IndexIt
29f60 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b  er *pIndexIter){
29f70 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49 74  .  Fts5Iter *pIt
29f80 65 72 20 3d 20 28 46 74 73 35 49 74 65 72 2a 29  er = (Fts5Iter*)
29f90 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20 61 73  pIndexIter;.  as
29fa0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e  sert( pIter->pIn
29fb0 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  dex->rc==SQLITE_
29fc0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74  OK );.  fts5Mult
29fd0 69 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d  iIterNext(pIter-
29fe0 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20  >pIndex, pIter, 
29ff0 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
2a000 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
2a010 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
2a020 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
2a030 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
2a040 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55  ng term/rowid. U
2a050 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76  sed by the fts5v
2a060 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a  ocab module..*/.
2a070 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2a080 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35  terNextScan(Fts5
2a090 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
2a0a0 78 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74  xIter){.  Fts5It
2a0b0 65 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73  er *pIter = (Fts
2a0c0 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65  5Iter*)pIndexIte
2a0d0 72 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r;.  Fts5Index *
2a0e0 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
2a0f0 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  x;..  assert( pI
2a100 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
2a110 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
2a120 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
2a130 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
2a140 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0);.  if( p->rc=
2a150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a160 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
2a170 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
2a180 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
2a190 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
2a1a0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65     if( pSeg->pLe
2a1b0 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d  af && pSeg->term
2a1c0 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e  .p[0]!=FTS5_MAIN
2a1d0 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20  _PREFIX ){.     
2a1e0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
2a1f0 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20  (pSeg->pLeaf);. 
2a200 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66       pSeg->pLeaf
2a210 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65   = 0;.      pIte
2a220 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20 31  r->base.bEof = 1
2a230 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
2a240 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
2a250 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
2a260 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
2a270 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
2a280 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
2a290 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
2a2a0 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
2a2b0 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
2a2c0 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
2a2d0 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
2a2e0 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
2a2f0 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
2a300 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
2a310 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
2a320 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  order..*/.int sq
2a330 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
2a340 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
2a350 74 65 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c  ter *pIndexIter,
2a360 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a 20 20   i64 iMatch){.  
2a370 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
2a380 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
2a390 64 65 78 49 74 65 72 3b 0a 20 20 66 74 73 35 4d  dexIter;.  fts5M
2a3a0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
2a3b0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
2a3c0 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a  pIter, iMatch);.
2a3d0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2a3e0 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
2a3f0 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
2a400 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
2a410 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f  rent term..*/.co
2a420 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2a430 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46 74  3Fts5IterTerm(Ft
2a440 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e  s5IndexIter *pIn
2a450 64 65 78 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e  dexIter, int *pn
2a460 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f  ){.  int n;.  co
2a470 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
2a480 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d  onst char*)fts5M
2a490 75 6c 74 69 49 74 65 72 54 65 72 6d 28 28 46 74  ultiIterTerm((Ft
2a4a0 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74  s5Iter*)pIndexIt
2a4b0 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d  er, &n);.  *pn =
2a4c0 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26   n-1;.  return &
2a4d0 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  z[1];.}../*.** C
2a4e0 6c 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72  lose an iterator
2a4f0 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
2a500 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
2a510 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
2a520 65 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ery()..*/.void s
2a530 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
2a540 6f 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  ose(Fts5IndexIte
2a550 72 20 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a  r *pIndexIter){.
2a560 20 20 69 66 28 20 70 49 6e 64 65 78 49 74 65 72    if( pIndexIter
2a570 20 29 7b 0a 20 20 20 20 46 74 73 35 49 74 65 72   ){.    Fts5Iter
2a580 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
2a590 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
2a5a0 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
2a5b0 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
2a5c0 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
2a5d0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
2a5e0 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c  ter);.    fts5Cl
2a5f0 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78  oseReader(pIndex
2a600 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
2a610 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20  Read and decode 
2a620 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
2a630 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64  ecord from the d
2a640 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
2a650 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65  Parameter anSize
2a660 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
2a670 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20  n array of size 
2a680 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c  nCol, where nCol
2a690 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
2a6a0 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
2a6b0 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
2a6c0 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
2a6d0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
2a6e0 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
2a6f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
2a700 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
2a710 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  Size){.  int nCo
2a720 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
2a730 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61  nCol;.  Fts5Data
2a740 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52   *pData;..  *pnR
2a750 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ow = 0;.  memset
2a760 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65  (anSize, 0, size
2a770 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b  of(i64) * nCol);
2a780 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
2a790 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
2a7a0 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
2a7b0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2a7c0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
2a7d0 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->nn ){.    int 
2a7e0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
2a7f0 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  Col;.    i += ft
2a800 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
2a810 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
2a820 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28  pnRow);.    for(
2a830 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d  iCol=0; i<pData-
2a840 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c  >nn && iCol<nCol
2a850 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
2a860 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
2a870 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
2a880 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b  , (u64*)&anSize[
2a890 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol]);.    }.  
2a8a0 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
2a8b0 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
2a8c0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
2a8d0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
2a8e0 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
2a8f0 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73  urrent "averages
2a900 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68  " record with th
2a910 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2a920 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70  e buffer .** sup
2a930 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63  plied as the sec
2a940 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
2a950 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
2a960 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
2a970 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
2a980 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
2a990 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73  int nData){.  as
2a9a0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
2a9b0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
2a9c0 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
2a9d0 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
2a9e0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
2a9f0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
2aa00 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
2aa10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2aa20 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
2aa30 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
2aa40 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
2aa50 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
2aa60 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
2aa70 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
2aa80 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
2aa90 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
2aaa0 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
2aab0 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f  n p->nRead;.}../
2aac0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d  *.** Set the 32-
2aad0 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  bit cookie value
2aae0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
2aaf0 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75  tart of all stru
2ab00 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64  cture .** record
2ab10 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  s to the value p
2ab20 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2ab30 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
2ab40 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
2ab50 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
2ab60 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
2ab70 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
2ab80 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
2ab90 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
2aba0 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
2abb0 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  kie(Fts5Index *p
2abc0 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69  , int iNew){.  i
2abd0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2abf0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2ac00 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
2ac10 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
2ac20 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20  >pConfig;    /* 
2ac30 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
2ac40 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f  ject */.  u8 aCo
2ac50 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20  okie[4];        
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac70 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65  * Binary represe
2ac80 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20  ntation of iNew 
2ac90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
2aca0 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20  b *pBlob = 0;.. 
2acb0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
2acc0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
2acd0 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
2ace0 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
2acf0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2ad00 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
2ad10 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  g->db, pConfig->
2ad20 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
2ad30 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22  , .      "block"
2ad40 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
2ad50 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f  _ROWID, 1, &pBlo
2ad60 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  b.  );.  if( rc=
2ad70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ad80 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
2ad90 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
2ada0 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
2adb0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
2adc0 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
2add0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
2ade0 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
2adf0 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e  Fts5IndexLoadCon
2ae00 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fig(Fts5Index *p
2ae10 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
2ae20 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70  re *pStruct;.  p
2ae30 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
2ae40 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
2ae50 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
2ae60 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
2ae70 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
2ae80 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
2ae90 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
2aea0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aeb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aec0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aed0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
2aee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2af20 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
2af30 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
2af40 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2af50 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
2af60 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63  y-check .** func
2af70 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f  tionality..*/../
2af80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
2af90 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
2afa0 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
2afb0 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75   arguments..*/.u
2afc0 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  64 sqlite3Fts5In
2afd0 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
2afe0 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
2aff0 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
2b000 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49   iPos, .  int iI
2b010 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
2b020 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e   *pTerm,.  int n
2b030 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
2b040 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
2b050 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
2b060 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
2b070 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
2b080 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69   + iPos;.  if( i
2b090 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20  Idx>=0 ) ret += 
2b0a0 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35  (ret<<3) + (FTS5
2b0b0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
2b0c0 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Idx);.  for(i=0;
2b0d0 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
2b0e0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2b0f0 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
2b100 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64  urn ret;.}..#ifd
2b110 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2b120 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2b130 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e  ion is purely an
2b140 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2b150 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2b160 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2b170 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2b180 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2b190 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2b1a0 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
2b1b0 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74  Instead, it test
2b1c0 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  s that the same 
2b1d0 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69  set of pgno/rowi
2b1e0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  d combinations a
2b1f0 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72  re .** visited r
2b200 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
2b210 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74  ther the doclist
2b220 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65  -index identifie
2b230 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a  d by parameters.
2b240 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20  ** iSegid/iLeaf 
2b250 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66  is iterated in f
2b260 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72  orwards or rever
2b270 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  se order..*/.sta
2b280 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2b290 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20  tDlidxReverse(. 
2b2a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
2b2b0 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2d0 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
2b2e0 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a  to load from */.
2b2f0 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20    int iLeaf     
2b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b310 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73    /* Load doclis
2b320 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  t-index for this
2b330 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74   leaf */.){.  Ft
2b340 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
2b350 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63  idx = 0;.  u64 c
2b360 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36  ksum1 = 13;.  u6
2b370 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a  4 cksum2 = 13;..
2b380 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
2b390 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
2b3a0 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 0, iSegid, iLe
2b3b0 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
2b3c0 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
2b3d0 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
2b3e0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
2b3f0 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  xt(p, pDlidx).  
2b400 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
2b410 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
2b420 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
2b430 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
2b440 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2b450 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
2b460 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66  sert( pgno>iLeaf
2b470 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b   );.    cksum1 +
2b480 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
2b490 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
2b4a0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
2b4b0 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
2b4c0 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
2b4d0 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
2b4e0 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c  dxIterInit(p, 1,
2b4f0 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
2b500 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2b510 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
2b520 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
2b530 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
2b540 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
2b550 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
2b560 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
2b570 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
2b580 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
2b590 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
2b5a0 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
2b5b0 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  ( fts5DlidxIterP
2b5c0 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61  gno(pDlidx)>iLea
2b5d0 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20  f );.    cksum2 
2b5e0 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
2b5f0 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
2b600 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
2b610 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
2b620 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
2b630 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
2b640 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
2b650 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
2b660 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  FTS5_CORRUPT;.}.
2b670 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2b680 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74  QueryCksum(.  Ft
2b690 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
2b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b6b0 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65   Fts5 index obje
2b6c0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
2b6d0 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
2b6e0 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
2b6f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79      /* Index key
2b700 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
2b710 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b730 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e     /* Size of in
2b740 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73  dex key in bytes
2b750 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b770 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
2b780 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  or Fts5IndexQuer
2b790 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73  y */.  u64 *pCks
2b7a0 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
2b7b0 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2b7c0 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  : Checksum value
2b7d0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 44 65   */.){.  int eDe
2b7e0 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  tail = p->pConfi
2b7f0 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36  g->eDetail;.  u6
2b800 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73 75  4 cksum = *pCksu
2b810 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  m;.  Fts5IndexIt
2b820 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
2b830 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2b840 33 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28  3Fts5IndexQuery(
2b850 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20  p, z, n, flags, 
2b860 30 2c 20 26 70 49 74 65 72 29 3b 0a 0a 20 20 77  0, &pIter);..  w
2b870 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
2b880 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
2b890 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 74  3Fts5IterEof(pIt
2b8a0 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 72  er) ){.    i64 r
2b8b0 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 69 52  owid = pIter->iR
2b8c0 6f 77 69 64 3b 0a 0a 20 20 20 20 69 66 28 20 65  owid;..    if( e
2b8d0 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54  Detail==FTS5_DET
2b8e0 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  AIL_NONE ){.    
2b8f0 20 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74    cksum ^= sqlit
2b900 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2b910 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 30 2c 20  Cksum(rowid, 0, 
2b920 30 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a  0, iIdx, z, n);.
2b930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b940 20 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64   Fts5PoslistRead
2b950 65 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20  er sReader;.    
2b960 20 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73    for(sqlite3Fts
2b970 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e  5PoslistReaderIn
2b980 69 74 28 70 49 74 65 72 2d 3e 70 44 61 74 61 2c  it(pIter->pData,
2b990 20 70 49 74 65 72 2d 3e 6e 44 61 74 61 2c 20 26   pIter->nData, &
2b9a0 73 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  sReader);.      
2b9b0 20 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66      sReader.bEof
2b9c0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ==0;.          s
2b9d0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
2b9e0 74 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65  tReaderNext(&sRe
2b9f0 61 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20  ader).      ){. 
2ba00 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20         int iCol 
2ba10 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d  = FTS5_POS2COLUM
2ba20 4e 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b  N(sReader.iPos);
2ba30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
2ba40 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46  f = FTS5_POS2OFF
2ba50 53 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73  SET(sReader.iPos
2ba60 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2ba70 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2ba80 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72  ndexEntryCksum(r
2ba90 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66  owid, iCol, iOff
2baa0 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20  , iIdx, z, n);. 
2bab0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2bac0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2bad0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
2bae0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
2baf0 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 20 20 20  Next(pIter);.   
2bb00 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
2bb10 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70 49  Fts5IterClose(pI
2bb20 74 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d  ter);..  *pCksum
2bb30 20 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75   = cksum;.  retu
2bb40 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
2bb50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bb60 73 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e  s also purely an
2bb70 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
2bb80 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
2bb90 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
2bba0 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
2bbb0 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
2bbc0 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
2bbd0 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61   any way..*/.sta
2bbe0 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
2bbf0 74 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64  tTerm(.  Fts5Ind
2bc00 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75  ex *p, .  Fts5Bu
2bc10 66 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20  ffer *pPrev,    
2bc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65            /* Pre
2bc30 76 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20  vious term */.  
2bc40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
2bc50 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
2bc60 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20  /* Possibly new 
2bc70 74 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a  term to test */.
2bc80 20 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a    u64 expected,.
2bc90 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b    u64 *pCksum.){
2bca0 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72  .  int rc = p->r
2bcb0 63 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e  c;.  if( pPrev->
2bcc0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  n==0 ){.    fts5
2bcd0 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70  BufferSet(&rc, p
2bce0 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20  Prev, n, (const 
2bcf0 75 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a  u8*)z);.  }else.
2bd00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bd10 5f 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e  _OK && (pPrev->n
2bd20 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50  !=n || memcmp(pP
2bd30 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29  rev->p, z, n)) )
2bd40 7b 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33  {.    u64 cksum3
2bd50 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20   = *pCksum;.    
2bd60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
2bd70 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  m = (const char*
2bd80 29 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20  )&pPrev->p[1];  
2bd90 2f 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65  /* term sans pre
2bda0 66 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20  fix-byte */.    
2bdb0 69 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65  int nTerm = pPre
2bdc0 76 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20  v->n-1;         
2bdd0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54     /* Size of zT
2bde0 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  erm in bytes */.
2bdf0 20 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28      int iIdx = (
2be00 70 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54  pPrev->p[0] - FT
2be10 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b  S5_MAIN_PREFIX);
2be20 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
2be30 20 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20   (iIdx==0 ? 0 : 
2be40 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2be50 50 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34  PREFIX);.    u64
2be60 20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36   ck1 = 0;.    u6
2be70 34 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20  4 ck2 = 0;..    
2be80 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
2be90 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
2bea0 65 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44  ed for ASC and D
2beb0 45 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a  ESC queries are.
2bec0 20 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e      ** the same.
2bed0 20 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68   If not, call th
2bee0 69 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  is corruption.  
2bef0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35  */.    rc = fts5
2bf00 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
2bf10 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
2bf20 2c 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a  , flags, &ck1);.
2bf30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bf40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2bf50 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53  nt f = flags|FTS
2bf60 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
2bf70 43 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74  C;.      rc = ft
2bf80 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
2bf90 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
2bfa0 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
2bfb0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2bfc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
2bfd0 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
2bfe0 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
2bff0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2c000 70 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68  prefix query, ch
2c010 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
2c020 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66  ults returned if
2c030 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   the.    ** the 
2c040 69 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65  index is disable
2c050 64 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20  d are the same. 
2c060 49 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20  In both ASC and 
2c070 44 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20  DESC order. .   
2c080 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
2c090 63 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62  check may only b
2c0a0 65 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74  e performed if t
2c0b0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73  he hash table is
2c0c0 20 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20   empty. This.   
2c0d0 20 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74   ** is because t
2c0e0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e  he hash table on
2c0f0 6c 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69  ly supports a si
2c100 6e 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20  ngle scan query 
2c110 61 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65  at.    ** a time
2c120 2c 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d  , and the multi-
2c130 69 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77  iter loop from w
2c140 68 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69  hich this functi
2c150 6f 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20  on is called.   
2c160 20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70   ** is already p
2c170 65 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61  erforming such a
2c180 20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66   scan. */.    if
2c190 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
2c1a0 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  a==0 ){.      if
2c1b0 28 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d  ( iIdx>0 && rc==
2c1c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c1d0 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
2c1e0 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
2c1f0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20  RY_TEST_NOIDX;. 
2c200 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a         ck2 = 0;.
2c210 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73          rc = fts
2c220 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
2c230 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
2c240 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
2c250 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2c260 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63  ITE_OK && ck1!=c
2c270 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43  k2 ) rc = FTS5_C
2c280 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a  ORRUPT;.      }.
2c290 20 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30        if( iIdx>0
2c2a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2c2b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  K ){.        int
2c2c0 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
2c2d0 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
2c2e0 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f  NOIDX|FTS5INDEX_
2c2f0 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
2c300 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20      ck2 = 0;.   
2c310 20 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75       rc = fts5Qu
2c320 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78  eryCksum(p, iIdx
2c330 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , zTerm, nTerm, 
2c340 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20  f, &ck2);.      
2c350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c360 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20  _OK && ck1!=ck2 
2c370 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ) rc = FTS5_CORR
2c380 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
2c390 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e   }..    cksum3 ^
2c3a0 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42  = ck1;.    fts5B
2c3b0 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
2c3c0 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
2c3d0 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20  8*)z);..    if( 
2c3e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2c3f0 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65   cksum3!=expecte
2c400 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
2c410 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2c420 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20    }.    *pCksum 
2c430 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20  = cksum3;.  }.  
2c440 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a  p->rc = rc;.}. .
2c450 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
2c460 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
2c470 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66  rse(x,y,z).# def
2c480 69 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d  ine fts5TestTerm
2c490 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65  (u,v,w,x,y,z).#e
2c4a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
2c4b0 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  k that:.**.**   
2c4c0 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66  1) All leaves of
2c4d0 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46   pSeg between iF
2c4e0 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28  irst and iLast (
2c4f0 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74  inclusive) exist
2c500 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e   and.**      con
2c510 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e  tain zero terms.
2c520 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61  .**   2) All lea
2c530 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
2c540 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64  een iNoRowid and
2c550 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76   iLast (inclusiv
2c560 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20  e) exist and.** 
2c570 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72       contain zer
2c580 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61  o rowids..*/.sta
2c590 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
2c5a0 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
2c5b0 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64  Empty(.  Fts5Ind
2c5c0 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72  ex *p,.  Fts5Str
2c5d0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2c5e0 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg,     /* Segm
2c5f0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
2c600 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
2c610 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73  y */.  int iFirs
2c620 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69  t,.  int iNoRowi
2c630 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29  d,.  int iLast.)
2c640 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
2c650 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20   Now check that 
2c660 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20  the iter.nEmpty 
2c670 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67  leaves following
2c680 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
2c690 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74  f.  ** (a) exist
2c6a0 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2c6b0 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20   no terms. */.  
2c6c0 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d  for(i=iFirst; p-
2c6d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2c6e0 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29  & i<=iLast; i++)
2c6f0 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  {.    Fts5Data *
2c700 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2c710 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
2c720 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2c730 3e 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20  >iSegid, i));.  
2c740 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
2c750 20 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65       if( !fts5Le
2c760 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
2c770 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
2c780 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2c790 20 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69    if( i>=iNoRowi
2c7a0 64 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66  d && 0!=fts5Leaf
2c7b0 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
2c7c0 65 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  eaf) ) p->rc = F
2c7d0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c7e0 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
2c7f0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2c800 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
2c810 64 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43  d fts5IntegrityC
2c820 68 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e  heckPgidx(Fts5In
2c830 64 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61  dex *p, Fts5Data
2c840 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20   *pLeaf){.  int 
2c850 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
2c860 69 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42  int ii;..  Fts5B
2c870 75 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c  uffer buf1 = {0,
2c880 30 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66  0,0};.  Fts5Buff
2c890 65 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30  er buf2 = {0,0,0
2c8a0 7d 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66  };..  ii = pLeaf
2c8b0 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c  ->szLeaf;.  whil
2c8c0 65 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20  e( ii<pLeaf->nn 
2c8d0 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
2c8e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
2c8f0 65 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66  es;.    int iOff
2c900 3b 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b  ;.    int nIncr;
2c910 0a 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35  ..    ii += fts5
2c920 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65  GetVarint32(&pLe
2c930 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72  af->p[ii], nIncr
2c940 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20  );.    iTermOff 
2c950 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f  += nIncr;.    iO
2c960 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a  ff = iTermOff;..
2c970 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c      if( iOff>=pL
2c980 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2c990 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2c9a0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
2c9b0 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66  else if( iTermOf
2c9c0 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20  f==nIncr ){.    
2c9d0 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20    int nByte;.   
2c9e0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2c9f0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2ca00 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  f->p[iOff], nByt
2ca10 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69  e);.      if( (i
2ca20 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66  Off+nByte)>pLeaf
2ca30 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2ca40 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2ca50 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2ca60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
2ca70 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
2ca80 3e 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74  >rc, &buf1, nByt
2ca90 65 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  e, &pLeaf->p[iOf
2caa0 66 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  f]);.      }.   
2cab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2cac0 74 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a  t nKeep, nByte;.
2cad0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
2cae0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
2caf0 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e  Leaf->p[iOff], n
2cb00 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66  Keep);.      iOf
2cb10 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2cb20 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
2cb30 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20  Off], nByte);.  
2cb40 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75      if( nKeep>bu
2cb50 66 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42  f1.n || (iOff+nB
2cb60 79 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  yte)>pLeaf->szLe
2cb70 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
2cb80 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2cb90 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
2cba0 0a 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20  .        buf1.n 
2cbb0 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20  = nKeep;.       
2cbc0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
2cbd0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
2cbe0 75 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65  uf1, nByte, &pLe
2cbf0 61 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20  af->p[iOff]);.  
2cc00 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
2cc10 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
2cc20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  K ){.        res
2cc30 20 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d   = fts5BufferCom
2cc40 70 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66  pare(&buf1, &buf
2cc50 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
2cc60 72 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d  res<=0 ) p->rc =
2cc70 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2cc80 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2cc90 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2cca0 70 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75  p->rc, &buf2, bu
2ccb0 66 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20  f1.n, buf1.p);. 
2ccc0 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
2ccd0 46 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66  Free(&buf1);.  f
2cce0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
2ccf0 75 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  uf2);.}..static 
2cd00 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e  void fts5IndexIn
2cd10 74 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d  tegrityCheckSegm
2cd20 65 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ent(.  Fts5Index
2cd30 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
2cd40 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
2cd50 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
2cd60 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
2cd70 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20  Segment *pSeg   
2cd80 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f     /* Segment to
2cd90 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20   check internal 
2cda0 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29  consistency */.)
2cdb0 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  {.  Fts5Config *
2cdc0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
2cdd0 6e 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nfig;.  sqlite3_
2cde0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2cdf0 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e  .  int rc2;.  in
2ce00 74 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d  t iIdxPrevLeaf =
2ce10 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
2ce20 2d 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78  -1;.  int iDlidx
2ce30 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d  PrevLeaf = pSeg-
2ce40 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66  >pgnoLast;..  if
2ce50 28 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ( pSeg->pgnoFirs
2ce60 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a  t==0 ) return;..
2ce70 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
2ce80 72 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74  reStmt(p, &pStmt
2ce90 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
2cea0 66 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54  f(.      "SELECT
2ceb0 20 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70   segid, term, (p
2cec0 67 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31  gno>>1), (pgno&1
2ced0 29 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64  ) FROM %Q.'%q_id
2cee0 78 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25  x' WHERE segid=%
2cef0 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69  d",.      pConfi
2cf00 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
2cf10 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53  >zName, pSeg->iS
2cf20 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a  egid.  ));..  /*
2cf30 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   Iterate through
2cf40 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72   the b-tree hier
2cf50 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69  archy.  */.  whi
2cf60 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
2cf70 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52  E_OK && SQLITE_R
2cf80 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2cf90 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69  (pStmt) ){.    i
2cfa0 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20  64 iRow;        
2cfb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cfc0 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c  Rowid for this l
2cfd0 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
2cfe0 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20  ata *pLeaf;     
2cff0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2d000 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a   for this leaf *
2d010 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54  /..    int nIdxT
2d020 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  erm = sqlite3_co
2d030 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
2d040 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 1);.    const 
2d050 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d  char *zIdxTerm =
2d060 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2d070 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2d080 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
2d090 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20   int iIdxLeaf = 
2d0a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2d0b0 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20  nt(pStmt, 2);.  
2d0c0 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20    int bIdxDlidx 
2d0d0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2d0e0 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a  _int(pStmt, 3);.
2d0f0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c  .    /* If the l
2d100 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  eaf in question 
2d110 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2d120 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68   trimmed from th
2d130 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20  e segment, .    
2d140 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62  ** ignore this b
2d150 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68  -tree entry. Oth
2d160 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20  erwise, load it 
2d170 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a  into memory. */.
2d180 20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66      if( iIdxLeaf
2d190 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  <pSeg->pgnoFirst
2d1a0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
2d1b0 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47   iRow = FTS5_SEG
2d1c0 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
2d1d0 3e 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61  >iSegid, iIdxLea
2d1e0 66 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20  f);.    pLeaf = 
2d1f0 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
2d200 69 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70  iRow);.    if( p
2d210 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
2d220 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
2d230 68 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e  hat the leaf con
2d240 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f  tains at least o
2d250 6e 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61  ne term, and tha
2d260 74 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20  t it is equal.  
2d270 20 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65    ** to or large
2d280 72 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74  r than the split
2d290 2d 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d  -key in zIdxTerm
2d2a0 2e 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68  .  Also check th
2d2b0 61 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20  at if there.    
2d2c0 2a 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77  ** is also a row
2d2d0 69 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69  id pointer withi
2d2e0 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
2d2f0 68 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74  header, it point
2d300 73 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f  s to a.    ** lo
2d310 63 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68  cation before th
2d320 65 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20  e term.  */.    
2d330 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70  if( pLeaf->nn<=p
2d340 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2d350 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
2d360 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2d370 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
2d380 20 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   iOff;          
2d390 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2d3a0 65 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d  et of first term
2d3b0 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20   on leaf */.    
2d3c0 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b    int iRowidOff;
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d3e0 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
2d3f0 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a   rowid on leaf *
2d400 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72  /.      int nTer
2d410 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2d420 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
2d430 65 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62  erm on leaf in b
2d440 79 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ytes */.      in
2d450 74 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20  t res;          
2d460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
2d470 70 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20  parison of term 
2d480 61 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f  and split-key */
2d490 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66  ..      iOff = f
2d4a0 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
2d4b0 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2d4c0 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74    iRowidOff = ft
2d4d0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2d4e0 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2d4f0 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
2d500 3d 69 4f 66 66 20 7c 7c 20 69 4f 66 66 3e 3d 70  =iOff || iOff>=p
2d510 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
2d520 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
2d530 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2d540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2d550 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2d560 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2d570 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72  f->p[iOff], nTer
2d580 6d 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  m);.        res 
2d590 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 26 70 4c  = fts5Memcmp(&pL
2d5a0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 7a 49  eaf->p[iOff], zI
2d5b0 64 78 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 65 72  dxTerm, MIN(nTer
2d5c0 6d 2c 20 6e 49 64 78 54 65 72 6d 29 29 3b 0a 20  m, nIdxTerm));. 
2d5d0 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d         if( res==
2d5e0 30 20 29 20 72 65 73 20 3d 20 6e 54 65 72 6d 20  0 ) res = nTerm 
2d5f0 2d 20 6e 49 64 78 54 65 72 6d 3b 0a 20 20 20 20  - nIdxTerm;.    
2d600 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 20      if( res<0 ) 
2d610 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2d620 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  RUPT;.      }.. 
2d630 20 20 20 20 20 66 74 73 35 49 6e 74 65 67 72 69       fts5Integri
2d640 74 79 43 68 65 63 6b 50 67 69 64 78 28 70 2c 20  tyCheckPgidx(p, 
2d650 70 4c 65 61 66 29 3b 0a 20 20 20 20 7d 0a 20 20  pLeaf);.    }.  
2d660 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2d670 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66  e(pLeaf);.    if
2d680 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
2d690 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65  ..    /* Now che
2d6a0 63 6b 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ck that the iter
2d6b0 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66  .nEmpty leaves f
2d6c0 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72  ollowing the cur
2d6d0 72 65 6e 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a  rent leaf.    **
2d6e0 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20 28   (a) exist and (
2d6f0 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  b) contain no te
2d700 72 6d 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  rms. */.    fts5
2d710 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68  IndexIntegrityCh
2d720 65 63 6b 45 6d 70 74 79 28 0a 20 20 20 20 20 20  eckEmpty(.      
2d730 20 20 70 2c 20 70 53 65 67 2c 20 69 49 64 78 50    p, pSeg, iIdxP
2d740 72 65 76 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64  revLeaf+1, iDlid
2d750 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69 49 64  xPrevLeaf+1, iId
2d760 78 4c 65 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20  xLeaf-1.    );. 
2d770 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
2d780 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  reak;..    /* If
2d790 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
2d7a0 69 73 74 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b  ist-index, check
2d7b0 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72   that it looks r
2d7c0 69 67 68 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ight. */.    if(
2d7d0 20 62 49 64 78 44 6c 69 64 78 20 29 7b 0a 20 20   bIdxDlidx ){.  
2d7e0 20 20 20 20 46 74 73 35 44 6c 69 64 78 49 74 65      Fts5DlidxIte
2d7f0 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 20 20  r *pDlidx = 0;  
2d800 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
2d810 20 74 68 72 6f 75 67 68 20 64 6f 63 6c 69 73 74   through doclist
2d820 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
2d830 69 6e 74 20 69 50 72 65 76 4c 65 61 66 20 3d 20  int iPrevLeaf = 
2d840 69 49 64 78 4c 65 61 66 3b 0a 20 20 20 20 20 20  iIdxLeaf;.      
2d850 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 53 65  int iSegid = pSe
2d860 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
2d870 20 69 6e 74 20 69 50 67 20 3d 20 30 3b 0a 20 20   int iPg = 0;.  
2d880 20 20 20 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20      i64 iKey;.. 
2d890 20 20 20 20 20 66 6f 72 28 70 44 6c 69 64 78 3d       for(pDlidx=
2d8a0 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
2d8b0 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20  t(p, 0, iSegid, 
2d8c0 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 20  iIdxLeaf);.     
2d8d0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2d8e0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
2d8f0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ==0;.          f
2d900 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
2d910 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 20 20  (p, pDlidx).    
2d920 20 20 29 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a    ){..        /*
2d930 20 43 68 65 63 6b 20 61 6e 79 20 72 6f 77 69 64   Check any rowid
2d940 2d 6c 65 73 73 20 70 61 67 65 73 20 74 68 61 74  -less pages that
2d950 20 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68   occur before th
2d960 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
2d970 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
2d980 50 67 3d 69 50 72 65 76 4c 65 61 66 2b 31 3b 20  Pg=iPrevLeaf+1; 
2d990 69 50 67 3c 66 74 73 35 44 6c 69 64 78 49 74 65  iPg<fts5DlidxIte
2d9a0 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69  rPgno(pDlidx); i
2d9b0 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
2d9c0 20 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47   iKey = FTS5_SEG
2d9d0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69  MENT_ROWID(iSegi
2d9e0 64 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  d, iPg);.       
2d9f0 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
2da00 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
2da10 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2da20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
2da30 20 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61       if( fts5Lea
2da40 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
2da50 4c 65 61 66 29 21 3d 30 20 29 20 70 2d 3e 72 63  Leaf)!=0 ) p->rc
2da60 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2da70 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
2da80 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2da90 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  af);.          }
2daa0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dab0 20 20 20 69 50 72 65 76 4c 65 61 66 20 3d 20 66     iPrevLeaf = f
2dac0 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
2dad0 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 20  (pDlidx);..     
2dae0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
2daf0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
2db00 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
2db10 69 74 65 72 61 74 6f 72 20 72 65 61 6c 6c 79 20  iterator really 
2db20 64 6f 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  does.        ** 
2db30 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 6f 77 69  contain the rowi
2db40 64 20 73 75 67 67 65 73 74 65 64 20 62 79 20 74  d suggested by t
2db50 68 65 20 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  he same. */.    
2db60 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35 5f      iKey = FTS5_
2db70 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
2db80 65 67 69 64 2c 20 69 50 72 65 76 4c 65 61 66 29  egid, iPrevLeaf)
2db90 3b 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 20  ;.        pLeaf 
2dba0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
2dbb0 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20  , iKey);.       
2dbc0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
2dbd0 20 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77          i64 iRow
2dbe0 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  id;.          in
2dbf0 74 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74  t iRowidOff = ft
2dc00 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2dc10 4f 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  Off(pLeaf);.    
2dc20 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
2dc30 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
2dc40 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
2dc50 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73  widOff>=pLeaf->s
2dc60 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
2dc70 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
2dc80 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2dc90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2dca0 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2dcb0 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
2dcc0 69 52 6f 77 69 64 4f 66 66 5d 2c 20 28 75 36 34  iRowidOff], (u64
2dcd0 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  *)&iRowid);.    
2dce0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
2dcf0 69 64 21 3d 66 74 73 35 44 6c 69 64 78 49 74 65  id!=fts5DlidxIte
2dd00 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
2dd10 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2dd20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2dd30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73   }.          fts
2dd40 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2dd50 61 66 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  af);.        }. 
2dd60 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 44       }..      iD
2dd70 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69  lidxPrevLeaf = i
2dd80 50 67 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  Pg;.      fts5Dl
2dd90 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
2dda0 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 54  dx);.      fts5T
2ddb0 65 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28  estDlidxReverse(
2ddc0 70 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c  p, iSegid, iIdxL
2ddd0 65 61 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  eaf);.    }else{
2dde0 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65  .      iDlidxPre
2ddf0 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67  vLeaf = pSeg->pg
2de00 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a  noLast;.      /*
2de10 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65   TODO: Check the
2de20 72 65 20 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74  re is no doclist
2de30 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a   index */.    }.
2de40 0a 20 20 20 20 69 49 64 78 50 72 65 76 4c 65 61  .    iIdxPrevLea
2de50 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
2de60 7d 0a 0a 20 20 72 63 32 20 3d 20 73 71 6c 69 74  }..  rc2 = sqlit
2de70 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2de80 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t);.  if( p->rc=
2de90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
2dea0 72 63 20 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20  rc = rc2;..  /* 
2deb0 50 61 67 65 20 69 74 65 72 2e 69 4c 65 61 66 20  Page iter.iLeaf 
2dec0 6d 75 73 74 20 6e 6f 77 20 62 65 20 74 68 65 20  must now be the 
2ded0 72 69 67 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70  rightmost leaf-p
2dee0 61 67 65 20 69 6e 20 74 68 65 20 73 65 67 6d 65  age in the segme
2def0 6e 74 20 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66  nt */.#if 0.  if
2df00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
2df10 4f 4b 20 26 26 20 69 74 65 72 2e 69 4c 65 61 66  OK && iter.iLeaf
2df20 21 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  !=pSeg->pgnoLast
2df30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
2df40 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2df50 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  }.#endif.}.../*.
2df60 2a 2a 20 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20  ** Run internal 
2df70 63 68 65 63 6b 73 20 74 6f 20 65 6e 73 75 72 65  checks to ensure
2df80 20 74 68 61 74 20 74 68 65 20 46 54 53 20 69 6e   that the FTS in
2df90 64 65 78 20 28 61 29 20 69 73 20 69 6e 74 65 72  dex (a) is inter
2dfa0 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73  nally .** consis
2dfb0 74 65 6e 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  tent and (b) con
2dfc0 74 61 69 6e 73 20 65 6e 74 72 69 65 73 20 66 6f  tains entries fo
2dfd0 72 20 77 68 69 63 68 20 74 68 65 20 58 4f 52 20  r which the XOR 
2dfe0 6f 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  of the checksums
2dff0 0a 2a 2a 20 61 73 20 63 61 6c 63 75 6c 61 74 65  .** as calculate
2e000 64 20 62 79 20 73 71 6c 69 74 65 33 46 74 73 35  d by sqlite3Fts5
2e010 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2e020 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a  ) is cksum..**.*
2e030 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
2e040 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f  CORRUPT if any o
2e050 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  f the internal c
2e060 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69  hecks fail, or i
2e070 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  f the.** checksu
2e080 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  m does not match
2e090 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
2e0a0 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73  OK if all checks
2e0b0 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a   pass without.**
2e0c0 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20   error, or some 
2e0d0 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65 72 72  other SQLite err
2e0e0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68  or code if anoth
2e0f0 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f  er error (e.g. O
2e100 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a  OM).** occurs..*
2e110 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2e120 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
2e130 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a  heck(Fts5Index *
2e140 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20  p, u64 cksum){. 
2e150 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70   int eDetail = p
2e160 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61  ->pConfig->eDeta
2e170 69 6c 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32  il;.  u64 cksum2
2e180 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2e190 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
2e1a0 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
2e1b0 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
2e1c0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  /.  Fts5Buffer p
2e1d0 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d  oslist = {0,0,0}
2e1e0 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73  ;   /* Buffer us
2e1f0 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73  ed to hold a pos
2e200 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 74  list */.  Fts5It
2e210 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20  er *pIter;      
2e220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2e230 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2e240 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65  ough entire inde
2e250 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
2e260 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20  ture *pStruct;  
2e270 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
2e280 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69  structure */..#i
2e290 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
2e2a0 47 0a 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65  G.  /* Used by e
2e2b0 78 74 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65  xtra internal te
2e2c0 73 74 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20  sts only run if 
2e2d0 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
2e2e0 66 69 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63  fined */.  u64 c
2e2f0 6b 73 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20  ksum3 = 0;      
2e300 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2e310 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
2e320 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65  contents of inde
2e330 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  xes */.  Fts5Buf
2e340 66 65 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c  fer term = {0,0,
2e350 30 7d 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66  0};      /* Buff
2e360 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  er used to hold 
2e370 6d 6f 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d  most recent term
2e380 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 6f 6e   */.#endif.  con
2e390 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
2e3a0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
2e3b0 4f 4f 55 54 50 55 54 3b 0a 20 20 0a 20 20 2f 2a  OOUTPUT;.  .  /*
2e3c0 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e   Load the FTS in
2e3d0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
2e3e0 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
2e3f0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
2e400 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
2e410 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
2e420 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
2e430 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
2e440 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28   leaves */.  if(
2e450 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
2e460 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
2e470 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
2e480 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
2e490 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
2e4a0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
2e4b0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
2e4c0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
2e4d0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2e4e0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
2e4f0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
2e500 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
2e510 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
2e520 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49  ];.        fts5I
2e530 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2e540 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  ckSegment(p, pSe
2e550 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2e560 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
2e570 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
2e580 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2e590 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
2e5a0 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
2e5b0 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
2e5c0 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
2e5d0 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
2e5e0 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
2e5f0 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
2e600 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
2e610 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
2e620 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
2e630 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
2e640 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
2e650 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
2e660 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
2e670 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
2e680 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
2e690 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
2e6a0 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
2e6b0 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
2e6c0 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
2e6d0 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
2e6e0 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
2e6f0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
2e700 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
2e710 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
2e720 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
2e730 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
2e740 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
2e750 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
2e760 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
2e770 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
2e780 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
2e790 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
2e7a0 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
2e7b0 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
2e7c0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
2e7d0 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
2e7e0 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
2e7f0 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
2e800 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  s..  */.  for(ft
2e810 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
2e820 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
2e830 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30  , 0, 0, 0, -1, 0
2e840 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
2e850 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
2e860 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
2e870 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
2e880 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
2e890 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
2e8a0 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e8c0 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
2e8d0 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34  bytes */.    i64
2e8e0 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20   iPos = 0;      
2e8f0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
2e900 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70  tion read from p
2e910 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e  oslist */.    in
2e920 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20  t iOff = 0;     
2e930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
2e940 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69  set within posli
2e950 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52  st */.    i64 iR
2e960 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
2e970 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
2e980 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  ;.    char *z = 
2e990 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69  (char*)fts5Multi
2e9a0 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
2e9b0 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  &n);..    /* If 
2e9c0 74 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  this is a new te
2e9d0 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74  rm, query for it
2e9e0 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20  . Update cksum3 
2e9f0 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73  with the results
2ea00 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73  . */.    fts5Tes
2ea10 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20  tTerm(p, &term, 
2ea20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63  z, n, cksum2, &c
2ea30 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20 69 66 28  ksum3);..    if(
2ea40 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44   eDetail==FTS5_D
2ea50 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20  ETAIL_NONE ){.  
2ea60 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35 4d      if( 0==fts5M
2ea70 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
2ea80 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20  p, pIter) ){.   
2ea90 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73       cksum2 ^= s
2eaa0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
2eab0 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64  ntryCksum(iRowid
2eac0 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 7a 2c 20 6e  , 0, 0, -1, z, n
2ead0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2eae0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 6f 73 6c  else{.      posl
2eaf0 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ist.n = 0;.     
2eb00 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
2eb10 69 73 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61  ist(p, &pIter->a
2eb20 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
2eb30 74 5b 31 5d 2e 69 46 69 72 73 74 5d 2c 20 30 2c  t[1].iFirst], 0,
2eb40 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   &poslist);.    
2eb50 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69    while( 0==sqli
2eb60 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
2eb70 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20  xt64(poslist.p, 
2eb80 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66  poslist.n, &iOff
2eb90 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  , &iPos) ){.    
2eba0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
2ebb0 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69  TS5_POS2COLUMN(i
2ebc0 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  Pos);.        in
2ebd0 74 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35  t iTokOff = FTS5
2ebe0 5f 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73  _POS2OFFSET(iPos
2ebf0 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  );.        cksum
2ec00 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35  2 ^= sqlite3Fts5
2ec10 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2ec20 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54  iRowid, iCol, iT
2ec30 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29  okOff, -1, z, n)
2ec40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2ec50 20 20 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65    }.  fts5TestTe
2ec60 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20  rm(p, &term, 0, 
2ec70 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75  0, cksum2, &cksu
2ec80 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  m3);..  fts5Mult
2ec90 69 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29  iIterFree(pIter)
2eca0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
2ecb0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
2ecc0 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72  m!=cksum2 ) p->r
2ecd0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2ece0 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  ;..  fts5Structu
2ecf0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
2ed00 74 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t);.#ifdef SQLIT
2ed10 45 5f 44 45 42 55 47 0a 20 20 66 74 73 35 42 75  E_DEBUG.  fts5Bu
2ed20 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b  fferFree(&term);
2ed30 0a 23 65 6e 64 69 66 0a 20 20 66 74 73 35 42 75  .#endif.  fts5Bu
2ed40 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69 73  fferFree(&poslis
2ed50 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
2ed60 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
2ed70 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
2ed80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eda0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2edb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2edc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2edd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ede0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2edf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ee00 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
2ee10 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
2ee20 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
2ee30 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f  ion of the fts5_
2ee40 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a  decode() scalar.
2ee50 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ** function only
2ee60 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  ..*/../*.** Deco
2ee70 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74  de a segment-dat
2ee80 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65  a rowid from the
2ee90 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
2eea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
2eeb0 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20  ** the opposite 
2eec0 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45  of macro FTS5_SE
2eed0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a  GMENT_ROWID()..*
2eee0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2eef0 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20  s5DecodeRowid(. 
2ef00 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
2ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25   /* Rowid from %
2ef30 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
2ef40 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20   int *piSegid,  
2ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef60 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74   /* OUT: Segment
2ef70 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62   id */.  int *pb
2ef80 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  Dlidx,          
2ef90 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
2efa0 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20   Dlidx flag */. 
2efb0 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20   int *piHeight, 
2efc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2efd0 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20   /* OUT: Height 
2efe0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f  */.  int *piPgno
2eff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f000 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67       /* OUT: Pag
2f010 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
2f020 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29   *piPgno = (int)
2f030 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2f040 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2f050 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20  PAGE_B) - 1));. 
2f060 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2f070 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20  _DATA_PAGE_B;.. 
2f080 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e   *piHeight = (in
2f090 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
2f0a0 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
2f0b0 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29  A_HEIGHT_B) - 1)
2f0c0 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
2f0d0 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2f0e0 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20  _B;..  *pbDlidx 
2f0f0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2f100 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77   0x0001);.  iRow
2f110 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
2f120 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65  _DLI_B;..  *piSe
2f130 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gid = (int)(iRow
2f140 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
2f150 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
2f160 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69   - 1));.}..stati
2f170 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
2f180 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20  Rowid(int *pRc, 
2f190 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2f1a0 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69  , i64 iKey){.  i
2f1b0 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  nt iSegid, iHeig
2f1c0 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64  ht, iPgno, bDlid
2f1d0 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  x;       /* Rowi
2f1e0 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a  d compenents */.
2f1f0 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
2f200 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c  d(iKey, &iSegid,
2f210 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
2f220 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
2f230 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
2f240 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46  .    if( iKey==F
2f250 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2f260 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ID ){.      sqli
2f270 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f280 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f290 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d  Buf, "{averages}
2f2a0 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
2f2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2f2c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f2d0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2f2e0 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20  {structure}");. 
2f2f0 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b     }.  }.  else{
2f300 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2f310 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2f320 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
2f330 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20  %ssegid=%d h=%d 
2f340 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20  pgno=%d}",.     
2f350 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69     bDlidx ? "dli
2f360 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69  dx " : "", iSegi
2f370 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
2f380 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
2f390 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2f3a0 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a  DebugStructure(.
2f3b0 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2f3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3d0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2f3e0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2f3f0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2f400 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
2f410 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  p.){.  int iLvl,
2f420 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
2f430 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2f440 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
2f450 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  , segments */.. 
2f460 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
2f470 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  l<p->nLevel; iLv
2f480 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  l++){.    Fts5St
2f490 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
2f4a0 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  vl = &p->aLevel[
2f4b0 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74  iLvl];.    sqlit
2f4c0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f4d0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f4e0 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b  uf, .        " {
2f4f0 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64  lvl=%d nMerge=%d
2f500 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c   nSeg=%d", iLvl,
2f510 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70   pLvl->nMerge, p
2f520 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b  Lvl->nSeg.    );
2f530 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
2f540 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
2f550 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
2f560 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
2f570 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
2f580 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
2f590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
2f5a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2f5b0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2f5c0 22 20 7b 69 64 3d 25 64 20 6c 65 61 76 65 73 3d  " {id=%d leaves=
2f5d0 25 64 2e 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20  %d..%d}", .     
2f5e0 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
2f5f0 64 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  d, pSeg->pgnoFir
2f600 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  st, pSeg->pgnoLa
2f610 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  st.      );.    
2f620 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  }.    sqlite3Fts
2f630 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2f640 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2f650 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  }");.  }.}../*.*
2f660 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f  * This is part o
2f670 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64  f the fts5_decod
2f680 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69  e() debugging ai
2f690 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  d..**.** Argumen
2f6a0 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63  ts pBlob/nBlob c
2f6b0 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69  ontain a seriali
2f6c0 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72  zed Fts5Structur
2f6d0 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a  e object. This.*
2f6e0 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
2f6f0 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61  ds a human-reada
2f700 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69  ble representati
2f710 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f  on of the same o
2f720 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20  bject.** to the 
2f730 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73  buffer passed as
2f740 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2f750 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ment. .*/.static
2f760 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2f770 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74  Structure(.  int
2f780 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20   *pRc,          
2f790 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f7a0 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f  IN/OUT: error co
2f7b0 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  de */.  Fts5Buff
2f7c0 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73  er *pBuf,.  cons
2f7d0 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74  t u8 *pBlob, int
2f7e0 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20   nBlob.){.  int 
2f7f0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2f800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2f810 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
2f820 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
2f830 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2f840 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63  /* Decoded struc
2f850 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a  ture object */..
2f860 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63    rc = fts5Struc
2f870 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62  tureDecode(pBlob
2f880 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b  , nBlob, 0, &p);
2f890 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2f8a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63  E_OK ){.    *pRc
2f8b0 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72   = rc;.    retur
2f8c0 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65  n;.  }..  fts5De
2f8d0 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63  bugStructure(pRc
2f8e0 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74  , pBuf, p);.  ft
2f8f0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
2f900 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  se(p);.}../*.** 
2f910 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20  This is part of 
2f920 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28  the fts5_decode(
2f930 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e  ) debugging aid.
2f940 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73  .**.** Arguments
2f950 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e   pBlob/nBlob con
2f960 74 61 69 6e 20 61 6e 20 22 61 76 65 72 61 67 65  tain an "average
2f970 73 22 20 72 65 63 6f 72 64 2e 20 54 68 69 73 20  s" record. This 
2f980 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70  function .** app
2f990 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
2f9a0 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61  dable representa
2f9b0 74 69 6f 6e 20 6f 66 20 72 65 63 6f 72 64 20 74  tion of record t
2f9c0 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73  o the buffer pas
2f9d0 73 65 64 20 0a 2a 2a 20 61 73 20 74 68 65 20 73  sed .** as the s
2f9e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20  econd argument. 
2f9f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2fa00 66 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67  fts5DecodeAverag
2fa10 65 73 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  es(.  int *pRc, 
2fa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa30 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2fa40 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
2fa50 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2fa60 66 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  f,.  const u8 *p
2fa70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a  Blob, int nBlob.
2fa80 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  ){.  int i = 0;.
2fa90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
2faa0 70 61 63 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68  pace = "";..  wh
2fab0 69 6c 65 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a  ile( i<nBlob ){.
2fac0 20 20 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20      u64 iVal;.  
2fad0 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74    i += sqlite3Ft
2fae0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 6c  s5GetVarint(&pBl
2faf0 6f 62 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20  ob[i], &iVal);. 
2fb00 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2fb10 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2fb20 28 70 52 63 2c 20 70 42 75 66 2c 20 22 25 73 25  (pRc, pBuf, "%s%
2fb30 64 22 2c 20 7a 53 70 61 63 65 2c 20 28 69 6e 74  d", zSpace, (int
2fb40 29 69 56 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61  )iVal);.    zSpa
2fb50 63 65 20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a  ce = " ";.  }.}.
2fb60 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 61  ./*.** Buffer (a
2fb70 2f 6e 29 20 69 73 20 61 73 73 75 6d 65 64 20 74  /n) is assumed t
2fb80 6f 20 63 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74  o contain a list
2fb90 20 6f 66 20 73 65 72 69 61 6c 69 7a 65 64 20 76   of serialized v
2fba0 61 72 69 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20  arints. Read.** 
2fbb0 65 61 63 68 20 76 61 72 69 6e 74 20 61 6e 64 20  each varint and 
2fbc0 61 70 70 65 6e 64 20 69 74 73 20 73 74 72 69 6e  append its strin
2fbd0 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
2fbe0 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e   to buffer pBuf.
2fbf0 20 52 65 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72   Return.** after
2fc00 20 65 69 74 68 65 72 20 74 68 65 20 69 6e 70 75   either the inpu
2fc10 74 20 62 75 66 66 65 72 20 69 73 20 65 78 68 61  t buffer is exha
2fc20 75 73 74 65 64 20 6f 72 20 61 20 30 20 76 61 6c  usted or a 0 val
2fc30 75 65 20 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  ue is read..**.*
2fc40 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
2fc50 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ue is the number
2fc60 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20 66   of bytes read f
2fc70 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75  rom the input bu
2fc80 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
2fc90 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 50 6f  int fts5DecodePo
2fca0 73 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20  slist(int *pRc, 
2fcb0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2fcc0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69  , const u8 *a, i
2fcd0 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66  nt n){.  int iOf
2fce0 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  f = 0;.  while( 
2fcf0 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
2fd00 74 20 69 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66  t iVal;.    iOff
2fd10 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2fd20 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56  t32(&a[iOff], iV
2fd30 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
2fd40 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2fd50 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2fd60 2c 20 22 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a  , " %d", iVal);.
2fd70 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 4f 66    }.  return iOf
2fd80 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  f;.}../*.** The 
2fd90 73 74 61 72 74 20 6f 66 20 62 75 66 66 65 72 20  start of buffer 
2fda0 28 61 2f 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74  (a/n) contains t
2fdb0 68 65 20 73 74 61 72 74 20 6f 66 20 61 20 64 6f  he start of a do
2fdc0 63 6c 69 73 74 2e 20 54 68 65 20 64 6f 63 6c 69  clist. The docli
2fdd0 73 74 0a 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79  st.** may or may
2fde0 20 6e 6f 74 20 66 69 6e 69 73 68 20 77 69 74 68   not finish with
2fdf0 69 6e 20 74 68 65 20 62 75 66 66 65 72 2e 20 54  in the buffer. T
2fe00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
2fe10 65 6e 64 73 20 61 20 74 65 78 74 0a 2a 2a 20 72  ends a text.** r
2fe20 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2fe30 20 74 68 65 20 70 61 72 74 20 6f 66 20 74 68 65   the part of the
2fe40 20 64 6f 63 6c 69 73 74 20 74 68 61 74 20 69 73   doclist that is
2fe50 20 70 72 65 73 65 6e 74 20 74 6f 20 62 75 66 66   present to buff
2fe60 65 72 0a 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a  er.** pBuf. .**.
2fe70 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
2fe80 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
2fe90 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 20  r of bytes read 
2fea0 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 62  from the input b
2feb0 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  uffer..*/.static
2fec0 20 69 6e 74 20 66 74 73 35 44 65 63 6f 64 65 44   int fts5DecodeD
2fed0 6f 63 6c 69 73 74 28 69 6e 74 20 2a 70 52 63 2c  oclist(int *pRc,
2fee0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2fef0 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20  f, const u8 *a, 
2ff00 69 6e 74 20 6e 29 7b 0a 20 20 69 36 34 20 69 44  int n){.  i64 iD
2ff10 6f 63 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ocid = 0;.  int 
2ff20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  iOff = 0;..  if(
2ff30 20 6e 3e 30 20 29 7b 0a 20 20 20 20 69 4f 66 66   n>0 ){.    iOff
2ff40 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   = sqlite3Fts5Ge
2ff50 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
2ff60 29 26 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 73  )&iDocid);.    s
2ff70 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2ff80 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2ff90 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c  , pBuf, " id=%ll
2ffa0 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d  d", iDocid);.  }
2ffb0 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
2ffc0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   ){.    int nPos
2ffd0 3b 0a 20 20 20 20 69 6e 74 20 62 44 65 6c 3b 0a  ;.    int bDel;.
2ffe0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2fff0 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
30000 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20  a[iOff], &nPos, 
30010 26 62 44 65 6c 29 3b 0a 20 20 20 20 73 71 6c 69  &bDel);.    sqli
30020 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
30030 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
30040 42 75 66 2c 20 22 20 6e 50 6f 73 3d 25 64 25 73  Buf, " nPos=%d%s
30050 22 2c 20 6e 50 6f 73 2c 20 62 44 65 6c 3f 22 2a  ", nPos, bDel?"*
30060 22 3a 22 22 29 3b 0a 20 20 20 20 69 4f 66 66 20  ":"");.    iOff 
30070 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  += fts5DecodePos
30080 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20  list(pRc, pBuf, 
30090 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d  &a[iOff], MIN(n-
300a0 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20  iOff, nPos));.  
300b0 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
300c0 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
300d0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
300e0 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
300f0 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
30100 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
30110 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d 20 69       iDocid += i
30120 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73 71 6c  Delta;.      sql
30130 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
30140 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
30150 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22  pBuf, " id=%lld"
30160 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d  , iDocid);.    }
30170 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69  .  }..  return i
30180 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Off;.}../*.** Th
30190 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70  is function is p
301a0 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
301b0 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
301c0 6e 67 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 20  ng function. It 
301d0 69 73 20 0a 2a 2a 20 6f 6e 6c 79 20 65 76 65 72  is .** only ever
301e0 20 75 73 65 64 20 77 69 74 68 20 64 65 74 61 69   used with detai
301f0 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65 73 2e 0a 2a  l=none tables..*
30200 2a 0a 2a 2a 20 42 75 66 66 65 72 20 28 70 44 61  *.** Buffer (pDa
30210 74 61 2f 6e 44 61 74 61 29 20 63 6f 6e 74 61 69  ta/nData) contai
30220 6e 73 20 61 20 64 6f 63 6c 69 73 74 20 69 6e 20  ns a doclist in 
30230 74 68 65 20 66 6f 72 6d 61 74 20 75 73 65 64 20  the format used 
30240 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 0a 2a  by detail=none.*
30250 2a 20 74 61 62 6c 65 73 2e 20 54 68 69 73 20 66  * tables. This f
30260 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
30270 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
30280 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 61 74   version of that
30290 20 6c 69 73 74 20 74 6f 0a 2a 2a 20 62 75 66 66   list to.** buff
302a0 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49  er pBuf..**.** I
302b0 66 20 2a 70 52 63 20 69 73 20 6f 74 68 65 72 20  f *pRc is other 
302c0 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 77  than SQLITE_OK w
302d0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
302e0 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  n is called, it 
302f0 69 73 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 49  is a.** no-op. I
30300 66 20 61 6e 20 4f 4f 4d 20 6f 72 20 6f 74 68 65  f an OOM or othe
30310 72 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  r error occurs w
30320 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74  ithin this funct
30330 69 6f 6e 2c 20 2a 70 52 63 20 69 73 0a 2a 2a 20  ion, *pRc is.** 
30340 73 65 74 20 74 6f 20 61 6e 20 53 51 4c 69 74 65  set to an SQLite
30350 20 65 72 72 6f 72 20 63 6f 64 65 20 62 65 66 6f   error code befo
30360 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 54 68  re returning. Th
30370 65 20 66 69 6e 61 6c 20 73 74 61 74 65 20 6f 66  e final state of
30380 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 20   buffer.** pBuf 
30390 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
303a0 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
303b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
303c0 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 0a 20  codeRowidList(. 
303d0 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
303e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303f0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72 6f   /* IN/OUT: Erro
30400 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
30410 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
30420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
30430 75 66 66 65 72 20 74 6f 20 61 70 70 65 6e 64 20  uffer to append 
30440 74 65 78 74 20 74 6f 20 2a 2f 0a 20 20 63 6f 6e  text to */.  con
30450 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e  st u8 *pData, in
30460 74 20 6e 44 61 74 61 20 20 20 20 20 20 2f 2a 20  t nData      /* 
30470 44 61 74 61 20 74 6f 20 64 65 63 6f 64 65 20 6c  Data to decode l
30480 69 73 74 2d 6f 66 2d 72 6f 77 69 64 73 20 66 72  ist-of-rowids fr
30490 6f 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  om */.){.  int i
304a0 20 3d 20 30 3b 0a 20 20 69 36 34 20 69 52 6f 77   = 0;.  i64 iRow
304b0 69 64 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  id = 0;..  while
304c0 28 20 69 3c 6e 44 61 74 61 20 29 7b 0a 20 20 20  ( i<nData ){.   
304d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 70   const char *zAp
304e0 70 20 3d 20 22 22 3b 0a 20 20 20 20 75 36 34 20  p = "";.    u64 
304f0 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73  iVal;.    i += s
30500 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
30510 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c 20 26  int(&pData[i], &
30520 69 56 61 6c 29 3b 0a 20 20 20 20 69 52 6f 77 69  iVal);.    iRowi
30530 64 20 2b 3d 20 69 56 61 6c 3b 0a 0a 20 20 20 20  d += iVal;..    
30540 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26 20 70  if( i<nData && p
30550 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20 29 7b  Data[i]==0x00 ){
30560 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20  .      i++;.    
30570 20 20 69 66 28 20 69 3c 6e 44 61 74 61 20 26 26    if( i<nData &&
30580 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78 30 30 20   pData[i]==0x00 
30590 29 7b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a  ){.        i++;.
305a0 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20 22          zApp = "
305b0 2b 22 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +";.      }else{
305c0 0a 20 20 20 20 20 20 20 20 7a 41 70 70 20 3d 20  .        zApp = 
305d0 22 2a 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "*";.      }.   
305e0 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
305f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
30600 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
30610 20 22 20 25 6c 6c 64 25 73 22 2c 20 69 52 6f 77   " %lld%s", iRow
30620 69 64 2c 20 7a 41 70 70 29 3b 0a 20 20 7d 0a 7d  id, zApp);.  }.}
30630 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
30640 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73  ementation of us
30650 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61  er-defined scala
30660 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f  r function fts5_
30670 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61  decode()..*/.sta
30680 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63  tic void fts5Dec
30690 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73  odeFunction(.  s
306a0 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
306b0 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f  pCtx,          /
306c0 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  * Function call 
306d0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
306e0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
306f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30700 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28  Number of args (
30710 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73  always 2) */.  s
30720 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
30730 70 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f  pVal           /
30740 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  * Function argum
30750 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  ents */.){.  i64
30760 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20   iRowid;        
30770 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30780 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f 72 64  Rowid for record
30790 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64 20 2a   being decoded *
307a0 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 69  /.  int iSegid,i
307b0 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62 44 6c  Height,iPgno,bDl
307c0 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63 6f 6d  idx;/* Rowid com
307d0 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e  ponents */.  con
307e0 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20 69 6e  st u8 *aBlob; in
307f0 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  t n;         /* 
30800 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f 64 65  Record to decode
30810 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20 30 3b   */.  u8 *a = 0;
30820 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 73 3b  .  Fts5Buffer s;
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30840 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70 20 74     /* Build up t
30850 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20 68 65  ext to return he
30860 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
30870 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
30880 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
30890 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
308a0 74 65 33 5f 69 6e 74 36 34 20 6e 53 70 61 63 65  te3_int64 nSpace
308b0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 65 44 65 74   = 0;.  int eDet
308c0 61 69 6c 4e 6f 6e 65 20 3d 20 28 73 71 6c 69 74  ailNone = (sqlit
308d0 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
308e0 78 29 21 3d 30 29 3b 0a 0a 20 20 61 73 73 65 72  x)!=0);..  asser
308f0 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20  t( nArg==2 );.  
30900 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 6e 41 72  UNUSED_PARAM(nAr
30910 67 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c  g);.  memset(&s,
30920 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
30930 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69  uffer));.  iRowi
30940 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
30950 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d  e_int64(apVal[0]
30960 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  );..  /* Make a 
30970 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
30980 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20 62  nd argument (a b
30990 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e  lob) in aBlob[].
309a0 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a   The aBlob[].  *
309b0 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77  * copy is follow
309c0 65 64 20 62 79 20 46 54 53 35 5f 44 41 54 41 5f  ed by FTS5_DATA_
309d0 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78 30  ZERO_PADDING 0x0
309e0 30 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 70  0 bytes, which p
309f0 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66  revents.  ** buf
30a00 66 65 72 20 6f 76 65 72 72 65 61 64 73 20 65 76  fer overreads ev
30a10 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  en if the record
30a20 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f   is corrupt.  */
30a30 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
30a40 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
30a50 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20  [1]);.  aBlob = 
30a60 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
30a70 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  ob(apVal[1]);.  
30a80 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53  nSpace = n + FTS
30a90 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
30aa0 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29  ING;.  a = (u8*)
30ab0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
30ac0 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63  cZero(&rc, nSpac
30ad0 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  e);.  if( a==0 )
30ae0 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
30af0 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 20 6d 65  ;.  if( n>0 ) me
30b00 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e  mcpy(a, aBlob, n
30b10 29 3b 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65  );..  fts5Decode
30b20 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
30b30 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
30b40 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
30b50 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52  );..  fts5DebugR
30b60 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52  owid(&rc, &s, iR
30b70 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c  owid);.  if( bDl
30b80 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
30b90 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46  ata dlidx;.    F
30ba0 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b  ts5DlidxLvl lvl;
30bb0 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20  ..    dlidx.p = 
30bc0 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20  a;.    dlidx.nn 
30bd0 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = n;..    memset
30be0 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (&lvl, 0, sizeof
30bf0 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
30c00 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d  .    lvl.pData =
30c10 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c   &dlidx;.    lvl
30c20 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  .iLeafPgno = iPg
30c30 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73  no;..    for(fts
30c40 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
30c50 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30  vl); lvl.bEof==0
30c60 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ; fts5DlidxLvlNe
30c70 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20  xt(&lvl)){.     
30c80 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
30c90 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
30ca0 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20  rc, &s, .       
30cb0 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20     " %d(%lld)", 
30cc0 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c  lvl.iLeafPgno, l
30cd0 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20  vl.iRowid.      
30ce0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
30cf0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
30d00 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  {.    if( iRowid
30d10 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
30d20 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66  ROWID ){.      f
30d30 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65  ts5DecodeAverage
30d40 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  s(&rc, &s, a, n)
30d50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30d60 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72     fts5DecodeStr
30d70 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20  ucture(&rc, &s, 
30d80 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  a, n);.    }.  }
30d90 65 6c 73 65 20 69 66 28 20 65 44 65 74 61 69 6c  else if( eDetail
30da0 4e 6f 6e 65 20 29 7b 0a 20 20 20 20 46 74 73 35  None ){.    Fts5
30db0 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
30dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
30dd0 72 65 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66  rent term read f
30de0 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  rom page */.    
30df0 69 6e 74 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  int szLeaf;.    
30e00 69 6e 74 20 69 50 67 69 64 78 4f 66 66 20 3d 20  int iPgidxOff = 
30e10 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74  szLeaf = fts5Get
30e20 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
30e30 69 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  int iTermOff;.  
30e40 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b    int nKeep = 0;
30e50 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  .    int iOff;..
30e60 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
30e70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
30e80 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f  Buffer));..    /
30e90 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 65 6e 74  * Decode any ent
30ea0 72 69 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ries that occur 
30eb0 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
30ec0 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 69 66   term. */.    if
30ed0 28 20 73 7a 4c 65 61 66 3c 6e 20 29 7b 0a 20 20  ( szLeaf<n ){.  
30ee0 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
30ef0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30f00 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
30f10 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 7d  iTermOff);.    }
30f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 54 65 72  else{.      iTer
30f30 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  mOff = szLeaf;. 
30f40 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63     }.    fts5Dec
30f50 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72 63  odeRowidList(&rc
30f60 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20 69 54 65  , &s, &a[4], iTe
30f70 72 6d 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 69  rmOff-4);..    i
30f80 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
30f90 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c      while( iOff<
30fa0 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
30fb0 69 6e 74 20 6e 41 70 70 65 6e 64 3b 0a 0a 20 20  int nAppend;..  
30fc0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
30fd0 74 65 72 6d 20 64 61 74 61 20 66 6f 72 20 74 68  term data for th
30fe0 65 20 6e 65 78 74 20 74 65 72 6d 2a 2f 0a 20 20  e next term*/.  
30ff0 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
31000 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
31010 4f 66 66 5d 2c 20 6e 41 70 70 65 6e 64 29 3b 0a  Off], nAppend);.
31020 20 20 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e        term.n = n
31030 4b 65 65 70 3b 0a 20 20 20 20 20 20 66 74 73 35  Keep;.      fts5
31040 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
31050 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e 41 70  (&rc, &term, nAp
31060 70 65 6e 64 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  pend, &a[iOff]);
31070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
31080 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
31090 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20  intf(.          
310a0 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d 3d  &rc, &s, " term=
310b0 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20 28  %.*s", term.n, (
310c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72 6d  const char*)term
310d0 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .p.      );.    
310e0 20 20 69 4f 66 66 20 2b 3d 20 6e 41 70 70 65 6e    iOff += nAppen
310f0 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67  d;..      /* Fig
31100 75 72 65 20 6f 75 74 20 77 68 65 72 65 20 74 68  ure out where th
31110 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  e doclist for th
31120 69 73 20 74 65 72 6d 20 65 6e 64 73 20 2a 2f 0a  is term ends */.
31130 20 20 20 20 20 20 69 66 28 20 69 50 67 69 64 78        if( iPgidx
31140 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20  Off<n ){.       
31150 20 69 6e 74 20 6e 49 6e 63 72 3b 0a 20 20 20 20   int nIncr;.    
31160 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d      iPgidxOff +=
31170 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
31180 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20  (&a[iPgidxOff], 
31190 6e 49 6e 63 72 29 3b 0a 20 20 20 20 20 20 20 20  nIncr);.        
311a0 69 54 65 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63  iTermOff += nInc
311b0 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
311c0 20 20 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66          iTermOff
311d0 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
311e0 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 44 65   }..      fts5De
311f0 63 6f 64 65 52 6f 77 69 64 4c 69 73 74 28 26 72  codeRowidList(&r
31200 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
31210 20 69 54 65 72 6d 4f 66 66 2d 69 4f 66 66 29 3b   iTermOff-iOff);
31220 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54  .      iOff = iT
31230 65 72 6d 4f 66 66 3b 0a 20 20 20 20 20 20 69 66  ermOff;.      if
31240 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b  ( iOff<szLeaf ){
31250 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
31260 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
31270 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
31280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
31290 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
312a0 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d  Free(&term);.  }
312b0 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75  else{.    Fts5Bu
312c0 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
312d0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
312e0 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f  nt term read fro
312f0 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  m page */.    in
31300 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
31310 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
31320 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20 69  ffset of pgidx i
31330 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  n a[] */.    int
31340 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20   iPgidxOff;.    
31350 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20 3d  int iPgidxPrev =
31360 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
31370 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
31380 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20  read from pgidx 
31390 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d  */.    int iTerm
313a0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
313b0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
313c0 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
313d0 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a    int nDoclist;.
313e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
313f0 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
31400 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
31410 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20  if( n<4 ){.     
31420 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
31430 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37  erSet(&rc, &s, 7
31440 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f  , (const u8*)"co
31450 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67  rrupt");.      g
31460 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
31470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31480 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
31490 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a  5GetU16(&a[0]);.
314a0 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
314b0 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
314c0 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
314d0 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
314e0 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
314f0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
31500 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54  a[iPgidxOff], iT
31510 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  ermOff);.      }
31520 65 6c 73 65 20 69 66 28 20 69 50 67 69 64 78 4f  else if( iPgidxO
31530 66 66 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>n ){.        
31540 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
31550 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  T;.        goto 
31560 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20 20  decode_out;.    
31570 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
31580 2a 20 44 65 63 6f 64 65 20 74 68 65 20 70 6f 73  * Decode the pos
31590 69 74 69 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20  ition list tail 
315a0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
315b0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  the page */.    
315c0 69 66 28 20 69 52 6f 77 69 64 4f 66 66 21 3d 30  if( iRowidOff!=0
315d0 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d   ){.      iOff =
315e0 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
315f0 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
31600 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ff!=0 ){.      i
31610 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a  Off = iTermOff;.
31620 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31630 20 69 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a   iOff = szLeaf;.
31640 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 4f      }.    if( iO
31650 66 66 3e 6e 20 29 7b 0a 20 20 20 20 20 20 72 63  ff>n ){.      rc
31660 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
31670 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f  .      goto deco
31680 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  de_out;.    }.  
31690 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c    fts5DecodePosl
316a0 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
316b0 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20  4], iOff-4);..  
316c0 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e 79 20    /* Decode any 
316d0 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64 61 74  more doclist dat
316e0 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 6f  a that appears o
316f0 6e 20 74 68 65 20 70 61 67 65 20 62 65 66 6f 72  n the page befor
31700 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  e the.    ** fir
31710 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20  st term. */.    
31720 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54 65 72  nDoclist = (iTer
31730 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66 66 20  mOff ? iTermOff 
31740 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66  : szLeaf) - iOff
31750 3b 0a 20 20 20 20 69 66 28 20 6e 44 6f 63 6c 69  ;.    if( nDocli
31760 73 74 2b 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20  st+iOff>n ){.   
31770 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
31780 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RUPT;.      goto
31790 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
317a0 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
317b0 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73  eDoclist(&rc, &s
317c0 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63  , &a[iOff], nDoc
317d0 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69 6c  list);..    whil
317e0 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 26  e( iPgidxOff<n &
317f0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
31800 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  ){.      int bFi
31810 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66  rst = (iPgidxOff
31820 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f  ==szLeaf);     /
31830 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
31840 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
31850 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
31860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31880 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
31890 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b  .      int iEnd;
318a0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50  .      .      iP
318b0 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
318c0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
318d0 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
318e0 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72  ;.      iPgidxPr
318f0 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ev += nByte;.   
31900 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78     iOff = iPgidx
31910 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28  Prev;..      if(
31920 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
31930 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
31940 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
31950 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
31960 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50         iEnd = iP
31970 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65  gidxPrev + nByte
31980 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31990 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a         iEnd = sz
319a0 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Leaf;.      }.  
319b0 20 20 20 20 69 66 28 20 69 45 6e 64 3e 73 7a 4c      if( iEnd>szL
319c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 72  eaf ){.        r
319d0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
319e0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
319f0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
31a00 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b  if( bFirst==0 ){
31a10 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
31a20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
31a30 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  (&a[iOff], nByte
31a40 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
31a50 42 79 74 65 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20  Byte>term.n ){. 
31a60 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54           rc = FT
31a70 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
31a80 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 74       }.        t
31aa0 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20  erm.n = nByte;. 
31ab0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f 66       }.      iOf
31ac0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
31ad0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
31ae0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Byte);.      if(
31af0 20 69 4f 66 66 2b 6e 42 79 74 65 3e 6e 20 29 7b   iOff+nByte>n ){
31b00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54  .        rc = FT
31b10 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
31b20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31b30 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75 66   }.      fts5Buf
31b40 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
31b50 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c  c, &term, nByte,
31b60 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
31b70 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b    iOff += nByte;
31b80 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
31b90 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
31ba0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
31bb0 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
31bc0 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
31bd0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
31be0 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  m.p.      );.   
31bf0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
31c00 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
31c10 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
31c20 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20 20  iEnd-iOff);.    
31c30 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
31c40 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
31c50 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74  }.  . decode_out
31c60 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
31c70 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  (a);.  if( rc==S
31c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
31c90 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
31ca0 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74  ext(pCtx, (const
31cb0 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c   char*)s.p, s.n,
31cc0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
31cd0 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
31ce0 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
31cf0 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
31d00 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35   rc);.  }.  fts5
31d10 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b 0a  BufferFree(&s);.
31d20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  }../*.** The imp
31d30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75  lementation of u
31d40 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
31d50 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  ar function fts5
31d60 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61  _rowid()..*/.sta
31d70 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f 77  tic void fts5Row
31d80 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
31d90 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
31da0 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
31db0 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
31dc0 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
31dd0 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
31de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
31df0 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
31e00 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
31e10 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
31e20 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
31e30 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
31e40 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  nts */.){.  cons
31e50 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
31e60 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20  if( nArg==0 ){. 
31e70 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
31e80 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22 73  t_error(pCtx, "s
31e90 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72  hould be: fts5_r
31ea0 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e  owid(subject, ..
31eb0 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  ..)", -1);.  }el
31ec0 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 28  se{.    zArg = (
31ed0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
31ee0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
31ef0 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pVal[0]);.    if
31f00 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
31f10 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67 6d  icmp(zArg, "segm
31f20 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 69  ent") ){.      i
31f30 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
31f40 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67 6e 6f   int segid, pgno
31f50 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
31f60 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=3 ){.        s
31f70 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
31f80 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
31f90 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
31fa0 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
31fb0 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20  egment', segid, 
31fc0 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20  pgno))", -1.    
31fd0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
31fe0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 67 69  se{.        segi
31ff0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
32000 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
32010 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
32020 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
32030 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20  t(apVal[2]);.   
32040 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54       iRowid = FT
32050 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
32060 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20  (segid, pgno);. 
32070 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
32080 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
32090 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
320a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
320b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
320c0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
320d0 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20 61          "first a
320e0 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64  rg to fts5_rowid
320f0 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d  () must be 'segm
32100 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20 20 20  ent'" , -1.     
32110 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
32120 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
32130 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
32140 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
32150 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74   FTS5 module wit
32160 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  h database.** co
32170 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20  nnection db. It 
32180 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72 61  registers severa
32190 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  l user-defined s
321a0 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
321b0 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46  useful.** with F
321c0 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  TS5..**.** If su
321d0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
321e0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
321f0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
32200 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a  urs, some other.
32210 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
32220 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
32230 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74   instead..*/.int
32240 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
32250 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  xInit(sqlite3 *d
32260 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
32270 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
32280 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  nction(.      db
32290 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c  , "fts5_decode",
322a0 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
322b0 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75   0, fts5DecodeFu
322c0 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29  nction, 0, 0.  )
322d0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
322e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
322f0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
32300 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20  e_function(.    
32310 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65      db, "fts5_de
32320 63 6f 64 65 5f 6e 6f 6e 65 22 2c 20 32 2c 20 0a  code_none", 2, .
32330 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55          SQLITE_U
32340 54 46 38 2c 20 28 76 6f 69 64 2a 29 64 62 2c 20  TF8, (void*)db, 
32350 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69  fts5DecodeFuncti
32360 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  on, 0, 0.    );.
32370 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
32380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
32390 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
323a0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
323b0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
323c0 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49  rowid", -1, SQLI
323d0 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
323e0 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  RowidFunction, 0
323f0 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20  , 0.    );.  }. 
32400 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
32410 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
32420 6e 64 65 78 52 65 73 65 74 28 46 74 73 35 49 6e  ndexReset(Fts5In
32430 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  dex *p){.  asser
32440 74 28 20 70 2d 3e 70 53 74 72 75 63 74 3d 3d 30  t( p->pStruct==0
32450 20 7c 7c 20 70 2d 3e 69 53 74 72 75 63 74 56 65   || p->iStructVe
32460 72 73 69 6f 6e 21 3d 30 20 29 3b 0a 20 20 69 66  rsion!=0 );.  if
32470 28 20 66 74 73 35 49 6e 64 65 78 44 61 74 61 56  ( fts5IndexDataV
32480 65 72 73 69 6f 6e 28 70 29 21 3d 70 2d 3e 69 53  ersion(p)!=p->iS
32490 74 72 75 63 74 56 65 72 73 69 6f 6e 20 29 7b 0a  tructVersion ){.
324a0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
324b0 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a  eInvalidate(p);.
324c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
324d0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
324e0 0a 7d 0a                                         .}.