/ Hex Artifact Content
Login

Artifact 47ef0002b49b1dba5d5a49c8f2b02160a146a4ff:


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: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
28e0: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
28f0: 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e     /* Max pendin
2900: 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c  g data before fl
2910: 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ush to disk */. 
2920: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74   int nPendingDat
2930: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2940: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2950: 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74  s of pending dat
2960: 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74  a */.  i64 iWrit
2970: 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  eRowid;         
2980: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2990: 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20  for current doc 
29a0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
29b0: 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 3b 20  .  int bDelete; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
29e0: 69 74 65 20 69 73 20 61 20 64 65 6c 65 74 65 20  ite is a delete 
29f0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2a00: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a30: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2a40: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2a50: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2a60: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2a70: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2a80: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2aa0: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2ab0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2ac0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2ad0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2ae0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2af0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2b00: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
2b10: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2b20: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
2b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
2b40: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
2b50: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c   id<=?" */.  sql
2b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 57  ite3_stmt *pIdxW
2b70: 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  riter;       /* 
2b80: 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64  "INSERT ... %_id
2b90: 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  x VALUES(?,?,?,?
2ba0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2bb0: 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65 74 65  stmt *pIdxDelete
2bc0: 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45  r;      /* "DELE
2bd0: 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20 57 48  TE FROM %_idx WH
2be0: 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20  ERE segid=? */. 
2bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c00: 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74  IdxSelect;.  int
2c10: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2c40: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
2c50: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
2c60: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38  clistIter {.  u8
2c70: 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20 20   *aEof;         
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
2ca0: 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64  te past end of d
2cb0: 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20  oclist */..  /* 
2cc0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
2cd0: 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74  . aPoslist==0 at
2ce0: 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52   EOF */.  i64 iR
2cf0: 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73  owid;.  u8 *aPos
2d00: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73  list;.  int nPos
2d10: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69 7a  list;.  int nSiz
2d20: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.};../*.** The
2d30: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d40: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
2d50: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
2d60: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
2d70: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
2d80: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
2d90: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
2da0: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
2db0: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
2dc0: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
2dd0: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
2de0: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
2df0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2e00: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
2e10: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e30: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
2e40: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
2e70: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
2e80: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
2e90: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
2ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
2eb0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
2ec0: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
2ed0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2ee0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
2ef0: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f20: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
2f30: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
2f40: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
2f70: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
2f80: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2f90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
2fa0: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
2fb0: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
2fc0: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
2fd0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2fe0: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e  Structure {.  in
2ff0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   Object referenc
3020: 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34  e count */.  u64
3030: 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20   nWriteCounter; 
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69  Total leaves wri
3060: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20  tten to level 0 
3070: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
3080: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3090: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65       /* Total se
30a0: 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73  gments in this s
30b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
30c0: 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20  t nLevel;       
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   Number of level
30f0: 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20  s in this index 
3100: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
3110: 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31  reLevel aLevel[1
3120: 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  ];   /* Array of
3130: 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62   nLevel level ob
3140: 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  jects */.};../*.
3150: 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20  ** An object of 
3160: 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69 74  type Fts5SegWrit
3170: 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  er is used to wr
3180: 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e  ite to segments.
3190: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
31a0: 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  ageWriter {.  in
31b0: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
31e0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
31f0: 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b 20  int iPrevPgidx; 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
3220: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  e written into p
3230: 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42 75  gidx */.  Fts5Bu
3240: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3260: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c  fer containing l
3270: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
3280: 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b 20  s5Buffer pgidx; 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
32b0: 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a 2f  ng page-index */
32c0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
32d0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
32e0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
32f0: 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73  taining previous
3300: 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
3310: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44  .};.struct Fts5D
3320: 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69  lidxWriter {.  i
3330: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3350: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3360: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3370: 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b   int bPrevValid;
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65   /* True if iPre
33a0: 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  v is valid */.  
33b0: 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20  i64 iPrev;      
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
33e0: 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  d value written 
33f0: 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73  to page */.  Fts
3400: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3430: 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  g page data */.}
3440: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  ;.struct Fts5Seg
3450: 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69  Writer {.  int i
3460: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
3480: 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gid to write to 
3490: 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
34a0: 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20  ter writer;     
34b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69 74       /* PageWrit
34c0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
34d0: 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20  64 iPrevRowid;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34f0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  * Previous rowid
3500: 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72   written to curr
3510: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38  ent leaf */.  u8
3520: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f   bFirstRowidInDo
3530: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  clist;        /*
3540: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3550: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3560: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  doclist */.  u8 
3570: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
3580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3590: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
35a0: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70  id is first in p
35b0: 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44 4f  age */.  /* TODO
35c0: 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69 74  1: Can use (writ
35d0: 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20 69  er.pgidx.n==0) i
35e0: 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73 74  nstead of bFirst
35f0: 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20 20  TermInPage */.  
3600: 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50  u8 bFirstTermInP
3610: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
3620: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3630: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72  term will be fir
3640: 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  st in leaf */.  
3650: 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e  int nLeafWritten
3660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
3680: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
3690: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b  */.  int nEmpty;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36c0: 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72  f contiguous ter
36d0: 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a  m-less nodes */.
36e0: 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20 20  .  int nDlidx;  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3710: 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b 5d  size of aDlidx[]
3720: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
3740: 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  idx;        /* A
3750: 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69 64  rray of Fts5Dlid
3760: 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  xWriter objects 
3770: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73 20  */..  /* Values 
3780: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  to insert into t
3790: 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a  he %_idx table *
37a0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
37b0: 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  tterm;          
37c0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72 6d      /* Next term
37d0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
37e0: 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a 20  %_idx table */. 
37f0: 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20 20   int iBtPage;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3820: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
3830: 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a 74   btterm */.};..t
3840: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
3850: 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43 52  s5CResult Fts5CR
3860: 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46 74  esult;.struct Ft
3870: 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75 31  s5CResult {.  u1
3880: 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20  6 iFirst;       
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38a0: 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66   aSeg[] index of
38b0: 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61 74   firstest iterat
38c0: 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d  or */.  u8 bTerm
38d0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
38f0: 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72 65  if the terms are
3900: 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   equal */.};../*
3910: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
3920: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
3930: 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
3940: 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  t, visiting each
3950: 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20 70   term/rowid.** p
3960: 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65  air in the segme
3970: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a  nt..**.** pSeg:.
3980: 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74  **   The segment
3990: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
39a0: 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ugh..**.** iLeaf
39b0: 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65  Pgno:.**   Curre
39c0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
39d0: 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65  ber within segme
39e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f  nt..**.** iLeafO
39f0: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65  ffset:.**   Byte
3a00: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
3a10: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
3a20: 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72 73  that is the firs
3a30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
3a40: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
3a50: 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74 65  t data (one byte
3a60: 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73 69   passed the posi
3a70: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
3a80: 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69  ield)..**   rowi
3a90: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
3aa0: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
3ab0: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
3ac0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
3ad0: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
3ae0: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
3af0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
3b00: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
3b10: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3b20: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
3b30: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
3b40: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
3b50: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
3b60: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
3b70: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
3b80: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
3b90: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
3ba0: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
3bb0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
3bc0: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
3bd0: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
3be0: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
3bf0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
3c00: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
3c10: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
3c20: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
3c30: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
3c40: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
3c50: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
3c60: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
3c70: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
3c80: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
3c90: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
3ca0: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
3cb0: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
3cc0: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
3cd0: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
3ce0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
3cf0: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
3d00: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
3d10: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
3d20: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
3d30: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
3d40: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
3d50: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
3d60: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
3d70: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
3d80: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
3d90: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
3da0: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
3db0: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
3dc0: 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20 69   through rowid i
3dd0: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  n descending ord
3de0: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  er instead of th
3df0: 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74  e.**     default
3e00: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
3e10: 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66  ..**.** iRowidOf
3e20: 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65  fset/nRowidOffse
3e30: 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a  t/aRowidOffset:.
3e40: 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72 65  **     These are
3e50: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
3e60: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
3e70: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  E flag is set..*
3e80: 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61 63  *.**     For eac
3e90: 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  h rowid on the p
3ea0: 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  age correspondin
3eb0: 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
3ec0: 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20 20   term, the.**   
3ed0: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
3ee0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 65  aRowidOffset[] e
3ef0: 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 74  ntry is set to t
3f00: 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 6f  he byte offset o
3f10: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74 61  f the.**     sta
3f20: 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69 74  rt of the "posit
3f30: 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20 66  ion-list-size" f
3f40: 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20  ield within the 
3f50: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72  page..**.** iTer
3f60: 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e 64  mIdx:.**     Ind
3f70: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  ex of current te
3f80: 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66 50  rm on iTermLeafP
3f90: 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  gno..*/.struct F
3fa0: 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20 46  ts5SegIter {.  F
3fb0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
3fc0: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
3fd0: 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74 65  * Segment to ite
3fe0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
3ff0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e    /* Mask of con
4020: 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73  figuration flags
4030: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
4040: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4050: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4060: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
4070: 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  r */.  Fts5Data 
4080: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
4090: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40a0: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
40b0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78 74   Fts5Data *pNext
40c0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
40d0: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28 69   /* Leaf page (i
40e0: 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20  LeafPgno+1) */. 
40f0: 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74   int iLeafOffset
4100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4110: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
4120: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
4130: 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  eaf */..  /* The
4140: 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74   page and offset
4150: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20   from which the 
4160: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73  current term was
4170: 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65   read. The offse
4180: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f  t .  ** is the o
4190: 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69 72  ffset of the fir
41a0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
41b0: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e  current doclist.
41c0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d    */.  int iTerm
41d0: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
41e0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
41f0: 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66  ..  int iPgidxOf
4200: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
4210: 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
4220: 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20  et in pgidx */. 
4230: 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63 6c 69   int iEndofDocli
4240: 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  st;..  /* The fo
4250: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
4260: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
4270: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4280: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a  E flag is set. *
4290: 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  /.  int iRowidOf
42a0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
42b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65      /* Current e
42c0: 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66  ntry in aRowidOf
42d0: 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  fset[] */.  int 
42e0: 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  nRowidOffset;   
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4300: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
4310: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4320: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
4330: 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  aRowidOffset;   
4340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4350: 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f  ray of offset to
4360: 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f   rowid fields */
4370: 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ..  Fts5DlidxIte
4380: 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20  r *pDlidx;      
4390: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
43a0: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
43b0: 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69  ex */..  /* Vari
43c0: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
43d0: 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74  based on current
43e0: 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73   entry. */.  Fts
43f0: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4410: 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  Current term */.
4420: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
4450: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73  id */.  int nPos
4460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4470: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4480: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75  r of bytes in cu
4490: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
44a0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ist */.  int bDe
44b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
44c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
44d0: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
44e0: 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b  lag is set */.};
44f0: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
4500: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4510: 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72   an Fts5Data str
4520: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
4530: 61 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20  ains a .** leaf 
4540: 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  page..*/.#define
4550: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
4560: 4b 28 78 29 20 61 73 73 65 72 74 28 20 5c 0a 20  K(x) assert( \. 
4570: 20 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d     (x)->szLeaf==
4580: 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28 78 29 2d 3e  (x)->nn || (x)->
4590: 73 7a 4c 65 61 66 3d 3d 66 74 73 35 47 65 74 55  szLeaf==fts5GetU
45a0: 31 36 28 26 28 78 29 2d 3e 70 5b 32 5d 29 20 5c  16(&(x)->p[2]) \
45b0: 0a 29 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .)..#define FTS5
45c0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
45d0: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54   0x01.#define FT
45e0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
45f0: 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a  SE 0x02.../* .**
4600: 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   Argument is a p
4610: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73  ointer to an Fts
4620: 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  5Data structure 
4630: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
4640: 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68  leaf.** page. Th
4650: 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74  is macro evaluat
4660: 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  es to true if th
4670: 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20  e leaf contains 
4680: 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20  no terms, or.** 
4690: 66 61 6c 73 65 20 69 66 20 69 74 20 63 6f 6e 74  false if it cont
46a0: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
46b0: 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69  e term..*/.#defi
46c0: 6e 65 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  ne fts5LeafIsTer
46d0: 6d 6c 65 73 73 28 78 29 20 28 28 78 29 2d 3e 73  mless(x) ((x)->s
46e0: 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e  zLeaf >= (x)->nn
46f0: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4700: 65 61 66 54 65 72 6d 4f 66 66 28 78 2c 20 69 29  eafTermOff(x, i)
4710: 20 28 66 74 73 35 47 65 74 55 31 36 28 26 28 78   (fts5GetU16(&(x
4720: 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65 61 66  )->p[(x)->szLeaf
4730: 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a 23 64 65   + (i)*2]))..#de
4740: 66 69 6e 65 20 66 74 73 35 4c 65 61 66 46 69 72  fine fts5LeafFir
4750: 73 74 52 6f 77 69 64 4f 66 66 28 78 29 20 28 66  stRowidOff(x) (f
4760: 74 73 35 47 65 74 55 31 36 28 28 78 29 2d 3e 70  ts5GetU16((x)->p
4770: 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  ))../*.** Object
4780: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
4790: 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65  hrough the merge
47a0: 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65  d results of one
47b0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
47c0: 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65  s,.** visiting e
47d0: 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 20 70  ach term/rowid p
47e0: 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65  air in the merge
47f0: 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53  d data..**.** nS
4800: 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70  eg is always a p
4810: 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61  ower of two grea
4820: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4830: 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  l to the number 
4840: 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74  of.** segments t
4850: 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hat this object 
4860: 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20  is merging data 
4870: 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61  from. Both the a
4880: 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69  Seg[] and.** aFi
4890: 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65  rst[] arrays are
48a0: 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65   sized at nSeg e
48b0: 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67  ntries. The aSeg
48c0: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64  [] array is padd
48d0: 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65  ed.** with zeroe
48e0: 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73  d objects - thes
48f0: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73  e are handled as
4900: 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74   if they were it
4910: 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  erators opened.*
4920: 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65  * on empty segme
4930: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  nts..**.** The r
4940: 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
4950: 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65  ing segments aSe
4960: 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b  g[N] and aSeg[N+
4970: 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61  1], where N is a
4980: 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72  n.** even number
4990: 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  , is stored in a
49a0: 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32  First[(nSeg+N)/2
49b0: 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20  ]. The "result" 
49c0: 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61  of the .** compa
49d0: 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f  rison in this co
49e0: 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64  ntext is the ind
49f0: 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  ex of the iterat
4a00: 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  or that currentl
4a10: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  y.** points to t
4a20: 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f  he smaller term/
4a30: 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  rowid combinatio
4a40: 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20  n. Iterators at 
4a50: 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69  EOF are.** consi
4a60: 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61  dered to be grea
4a70: 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68  ter than all oth
4a80: 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a  er iterators..**
4a90: 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f  .** aFirst[1] co
4aa0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
4ab0: 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68   in aSeg[] of th
4ac0: 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  e iterator that 
4ad0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
4ae0: 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76   smallest key ov
4af0: 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d  erall. aFirst[0]
4b00: 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2a 0a   is unused. .**.
4b10: 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a 2a 20 20  ** poslist:.**  
4b20: 20 55 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   Used by sqlite3
4b30: 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28  Fts5IterPoslist(
4b40: 29 20 77 68 65 6e 20 74 68 65 20 70 6f 73 6c 69  ) when the posli
4b50: 73 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  st needs to be b
4b60: 75 66 66 65 72 65 64 2e 0a 2a 2a 20 20 20 54 68  uffered..**   Th
4b70: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
4b80: 20 74 65 6c 6c 20 69 66 20 74 68 69 73 20 69 73   tell if this is
4b90: 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 20 6e 6f   populated or no
4ba0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  t..*/.struct Fts
4bb0: 35 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46  5IndexIter {.  F
4bc0: 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
4bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4be0: 2a 20 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e  * Index that own
4bf0: 73 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  s this iterator 
4c00: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
4c10: 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
4c20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4c30: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
4c40: 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  his iterator */.
4c50: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
4c60: 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
4c70: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
4c80: 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70  aining current p
4c90: 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20 69 6e 74  oslist */..  int
4ca0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cc0: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4cd0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4ce0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d00: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4d10: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4d20: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4d50: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4d60: 65 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f 66 3b  es */.  u8 bEof;
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4d90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 75 38 20 62  at EOF */.  u8 b
4da0: 46 69 6c 74 65 72 65 64 3b 20 20 20 20 20 20 20  Filtered;       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4dc0: 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 2d 66 69  rue if column-fi
4dd0: 6c 74 65 72 20 61 6c 72 65 61 64 79 20 61 70 70  lter already app
4de0: 6c 69 65 64 20 2a 2f 0a 0a 20 20 69 36 34 20 69  lied */..  i64 i
4df0: 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20  SwitchRowid;    
4e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4e10: 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20  rstest rowid of 
4e20: 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72 73  other than aFirs
4e30: 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52  t[1] */.  Fts5CR
4e40: 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20  esult *aFirst;  
4e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4e60: 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65  rent merge state
4e70: 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
4e80: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61 53    Fts5SegIter aS
4e90: 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  eg[1];          
4ea0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
4eb0: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  gment iterators 
4ec0: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  */.};.../*.** An
4ed0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4ee0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
4ef0: 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
4f00: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  te through the c
4f10: 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20  ontents.** of a 
4f20: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65  doclist-index re
4f30: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74  cord..**.** pDat
4f40: 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63  a:.**   Record c
4f50: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f  ontaining the do
4f60: 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61  clist-index data
4f70: 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a  ..**.** bEof:.**
4f80: 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f     Set to true o
4f90: 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61 73  nce iterator has
4fa0: 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a   reached EOF..**
4fb0: 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53  .** iOff:.**   S
4fc0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  et to the curren
4fd0: 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  t offset within 
4fe0: 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f  record pData..*/
4ff0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
5000: 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74  xLvl {.  Fts5Dat
5010: 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  a *pData;       
5020: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
5030: 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  or current page 
5040: 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f  of this level */
5050: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20  .  int iOff;    
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73   /* Current offs
5080: 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f  et into pData */
5090: 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20  .  int bEof;    
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61   /* At EOF alrea
50c0: 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  dy */.  int iFir
50d0: 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  stOff;          
50e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
50f0: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
5100: 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70  rs */..  /* Outp
5110: 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  ut variables */.
5120: 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b    int iLeafPgno;
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
5150: 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  f current leaf p
5160: 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  age */.  i64 iRo
5170: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
5180: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5190: 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c  rowid on leaf iL
51a0: 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74  eafPgno */.};.st
51b0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74  ruct Fts5DlidxIt
51c0: 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b  er {.  int nLvl;
51d0: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
51e0: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c   Fts5DlidxLvl aL
51f0: 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69  vl[1];.};..stati
5200: 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55 31  c void fts5PutU1
5210: 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20  6(u8 *aOut, u16 
5220: 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d  iVal){.  aOut[0]
5230: 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20   = (iVal>>8);.  
5240: 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26  aOut[1] = (iVal&
5250: 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  0xFF);.}..static
5260: 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36 28   u16 fts5GetU16(
5270: 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a  const u8 *aIn){.
5280: 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29 61    return ((u16)a
5290: 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49  In[0] << 8) + aI
52a0: 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20  n[1];.} ../*.** 
52b0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
52c0: 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74 20  urn a buffer at 
52d0: 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65  least nByte byte
52e0: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
52f0: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
5300: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
5310: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
5320: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
5330: 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74  ode in.** the Ft
5340: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70  s5Index handle p
5350: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5360: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
5370: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
5380: 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49  5IdxMalloc(Fts5I
5390: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79  ndex *p, int nBy
53a0: 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  te){.  return sq
53b0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
53c0: 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74  ero(&p->rc, nByt
53d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  e);.}../*.** Com
53e0: 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
53f0: 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62  s of the pLeft b
5400: 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20 70  uffer with the p
5410: 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f  Right/nRight blo
5420: 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  b..**.** Return 
5430: 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20  -ve if pLeft is 
5440: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69  smaller than pRi
5450: 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61  ght, 0 if they a
5460: 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b  re equal or.** +
5470: 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20  ve if pRight is 
5480: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65  smaller than pLe
5490: 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ft. In other wor
54a0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65  ds:.**.**     re
54b0: 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52  s = *pLeft - *pR
54c0: 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ight.*/.#ifdef S
54d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
54e0: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
54f0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
5500: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
5510: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5520: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
5530: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
5540: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
5550: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
5560: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
5570: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
5580: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
5590: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
55a0: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
55b0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
55c0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
55d0: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
55e0: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
55f0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
5600: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e  t) : res);.}.#en
5610: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  dif../*.** Compa
5620: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5630: 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66 65  of the two buffe
5640: 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  rs using memcmp(
5650: 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72  ). If one buffer
5660: 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20  .** is a prefix 
5670: 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74  of the other, it
5680: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
5690: 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a  he lesser..**.**
56a0: 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70   Return -ve if p
56b0: 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  Left is smaller 
56c0: 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69  than pRight, 0 i
56d0: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
56e0: 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52   or.** +ve if pR
56f0: 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  ight is smaller 
5700: 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f  than pLeft. In o
5710: 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  ther words:.**.*
5720: 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65  *     res = *pLe
5730: 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a  ft - *pRight.*/.
5740: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
5750: 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73  ufferCompare(Fts
5760: 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20  5Buffer *pLeft, 
5770: 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69 67  Fts5Buffer *pRig
5780: 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  ht){.  int nCmp 
5790: 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20  = MIN(pLeft->n, 
57a0: 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e  pRight->n);.  in
57b0: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
57c0: 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d  Left->p, pRight-
57d0: 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  >p, nCmp);.  ret
57e0: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70  urn (res==0 ? (p
57f0: 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74  Left->n - pRight
5800: 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ->n) : res);.}..
5810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5820: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66  BUG.static int f
5830: 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 0a  ts5BlobCompare(.
5840: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66    const u8 *pLef
5850: 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20 0a 20  t, int nLeft, . 
5860: 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68   const u8 *pRigh
5870: 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29 7b  t, int nRight.){
5880: 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49  .  int nCmp = MI
5890: 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29  N(nLeft, nRight)
58a0: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
58b0: 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69 67  mcmp(pLeft, pRig
58c0: 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  ht, nCmp);.  ret
58d0: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 6e  urn (res==0 ? (n
58e0: 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20 3a  Left - nRight) :
58f0: 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a   res);.}.#endif.
5900: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
5910: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
5920: 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66  (Fts5Data *pLeaf
5930: 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
5940: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
5950: 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d  &pLeaf->p[pLeaf-
5960: 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a  >szLeaf], ret);.
5970: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5980: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
5990: 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20   read-only blob 
59a0: 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73  handle, if it is
59b0: 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   open..*/.static
59c0: 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52   void fts5CloseR
59d0: 65 61 64 65 72 28 46 74 73 35 49 6e 64 65 78 20  eader(Fts5Index 
59e0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52  *p){.  if( p->pR
59f0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  eader ){.    sql
5a00: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64  ite3_blob *pRead
5a10: 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b  er = p->pReader;
5a20: 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20  .    p->pReader 
5a30: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
5a40: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61  _blob_close(pRea
5a50: 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  der);.  }.}.../*
5a60: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
5a70: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
5a80: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
5a90: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
5aa0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
5ab0: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
5ac0: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
5ad0: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
5ae0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
5af0: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
5b00: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
5b10: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
5b20: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
5b30: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
5b40: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
5b50: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
5b60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20  SQLITE_OK;..    
5b70: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
5b80: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
5b90: 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72 6e 20  call may return 
5ba0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69 66 20  SQLITE_ABORT if 
5bb0: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 61  there has been a
5bc0: 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
5bd0: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e   ** rollback sin
5be0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 75  ce it was last u
5bf0: 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sed. In this cas
5c00: 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e  e a new blob han
5c10: 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  dle.      ** is 
5c20: 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
5c30: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5c40: 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65   *pBlob = p->pRe
5c50: 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  ader;.      p->p
5c60: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5c70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5c80: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62  lob_reopen(pBlob
5c90: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
5ca0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
5cb0: 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  der==0 );.      
5cc0: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70 42 6c  p->pReader = pBl
5cd0: 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ob;.      if( rc
5ce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5cf0: 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65         fts5Close
5d00: 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 20  Reader(p);.     
5d10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
5d20: 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 20  =SQLITE_ABORT ) 
5d30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5d40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5d50: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
5d60: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20   is not open at 
5d70: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e  this point, open
5d80: 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a 20 20   it and seek .  
5d90: 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65 71 75    ** to the requ
5da0: 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f  ested entry.  */
5db0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
5dc0: 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  der==0 && rc==SQ
5dd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5de0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
5df0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
5e00: 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  g;.      rc = sq
5e10: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
5e20: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20  pConfig->db, .  
5e30: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
5e40: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
5e50: 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77  l, "block", iRow
5e60: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64  id, 0, &p->pRead
5e70: 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  er.      );.    
5e80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  }..    /* If eit
5e90: 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 74  her of the sqlit
5ea0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f  e3_blob_open() o
5eb0: 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  r sqlite3_blob_r
5ec0: 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20  eopen() calls.  
5ed0: 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72    ** above retur
5ee0: 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ned SQLITE_ERROR
5ef0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5f00: 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e 73  CORRUPT_VTAB ins
5f10: 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c  tead..    ** All
5f20: 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68 6f   the reasons tho
5f30: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67  se functions mig
5f40: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
5f50: 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67  _ERROR - missing
5f60: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d  .    ** table, m
5f70: 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d  issing row, non-
5f80: 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f  blob/text in blo
5f90: 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69  ck column - indi
5fa0: 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61 63  cate .    ** bac
5fb0: 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72 75  king store corru
5fc0: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  ption.  */.    i
5fd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
5fe0: 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ROR ) rc = FTS5_
5ff0: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69 66  CORRUPT;..    if
6000: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6010: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 75  ){.      u8 *aOu
6020: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
6030: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f       /* Read blo
6040: 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  b data into this
6050: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20   buffer */.     
6060: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
6070: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
6080: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
6090: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
60a0: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
60b0: 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f   + nByte + FTS5_
60c0: 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20  DATA_PADDING;.  
60d0: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
60e0: 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Data*)sqlite3_ma
60f0: 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  lloc(nAlloc);.  
6100: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
6110: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e          pRet->nn
6120: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
6130: 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70    aOut = pRet->p
6140: 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d   = (u8*)&pRet[1]
6150: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6160: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6170: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6180: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
6190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
61a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
61b0: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e  e3_blob_read(p->
61c0: 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e  pReader, aOut, n
61d0: 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Byte, 0);.      
61e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
61f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6200: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6210: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
6220: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
6230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6240: 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20 74 68  /* TODO1: Fix th
6250: 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52  is */.        pR
6260: 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73  et->szLeaf = fts
6270: 35 47 65 74 55 31 36 28 26 70 52 65 74 2d 3e 70  5GetU16(&pRet->p
6280: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [2]);.      }.  
6290: 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20    }.    p->rc = 
62a0: 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64  rc;.    p->nRead
62b0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ++;.  }..  asser
62c0: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
62d0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
62e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
62f0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  t;.}../*.** Rele
6300: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
6310: 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72  to data record r
6320: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6330: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
6340: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e   fts5DataRead().
6350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6360: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
6370: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
6380: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
6390: 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74  (pData);.}..stat
63a0: 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
63b0: 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46  PrepareStmt(.  F
63c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73  ts5Index *p,.  s
63d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
63e0: 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt,.  char *zS
63f0: 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ql.){.  if( p->r
6400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6410: 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a      if( zSql ){.
6420: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
6430: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
6440: 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  (p->pConfig->db,
6450: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
6460: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
6470: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6480: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6490: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
64a0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
64b0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
64c0: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
64d0: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
64e0: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
64f0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
6500: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6510: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
6520: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
6530: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
6540: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
6550: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6560: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6570: 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72    if( p->pWriter
6580: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6590: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
65a0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
65b0: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
65c0: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72  eStmt(p, &p->pWr
65d0: 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
65e0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
65f0: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
6600: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64  %q'.'%q_data'(id
6610: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
6620: 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
6630: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6640: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6650: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
6660: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
6670: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6680: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69  nd_int64(p->pWri
6690: 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ter, 1, iRowid);
66a0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
66b0: 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c  blob(p->pWriter,
66c0: 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61   2, pData, nData
66d0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
66e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
66f0: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
6700: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
6710: 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72  reset(p->pWriter
6720: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
6730: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ute the followin
6740: 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  g SQL:.**.**    
6750: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64   DELETE FROM %_d
6760: 61 74 61 20 57 48 45 52 45 20 69 64 20 42 45 54  ata WHERE id BET
6770: 57 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44  WEEN $iFirst AND
6780: 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69   $iLast.*/.stati
6790: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 44  c void fts5DataD
67a0: 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78 20  elete(Fts5Index 
67b0: 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  *p, i64 iFirst, 
67c0: 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66  i64 iLast){.  if
67d0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
67e0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
67f0: 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d  if( p->pDeleter=
6800: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
6810: 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  ;.    Fts5Config
6820: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6830: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
6840: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
6850: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6860: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6870: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48  %q'.'%q_data' WH
6880: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
6890: 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20  <=?", .         
68a0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
68b0: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
68c0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
68d0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
68e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
68f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6900: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
6910: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
6920: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
6930: 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30   &p->pDeleter, 0
6940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6950: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
6960: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
6970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6980: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
6990: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
69a0: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
69b0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
69c0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
69d0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
69e0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
69f0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6a00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6a10: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
6a20: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6a30: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
6a40: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
6a50: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6a60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6a70: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6a90: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6aa0: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6ab0: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6ac0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6ad0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6ae0: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6af0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6b00: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6b10: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6b20: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6b30: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6b40: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6b50: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6b60: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6b70: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6b80: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6b90: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6ba0: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6bb0: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6bc0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6bd0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6be0: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6bf0: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6c00: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6c10: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6c20: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6c30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6c40: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c50: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6c60: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6c70: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6c80: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6c90: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6ca0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6cb0: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6cc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6cd0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6ce0: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6cf0: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6d00: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6d10: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6d20: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6d30: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6d40: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6d60: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6d70: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6d80: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6d90: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6da0: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6db0: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6dd0: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6de0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6df0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6e10: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6e20: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6e30: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6e40: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6e50: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6e60: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6e70: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6e80: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6e90: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6ea0: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6eb0: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6ec0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6ed0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6ee0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6ef0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6f00: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6f10: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
6f20: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
6f30: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
6f40: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
6f50: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
6f60: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
6f70: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
6f80: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
6f90: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
6fa0: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
6fb0: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
6fc0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
6fd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6fe0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
6ff0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
7000: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7010: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7020: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7030: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7040: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7050: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7060: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7070: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7080: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7090: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
70a0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
70b0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
70c0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
70d0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
70e0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
7110: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7120: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7130: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7140: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7150: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7160: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7170: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7190: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
71a0: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
71b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
71c0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
71d0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
71e0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
71f0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
7200: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  ;.  int nByte;  
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7230: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7240: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7250: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7260: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7270: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7280: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7290: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
72a0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
72b0: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
72c0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
72d0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
72e0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
72f0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
7300: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
7310: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7320: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7330: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7340: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
7350: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
7360: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7370: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7380: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7390: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
73a0: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
73b0: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
73c0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
73d0: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
73e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
73f0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7400: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7410: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
7420: 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20  nLevel-1)    /* 
7430: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
7440: 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20  /.  );.  pRet = 
7450: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
7460: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
7470: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
7480: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
7490: 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66  {.    pRet->nRef
74a0: 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e   = 1;.    pRet->
74b0: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
74c0: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d  .    pRet->nSegm
74d0: 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a  ent = nSegment;.
74e0: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
74f0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
7500: 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e  Data[i], &pRet->
7510: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
7520: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
7530: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7540: 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69  & iLvl<nLevel; i
7550: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
7560: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7570: 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e   *pLvl = &pRet->
7580: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7590: 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a      int nTotal;.
75a0: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
75b0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
75c0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
75d0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
75e0: 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  rge);.      i +=
75f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7600: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74  (&pData[i], nTot
7610: 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
7620: 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d  t( nTotal>=pLvl-
7630: 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  >nMerge );.     
7640: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
7650: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7660: 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ent*)sqlite3Fts5
7670: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
7680: 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61  .          nTota
7690: 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  l * sizeof(Fts5S
76a0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
76b0: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
76c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
76d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  OK ){.        pL
76e0: 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61  vl->nSeg = nTota
76f0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
7700: 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74  Seg=0; iSeg<nTot
7710: 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  al; iSeg++){.   
7720: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7730: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7740: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7750: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
7760: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7770: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7780: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7790: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
77a0: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
77b0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
77c0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
77d0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
77e0: 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  g].pgnoLast);.  
77f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
7810: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
7820: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
7830: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
7840: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7850: 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20  *ppOut = pRet;. 
7860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7870: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
7880: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
7890: 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70  eAddLevel(int *p
78a0: 52 63 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  Rc, Fts5Structur
78b0: 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20  e **ppStruct){. 
78c0: 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
78d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
78e0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
78f0: 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
7900: 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d      int nLevel =
7910: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7920: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
7930: 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65  = (.        size
7940: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7950: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
7960: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7970: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7980: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7990: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
79a0: 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c  nLevel+1)  /* aL
79b0: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
79c0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72      );..    pStr
79d0: 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  uct = sqlite3_re
79e0: 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e  alloc(pStruct, n
79f0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
7a00: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
7a10: 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d  memset(&pStruct-
7a20: 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c  >aLevel[nLevel],
7a30: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
7a40: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b  tructureLevel));
7a50: 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
7a60: 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20  nLevel++;.      
7a70: 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
7a80: 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  uct;.    }else{.
7a90: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
7aa0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
7ab0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7ac0: 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20  tend level iLvl 
7ad0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
7ae0: 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61   room for at lea
7af0: 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a  st nExtra more.*
7b00: 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  * segments..*/.s
7b10: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7b20: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
7b30: 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  vel(.  int *pRc,
7b40: 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72   .  Fts5Structur
7b50: 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69  e *pStruct, .  i
7b60: 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20  nt iLvl, .  int 
7b70: 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62  nExtra, .  int b
7b80: 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20  Insert.){.  if( 
7b90: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7ba0: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7bb0: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
7bc0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
7bd0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74  el[iLvl];.    Ft
7be0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7bf0: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e  nt *aNew;.    in
7c00: 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42  t nByte;..    nB
7c10: 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65  yte = (pLvl->nSe
7c20: 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69  g + nExtra) * si
7c30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7c40: 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
7c50: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
7c60: 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65  ealloc(pLvl->aSe
7c70: 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  g, nByte);.    i
7c80: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( aNew ){.     
7c90: 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20   if( bInsert==0 
7ca0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
7cb0: 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53  t(&aNew[pLvl->nS
7cc0: 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  eg], 0, sizeof(F
7cd0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7ce0: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
7cf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7d00: 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d       int nMove =
7d10: 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69   pLvl->nSeg * si
7d20: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7d30: 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
7d40: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65      memmove(&aNe
7d50: 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c  w[nExtra], aNew,
7d60: 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20   nMove);.       
7d70: 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c   memset(aNew, 0,
7d80: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7d90: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20  ctureSegment) * 
7da0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
7db0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  .      pLvl->aSe
7dc0: 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65  g = aNew;.    }e
7dd0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
7de0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7df0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7e00: 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69 61  ** Read, deseria
7e10: 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20  lize and return 
7e20: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
7e30: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cord..**.** The 
7e40: 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c  Fts5Structure.aL
7e50: 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20  evel[] and each 
7e60: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7e70: 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a  el.aSeg[] array.
7e80: 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f  ** are over-allo
7e90: 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69 62  cated as describ
7ea0: 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ed for function 
7eb0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
7ec0: 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e  ode() .** above.
7ed0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7ee0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
7ef0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
7f00: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65  an error code le
7f10: 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73  ft in the.** Fts
7f20: 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49  5Index handle. I
7f30: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
7f40: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
7f50: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7f60: 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  on.** is called,
7f70: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
7f80: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53 74  */.static Fts5St
7f90: 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74 72  ructure *fts5Str
7fa0: 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35 49  uctureRead(Fts5I
7fb0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
7fc0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
7fd0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
7fe0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7ff0: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
8000: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65 74  /* Object to ret
8010: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  urn */.  int iCo
8020: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
8030: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
8040: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
8050: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
8060: 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20  pData;..  pData 
8070: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
8080: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
8090: 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70  _ROWID);.  if( p
80a0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ->rc ) return 0;
80b0: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f 20 77  .  /* TODO: Do w
80c0: 65 20 6e 65 65 64 20 74 68 69 73 20 69 66 20 74  e need this if t
80d0: 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20 69 73  he leaf-index is
80e0: 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f 62 61   appended? Proba
80f0: 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d 65 6d 73  bly... */.  mems
8100: 65 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 44 61  et(&pData->p[pDa
8110: 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35  ta->nn], 0, FTS5
8120: 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a  _DATA_PADDING);.
8130: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
8140: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
8150: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
8160: 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52  n, &iCookie, &pR
8170: 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  et);.  if( p->rc
8180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8190: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21  Config->iCookie!
81a0: 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  =iCookie ){.    
81b0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
81c0: 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43  ts5ConfigLoad(pC
81d0: 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b  onfig, iCookie);
81e0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
81f0: 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
8200: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
8210: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
8220: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8230: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
8240: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
8250: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
8260: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
8270: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8280: 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
8290: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
82a0: 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ct. This.** func
82b0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
82c0: 72 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  r used as part o
82d0: 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69  f assert() condi
82e0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tions..*/.#ifdef
82f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
8300: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 72  atic int fts5Str
8310: 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
8320: 6e 74 73 28 46 74 73 35 53 74 72 75 63 74 75 72  nts(Fts5Structur
8330: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
8340: 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b  nt nSegment = 0;
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8360: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
8370: 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  f segments */.  
8380: 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
8390: 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
83c0: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
83d0: 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c  ls */.    for(iL
83e0: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
83f0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
8400: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d  ++){.      nSegm
8410: 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e  ent += pStruct->
8420: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
8430: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
8440: 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b  return nSegment;
8450: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
8460: 20 53 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 73   Serialize and s
8470: 74 6f 72 65 20 74 68 65 20 22 73 74 72 75 63 74  tore the "struct
8480: 75 72 65 22 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ure" record..**.
8490: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
84a0: 63 63 75 72 73 2c 20 6c 65 61 76 65 20 61 6e 20  ccurs, leave an 
84b0: 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 20 74 68  error code in th
84c0: 65 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  e Fts5Index obje
84d0: 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20 65 72 72  ct. If an.** err
84e0: 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
84f0: 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
8500: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
8510: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
8520: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57  d fts5StructureW
8530: 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a  rite(Fts5Index *
8540: 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  p, Fts5Structure
8550: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66   *pStruct){.  if
8560: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
8570: 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 42 75  OK ){.    Fts5Bu
8580: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
8590: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
85a0: 72 20 74 6f 20 73 65 72 69 61 6c 69 7a 65 20 72  r to serialize r
85b0: 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f 0a 20 20  ecord into */.  
85c0: 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20    int iLvl;     
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85e0: 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
85f0: 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c  te through level
8600: 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 43 6f  s */.    int iCo
8610: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
8620: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f 6b 69 65         /* Cookie
8630: 20 76 61 6c 75 65 20 74 6f 20 73 74 6f 72 65 20   value to store 
8640: 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
8650: 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
8660: 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
8670: 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
8680: 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6d 65  truct) );.    me
8690: 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69  mset(&buf, 0, si
86a0: 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
86b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  );..    /* Appen
86c0: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f  d the current co
86d0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
86e0: 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f 6f 6b 69  ie */.    iCooki
86f0: 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  e = p->pConfig->
8700: 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20 69 66 28  iCookie;.    if(
8710: 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20 69 43 6f   iCookie<0 ) iCo
8720: 6f 6b 69 65 20 3d 20 30 3b 0a 20 20 20 20 66 74  okie = 0;.    ft
8730: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 33 32  s5BufferAppend32
8740: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 69  (&p->rc, &buf, i
8750: 43 6f 6f 6b 69 65 29 3b 0a 0a 20 20 20 20 66 74  Cookie);..    ft
8760: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8770: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
8780: 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  f, pStruct->nLev
8790: 65 6c 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  el);.    fts5Buf
87a0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
87b0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
87c0: 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 29  truct->nSegment)
87d0: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
87e0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
87f0: 3e 72 63 2c 20 26 62 75 66 2c 20 28 69 36 34 29  >rc, &buf, (i64)
8800: 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
8810: 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f  ounter);..    fo
8820: 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
8830: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
8840: 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69  iLvl++){.      i
8850: 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  nt iSeg;        
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8870: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
8880: 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73  through segments
8890: 20 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 74   */.      Fts5St
88a0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
88b0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
88c0: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
88d0: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
88e0: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
88f0: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d  , &buf, pLvl->nM
8900: 65 72 67 65 29 3b 0a 20 20 20 20 20 20 66 74 73  erge);.      fts
8910: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
8920: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
8930: 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20  , pLvl->nSeg);. 
8940: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76       assert( pLv
8950: 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d  l->nMerge<=pLvl-
8960: 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 20 20 20 20  >nSeg );..      
8970: 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67  for(iSeg=0; iSeg
8980: 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65  <pLvl->nSeg; iSe
8990: 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 74  g++){.        ft
89a0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
89b0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
89c0: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
89d0: 65 67 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg].iSegid);.   
89e0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
89f0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8a00: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
8a10: 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46  aSeg[iSeg].pgnoF
8a20: 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 66  irst);.        f
8a30: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8a40: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8a50: 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  uf, pLvl->aSeg[i
8a60: 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg].pgnoLast);.
8a70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
8a80: 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
8a90: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
8aa0: 52 45 5f 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c  RE_ROWID, buf.p,
8ab0: 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73   buf.n);.    fts
8ac0: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
8ad0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a  );.  }.}..#if 0.
8ae0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8af0: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 69  DebugStructure(i
8b00: 6e 74 2a 2c 46 74 73 35 42 75 66 66 65 72 2a 2c  nt*,Fts5Buffer*,
8b10: 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29 3b  Fts5Structure*);
8b20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
8b30: 35 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28  5PrintStructure(
8b40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 70  const char *zCap
8b50: 74 69 6f 6e 2c 20 46 74 73 35 53 74 72 75 63 74  tion, Fts5Struct
8b60: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
8b70: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
8b80: 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75 66 66 65  _OK;.  Fts5Buffe
8b90: 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28  r buf;.  memset(
8ba0: 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &buf, 0, sizeof(
8bb0: 62 75 66 29 29 3b 0a 20 20 66 74 73 35 44 65 62  buf));.  fts5Deb
8bc0: 75 67 53 74 72 75 63 74 75 72 65 28 26 72 63 2c  ugStructure(&rc,
8bd0: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 29 3b   &buf, pStruct);
8be0: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75  .  fprintf(stdou
8bf0: 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a  t, "%s: %s\n", z
8c00: 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b  Caption, buf.p);
8c10: 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  .  fflush(stdout
8c20: 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
8c30: 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c  ree(&buf);.}.#el
8c40: 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35  se.# define fts5
8c50: 50 72 69 6e 74 53 74 72 75 63 74 75 72 65 28 78  PrintStructure(x
8c60: 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74  ,y).#endif..stat
8c70: 69 63 20 69 6e 74 20 66 74 73 35 53 65 67 6d 65  ic int fts5Segme
8c80: 6e 74 53 69 7a 65 28 46 74 73 35 53 74 72 75 63  ntSize(Fts5Struc
8c90: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
8ca0: 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 31 20 2b  g){.  return 1 +
8cb0: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
8cc0: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
8cd0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
8ce0: 72 6e 20 61 20 63 6f 70 79 20 6f 66 20 69 6e 64  rn a copy of ind
8cf0: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
8d00: 72 75 63 74 2e 20 45 78 63 65 70 74 2c 20 70 72  ruct. Except, pr
8d10: 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a  omote as many .*
8d20: 2a 20 73 65 67 6d 65 6e 74 73 20 61 73 20 70 6f  * segments as po
8d30: 73 73 69 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20  ssible to level 
8d40: 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20  iPromote. If an 
8d50: 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  OOM occurs, NULL
8d60: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
8d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8d80: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
8d90: 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74 73 35 49  omoteTo(.  Fts5I
8da0: 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69  ndex *p,.  int i
8db0: 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73  Promote,.  int s
8dc0: 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35  zPromote,.  Fts5
8dd0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8de0: 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20  ct.){.  int il, 
8df0: 69 73 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  is;.  Fts5Struct
8e00: 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d  ureLevel *pOut =
8e10: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
8e20: 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20  l[iPromote];..  
8e30: 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65  if( pOut->nMerge
8e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
8e50: 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c  l=iPromote+1; il
8e60: 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
8e70: 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46  ; il++){.      F
8e80: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
8e90: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75  l *pLvl = &pStru
8ea0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a  ct->aLevel[il];.
8eb0: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
8ec0: 6e 4d 65 72 67 65 20 29 20 72 65 74 75 72 6e 3b  nMerge ) return;
8ed0: 0a 20 20 20 20 20 20 66 6f 72 28 69 73 3d 70 4c  .      for(is=pL
8ee0: 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d  vl->nSeg-1; is>=
8ef0: 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20  0; is--){.      
8f00: 20 20 69 6e 74 20 73 7a 20 3d 20 66 74 73 35 53    int sz = fts5S
8f10: 65 67 6d 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c  egmentSize(&pLvl
8f20: 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20  ->aSeg[is]);.   
8f30: 20 20 20 20 20 69 66 28 20 73 7a 3e 73 7a 50 72       if( sz>szPr
8f40: 6f 6d 6f 74 65 20 29 20 72 65 74 75 72 6e 3b 0a  omote ) return;.
8f50: 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75          fts5Stru
8f60: 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
8f70: 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
8f80: 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31  , iPromote, 1, 1
8f90: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
8fa0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
8fb0: 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 4f         memcpy(pO
8fc0: 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  ut->aSeg, &pLvl-
8fd0: 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f  >aSeg[is], sizeo
8fe0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8ff0: 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20 20 20 20  egment));.      
9000: 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a    pOut->nSeg++;.
9010: 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53          pLvl->nS
9020: 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eg--;.      }.  
9030: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
9040: 20 41 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 68   A new segment h
9050: 61 73 20 6a 75 73 74 20 62 65 65 6e 20 77 72 69  as just been wri
9060: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c  tten to level iL
9070: 76 6c 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  vl of index stru
9080: 63 74 75 72 65 0a 2a 2a 20 70 53 74 72 75 63 74  cture.** pStruct
9090: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
90a0: 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 6e  determines if an
90b0: 79 20 73 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c  y segments shoul
90c0: 64 20 62 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a  d be promoted.**
90d0: 20 61 73 20 61 20 72 65 73 75 6c 74 2e 20 53 65   as a result. Se
90e0: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
90f0: 74 65 64 20 69 6e 20 74 77 6f 20 73 63 65 6e 61  ted in two scena
9100: 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  rios:.**.**   a)
9110: 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20   If the segment 
9120: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73 20  just written is 
9130: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65  smaller than one
9140: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
9150: 73 0a 2a 2a 20 20 20 20 20 20 77 69 74 68 69 6e  s.**      within
9160: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 6f   the previous po
9170: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 69  pulated level, i
9180: 74 20 69 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f  t is promoted to
9190: 20 74 68 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a   the previous.**
91a0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 64 20        populated 
91b0: 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62  level..**.**   b
91c0: 29 20 49 66 20 74 68 65 20 73 65 67 6d 65 6e 74  ) If the segment
91d0: 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 69 73   just written is
91e0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
91f0: 20 6e 65 77 65 73 74 20 73 65 67 6d 65 6e 74 20   newest segment 
9200: 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68 65 20 6e  on.**      the n
9210: 65 78 74 20 70 6f 70 75 6c 61 74 65 64 20 6c 65  ext populated le
9220: 76 65 6c 2c 20 74 68 65 6e 20 74 68 61 74 20 73  vel, then that s
9230: 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20  egment, and any 
9240: 6f 74 68 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a  other adjacent.*
9250: 2a 20 20 20 20 20 20 73 65 67 6d 65 6e 74 73 20  *      segments 
9260: 74 68 61 74 20 61 72 65 20 61 6c 73 6f 20 73 6d  that are also sm
9270: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 6f  aller than the o
9280: 6e 65 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  ne just written,
9290: 20 61 72 65 20 0a 2a 2a 20 20 20 20 20 20 70 72   are .**      pr
92a0: 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49  omoted. .**.** I
92b0: 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65  f one or more se
92c0: 67 6d 65 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f  gments are promo
92d0: 74 65 64 2c 20 74 68 65 20 73 74 72 75 63 74 75  ted, the structu
92e0: 72 65 20 6f 62 6a 65 63 74 20 69 73 20 75 70 64  re object is upd
92f0: 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65  ated.** to refle
9300: 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74  ct this..*/.stat
9310: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
9320: 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20  cturePromote(.  
9330: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9350: 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
9360: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
9370: 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
9380: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
9390: 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75 73 74 20  ndex level just 
93a0: 75 70 64 61 74 65 64 20 2a 2f 0a 20 20 46 74 73  updated */.  Fts
93b0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
93c0: 75 63 74 20 20 20 20 20 20 20 20 20 20 2f 2a 20  uct          /* 
93d0: 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
93e0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
93f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
9400: 20 20 20 20 69 6e 74 20 69 54 73 74 3b 0a 20 20      int iTst;.  
9410: 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d    int iPromote =
9420: 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50   -1;.    int szP
9430: 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20 20 20 20  romote = 0;     
9440: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74         /* Promot
9450: 65 20 61 6e 79 74 68 69 6e 67 20 74 68 69 73 20  e anything this 
9460: 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20  size or smaller 
9470: 2a 2f 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  */.    Fts5Struc
9480: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
9490: 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20  g;   /* Segment 
94a0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
94b0: 20 20 20 20 69 6e 74 20 73 7a 53 65 67 3b 20 20      int szSeg;  
94c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94d0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 65 67    /* Size of seg
94e0: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
94f0: 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  n */.    int nSe
9500: 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  g = pStruct->aLe
9510: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
9520: 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3d 3d 30  .    if( nSeg==0
9530: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
9540: 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Seg = &pStruct->
9550: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
9560: 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g[pStruct->aLeve
9570: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b  l[iLvl].nSeg-1];
9580: 0a 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20  .    szSeg = (1 
9590: 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  + pSeg->pgnoLast
95a0: 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   - pSeg->pgnoFir
95b0: 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  st);..    /* Che
95c0: 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e  ck for condition
95d0: 20 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28   (a) */.    for(
95e0: 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73  iTst=iLvl-1; iTs
95f0: 74 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d  t>=0 && pStruct-
9600: 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53  >aLevel[iTst].nS
9610: 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a  eg==0; iTst--);.
9620: 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20      if( iTst>=0 
9630: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
9640: 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20        int szMax 
9650: 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53  = 0;.      Fts5S
9660: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
9670: 54 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Tst = &pStruct->
9680: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20  aLevel[iTst];.  
9690: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74      assert( pTst
96a0: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20  ->nMerge==0 );. 
96b0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
96c0: 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  pTst->nSeg; i++)
96d0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
96e0: 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   = pTst->aSeg[i]
96f0: 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74  .pgnoLast - pTst
9700: 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69  ->aSeg[i].pgnoFi
9710: 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  rst + 1;.       
9720: 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20   if( sz>szMax ) 
9730: 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20  szMax = sz;.    
9740: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a    }.      if( sz
9750: 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20  Max>=szSeg ){.  
9760: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69        /* Conditi
9770: 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20  on (a) is true. 
9780: 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65  Promote the newe
9790: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65  st segment on le
97a0: 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  vel .        ** 
97b0: 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54  iLvl to level iT
97c0: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
97d0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b  iPromote = iTst;
97e0: 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f  .        szPromo
97f0: 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20  te = szMax;.    
9800: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9810: 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28  * If condition (
9820: 61 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61  a) is not met, a
9830: 73 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75  ssume (b) is tru
9840: 65 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d  e. StructureProm
9850: 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69  oteTo().    ** i
9860: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20  s a no-op if it 
9870: 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20  is not.  */.    
9880: 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29  if( iPromote<0 )
9890: 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65  {.      iPromote
98a0: 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73   = iLvl;.      s
98b0: 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67  zPromote = szSeg
98c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
98d0: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
98e0: 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  To(p, iPromote, 
98f0: 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75  szPromote, pStru
9900: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
9910: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
9920: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
9930: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
9940: 65 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20  ent. If the end 
9950: 6f 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69  of the .** docli
9960: 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73  st-index page is
9970: 20 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e   reached, return
9980: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74   non-zero..*/.st
9990: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
99a0: 64 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c  dxLvlNext(Fts5Dl
99b0: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20  idxLvl *pLvl){. 
99c0: 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
99d0: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a   = pLvl->pData;.
99e0: 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66  .  if( pLvl->iOf
99f0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  f==0 ){.    asse
9a00: 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d  rt( pLvl->bEof==
9a10: 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  0 );.    pLvl->i
9a20: 4f 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76  Off = 1;.    pLv
9a30: 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  l->iOff += fts5G
9a40: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
9a50: 61 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69  a->p[1], pLvl->i
9a60: 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70  LeafPgno);.    p
9a70: 4c 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73  Lvl->iOff += fts
9a80: 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
9a90: 61 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d  a->p[pLvl->iOff]
9aa0: 2c 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69  , (u64*)&pLvl->i
9ab0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c  Rowid);.    pLvl
9ac0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c  ->iFirstOff = pL
9ad0: 76 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73  vl->iOff;.  }els
9ae0: 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  e{.    int iOff;
9af0: 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c  .    for(iOff=pL
9b00: 76 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70  vl->iOff; iOff<p
9b10: 44 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b  Data->nn; iOff++
9b20: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  ){.      if( pDa
9b30: 74 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72  ta->p[iOff] ) br
9b40: 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20  eak; .    }..   
9b50: 20 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d   if( iOff<pData-
9b60: 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34  >nn ){.      i64
9b70: 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76   iVal;.      pLv
9b80: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20  l->iLeafPgno += 
9b90: 28 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f  (iOff - pLvl->iO
9ba0: 66 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69  ff) + 1;.      i
9bb0: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
9bc0: 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
9bd0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
9be0: 6c 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  l);.      pLvl->
9bf0: 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
9c00: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66        pLvl->iOff
9c10: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c   = iOff;.    }el
9c20: 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  se{.      pLvl->
9c30: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
9c40: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
9c50: 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a  vl->bEof;.}../*.
9c60: 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69  ** Advance the i
9c70: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
9c80: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
9c90: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
9ca0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
9cb0: 4e 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20  NextR(Fts5Index 
9cc0: 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65  *p, Fts5DlidxIte
9cd0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c  r *pIter, int iL
9ce0: 76 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  vl){.  Fts5Dlidx
9cf0: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
9d00: 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a  er->aLvl[iLvl];.
9d10: 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
9d20: 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20  pIter->nLvl );. 
9d30: 20 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76   if( fts5DlidxLv
9d40: 6c 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20  lNext(pLvl) ){. 
9d50: 20 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20     if( (iLvl+1) 
9d60: 3c 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b  < pIter->nLvl ){
9d70: 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
9d80: 49 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74  IterNextR(p, pIt
9d90: 65 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20  er, iLvl+1);.   
9da0: 20 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62     if( pLvl[1].b
9db0: 45 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Eof==0 ){.      
9dc0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
9dd0: 65 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a  e(pLvl->pData);.
9de0: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70          memset(p
9df0: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
9e00: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
9e10: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61         pLvl->pDa
9e20: 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
9e30: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  d(p, .          
9e40: 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57    FTS5_DLIDX_ROW
9e50: 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64  ID(pIter->iSegid
9e60: 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e  , iLvl, pLvl[1].
9e70: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
9e80: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
9e90: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20  ( pLvl->pData ) 
9ea0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
9eb0: 28 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a  (pLvl);.      }.
9ec0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
9ed0: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
9ee0: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69  0].bEof;.}.stati
9ef0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
9f00: 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65  terNext(Fts5Inde
9f10: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
9f20: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
9f30: 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49  eturn fts5DlidxI
9f40: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
9f50: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
9f60: 54 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  The iterator pas
9f70: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
9f80: 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68   argument has th
9f90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
9fa0: 64 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c  ds set.** as fol
9fb0: 6c 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74  lows. This funct
9fc0: 69 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20  ion sets up the 
9fd0: 72 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72  rest of the iter
9fe0: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a  ator so that it.
9ff0: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
a000: 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
a010: 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
a020: 78 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61  x..**.**   pData
a030: 3a 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72  :.**     pointer
a040: 20 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   to doclist-inde
a050: 78 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a  x record, .**.**
a060: 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
a070: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49  ion is called pI
a080: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69  ter->iLeafPgno i
a090: 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
a0a0: 72 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74  r the.** doclist
a0b0: 20 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77   is associated w
a0c0: 69 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61  ith (the one fea
a0d0: 74 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29  turing the term)
a0e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a0f0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72  fts5DlidxIterFir
a100: 73 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  st(Fts5DlidxIter
a110: 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
a120: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
a130: 70 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b  pIter->nLvl; i++
a140: 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78  ){.    fts5Dlidx
a150: 4c 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e  LvlNext(&pIter->
a160: 61 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  aLvl[i]);.  }.  
a170: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
a180: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a  vl[0].bEof;.}...
a190: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a1a0: 6c 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35  lidxIterEof(Fts5
a1b0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
a1c0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
a1d0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21  .  return p->rc!
a1e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
a1f0: 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f  ter->aLvl[0].bEo
a200: 66 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  f;.}..static voi
a210: 64 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c  d fts5DlidxIterL
a220: 61 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ast(Fts5Index *p
a230: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
a240: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
a250: 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20  ;..  /* Advance 
a260: 65 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68  each level to th
a270: 65 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20  e last entry on 
a280: 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f  the last page */
a290: 0a 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e  .  for(i=pIter->
a2a0: 6e 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53  nLvl-1; p->rc==S
a2b0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30  QLITE_OK && i>=0
a2c0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35  ; i--){.    Fts5
a2d0: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
a2e0: 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d   &pIter->aLvl[i]
a2f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73  ;.    while( fts
a300: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
a310: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c  vl)==0 );.    pL
a320: 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20  vl->bEof = 0;.. 
a330: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
a340: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
a350: 20 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c   *pChild = &pLvl
a360: 5b 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  [-1];.      fts5
a370: 44 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69  DataRelease(pChi
a380: 6c 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  ld->pData);.    
a390: 20 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c    memset(pChild,
a3a0: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
a3b0: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
a3c0: 20 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d   pChild->pData =
a3d0: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
a3e0: 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35   .          FTS5
a3f0: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74  _DLIDX_ROWID(pIt
a400: 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c  er->iSegid, i-1,
a410: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a420: 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
a430: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  .  }.}../*.** Mo
a440: 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
a450: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a460: 6c 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ly argument to t
a470: 68 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72  he previous entr
a480: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
a490: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65   fts5DlidxLvlPre
a4a0: 76 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a  v(Fts5DlidxLvl *
a4b0: 70 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66  pLvl){.  int iOf
a4c0: 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a  f = pLvl->iOff;.
a4d0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d  .  assert( pLvl-
a4e0: 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66  >bEof==0 );.  if
a4f0: 28 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46  ( iOff<=pLvl->iF
a500: 69 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70  irstOff ){.    p
a510: 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  Lvl->bEof = 1;. 
a520: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a   }else{.    u8 *
a530: 61 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d  a = pLvl->pData-
a540: 3e 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c  >p;.    i64 iVal
a550: 3b 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74  ;.    int iLimit
a560: 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
a570: 20 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b    int nZero = 0;
a580: 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  ..    /* Current
a590: 6c 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74  ly iOff points t
a5a0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
a5b0: 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68   of a varint. Th
a5c0: 69 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a  is block .    **
a5d0: 20 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66   decrements iOff
a5e0: 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
a5f0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
a600: 74 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f  te of the previo
a610: 75 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e  us .    ** varin
a620: 74 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e  t. Taking care n
a630: 6f 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d  ot to read any m
a640: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20  emory locations 
a650: 74 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a  that occur.    *
a660: 2a 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66  * before the buf
a670: 66 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  fer in memory.  
a680: 2a 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20  */.    iLimit = 
a690: 28 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39  (iOff>9 ? iOff-9
a6a0: 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69   : 0);.    for(i
a6b0: 4f 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d  Off--; iOff>iLim
a6c0: 69 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20  it; iOff--){.   
a6d0: 20 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31     if( (a[iOff-1
a6e0: 5d 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62  ] & 0x80)==0 ) b
a6f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
a700: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
a710: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
a720: 69 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  iVal);.    pLvl-
a730: 3e 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b  >iRowid -= iVal;
a740: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66  .    pLvl->iLeaf
a750: 50 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20  Pgno--;..    /* 
a760: 53 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70  Skip backwards p
a770: 61 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72  ast any 0x00 var
a780: 69 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  ints. */.    for
a790: 28 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d  (ii=iOff-1; ii>=
a7a0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
a7b0: 26 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20  && a[ii]==0x00; 
a7c0: 69 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65  ii--){.      nZe
a7d0: 72 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ro++;.    }.    
a7e0: 69 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46  if( ii>=pLvl->iF
a7f0: 69 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69  irstOff && (a[ii
a800: 5d 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20  ] & 0x80) ){.   
a810: 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69     /* The byte i
a820: 6d 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72  mmediately befor
a830: 65 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20  e the last 0x00 
a840: 62 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38  byte has the 0x8
a850: 30 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73  0 bit.      ** s
a860: 65 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20  et. So the last 
a870: 30 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76  0x00 is only a v
a880: 61 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65  arint 0 if there
a890: 20 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30   are 8 more 0x80
a8a0: 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
a8b0: 62 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f  before a[ii]. */
a8c0: 0a 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f  .      int bZero
a8d0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
a8e0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61     /* True if la
a8f0: 73 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a  st 0x00 counts *
a900: 2f 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d  /.      if( (ii-
a910: 38 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  8)>=pLvl->iFirst
a920: 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Off ){.        i
a930: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt j;.        fo
a940: 72 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28  r(j=1; j<=8 && (
a950: 61 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b  a[ii-j] & 0x80);
a960: 20 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62   j++);.        b
a970: 5a 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20  Zero = (j>8);.  
a980: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a990: 62 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f  bZero==0 ) nZero
a9a0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  --;.    }.    pL
a9b0: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d  vl->iLeafPgno -=
a9c0: 20 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c   nZero;.    pLvl
a9d0: 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20  ->iOff = iOff - 
a9e0: 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65  nZero;.  }..  re
a9f0: 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b  turn pLvl->bEof;
aa00: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
aa10: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
aa20: 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  R(Fts5Index *p, 
aa30: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
aa40: 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b  Iter, int iLvl){
aa50: 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  .  Fts5DlidxLvl 
aa60: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
aa70: 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61  aLvl[iLvl];..  a
aa80: 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65  ssert( iLvl<pIte
aa90: 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28  r->nLvl );.  if(
aaa0: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65   fts5DlidxLvlPre
aab0: 76 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69  v(pLvl) ){.    i
aac0: 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49  f( (iLvl+1) < pI
aad0: 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20  ter->nLvl ){.   
aae0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
aaf0: 50 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20  PrevR(p, pIter, 
ab00: 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69  iLvl+1);.      i
ab10: 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d  f( pLvl[1].bEof=
ab20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
ab30: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
ab40: 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  vl->pData);.    
ab50: 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c      memset(pLvl,
ab60: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
ab70: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
ab80: 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
ab90: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
aba0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54   .            FT
abb0: 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
abc0: 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c  Iter->iSegid, iL
abd0: 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61  vl, pLvl[1].iLea
abe0: 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  fPgno).        )
abf0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
ac00: 76 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20  vl->pData ){.   
ac10: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74         while( ft
ac20: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
ac30: 4c 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lvl)==0 );.     
ac40: 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20       pLvl->bEof 
ac50: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
ac60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ac70: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
ac80: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
ac90: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  }.static int fts
aca0: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46  5DlidxIterPrev(F
acb0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
acc0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
acd0: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  r){.  return fts
ace0: 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28  5DlidxIterPrevR(
acf0: 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a  p, pIter, 0);.}.
ad00: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f  ./*.** Free a do
ad10: 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72  clist-index iter
ad20: 61 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f  ator object allo
ad30: 63 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69  cated by fts5Dli
ad40: 64 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f  dxIterInit()..*/
ad50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ad60: 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46  5DlidxIterFree(F
ad70: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
ad80: 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
ad90: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
ada0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
adb0: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
adc0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
add0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61  Release(pIter->a
ade0: 4c 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20  Lvl[i].pData);. 
adf0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ae00: 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  _free(pIter);.  
ae10: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35  }.}..static Fts5
ae20: 44 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44  DlidxIter *fts5D
ae30: 6c 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20  lidxIterInit(.  
ae40: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 2f 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20  /* Fts5 Backend 
ae70: 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
ae80: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c  n */.  int bRev,
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
aeb0: 6f 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20  or ORDER BY ASC 
aec0: 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  */.  int iSegid,
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
aef0: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  id */.  int iLea
af00: 66 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20  fPg             
af10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20          /* Leaf 
af20: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c  page number to l
af30: 6f 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f  oad dlidx for */
af40: 0a 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49  .){.  Fts5DlidxI
af50: 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a  ter *pIter = 0;.
af60: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62    int i;.  int b
af70: 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  Done = 0;..  for
af80: 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c  (i=0; p->rc==SQL
af90: 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d  ITE_OK && bDone=
afa0: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  =0; i++){.    in
afb0: 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66  t nByte = sizeof
afc0: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 20  (Fts5DlidxIter) 
afd0: 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  + i * sizeof(Fts
afe0: 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20  5DlidxLvl);.    
aff0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b000: 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d  New;..    pNew =
b010: 20 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a   (Fts5DlidxIter*
b020: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
b030: 28 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a  (pIter, nByte);.
b040: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
b050: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
b060: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
b070: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b080: 69 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53  i64 iRowid = FTS
b090: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53  5_DLIDX_ROWID(iS
b0a0: 65 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67  egid, i, iLeafPg
b0b0: 29 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  );.      Fts5Dli
b0c0: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
b0d0: 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  New->aLvl[i];.  
b0e0: 20 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77      pIter = pNew
b0f0: 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  ;.      memset(p
b100: 4c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  Lvl, 0, sizeof(F
b110: 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20  ts5DlidxLvl));. 
b120: 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61       pLvl->pData
b130: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
b140: 70 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  p, iRowid);.    
b150: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
b160: 61 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74  a && (pLvl->pDat
b170: 61 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31  a->p[0] & 0x0001
b180: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
b190: 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20  bDone = 1;.     
b1a0: 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e   }.      pIter->
b1b0: 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20  nLvl = i+1;.    
b1c0: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
b1d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b1e0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67  .    pIter->iSeg
b1f0: 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
b200: 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
b210: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
b220: 74 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b  terFirst(pIter);
b230: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b240: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c    fts5DlidxIterL
b250: 61 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  ast(p, pIter);. 
b260: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
b270: 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
b280: 20 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64   ){.    fts5Dlid
b290: 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29  xIterFree(pIter)
b2a0: 3b 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b  ;.    pIter = 0;
b2b0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
b2c0: 49 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Iter;.}..static 
b2d0: 69 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65  i64 fts5DlidxIte
b2e0: 72 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78  rRowid(Fts5Dlidx
b2f0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
b300: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
b310: 76 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a  vl[0].iRowid;.}.
b320: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
b330: 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73  lidxIterPgno(Fts
b340: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
b350: 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74  r){.  return pIt
b360: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61  er->aLvl[0].iLea
b370: 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fPgno;.}../*.** 
b380: 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65  Load the next le
b390: 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  af page into the
b3a0: 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
b3b0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  r..*/.static voi
b3c0: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
b3d0: 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64  tPage(.  Fts5Ind
b3e0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
b3f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
b400: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
b410: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
b420: 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20   *pIter         
b430: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
b440: 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e   to advance to n
b450: 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  ext page */.){. 
b460: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
b470: 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
b480: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d  eSegment *pSeg =
b490: 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20   pIter->pSeg;.  
b4a0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
b4b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
b4c0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
b4d0: 6f 2b 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72  o++;.  if( pIter
b4e0: 2d 3e 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20  ->pNextLeaf ){. 
b4f0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
b500: 3d 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  = pIter->pNextLe
b510: 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  af;.    pIter->p
b520: 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20  NextLeaf = 0;.  
b530: 7d 65 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d  }else if( pIter-
b540: 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67  >iLeafPgno<=pSeg
b550: 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
b560: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
b570: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
b580: 20 0a 20 20 20 20 20 20 20 20 46 54 53 35 5f 53   .        FTS5_S
b590: 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
b5a0: 67 2d 3e 69 53 65 67 69 64 2c 20 70 49 74 65 72  g->iSegid, pIter
b5b0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ->iLeafPgno).   
b5c0: 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
b5d0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
b5e0: 30 3b 0a 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d  0;.  }.  pLeaf =
b5f0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a   pIter->pLeaf;..
b600: 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
b610: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
b620: 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  Off = pLeaf->szL
b630: 65 61 66 3b 0a 20 20 20 20 69 66 28 20 66 74 73  eaf;.    if( fts
b640: 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
b650: 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20 20  pLeaf) ){.      
b660: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
b670: 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e  list = pLeaf->nn
b680: 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  +1;.    }else{. 
b690: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69       pIter->iPgi
b6a0: 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
b6b0: 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
b6c0: 3e 70 5b 70 49 74 65 72 2d 3e 69 50 67 69 64 78  >p[pIter->iPgidx
b6d0: 4f 66 66 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  Off],.          
b6e0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
b6f0: 6c 69 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20  list.      );.  
b700: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
b710: 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   Argument p poin
b720: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
b730: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69  ontaining a vari
b740: 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72  nt to be interpr
b750: 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73  eted as a.** pos
b760: 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
b770: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
b780: 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72  varint and retur
b790: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b7a0: 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42  bytes.** read. B
b7b0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
b7c0: 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68   set *pnSz to th
b7d0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
b7e0: 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s in the positio
b7f0: 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a  n.** list, and *
b800: 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66  pbDel to true if
b810: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
b820: 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73   is set, or fals
b830: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
b840: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47  static int fts5G
b850: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f  etPoslistSize(co
b860: 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a  nst u8 *p, int *
b870: 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c  pnSz, int *pbDel
b880: 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20  ){.  int nSz;.  
b890: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73  int n = 0;.  fts
b8a0: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
b8b0: 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61  (p, n, nSz);.  a
b8c0: 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30  ssert_nc( nSz>=0
b8d0: 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53   );.  *pnSz = nS
b8e0: 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20  z/2;.  *pbDel = 
b8f0: 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20 20  nSz & 0x0001;.  
b900: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
b910: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
b920: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
b930: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
b940: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
b950: 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c   a.** position-l
b960: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
b970: 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f  Read the value o
b980: 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64 20  f the field and 
b990: 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74  store it.** in t
b9a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72  he following var
b9b0: 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  iables:.**.**   
b9c0: 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f 73  Fts5SegIter.nPos
b9d0: 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65  .**   Fts5SegIte
b9e0: 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61  r.bDel.**.** Lea
b9f0: 76 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ve Fts5SegIter.i
ba00: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
ba10: 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
ba20: 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a   byte of the .**
ba30: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
ba40: 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29 2e  ontent (if any).
ba50: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ba60: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
ba70: 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Pos(Fts5Index *p
ba80: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
ba90: 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Iter){.  if( p->
baa0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bab0: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  .    int iOff = 
bac0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
bad0: 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74  et;  /* Offset t
bae0: 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 20  o read at */.   
baf0: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 41 53   int nSz;.    AS
bb00: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
bb10: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bb20: 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
bb30: 69 6e 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65  int32(pIter->pLe
bb40: 61 66 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a  af->p, iOff, nSz
bb50: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44  );.    pIter->bD
bb60: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
bb70: 30 31 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01);.    pIter->
bb80: 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20  nPos = nSz>>1;. 
bb90: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
bba0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
bbb0: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
bbc0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
bbd0: 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 20  Rowid(Fts5Index 
bbe0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
bbf0: 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61  *pIter){.  u8 *a
bc00: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
bc10: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
bc20: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
bc30: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
bc40: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
bc50: 65 61 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53  eafOffset;..  AS
bc60: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
bc70: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bc80: 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d  if( iOff>=pIter-
bc90: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
bca0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
bcb0: 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
bcc0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
bcd0: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a  er->pLeaf==0 ){.
bce0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
bcf0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e  =SQLITE_OK ) p->
bd00: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
bd10: 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  T;.      return;
bd20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
bd30: 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74  = 4;.    a = pIt
bd40: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
bd50: 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69  }.  iOff += sqli
bd60: 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
bd70: 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  (&a[iOff], (u64*
bd80: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
bd90: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ;.  pIter->iLeaf
bda0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d  Offset = iOff;.}
bdb0: 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49  ../*.** Fts5SegI
bdc0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
bdd0: 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
bde0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
bdf0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e  te of the .** "n
be00: 53 75 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66  Suffix" field of
be10: 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f   a term. Functio
be20: 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65  n parameter nKee
be30: 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76  p contains the v
be40: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22  alue.** of the "
be50: 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64 20 28  nPrefix" field (
be60: 69 66 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65  if there was one
be70: 20 2d 20 69 74 20 69 73 20 70 61 73 73 65 64 20   - it is passed 
be80: 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20  0 if this is.** 
be90: 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 69  the first term i
bea0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a  n the segment)..
beb0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
bec0: 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a  ion populates:.*
bed0: 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  *.**   Fts5SegIt
bee0: 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73  er.term.**   Fts
bef0: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a  5SegIter.rowid.*
bf00: 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79  *.** accordingly
bf10: 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73   and leaves (Fts
bf20: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
bf30: 66 73 65 74 29 20 73 65 74 20 74 6f 20 74 68 65  fset) set to the
bf40: 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74   content of.** t
bf50: 68 65 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f  he first positio
bf60: 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69  n list. The posi
bf70: 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67  tion list belong
bf80: 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20  ing to document 
bf90: 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74 65 72  .** (Fts5SegIter
bfa0: 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61  .iRowid)..*/.sta
bfb0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
bfc0: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73  IterLoadTerm(Fts
bfd0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
bfe0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  egIter *pIter, i
bff0: 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20  nt nKeep){.  u8 
c000: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
c010: 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  f->p;        /* 
c020: 42 75 66 66 65 72 20 74 6f 20 72 65 61 64 20 64  Buffer to read d
c030: 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ata from */.  in
c040: 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e  t iOff = pIter->
c050: 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a  iLeafOffset;  /*
c060: 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61 64 20   Offset to read 
c070: 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77  at */.  int nNew
c080: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c090: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
c0a0: 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a   of new data */.
c0b0: 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  .  iOff += fts5G
c0c0: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
c0d0: 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49  ff], nNew);.  pI
c0e0: 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b  ter->term.n = nK
c0f0: 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65  eep;.  fts5Buffe
c100: 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
c110: 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
c120: 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d  , nNew, &a[iOff]
c130: 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65  );.  iOff += nNe
c140: 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  w;.  pIter->iTer
c150: 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  mLeafOffset = iO
c160: 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65  ff;.  pIter->iTe
c170: 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74  rmLeafPgno = pIt
c180: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
c190: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c1a0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69  set = iOff;..  i
c1b0: 66 28 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78  f( pIter->iPgidx
c1c0: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
c1d0: 66 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74  f->nn ){.    pIt
c1e0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
c1f0: 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  t = pIter->pLeaf
c200: 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b  ->nn+1;.  }else{
c210: 0a 20 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  .    int nExtra;
c220: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69  .    pIter->iPgi
c230: 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  dxOff += fts5Get
c240: 56 61 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65  Varint32(&a[pIte
c250: 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  r->iPgidxOff], n
c260: 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65  Extra);.    pIte
c270: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
c280: 20 2b 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a   += nExtra;.  }.
c290: 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
c2a0: 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72  adRowid(p, pIter
c2b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  );.}../*.** Init
c2c0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
c2d0: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
c2e0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
c2f0: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
c300: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
c310: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
c320: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
c330: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
c340: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
c350: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
c360: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
c370: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
c380: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
c390: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
c3a0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
c3b0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
c3c0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
c3d0: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
c3e0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
c3f0: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
c400: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
c410: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
c420: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
c430: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
c440: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
c450: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
c460: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
c470: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
c480: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
c490: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
c4a0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
c4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c4c0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
c4d0: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
c4e0: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
c4f0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
c500: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
c510: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
c520: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
c530: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
c540: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
c550: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
c560: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
c570: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
c580: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
c590: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
c5a0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
c5b0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
c5c0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
c5d0: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
c5e0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
c5f0: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
c600: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
c610: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
c620: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
c630: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
c640: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
c650: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
c660: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
c670: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c680: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
c690: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
c6a0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70  (*pIter));.    p
c6b0: 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65  Iter->pSeg = pSe
c6c0: 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  g;.    pIter->iL
c6d0: 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  eafPgno = pSeg->
c6e0: 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20  pgnoFirst-1;.   
c6f0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
c700: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
c710: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
c720: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
c730: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
c740: 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61  ffset = 4;.    a
c750: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
c760: 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a  >pLeaf->nn>4 );.
c770: 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
c780: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
c790: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d  (pIter->pLeaf)==
c7a0: 34 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  4 );.    pIter->
c7b0: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65  iPgidxOff = pIte
c7c0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
c7d0: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
c7e0: 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
c7f0: 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74  Iter, 0);.    ft
c800: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f  s5SegIterLoadNPo
c810: 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  s(p, pIter);.  }
c820: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
c830: 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
c840: 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69  ever called on i
c850: 74 65 72 61 74 6f 72 73 20 63 72 65 61 74 65 64  terators created
c860: 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20   by calls to.** 
c870: 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
c880: 20 77 69 74 68 20 74 68 65 20 46 54 53 35 49 4e   with the FTS5IN
c890: 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66  DEX_QUERY_DESC f
c8a0: 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54  lag set..**.** T
c8b0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 69  he iterator is i
c8c0: 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61  n an unusual sta
c8d0: 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
c8e0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a  ction is called:
c8f0: 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49   the.** Fts5SegI
c900: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
c910: 76 61 72 69 61 62 6c 65 20 69 73 20 73 65 74 20  variable is set 
c920: 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66  to the offset of
c930: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
c940: 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
c950: 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f  st size field fo
c960: 72 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65  r the first rele
c970: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
c980: 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53  e page..** Fts5S
c990: 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20  egIter.rowid is 
c9a0: 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e  set, but nPos an
c9b0: 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a  d bDel are not..
c9c0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
c9d0: 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65  ion advances the
c9e0: 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61   iterator so tha
c9f0: 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  t it points to t
ca00: 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65  he last .** rele
ca10: 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  vant rowid on th
ca20: 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e  e page and, if n
ca30: 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61  ecessary, initia
ca40: 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52  lizes the .** aR
ca50: 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64  owidOffset[] and
ca60: 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61   iRowidOffset va
ca70: 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73  riables. At this
ca80: 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61   point the itera
ca90: 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73  tor.** is in its
caa0: 20 72 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d   regular state -
cab0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65   Fts5SegIter.iLe
cac0: 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20  afOffset points 
cad0: 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  to the first.** 
cae0: 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69  byte of the posi
caf0: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
cb00: 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
cb10: 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f  h said rowid..*/
cb20: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
cb30: 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49  5SegIterReverseI
cb40: 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e 64 65  nitPage(Fts5Inde
cb50: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
cb60: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
cb70: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61   n = pIter->pLea
cb80: 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74  f->szLeaf;.  int
cb90: 20 69 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61   i = pIter->iLea
cba0: 66 4f 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61  fOffset;.  u8 *a
cbb0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cbc0: 3e 70 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64  >p;.  int iRowid
cbd0: 4f 66 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69  Offset = 0;..  i
cbe0: 66 28 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64  f( n>pIter->iEnd
cbf0: 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  ofDoclist ){.   
cc00: 20 6e 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64   n = pIter->iEnd
cc10: 6f 66 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a  ofDoclist;.  }..
cc20: 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f    ASSERT_SZLEAF_
cc30: 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  OK(pIter->pLeaf)
cc40: 3b 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ;.  while( 1 ){.
cc50: 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d      i64 iDelta =
cc60: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73   0;.    int nPos
cc70: 3b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79  ;.    int bDummy
cc80: 3b 0a 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35  ;..    i += fts5
cc90: 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
cca0: 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  a[i], &nPos, &bD
ccb0: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20  ummy);.    i += 
ccc0: 6e 50 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e  nPos;.    if( i>
ccd0: 3d 6e 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =n ) break;.    
cce0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
ccf0: 6e 74 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29  nt(&a[i], (u64*)
cd00: 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49  &iDelta);.    pI
cd10: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
cd20: 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20  Delta;..    if( 
cd30: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49  iRowidOffset>=pI
cd40: 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65  ter->nRowidOffse
cd50: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
cd60: 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f  New = pIter->nRo
cd70: 77 69 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20  widOffset + 8;. 
cd80: 20 20 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d       int *aNew =
cd90: 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
cda0: 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52  ealloc(pIter->aR
cdb0: 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77  owidOffset, nNew
cdc0: 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
cdd0: 20 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30       if( aNew==0
cde0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
cdf0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
ce00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ce10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
ce20: 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
ce30: 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20  et = aNew;.     
ce40: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
ce50: 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20  fset = nNew;.   
ce60: 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
ce70: 52 6f 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77  RowidOffset[iRow
ce80: 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49  idOffset++] = pI
ce90: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
cea0: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
ceb0: 61 66 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20  afOffset = i;.  
cec0: 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69  }.  pIter->iRowi
ced0: 64 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64  dOffset = iRowid
cee0: 4f 66 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65  Offset;.  fts5Se
cef0: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
cf00: 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pIter);.}../*.*
cf10: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
cf20: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
cf30: 72 73 65 4e 65 77 50 61 67 65 28 46 74 73 35 49  rseNewPage(Fts5I
cf40: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
cf50: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
cf60: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66  assert( pIter->f
cf70: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
cf80: 54 45 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20  TER_REVERSE );. 
cf90: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
cfa0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
cfb0: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a  ITER_ONETERM );.
cfc0: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
cfd0: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
cfe0: 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  ;.  pIter->pLeaf
cff0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70   = 0;.  while( p
d000: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d010: 26 26 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  && pIter->iLeafP
d020: 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d  gno>pIter->iTerm
d030: 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
d040: 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a  Fts5Data *pNew;.
d050: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d060: 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77  Pgno--;.    pNew
d070: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
d080: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
d090: 52 4f 57 49 44 28 0a 20 20 20 20 20 20 20 20 20  ROWID(.         
d0a0: 20 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53   pIter->pSeg->iS
d0b0: 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65  egid, pIter->iLe
d0c0: 61 66 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20  afPgno.    ));. 
d0d0: 20 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20     if( pNew ){. 
d0e0: 20 20 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61       /* iTermLea
d0f0: 66 4f 66 66 73 65 74 20 6d 61 79 20 62 65 20 65  fOffset may be e
d100: 71 75 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69  qual to szLeaf i
d110: 66 20 74 68 65 20 74 65 72 6d 20 69 73 20 74 68  f the term is th
d120: 65 20 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20  e last.      ** 
d130: 74 68 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  thing on the pag
d140: 65 20 2d 20 69 2e 65 2e 20 74 68 65 20 66 69 72  e - i.e. the fir
d150: 73 74 20 72 6f 77 69 64 20 69 73 20 6f 6e 20 74  st rowid is on t
d160: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67  he following pag
d170: 65 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  e..      ** In t
d180: 68 69 73 20 63 61 73 65 20 6c 65 61 66 20 70 49  his case leaf pI
d190: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74  ter->pLeaf==0, t
d1a0: 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 73 20  his iterator is 
d1b0: 61 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20  at EOF. */.     
d1c0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
d1d0: 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54  fPgno==pIter->iT
d1e0: 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20  ermLeafPgno .   
d1f0: 20 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69 54      && pIter->iT
d200: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e  ermLeafOffset<pN
d210: 65 77 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20  ew->szLeaf .    
d220: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74    ){.        pIt
d230: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
d240: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d250: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
d260: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
d270: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c  ffset;.      }el
d280: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
d290: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
d2a0: 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66     iRowidOff = f
d2b0: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
d2c0: 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  dOff(pNew);.    
d2d0: 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
d2e0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
d2f0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e  Iter->pLeaf = pN
d300: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  ew;.          pI
d310: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d320: 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20   = iRowidOff;.  
d330: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
d340: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
d350: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
d360: 20 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65     u8 *a = &pIte
d370: 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  r->pLeaf->p[pIte
d380: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  r->iLeafOffset];
d390: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
d3a0: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66  iLeafOffset += f
d3b0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
d3c0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
d3d0: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62  owid);.        b
d3e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  reak;.      }els
d3f0: 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  e{.        fts5D
d400: 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29  ataRelease(pNew)
d410: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d420: 20 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72    }..  if( pIter
d430: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70  ->pLeaf ){.    p
d440: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
d450: 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  ist = pIter->pLe
d460: 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74  af->nn+1;.    ft
d470: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
d480: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
d490: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
d4a0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
d4b0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
d4c0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
d4d0: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
d4e0: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
d4f0: 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  o a delete marke
d500: 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b  r. A delete mark
d510: 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77  er is an entry w
d520: 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20  ith a 0 byte.** 
d530: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a  position-list..*
d540: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
d550: 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
d560: 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
d570: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
d580: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
d590: 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
d5a0: 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
d5b0: 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
d5c0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  t];.  return (p-
d5d0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
d5e0: 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26  & pSeg->pLeaf &&
d5f0: 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b   pSeg->nPos==0);
d600: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
d610: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
d620: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
d630: 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
d640: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d650: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d660: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d670: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d680: 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63   It .** is not c
d690: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
d6a0: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
d6b0: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20  or reaches EOF. 
d6c0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
d6d0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
d6e0: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
d6f0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d700: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d710: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d720: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d730: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
d740: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d750: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
d760: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
d770: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
d780: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
d790: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
d7a0: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
d7b0: 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
d7c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d7d0: 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20  UT: Set for new 
d7e0: 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  term */.){.  ass
d7f0: 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d  ert( pbNewTerm==
d800: 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d  0 || *pbNewTerm=
d810: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  =0 );.  if( p->r
d820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d830: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
d840: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
d850: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
d860: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
d870: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  er->pNextLeaf==0
d880: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
d890: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
d8a0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  t>0 ){.        u
d8b0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
d8c0: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20  eaf->p;.        
d8d0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
d8e0: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
d8f0: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
d900: 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
d910: 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74  ta;..        pIt
d920: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
d930: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  --;.        pIte
d940: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d950: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61   iOff = pIter->a
d960: 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65  RowidOffset[pIte
d970: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d  r->iRowidOffset]
d980: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
d990: 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
d9a0: 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26  Size(&a[iOff], &
d9b0: 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
d9c0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d9d0: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 66 74  nPos;.        ft
d9e0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
d9f0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
da00: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49  lta);.        pI
da10: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  ter->iRowid -= i
da20: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 66  Delta;.        f
da30: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
da40: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
da50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
da60: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
da70: 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
da80: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
da90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
daa0: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
dab0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
dac0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
dad0: 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
dae0: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
daf0: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20  nt nKeep = 0;.. 
db00: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
db10: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
db20: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
db30: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
db40: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
db50: 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d    u8 *a = pLeaf-
db60: 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
db70: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
db80: 0a 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53  ..      ASSERT_S
db90: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
dba0: 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49  .      iOff = pI
dbb0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dbc0: 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a   + pIter->nPos;.
dbd0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
dbe0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n ){.        /* 
dbf0: 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  The next entry i
dc00: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
dc10: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
dc20: 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66    assert_nc( iOf
dc30: 66 3c 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66  f<=pIter->iEndof
dc40: 44 6f 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 20  Doclist );.     
dc50: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74     if( iOff>=pIt
dc60: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
dc70: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  t ){.          b
dc80: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
dc90: 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 21         if( iOff!
dca0: 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65  =fts5LeafFirstTe
dcb0: 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a  rmOff(pLeaf) ){.
dcc0: 20 20 20 20 20 20 20 20 20 20 20 20 69 4f 66 66              iOff
dcd0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
dce0: 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b  t32(&a[iOff], nK
dcf0: 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eep);.          
dd00: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
dd10: 0a 20 20 20 20 20 20 20 20 20 20 75 36 34 20 69  .          u64 i
dd20: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20  Delta;.         
dd30: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
dd40: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
dd50: 5b 69 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29  [iOff], &iDelta)
dd60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
dd70: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
dd80: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 61  lta;.          a
dd90: 73 73 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61  ssert_nc( iDelta
dda0: 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  >0 );.        }.
ddb0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
ddc0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
ddd0: 66 3b 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f;..      }else 
dde0: 69 66 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d  if( pIter->pSeg=
ddf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  =0 ){.        co
de00: 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
de10: 30 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  0;.        const
de20: 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30   char *zTerm = 0
de30: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c  ;.        int nL
de40: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
de50: 20 61 73 73 65 72 74 28 20 28 70 49 74 65 72 2d   assert( (pIter-
de60: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
de70: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c  GITER_ONETERM) |
de80: 7c 20 70 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20  | pbNewTerm );. 
de90: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 70         if( 0==(p
dea0: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
deb0: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
dec0: 52 4d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  RM) ){.         
ded0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
dee0: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
def0: 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  h);.          sq
df00: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
df10: 6e 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c  nEntry(p->pHash,
df20: 20 26 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c   &zTerm, &pList,
df30: 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 20 20   &nList);.      
df40: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
df50: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
df60: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
df70: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
df80: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  af);.          p
df90: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
dfa0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
dfb0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
dfc0: 3e 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a  >pLeaf->p = (u8*
dfd0: 29 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  )pList;.        
dfe0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
dff0: 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  nn = nList;.    
e000: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
e010: 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
e020: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  st;.          pI
e030: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
e040: 73 74 20 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20  st = nList+1;.  
e050: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
e060: 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
e070: 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
e080: 6d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  m, (int)strlen(z
e090: 54 65 72 6d 29 2c 0a 20 20 20 20 20 20 20 20 20  Term),.         
e0a0: 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72 6d 29       (u8*)zTerm)
e0b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e0c0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e0d0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
e0e0: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
e0f0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
e100: 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65 72         *pbNewTer
e110: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
e120: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e130: 20 20 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a        iOff = 0;.
e140: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
e150: 65 6e 74 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20  entry is not on 
e160: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e170: 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
e180: 65 28 20 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  e( iOff==0 ){.  
e190: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
e1a0: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
e1b0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
e1c0: 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e   pLeaf = pIter->
e1d0: 70 4c 65 61 66 3b 0a 20 20 20 20 20 20 20 20 20  pLeaf;.         
e1e0: 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
e1f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
e200: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
e210: 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
e220: 20 20 20 20 69 66 28 20 28 69 4f 66 66 20 3d 20      if( (iOff = 
e230: 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77  fts5LeafFirstRow
e240: 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20 26 26  idOff(pLeaf)) &&
e250: 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c   iOff<pLeaf->szL
e260: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
e270: 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74     iOff += sqlit
e280: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
e290: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
e2a0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e2b0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e2c0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
e2d0: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a  Offset = iOff;..
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
e2f0: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
e300: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
e310: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e320: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61  iPgidxOff = pLea
e330: 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35  f->szLeaf + fts5
e340: 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20  GetVarint32(.   
e350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
e360: 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e  pLeaf->p[pLeaf->
e370: 73 7a 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e  szLeaf], pIter->
e380: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
e390: 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20              );. 
e3a0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
e3b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e3c0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4c 65      else if( pLe
e3d0: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
e3e0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e3f0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
e400: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
e410: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
e420: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
e430: 20 20 20 20 20 20 20 20 26 70 4c 65 61 66 2d 3e          &pLeaf->
e440: 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d  p[pLeaf->szLeaf]
e450: 2c 20 69 4f 66 66 0a 20 20 20 20 20 20 20 20 20  , iOff.         
e460: 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20     );.          
e470: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e480: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20  fset = iOff;.   
e490: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e4a0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
e4b0: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
e4c0: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
e4d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
e4e0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
e4f0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
e500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
e510: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
e520: 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  T;.            r
e530: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
e540: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
e550: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43     }..      /* C
e560: 68 65 63 6b 20 69 66 20 74 68 65 20 69 74 65 72  heck if the iter
e570: 61 74 6f 72 20 69 73 20 6e 6f 77 20 61 74 20 45  ator is now at E
e580: 4f 46 2e 20 49 66 20 73 6f 2c 20 72 65 74 75 72  OF. If so, retur
e590: 6e 20 65 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20  n early. */.    
e5a0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
e5b0: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  af ){.        if
e5c0: 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20  ( bNewTerm ){.  
e5d0: 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65          if( pIte
e5e0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
e5f0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
e600: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
e610: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
e620: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
e630: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e640: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
e650: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e660: 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
e670: 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20  IterLoadTerm(p, 
e680: 70 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20  pIter, nKeep);. 
e690: 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53             fts5S
e6a0: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
e6b0: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
e6c0: 20 20 20 20 20 20 69 66 28 20 70 62 4e 65 77 54        if( pbNewT
e6d0: 65 72 6d 20 29 20 2a 70 62 4e 65 77 54 65 72 6d  erm ) *pbNewTerm
e6e0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
e6f0: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
e700: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
e710: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c  e following coul
e720: 64 20 62 65 20 64 6f 6e 65 20 62 79 20 63 61 6c  d be done by cal
e730: 6c 69 6e 67 20 66 74 73 35 53 65 67 49 74 65 72  ling fts5SegIter
e740: 4c 6f 61 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a  LoadNPos(). But.
e750: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 69            ** thi
e760: 73 20 62 6c 6f 63 6b 20 69 73 20 70 61 72 74 69  s block is parti
e770: 63 75 6c 61 72 6c 79 20 70 65 72 66 6f 72 6d 61  cularly performa
e780: 6e 63 65 20 63 72 69 74 69 63 61 6c 2c 20 73 6f  nce critical, so
e790: 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20   equivalent.    
e7a0: 20 20 20 20 20 20 2a 2a 20 63 6f 64 65 20 69 73        ** code is
e7b0: 20 69 6e 6c 69 6e 65 64 2e 20 2a 2f 0a 20 20 20   inlined. */.   
e7c0: 20 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a         int nSz;.
e7d0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
e7e0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
e7f0: 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OK );.          
e800: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
e810: 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  t32(pIter->pLeaf
e820: 2d 3e 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61  ->p, pIter->iLea
e830: 66 4f 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20  fOffset, nSz);. 
e840: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e850: 62 44 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78  bDel = (nSz & 0x
e860: 30 30 30 31 29 3b 0a 20 20 20 20 20 20 20 20 20  0001);.         
e870: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e   pIter->nPos = n
e880: 53 7a 3e 3e 31 3b 0a 20 20 20 20 20 20 20 20 7d  Sz>>1;.        }
e890: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e8a0: 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57   }.}..#define SW
e8b0: 41 50 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b  APVAL(T, a, b) {
e8c0: 20 54 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61   T tmp; tmp=a; a
e8d0: 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a  =b; b=tmp; }../*
e8e0: 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
e8f0: 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
e900: 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
e910: 20 72 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c   rowid in a docl
e920: 69 73 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e  ist. This.** fun
e930: 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69  ction sets the i
e940: 74 65 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68  terator up so th
e950: 61 74 20 69 74 65 72 61 74 65 73 20 69 6e 20 72  at iterates in r
e960: 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68 72  everse order thr
e970: 6f 75 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c  ough.** the docl
e980: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
e990: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
e9a0: 65 76 65 72 73 65 28 46 74 73 35 49 6e 64 65 78  everse(Fts5Index
e9b0: 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72   *p, Fts5SegIter
e9c0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
e9d0: 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64  DlidxIter *pDlid
e9e0: 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  x = pIter->pDlid
e9f0: 78 3b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  x;.  Fts5Data *p
ea00: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Last = 0;.  int 
ea10: 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20  pgnoLast = 0;.. 
ea20: 20 69 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20   if( pDlidx ){. 
ea30: 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
ea40: 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65  pIter->pSeg->iSe
ea50: 67 69 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73  gid;.    pgnoLas
ea60: 74 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  t = fts5DlidxIte
ea70: 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
ea80: 20 20 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44     pLast = fts5D
ea90: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
eaa0: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53  SEGMENT_ROWID(iS
eab0: 65 67 69 64 2c 20 70 67 6e 6f 4c 61 73 74 29 29  egid, pgnoLast))
eac0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46  ;.  }else{.    F
ead0: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
eae0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 20   pIter->pLeaf;  
eaf0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
eb00: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a  t leaf data */..
eb10: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79      /* Currently
eb20: 2c 20 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c  , Fts5SegIter.iL
eb30: 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 73  eafOffset points
eb40: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
eb50: 74 65 20 6f 66 0a 20 20 20 20 2a 2a 20 70 6f 73  te of.    ** pos
eb60: 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e 74 65  ition-list conte
eb70: 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  nt for the curre
eb80: 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b 20 69  nt rowid. Back i
eb90: 74 20 75 70 20 73 6f 20 74 68 61 74 20 69 74 0a  t up so that it.
eba0: 20 20 20 20 2a 2a 20 70 6f 69 6e 74 73 20 74 6f      ** points to
ebb0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
ebc0: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
ebd0: 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  size field. */. 
ebe0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
ebf0: 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74 65 33  ffset -= sqlite3
ec00: 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e  Fts5GetVarintLen
ec10: 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 2b 70  (pIter->nPos*2+p
ec20: 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 0a 20 20  Iter->bDel);..  
ec30: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f 6e    /* If this con
ec40: 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 74  dition is true t
ec50: 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  hen the largest 
ec60: 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63 75  rowid for the cu
ec70: 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65 72  rrent.    ** ter
ec80: 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74 6f  m may not be sto
ec90: 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65  red on the curre
eca0: 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61 72  nt page. So sear
ecb0: 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20 20  ch forward to.  
ecc0: 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20 73    ** see where s
ecd0: 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c 79  aid rowid really
ece0: 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28   is.  */.    if(
ecf0: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
ed00: 63 6c 69 73 74 3e 3d 70 4c 65 61 66 2d 3e 73 7a  clist>=pLeaf->sz
ed10: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e  Leaf ){.      in
ed20: 74 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 46 74  t pgno;.      Ft
ed30: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
ed40: 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72  nt *pSeg = pIter
ed50: 2d 3e 70 53 65 67 3b 0a 0a 20 20 20 20 20 20 2f  ->pSeg;..      /
ed60: 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 77 69 64  * The last rowid
ed70: 20 69 6e 20 74 68 65 20 64 6f 63 6c 69 73 74 20   in the doclist 
ed80: 6d 61 79 20 6e 6f 74 20 62 65 20 6f 6e 20 74 68  may not be on th
ed90: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20  e current page. 
eda0: 53 65 61 72 63 68 0a 20 20 20 20 20 20 2a 2a 20  Search.      ** 
edb0: 66 6f 72 77 61 72 64 20 74 6f 20 66 69 6e 64 20  forward to find 
edc0: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e  the page contain
edd0: 69 6e 67 20 74 68 65 20 6c 61 73 74 20 72 6f 77  ing the last row
ede0: 69 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 66 6f  id.  */.      fo
edf0: 72 28 70 67 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c  r(pgno=pIter->iL
ee00: 65 61 66 50 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72  eafPgno+1; !p->r
ee10: 63 20 26 26 20 70 67 6e 6f 3c 3d 70 53 65 67 2d  c && pgno<=pSeg-
ee20: 3e 70 67 6e 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b  >pgnoLast; pgno+
ee30: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  +){.        i64 
ee40: 69 41 62 73 20 3d 20 46 54 53 35 5f 53 45 47 4d  iAbs = FTS5_SEGM
ee50: 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
ee60: 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20  iSegid, pgno);. 
ee70: 20 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20         Fts5Data 
ee80: 2a 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61  *pNew = fts5Data
ee90: 52 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20  Read(p, iAbs);. 
eea0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20         if( pNew 
eeb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
eec0: 20 69 52 6f 77 69 64 2c 20 62 54 65 72 6d 6c 65   iRowid, bTermle
eed0: 73 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 52  ss;.          iR
eee0: 6f 77 69 64 20 3d 20 66 74 73 35 4c 65 61 66 46  owid = fts5LeafF
eef0: 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4e 65  irstRowidOff(pNe
ef00: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54  w);.          bT
ef10: 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65  ermless = fts5Le
ef20: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65  afIsTermless(pNe
ef30: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
ef40: 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ( iRowid ){.    
ef50: 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28          SWAPVAL(
ef60: 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c  Fts5Data*, pNew,
ef70: 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20   pLast);.       
ef80: 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20       pgnoLast = 
ef90: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  pgno;.          
efa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  }.          fts5
efb0: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
efc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
efd0: 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20   bTermless==0 ) 
efe0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
eff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f000: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73   }..  /* If pLas
f010: 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69  t is NULL at thi
f020: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
f030: 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72  e last rowid for
f040: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20   this doclist.  
f050: 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  ** lies on the p
f060: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  age currently in
f070: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
f080: 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73  terator. In this
f090: 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65   case .  ** pIte
f0a0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69  r->iLeafOffset i
f0b0: 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
f0c0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f   point to the po
f0d0: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
f0e0: 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f  .  ** field asso
f0f0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
f100: 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72  first relevant r
f110: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
f120: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20  ..  **.  ** Or, 
f130: 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d  if pLast is non-
f140: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
f150: 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63   the page that c
f160: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74  ontains the last
f170: 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20  .  ** rowid. In 
f180: 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67  this case config
f190: 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ure the iterator
f1a0: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
f1b0: 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  ts to the.  ** f
f1c0: 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
f1d0: 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  is page..  */.  
f1e0: 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20  if( pLast ){.   
f1f0: 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66   int iOff;.    f
f200: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
f210: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
f220: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
f230: 20 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65   pLast;.    pIte
f240: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70  r->iLeafPgno = p
f250: 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 69 4f 66  gnoLast;.    iOf
f260: 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
f270: 74 52 6f 77 69 64 4f 66 66 28 70 4c 61 73 74 29  tRowidOff(pLast)
f280: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
f290: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61  s5GetVarint(&pLa
f2a0: 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  st->p[iOff], (u6
f2b0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
f2c0: 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
f2d0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f2e0: 66 3b 0a 0a 20 20 20 20 69 66 28 20 66 74 73 35  f;..    if( fts5
f2f0: 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
f300: 4c 61 73 74 29 20 29 7b 0a 20 20 20 20 20 20 70  Last) ){.      p
f310: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
f320: 69 73 74 20 3d 20 70 4c 61 73 74 2d 3e 6e 6e 2b  ist = pLast->nn+
f330: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
f340: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
f350: 66 44 6f 63 6c 69 73 74 20 3d 20 66 74 73 35 4c  fDoclist = fts5L
f360: 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28  eafFirstTermOff(
f370: 70 4c 61 73 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  pLast);.    }.. 
f380: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
f390: 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
f3a0: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
f3b0: 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
f3c0: 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
f3d0: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
f3e0: 74 20 72 6f 77 69 64 20 6f 66 20 61 20 64 6f 63  t rowid of a doc
f3f0: 6c 69 73 74 2e 0a 2a 2a 20 54 68 65 72 65 20 69  list..** There i
f400: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
f410: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
f420: 68 20 74 68 65 20 66 69 6e 61 6c 20 74 65 72 6d  h the final term
f430: 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
f440: 0a 2a 2a 20 70 61 67 65 2e 20 49 66 20 74 68 65  .** page. If the
f450: 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 69 73   current term is
f460: 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20 6f   the last term o
f470: 6e 20 74 68 65 20 70 61 67 65 2c 20 6c 6f 61 64  n the page, load
f480: 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74   the .** doclist
f490: 2d 69 6e 64 65 78 20 66 72 6f 6d 20 64 69 73 6b  -index from disk
f4a0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
f4b0: 61 6e 20 69 74 65 72 61 74 6f 72 20 61 74 20 28  an iterator at (
f4c0: 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 2e 0a  pIter->pDlidx)..
f4d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
f4e0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c  ts5SegIterLoadDl
f4f0: 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
f500: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
f510: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 53 65  Iter){.  int iSe
f520: 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  g = pIter->pSeg-
f530: 3e 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 62  >iSegid;.  int b
f540: 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
f550: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
f560: 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
f570: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
f580: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 20 2f   pIter->pLeaf; /
f590: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
f5a0: 61 74 61 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ata */..  assert
f5b0: 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
f5c0: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
f5d0: 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72  ETERM );.  asser
f5e0: 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t( pIter->pDlidx
f5f0: 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ==0 );..  /* Che
f600: 63 6b 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ck if the curren
f610: 74 20 64 6f 63 6c 69 73 74 20 65 6e 64 73 20 6f  t doclist ends o
f620: 6e 20 74 68 69 73 20 70 61 67 65 2e 20 49 66 20  n this page. If 
f630: 69 74 20 64 6f 65 73 2c 20 72 65 74 75 72 6e 0a  it does, return.
f640: 20 20 2a 2a 20 65 61 72 6c 79 20 77 69 74 68 6f    ** early witho
f650: 75 74 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  ut loading the d
f660: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 28 61 73  oclist-index (as
f670: 20 69 74 20 62 65 6c 6f 6e 67 73 20 74 6f 20 61   it belongs to a
f680: 20 64 69 66 66 65 72 65 6e 74 0a 20 20 2a 2a 20   different.  ** 
f690: 74 65 72 6d 2e 20 2a 2f 0a 20 20 69 66 28 20 70  term. */.  if( p
f6a0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
f6b0: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno==pIter->iLea
f6c0: 66 50 67 6e 6f 20 0a 20 20 20 26 26 20 70 49 74  fPgno .   && pIt
f6d0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f6e0: 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  t<pLeaf->szLeaf 
f6f0: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
f700: 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
f710: 70 44 6c 69 64 78 20 3d 20 66 74 73 35 44 6c 69  pDlidx = fts5Dli
f720: 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 62 52  dxIterInit(p, bR
f730: 65 76 2c 20 69 53 65 67 2c 20 70 49 74 65 72 2d  ev, iSeg, pIter-
f740: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
f750: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
f760: 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28  IndexSkipVarint(
f770: 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20 20  a, iOff) {      
f780: 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69 45        \.  int iE
f790: 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20 20  nd = iOff+9;    
f7a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77 68            \.  wh
f7c0: 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d 20  ile( (a[iOff++] 
f7d0: 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66 3c  & 0x80) && iOff<
f7e0: 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c 0a  iEnd );       \.
f7f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
f800: 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73  rator object pas
f810: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
f820: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
f830: 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ntly contains.**
f840: 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c 75 65 73   no valid values
f850: 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
f860: 46 74 73 35 53 65 67 49 74 65 72 2e 70 4c 65 61  Fts5SegIter.pLea
f870: 66 20 6d 65 6d 62 65 72 20 76 61 72 69 61 62 6c  f member variabl
f880: 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e. This.** funct
f890: 69 6f 6e 20 73 65 61 72 63 68 65 73 20 74 68 65  ion searches the
f8a0: 20 6c 65 61 66 20 70 61 67 65 20 66 6f 72 20 61   leaf page for a
f8b0: 20 74 65 72 6d 20 6d 61 74 63 68 69 6e 67 20 28   term matching (
f8c0: 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 2a 2a  pTerm/nTerm)..**
f8d0: 0a 2a 2a 20 49 66 20 74 68 65 20 73 70 65 63 69  .** If the speci
f8e0: 66 69 65 64 20 74 65 72 6d 20 69 73 20 66 6f 75  fied term is fou
f8f0: 6e 64 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  nd on the page, 
f900: 74 68 65 6e 20 74 68 65 20 69 74 65 72 61 74 6f  then the iterato
f910: 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20 70 6f 69  r is left.** poi
f920: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20 49 66 20  nting to it. If 
f930: 61 72 67 75 6d 65 6e 74 20 62 47 65 20 69 73 20  argument bGe is 
f940: 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 74 65 72  zero and the ter
f950: 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 0a  m is not found,.
f960: 2a 2a 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ** the iterator 
f970: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
f980: 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   at EOF..**.** I
f990: 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  f bGe is non-zer
f9a0: 6f 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 66  o and the specif
f9b0: 69 65 64 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  ied term is not 
f9c0: 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68 65 0a  found, then the.
f9d0: 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  ** iterator is l
f9e0: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
f9f0: 74 68 65 20 73 6d 61 6c 6c 65 73 74 20 74 65 72  the smallest ter
fa00: 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74  m in the segment
fa10: 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67   that.** is larg
fa20: 65 72 20 74 68 61 6e 20 74 68 65 20 73 70 65 63  er than the spec
fa30: 69 66 69 65 64 20 74 65 72 6d 2c 20 65 76 65 6e  ified term, even
fa40: 20 69 66 20 74 68 69 73 20 74 65 72 6d 20 69 73   if this term is
fa50: 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a 2a 20 63   not on the.** c
fa60: 75 72 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2f 0a  urrent page..*/.
fa70: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
fa80: 4c 65 61 66 53 65 65 6b 28 0a 20 20 46 74 73 35  LeafSeek(.  Fts5
fa90: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
fab0: 65 61 76 65 20 61 6e 79 20 65 72 72 6f 72 20 63  eave any error c
fac0: 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ode here */.  in
fad0: 74 20 62 47 65 2c 20 20 20 20 20 20 20 20 20 20  t bGe,          
fae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
faf0: 20 54 72 75 65 20 66 6f 72 20 61 20 3e 3d 20 73   True for a >= s
fb00: 65 61 72 63 68 20 2a 2f 0a 20 20 46 74 73 35 53  earch */.  Fts5S
fb10: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
fb20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
fb30: 65 72 61 74 6f 72 20 74 6f 20 73 65 65 6b 20 2a  erator to seek *
fb40: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
fb50: 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20  erm, int nTerm  
fb60: 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
fb70: 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a 29 7b 0a  earch for */.){.
fb80: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 63 6f    int iOff;.  co
fb90: 6e 73 74 20 75 38 20 2a 61 20 3d 20 70 49 74 65  nst u8 *a = pIte
fba0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 69  r->pLeaf->p;.  i
fbb0: 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70 49 74 65  nt szLeaf = pIte
fbc0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
fbd0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70 49 74 65  ;.  int n = pIte
fbe0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a 20  r->pLeaf->nn;.. 
fbf0: 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d 20 30 3b   int nMatch = 0;
fc00: 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20 30  .  int nKeep = 0
fc10: 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30  ;.  int nNew = 0
fc20: 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66  ;.  int iTermOff
fc30: 3b 0a 20 20 69 6e 74 20 69 50 67 69 64 78 3b 20  ;.  int iPgidx; 
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc50: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
fc60: 66 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a  ffset in pgidx *
fc70: 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f 66 50 61  /.  int bEndOfPa
fc80: 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ge = 0;..  asser
fc90: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
fca0: 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67 69 64 78  _OK );..  iPgidx
fcb0: 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 69 50 67   = szLeaf;.  iPg
fcc0: 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61  idx += fts5GetVa
fcd0: 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
fce0: 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
fcf0: 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
fd00: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
fd10: 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
fd20: 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20  ut how many new 
fd30: 62 79 74 65 73 20 61 72 65 20 69 6e 20 74 68 69  bytes are in thi
fd40: 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74  s term */.    ft
fd50: 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
fd60: 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29  2(a, iOff, nNew)
fd70: 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3c  ;.    if( nKeep<
fd80: 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  nMatch ){.      
fd90: 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c  goto search_fail
fda0: 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  ed;.    }..    a
fdb0: 73 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d  ssert( nKeep>=nM
fdc0: 61 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28 20  atch );.    if( 
fdd0: 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b  nKeep==nMatch ){
fde0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b  .      int nCmp;
fdf0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
fe00: 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e      nCmp = MIN(n
fe10: 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63  New, nTerm-nMatc
fe20: 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  h);.      for(i=
fe30: 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b  0; i<nCmp; i++){
fe40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 5b 69  .        if( a[i
fe50: 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d  Off+i]!=pTerm[nM
fe60: 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b  atch+i] ) break;
fe70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
fe80: 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20  Match += i;..   
fe90: 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d     if( nTerm==nM
fea0: 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
feb0: 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20  if( i==nNew ){. 
fec0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
fed0: 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20  arch_success;.  
fee0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fef0: 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72         goto sear
ff00: 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  ch_failed;.     
ff10: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
ff20: 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61   if( i<nNew && a
ff30: 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e  [iOff+i]>pTerm[n
ff40: 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20  Match] ){.      
ff50: 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
ff60: 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  iled;.      }.  
ff70: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67    }..    if( iPg
ff80: 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  idx>=n ){.      
ff90: 62 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a  bEndOfPage = 1;.
ffa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ffb0: 20 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b   }..    iPgidx +
ffc0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
ffd0: 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b  2(&a[iPgidx], nK
ffe0: 65 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f  eep);.    iTermO
fff0: 66 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20  ff += nKeep;.   
10000 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66   iOff = iTermOff
10010 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
10020 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f  he nKeep field o
10030 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e  f the next term.
10040 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73 74   */.    fts5Fast
10050 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69  GetVarint32(a, i
10060 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 7d  Off, nKeep);.  }
10070 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64  .. search_failed
10080 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20 29  :.  if( bGe==0 )
10090 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  {.    fts5DataRe
100a0 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
100b0 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  af);.    pIter->
100c0 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 72  pLeaf = 0;.    r
100d0 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20 69  eturn;.  }else i
100e0 66 28 20 62 45 6e 64 4f 66 50 61 67 65 20 29 7b  f( bEndOfPage ){
100f0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
10100 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
10110 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
10120 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
10130 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72  pLeaf==0 ) retur
10140 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74  n;.      a = pIt
10150 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
10160 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
10170 49 73 54 65 72 6d 6c 65 73 73 28 70 49 74 65 72  IsTermless(pIter
10180 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29 7b 0a 20  ->pLeaf)==0 ){. 
10190 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
101a0 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 70  rint32(&pIter->p
101b0 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 70  Leaf->p[pIter->p
101c0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69  Leaf->szLeaf], i
101d0 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Off);.        if
101e0 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66  ( iOff<4 || iOff
101f0 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  >=pIter->pLeaf->
10200 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
10210 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
10220 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
10230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
10240 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20     nKeep = 0;.  
10250 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
10260 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
10270 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
10280 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10290 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
102a0 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
102b0 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  1 );.  }.. searc
102c0 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20 70 49  h_success:..  pI
102d0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
102e0 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a   = iOff + nNew;.
102f0 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
10300 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72  afOffset = pIter
10310 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
10320 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
10330 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
10340 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73  LeafPgno;..  fts
10350 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
10360 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
10370 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a   nKeep, pTerm);.
10380 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
10390 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
103a0 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
103b0 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20  w, &a[iOff]);.. 
103c0 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e 20 29   if( iPgidx>=n )
103d0 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  {.    pIter->iEn
103e0 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 49 74  dofDoclist = pIt
103f0 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  er->pLeaf->nn+1;
10400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
10410 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20 69 50  t nExtra;.    iP
10420 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56  gidx += fts5GetV
10430 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
10440 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  x], nExtra);.   
10450 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
10460 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f 66 66  clist = iTermOff
10470 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 20   + nExtra;.  }. 
10480 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
10490 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20 20 66  f = iPgidx;..  f
104a0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
104b0 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  wid(p, pIter);. 
104c0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
104d0 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
104e0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
104f0 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
10500 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
10510 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
10520 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65 6e 74  m within segment
10530 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74 68 65  .** pSeg. If the
10540 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74 65  re is no such te
10550 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65 78 2c  rm in the index,
10560 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
10570 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a   set to EOF..**.
10580 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
10590 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78  ccurs, Fts5Index
105a0 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e  .rc is set to an
105b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
105c0 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20  or code. If .** 
105d0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
105e0 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
105f0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
10600 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
10610 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
10620 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
10630 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28 0a 20  gIterSeekInit(. 
10640 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
10650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10660 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
10670 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
10680 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
10690 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
106a0 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 61 64 69  to use for loadi
106b0 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 63 6f  ng pages */.  co
106c0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
106d0 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
106e0 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
106f0 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
10700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10710 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
10720 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58 20 66   FTS5INDEX_XXX f
10730 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 53 74  lags */.  Fts5St
10740 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
10750 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73  pSeg,     /* Des
10760 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d  cription of segm
10770 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ent */.  Fts5Seg
10780 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
10790 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65           /* Obje
107a0 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a  ct to populate *
107b0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 20 3d  /.){.  int iPg =
107c0 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20   1;.  int bGe = 
107d0 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44  (flags & FTS5IND
107e0 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a  EX_QUERY_SCAN);.
107f0 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30    int bDlidx = 0
10800 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10810 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
10820 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
10830 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74 61 74  index */..  stat
10840 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30  ic int nCall = 0
10850 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20 20  ;.  nCall++;..  
10860 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c  assert( bGe==0 |
10870 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
10880 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29  NDEX_QUERY_DESC)
10890 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
108a0 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20   pTerm && nTerm 
108b0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  );.  memset(pIte
108c0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
108d0 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
108e0 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20  pSeg = pSeg;..  
108f0 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65  /* This block se
10900 74 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  ts stack variabl
10910 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61  e iPg to the lea
10920 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  f page number th
10930 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74  at may.  ** cont
10940 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ain term (pTerm/
10950 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73  nTerm), if it is
10960 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
10970 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 66  segment. */.  if
10980 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 3d  ( p->pIdxSelect=
10990 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
109a0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
109b0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
109c0 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
109d0 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
109e0 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33 5f  Select, sqlite3_
109f0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
10a00 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f 20     "SELECT pgno 
10a10 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64  FROM '%q'.'%q_id
10a20 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20 20  x' WHERE ".     
10a30 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41 4e       "segid=? AN
10a40 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52 20  D term<=? ORDER 
10a50 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49 4d  BY term DESC LIM
10a60 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20  IT 1",.         
10a70 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
10a80 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
10a90 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20    ));.  }.  if( 
10aa0 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
10ab0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
10ac0 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  nt(p->pIdxSelect
10ad0 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  , 1, pSeg->iSegi
10ae0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  d);.  sqlite3_bi
10af0 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 53  nd_blob(p->pIdxS
10b00 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c  elect, 2, pTerm,
10b10 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53   nTerm, SQLITE_S
10b20 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53 51  TATIC);.  if( SQ
10b30 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
10b40 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 53 65  3_step(p->pIdxSe
10b50 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34  lect) ){.    i64
10b60 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63   val = sqlite3_c
10b70 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70 49 64  olumn_int(p->pId
10b80 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20  xSelect, 0);.   
10b90 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76 61 6c   iPg = (int)(val
10ba0 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69 64 78  >>1);.    bDlidx
10bb0 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30 30 31   = (val & 0x0001
10bc0 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d  );.  }.  p->rc =
10bd0 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
10be0 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 0a  ->pIdxSelect);..
10bf0 20 20 69 66 28 20 69 50 67 3c 70 53 65 67 2d 3e    if( iPg<pSeg->
10c00 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20 20 20  pgnoFirst ){.   
10c10 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70 67 6e   iPg = pSeg->pgn
10c20 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44 6c 69  oFirst;.    bDli
10c30 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  dx = 0;.  }..  p
10c40 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
10c50 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66 74 73  = iPg - 1;.  fts
10c60 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
10c70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 69  (p, pIter);..  i
10c80 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
10c90 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61 66 53  ){.    fts5LeafS
10ca0 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49 74 65  eek(p, bGe, pIte
10cb0 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r, pTerm, nTerm)
10cc0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
10cd0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10ce0 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70   bGe==0 ){.    p
10cf0 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
10d00 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
10d10 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 49 74  ERM;.    if( pIt
10d20 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
10d30 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
10d40 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
10d50 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ESC ){.        p
10d60 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
10d70 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
10d80 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  RSE;.      }.   
10d90 20 20 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b     if( bDlidx ){
10da0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
10db0 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 70 2c  IterLoadDlidx(p,
10dc0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
10dd0 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73  .      if( flags
10de0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
10df0 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20  RY_DESC ){.     
10e00 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
10e10 76 65 72 73 65 28 70 2c 20 70 49 74 65 72 29 3b  verse(p, pIter);
10e20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10e30 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72 3a   }..  /* Either:
10e40 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31 29 20  .  **.  **   1) 
10e50 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
10e60 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a 20 20  urred, or.  **  
10e70 20 32 29 20 74 68 65 20 69 74 65 72 61 74 6f 72   2) the iterator
10e80 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 2c 20   points to EOF, 
10e90 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20 74 68 65  or.  **   3) the
10ea0 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
10eb0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74   to an entry wit
10ec0 68 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54  h term (pTerm/nT
10ed0 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20 20 20  erm), or.  **   
10ee0 34 29 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  4) the FTS5INDEX
10ef0 5f 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67  _QUERY_SCAN flag
10f00 20 77 61 73 20 73 65 74 20 61 6e 64 20 74 68 65   was set and the
10f10 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73   iterator points
10f20 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20 61 6e  .  **      to an
10f30 20 65 6e 74 72 79 20 77 69 74 68 20 61 20 74 65   entry with a te
10f40 72 6d 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  rm greater than 
10f50 6f 72 20 65 71 75 61 6c 20 74 6f 20 28 70 54 65  or equal to (pTe
10f60 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a 2f 0a  rm/nTerm)..  */.
10f70 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
10f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20  =SQLITE_OK      
10f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fb0 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20 20 7c      /* 1 */.   |
10fc0 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  | pIter->pLeaf==
10fd0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
10fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11000 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20 66 74  /* 2 */.   || ft
11010 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
11020 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d  lob(&pIter->term
11030 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3d  , pTerm, nTerm)=
11040 3d 30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 33  =0          /* 3
11050 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65 20 26   */.   || (bGe &
11060 26 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  & fts5BufferComp
11070 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e  areBlob(&pIter->
11080 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
11090 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a 2f 0a  rm)>0)  /* 4 */.
110a0 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e    );.}../*.** In
110b0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
110c0 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
110d0 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
110e0 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 74 68  /nTerm within th
110f0 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 68  e.** in-memory h
11100 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20 74 68  ash table. If th
11110 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20 74  ere is no such t
11120 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73 68 2d  erm in the hash-
11130 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a 20 69  table, the .** i
11140 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20 74  terator is set t
11150 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  o EOF..**.** If 
11160 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
11170 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73   Fts5Index.rc is
11180 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f   set to an appro
11190 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
111a0 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72  e. If .** an err
111b0 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  or has already o
111c0 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
111d0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
111e0 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
111f0 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
11200 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 48  oid fts5SegIterH
11210 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73 35 49  ashInit(.  Fts5I
11220 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
11230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
11240 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20 20  S5 backend */.  
11250 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
11260 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
11270 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
11280 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
11290 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
112a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
112b0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
112c0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
112d0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20  SegIter *pIter  
112e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
112f0 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74  bject to populat
11300 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  e */.){.  const 
11310 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20  u8 *pList = 0;. 
11320 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a   int nList = 0;.
11330 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20    const u8 *z = 
11340 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  0;.  int n = 0;.
11350 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48  .  assert( p->pH
11360 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ash );.  assert(
11370 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
11380 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54 65 72  K );..  if( pTer
11390 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26  m==0 || (flags &
113a0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
113b0 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20 70 2d  _SCAN) ){.    p-
113c0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
113d0 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d  5HashScanInit(p-
113e0 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63  >pHash, (const c
113f0 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72  har*)pTerm, nTer
11400 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  m);.    sqlite3F
11410 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
11420 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73  (p->pHash, (cons
11430 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c  t char**)&z, &pL
11440 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20  ist, &nList);.  
11450 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29    n = (z ? (int)
11460 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68  strlen((const ch
11470 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d  ar*)z) : 0);.  }
11480 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
11490 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
114a0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
114b0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
114c0 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73  ashQuery(p->pHas
114d0 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
114e0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70  pTerm, nTerm, &p
114f0 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
11500 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20     z = pTerm;.  
11510 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d    n = nTerm;.  }
11520 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ..  if( pList ){
11530 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
11540 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65  Leaf;.    sqlite
11550 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
11560 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
11570 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  erm, n, z);.    
11580 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d  pLeaf = fts5IdxM
11590 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
115a0 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20  Fts5Data));.    
115b0 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72  if( pLeaf==0 ) r
115c0 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66  eturn;.    pLeaf
115d0 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
115e0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20  ;.    pLeaf->nn 
115f0 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  = pLeaf->szLeaf 
11600 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = nList;.    pIt
11610 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61  er->pLeaf = pLea
11620 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  f;.    pIter->iL
11630 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
11640 47 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d  GetVarint(pLeaf-
11650 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  >p, (u64*)&pIter
11660 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
11670 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
11680 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b  ist = pLeaf->nn+
11690 31 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67  1;..    if( flag
116a0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
116b0 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
116c0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
116d0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
116e0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74  EVERSE;.      ft
116f0 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
11700 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
11710 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
11720 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11730 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
11740 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
11750 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20  ./*.** Zero the 
11760 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
11770 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
11780 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
11790 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
117a0 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65  Clear(Fts5SegIte
117b0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73  r *pIter){.  fts
117c0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
117d0 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73  er->term);.  fts
117e0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
117f0 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74  er->pLeaf);.  ft
11800 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11810 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b  ter->pNextLeaf);
11820 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
11830 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69  Free(pIter->pDli
11840 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  dx);.  sqlite3_f
11850 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  ree(pIter->aRowi
11860 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73  dOffset);.  mems
11870 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
11880 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
11890 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
118a0 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a  ITE_DEBUG../*.**
118b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
118c0 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
118d0 66 20 74 68 65 20 62 69 67 20 61 73 73 65 72 74  f the big assert
118e0 28 29 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70  () procedure imp
118f0 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66  lemented by.** f
11900 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
11910 65 72 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e  erSetup(). It en
11920 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 72  sures that the r
11930 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20  esult currently 
11940 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52  stored.** in *pR
11950 65 73 20 69 73 20 74 68 65 20 63 6f 72 72 65 63  es is the correc
11960 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  t result of comp
11970 61 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aring the curren
11980 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74  t positions of t
11990 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74  he.** two iterat
119a0 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
119b0 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 43 6f  oid fts5AssertCo
119c0 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a  mparisonResult(.
119d0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
119e0 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53  *pIter, .  Fts5S
119f0 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74  egIter *p1,.  Ft
11a00 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20  s5SegIter *p2,. 
11a10 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
11a20 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d  es.){.  int i1 =
11a30 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65   p1 - pIter->aSe
11a40 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32  g;.  int i2 = p2
11a50 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a   - pIter->aSeg;.
11a60 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66  .  if( p1->pLeaf
11a70 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b   || p2->pLeaf ){
11a80 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  .    if( p1->pLe
11a90 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  af==0 ){.      a
11aa0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
11ab0 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d  rst==i2 );.    }
11ac0 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65  else if( p2->pLe
11ad0 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  af==0 ){.      a
11ae0 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
11af0 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d  rst==i1 );.    }
11b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
11b10 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74  nMin = MIN(p1->t
11b20 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e  erm.n, p2->term.
11b30 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  n);.      int re
11b40 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74  s = memcmp(p1->t
11b50 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e  erm.p, p2->term.
11b60 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20  p, nMin);.      
11b70 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
11b80 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20   = p1->term.n - 
11b90 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20  p2->term.n;..   
11ba0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
11bb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11bc0 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d   pRes->bTermEq==
11bd0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
11be0 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21  ert( p1->iRowid!
11bf0 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  =p2->iRowid );. 
11c00 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70         res = ((p
11c10 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e  1->iRowid > p2->
11c20 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
11c30 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a  bRev) ? -1 : 1;.
11c40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11c50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
11c60 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b  s->bTermEq==0 );
11c70 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11c80 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
11c90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
11ca0 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b  s->iFirst==i1 );
11cb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11cc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11cd0 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29  es->iFirst==i2 )
11ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11cf0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
11d00 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11d10 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c  no-op unless SQL
11d20 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
11d30 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d  ined when this m
11d40 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70  odule.** is comp
11d50 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61  iled. In that ca
11d60 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
11d70 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79  n is essentially
11d80 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   an assert() .**
11d90 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
11da0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
11db0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11dc0 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  he pIter->aFirst
11dd0 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
11de0 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
11df0 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65  ic void fts5Asse
11e00 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
11e10 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
11e20 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
11e30 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
11e40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11e50 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
11e60 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65 72  *pFirst = &pIter
11e70 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
11e80 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
11e90 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ];.    int i;.. 
11ea0 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
11eb0 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70  st->pLeaf==0)==p
11ec0 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 0a 20  Iter->bEof );.. 
11ed0 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
11ee0 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
11ef0 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f 72 72  owid is set corr
11f00 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f  ectly. */.    fo
11f10 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
11f20 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
11f30 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
11f40 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
11f50 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
11f60 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20  t( p1==pFirst . 
11f70 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d            || p1-
11f80 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20  >pLeaf==0 .     
11f90 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66        || fts5Buf
11fa0 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72  ferCompare(&pFir
11fb0 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74  st->term, &p1->t
11fc0 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20  erm) .          
11fd0 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d   || p1->iRowid==
11fe0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
11ff0 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c  wid.           |
12000 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49  | (p1->iRowid<pI
12010 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
12020 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a  d)==pIter->bRev.
12030 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
12040 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
12050 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32  Iter->nSeg; i+=2
12060 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
12070 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
12080 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
12090 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
120a0 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
120b0 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73  [i+1];.      Fts
120c0 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
120d0 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
120e0 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69  (pIter->nSeg + i
120f0 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74  ) / 2];.      ft
12100 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
12110 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20  onResult(pIter, 
12120 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20  p1, p2, pRes);. 
12130 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
12140 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65  1; i<(pIter->nSe
12150 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20  g / 2); i+=2){. 
12160 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
12170 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
12180 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
12190 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d  st[i*2].iFirst ]
121a0 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  ;.      Fts5SegI
121b0 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72  ter *p2 = &pIter
121c0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
121d0 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69  First[i*2+1].iFi
121e0 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
121f0 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
12200 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
12210 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73  i];.      fts5As
12220 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
12230 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
12240 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
12250 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
12260 65 66 69 6e 65 20 66 74 73 35 41 73 73 65 72 74  efine fts5Assert
12270 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 78  MultiIterSetup(x
12280 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,y).#endif../*.*
12290 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
122a0 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f  son necessary to
122b0 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d   populate pIter-
122c0 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a  >aFirst[iOut]..*
122d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
122e0 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f  rned value is no
122f0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
12300 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
12310 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74  an entry.** in t
12320 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d  he pIter->aSeg[]
12330 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28   array that is (
12340 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61  a) not at EOF, a
12350 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a  nd (b) pointing.
12360 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74  ** to a key that
12370 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
12380 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68  of another, high
12390 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a  er priority, .**
123a0 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f   segment-iterato
123b0 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61  r in the pSeg->a
123c0 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Seg[] array..*/.
123d0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
123e0 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
123f0 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  e(Fts5IndexIter 
12400 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74  *pIter, int iOut
12410 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20  ){.  int i1;    
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
12440 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   left-hand Fts5S
12450 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
12460 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i2;             
12470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12480 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61  ndex of right-ha
12490 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
124a0 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20  /.  int iRes;.  
124b0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b  Fts5SegIter *p1;
124c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124d0 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73  /* Left-hand Fts
124e0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
124f0 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20  s5SegIter *p2;  
12500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12510 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   Right-hand Fts5
12520 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
12530 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
12540 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
12550 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iOut];..  assert
12560 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53  ( iOut<pIter->nS
12570 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  eg && iOut>0 );.
12580 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
12590 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65  >bRev==0 || pIte
125a0 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20  r->bRev==1 );.. 
125b0 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65   if( iOut>=(pIte
125c0 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20  r->nSeg/2) ){.  
125d0 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
125e0 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20  Iter->nSeg/2) * 
125f0 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b  2;.    i2 = i1 +
12600 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
12610 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i1 = pIter->aFi
12620 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72  rst[iOut*2].iFir
12630 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  st;.    i2 = pIt
12640 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
12650 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d  2+1].iFirst;.  }
12660 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
12670 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
12680 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
12690 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72  ];..  pRes->bTer
126a0 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  mEq = 0;.  if( p
126b0 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
126c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
126d0 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
126e0 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
126f0 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
12700 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
12710 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
12720 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
12730 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
12740 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
12750 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
12760 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
12770 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
12780 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
12790 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
127a0 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
127b0 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62  );.      pRes->b
127c0 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20  TermEq = 1;.    
127d0 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
127e0 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ==p2->iRowid ){.
127f0 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c          p1->bDel
12800 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20   = p2->bDel;.   
12810 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a       return i2;.
12820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
12830 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
12840 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
12850 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
12860 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : +1;.    }.  
12870 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
12880 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
12890 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
128a0 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
128b0 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
128c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
128d0 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 69 52  Res->iFirst = iR
128e0 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  es;.  return 0;.
128f0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
12900 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68  e seg-iter so th
12910 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
12920 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
12930 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e  on page iLeafPgn
12940 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65  o..** It is an e
12950 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65  rror if leaf iLe
12960 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20  afPgno does not 
12970 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e  exist or contain
12980 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a  s no rowids..*/.
12990 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
129a0 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28  SegIterGotoPage(
129b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129d0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
129e0 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
129f0 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
12a00 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
12a10 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
12a20 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69  vance */.  int i
12a30 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73  LeafPgno.){.  as
12a40 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e  sert( iLeafPgno>
12a50 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12a60 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66   );..  if( iLeaf
12a70 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67  Pgno>pIter->pSeg
12a80 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
12a90 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
12aa0 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
12ab0 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
12ac0 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78  ease(pIter->pNex
12ad0 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  tLeaf);.    pIte
12ae0 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
12af0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
12b00 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
12b10 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  no-1;.    fts5Se
12b20 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
12b30 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
12b40 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
12b50 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
12b60 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66  iLeafPgno==iLeaf
12b70 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
12b80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12b90 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
12ba0 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61  Off;.      u8 *a
12bb0 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
12bc0 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
12bd0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
12be0 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69  szLeaf;..      i
12bf0 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
12c00 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65  rstRowidOff(pIte
12c10 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
12c20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
12c30 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
12c40 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
12c50 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
12c60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  lse{.        iOf
12c70 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
12c80 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
12c90 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
12ca0 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  d);.        pIte
12cb0 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
12cc0 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66   iOff;.        f
12cd0 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
12ce0 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
12cf0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12d00 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
12d10 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
12d20 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
12d30 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69  nd argument unti
12d40 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a  l it is at or .*
12d50 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72  * past rowid iFr
12d60 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  om. Regardless o
12d70 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  f the value of i
12d80 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74  From, the iterat
12d90 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  or is.** always 
12da0 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73  advanced at leas
12db0 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  t once..*/.stati
12dc0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12dd0 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
12de0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12e00 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12e10 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
12e20 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
12e30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
12e40 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
12e50 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68   */.  i64 iMatch
12e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e70 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
12e80 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61   iterator at lea
12e90 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29  st this far */.)
12ea0 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  {.  int bRev = (
12eb0 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
12ec0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
12ed0 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64  RSE);.  Fts5Dlid
12ee0 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
12ef0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
12f00 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d   int iLeafPgno =
12f10 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
12f20 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d  o;.  int bMove =
12f30 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
12f40 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
12f50 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
12f60 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RM );.  assert( 
12f70 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b  pIter->pDlidx );
12f80 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12f90 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66  ->pLeaf );..  if
12fa0 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
12fb0 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69   while( !fts5Dli
12fc0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
12fd0 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66  idx) && iMatch>f
12fe0 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
12ff0 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20  d(pDlidx) ){.   
13000 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66     iLeafPgno = f
13010 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
13020 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  (pDlidx);.      
13030 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
13040 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20  t(p, pDlidx);.  
13050 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e    }.    assert_n
13060 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49  c( iLeafPgno>=pI
13070 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c  ter->iLeafPgno |
13080 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69  | p->rc );.    i
13090 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  f( iLeafPgno>pIt
130a0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b  er->iLeafPgno ){
130b0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
130c0 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49  erGotoPage(p, pI
130d0 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b  ter, iLeafPgno);
130e0 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
130f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
13110 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  er->pNextLeaf==0
13120 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13130 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52  iMatch<pIter->iR
13140 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c  owid );.    whil
13150 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74 65  e( !fts5DlidxIte
13160 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20  rEof(p, pDlidx) 
13170 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c  && iMatch<fts5Dl
13180 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
13190 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74  idx) ){.      ft
131a0 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
131b0 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  p, pDlidx);.    
131c0 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20  }.    iLeafPgno 
131d0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
131e0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20  gno(pDlidx);..  
131f0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
13200 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
13210 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67  lidx) || iLeafPg
13220 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no<=pIter->iLeaf
13230 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
13240 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72   iLeafPgno<pIter
13250 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
13260 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
13270 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
13280 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53  o+1;.      fts5S
13290 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
132a0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
132b0 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
132c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
132d0 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20  {.    if( bMove 
132e0 29 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  ) fts5SegIterNex
132f0 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  t(p, pIter, 0);.
13300 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
13310 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
13320 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
13330 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69   && pIter->iRowi
13340 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
13350 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21  k;.    if( bRev!
13360 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
13370 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
13380 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d  eak;.    bMove =
13390 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d   1;.  }while( p-
133a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
133b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  ;.}.../*.** Free
133c0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
133d0 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
133e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
133f0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
13400 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
13410 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Free(Fts5Index *
13420 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  p, Fts5IndexIter
13430 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
13440 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
13450 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
13460 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
13470 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
13480 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
13490 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
134a0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
134b0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 49  uctureRelease(pI
134c0 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20  ter->pStruct);. 
134d0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
134e0 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  e(&pIter->poslis
134f0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
13500 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
13510 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
13520 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
13530 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64  anced(.  Fts5Ind
13540 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
13550 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
13560 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
13570 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
13580 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
13590 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
135a0 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
135b0 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
135c0 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
135d0 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20  t iChanged,     
135e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
135f0 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
13600 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
13610 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  nced */.  int iM
13620 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20  inset           
13630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
13640 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46  imum entry in aF
13650 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f  irst[] to set */
13660 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
13670 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
13680 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69  g+iChanged)/2; i
13690 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e  >=iMinset && p->
136a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
136b0 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69  =i/2){.    int i
136c0 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71  Eq;.    if( (iEq
136d0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
136e0 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c  DoCompare(pIter,
136f0 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66 74   i)) ){.      ft
13700 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
13710 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45   &pIter->aSeg[iE
13720 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20  q], 0);.      i 
13730 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20  = pIter->nSeg + 
13740 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iEq;.    }.  }.}
13750 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72  ../*.** Sub-iter
13760 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f 66  ator iChanged of
13770 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
13780 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 64  has just been ad
13790 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c 6c  vanced. It still
137a0 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
137b0 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f 75  e same term thou
137c0 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66 66  gh - just a diff
137d0 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68 69  erent rowid. Thi
137e0 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74  s function.** at
137f0 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74 65  tempts to update
13800 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
13810 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
13820 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79  st[] accordingly
13830 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
13840 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  so successfully,
13850 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
13860 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a  Otherwise 1..**.
13870 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ** If non-zero i
13880 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
13890 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 61  caller should ca
138a0 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  ll fts5MultiIter
138b0 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e  Advanced().** on
138c0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   the iterator in
138d0 73 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e 63  stead. That func
138e0 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61  tion does the sa
138f0 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c 20  me as this one, 
13900 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
13910 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f 72  t deals with mor
13920 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63 61  e complicated ca
13930 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20  ses as well..*/ 
13940 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
13950 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
13960 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
13970 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
13980 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
13990 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
139a0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
139b0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
139c0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
139d0 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
139e0 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
139f0 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
13a00 74 20 69 43 68 61 6e 67 65 64 20 20 20 20 20 20  t iChanged      
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13a20 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
13a30 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
13a40 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  nced */.){.  Fts
13a50 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d  5SegIter *pNew =
13a60 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43   &pIter->aSeg[iC
13a70 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20  hanged];..  if( 
13a80 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  pNew->iRowid==pI
13a90 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13aa0 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69  d.   || (pNew->i
13ab0 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77  Rowid<pIter->iSw
13ac0 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
13ad0 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20  r->bRev.  ){.   
13ae0 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35   int i;.    Fts5
13af0 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20  SegIter *pOther 
13b00 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13b10 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31  Changed ^ 0x0001
13b20 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53  ];.    pIter->iS
13b30 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74  witchRowid = pIt
13b40 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c  er->bRev ? SMALL
13b50 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47  EST_INT64 : LARG
13b60 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66  EST_INT64;.    f
13b70 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
13b80 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31  g+iChanged)/2; 1
13b90 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20  ; i=i/2){.      
13ba0 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
13bb0 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
13bc0 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73  st[i];..      as
13bd0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61  sert( pNew->pLea
13be0 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  f );.      asser
13bf0 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
13c00 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70  ==0 || pOther->p
13c10 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69  Leaf );..      i
13c20 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  f( pRes->bTermEq
13c30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13c40 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f  pNew->iRowid==pO
13c50 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ther->iRowid ){.
13c60 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13c70 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
13c80 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69  e if( (pOther->i
13c90 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77  Rowid>pNew->iRow
13ca0 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13cb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
13cc0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13cd0 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
13ce0 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  id;.          pN
13cf0 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20  ew = pOther;.   
13d00 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
13d10 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70  pOther->iRowid>p
13d20 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13d30 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13d40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
13d50 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13d60 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
13d70 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
13d80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73      }.      pRes
13d90 2d 3e 69 46 69 72 73 74 20 3d 20 28 70 4e 65 77  ->iFirst = (pNew
13da0 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b   - pIter->aSeg);
13db0 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
13dc0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
13dd0 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
13de0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
13df0 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d  irst[i ^ 0x0001]
13e00 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d  .iFirst ];.    }
13e10 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
13e20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
13e30 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76  he pIter->bEof v
13e40 61 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e  ariable based on
13e50 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
13e60 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e  e sub-iterators.
13e70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13e80 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
13e90 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  Eof(Fts5IndexIte
13ea0 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
13eb0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
13ec0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
13ed0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
13ee0 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65  iFirst ];.  pIte
13ef0 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e  r->bEof = pSeg->
13f00 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65  pLeaf==0;.  pIte
13f10 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
13f20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
13f30 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
13f40 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
13f50 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
13f60 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
13f70 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
13f80 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
13f90 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
13fa0 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
13fb0 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
13fc0 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
13fd0 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
13fe0 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
13ff0 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
14000 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
14010 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
14020 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14030 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
14040 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
14050 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
14060 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72  pIter,.  int bFr
14070 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
14080 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14090 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72   if argument iFr
140a0 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  om is valid */. 
140b0 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20   i64 iFrom      
140c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
140d0 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c   /* Advance at l
140e0 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74  east as far as t
140f0 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  his */.){.  if( 
14100 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14110 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65   ){.    int bUse
14120 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20  From = bFrom;.  
14130 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
14140 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
14150 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
14160 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  t;.      int bNe
14170 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  wTerm = 0;.     
14180 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
14190 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
141a0 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  g[iFirst];.     
141b0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
141c0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
141d0 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20     if( bUseFrom 
141e0 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20  && pSeg->pDlidx 
141f0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
14200 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  egIterNextFrom(p
14210 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a  , pSeg, iFrom);.
14220 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14230 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
14240 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
14250 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
14260 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  }..      if( pSe
14270 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
14280 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
14290 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
142a0 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20  AdvanceRowid(p, 
142b0 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20  pIter, iFirst). 
142c0 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
142d0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
142e0 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
142f0 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
14300 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
14310 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a  rSetEof(pIter);.
14320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
14330 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
14340 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29  rSetup(p, pIter)
14350 3b 0a 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f  ;..      bUseFro
14360 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  m = 0;.    }whil
14370 65 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45  e( pIter->bSkipE
14380 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74  mpty && fts5Mult
14390 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
143a0 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a  pIter) );.  }.}.
143b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
143c0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28  5MultiIterNext2(
143d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
143e0 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65   .  Fts5IndexIte
143f0 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
14400 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
14410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
14420 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69 67  UT: True if *mig
14430 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d 20  ht* be new term 
14440 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
14450 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14460 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
14470 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65  nt iFirst = pIte
14480 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
14490 72 73 74 3b 0a 20 20 20 20 20 20 46 74 73 35 53  rst;.      Fts5S
144a0 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
144b0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69 72  pIter->aSeg[iFir
144c0 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  st];.      int b
144d0 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20  NewTerm = 0;..  
144e0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
144f0 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e  ext(p, pSeg, &bN
14500 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69  ewTerm);.      i
14510 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
14520 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20  0 || bNewTerm . 
14530 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c        || fts5Mul
14540 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77  tiIterAdvanceRow
14550 69 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69  id(p, pIter, iFi
14560 72 73 74 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  rst).      ){.  
14570 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
14580 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70  terAdvanced(p, p
14590 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29  Iter, iFirst, 1)
145a0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
145b0 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49  ltiIterSetEof(pI
145c0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70  ter);.        *p
145d0 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
145e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
145f0 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
14600 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
14610 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
14620 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
14630 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65  er);..    }while
14640 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
14650 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
14660 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
14670 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  Iter) );.  }.}..
14680 0a 73 74 61 74 69 63 20 46 74 73 35 49 6e 64 65  .static Fts5Inde
14690 78 49 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69  xIter *fts5Multi
146a0 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73  IterAlloc(.  Fts
146b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
146c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
146d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
146e0 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
146f0 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a  /.  int nSeg.){.
14700 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
14710 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c  *pNew;.  int nSl
14720 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
14730 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65           /* Powe
14740 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67  r of two >= nSeg
14750 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74   */..  for(nSlot
14760 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20  =2; nSlot<nSeg; 
14770 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a  nSlot=nSlot*2);.
14780 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78    pNew = fts5Idx
14790 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20  Malloc(p, .     
147a0 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65   sizeof(Fts5Inde
147b0 78 49 74 65 72 29 20 2b 20 20 20 20 20 20 20 20  xIter) +        
147c0 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a       /* pNew */.
147d0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
147e0 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c  5SegIter) * (nSl
147f0 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65  ot-1) +   /* pNe
14800 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20  w->aSeg[] */.   
14810 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52     sizeof(Fts5CR
14820 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20  esult) * nSlot  
14830 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
14840 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b  aFirst[] */.  );
14850 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
14860 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20     pNew->nSeg = 
14870 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d  nSlot;.    pNew-
14880 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43  >aFirst = (Fts5C
14890 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61  Result*)&pNew->a
148a0 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20  Seg[nSlot];.    
148b0 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pNew->pIndex = p
148c0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
148d0 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
148e0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73  locate a new Fts
148f0 35 49 6e 64 65 78 49 74 65 72 20 6f 62 6a 65 63  5IndexIter objec
14900 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
14910 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20   object will be 
14920 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
14930 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20  through data in 
14940 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
14950 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20  t..** If iLevel 
14960 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c  is -ve, then all
14970 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67   data in all seg
14980 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e  ments is merged.
14990 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a   Or, if iLevel.*
149a0 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65  * is zero or gre
149b0 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20  ater, data from 
149c0 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65  the first nSegme
149d0 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  nt segments on l
149e0 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  evel iLevel.** i
149f0 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  s merged..**.** 
14a00 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69  The iterator ini
14a10 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tially points to
14a20 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f   the first term/
14a30 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74  rowid entry in t
14a40 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20  he .** iterated 
14a50 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
14a60 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
14a70 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64  erNew(.  Fts5Ind
14a80 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
14a90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
14aa0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
14ab0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
14ac0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
14ad0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20  Struct,         
14ae0 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20  /* Structure of 
14af0 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a  specific index *
14b00 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70  /.  int bSkipEmp
14b10 74 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ty,             
14b20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
14b30 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65 79  gnore delete-key
14b40 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  s */.  int flags
14b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14b60 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e         /* FTS5IN
14b70 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c  DEX_QUERY_XXX fl
14b80 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ags */.  const u
14b90 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
14ba0 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
14bb0 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20   to seek to (or 
14bc0 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74  NULL/0) */.  int
14bd0 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14bf0 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65  Level to iterate
14c00 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f   (-1 for all) */
14c10 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c  .  int nSegment,
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c30 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
14c40 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
14c50 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f  e (iLevel>=0) */
14c60 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
14c70 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
14c80 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
14c90 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65   */.){.  int nSe
14ca0 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
14cb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14cc0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74  er of segment-it
14cd0 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  ers in use */.  
14ce0 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20  int iIter = 0;  
14cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d00 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  /* */.  int iSeg
14d10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14d20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
14d30 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
14d40 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
14d50 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
14d60 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
14d70 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
14d80 62 79 20 66 74 73 35 53 65 67 49 74 65 72 53 65  by fts5SegIterSe
14d90 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20 20 46 74  ekInit() */.  Ft
14da0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
14db0 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 6e   *pLvl;.  Fts5In
14dc0 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  dexIter *pNew;..
14dd0 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
14de0 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
14df0 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
14e00 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
14e10 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
14e20 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
14e30 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tor. */.  if( p-
14e40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14e50 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c  {.    if( iLevel
14e60 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
14e70 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
14e80 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
14e90 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
14ea0 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
14eb0 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
14ec0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
14ed0 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e      nSeg += (p->
14ee0 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a  pHash ? 1 : 0);.
14ef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14f00 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
14f10 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
14f20 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
14f30 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
14f40 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d   *ppOut = pNew =
14f50 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
14f60 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20  loc(p, nSeg);.  
14f70 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
14f80 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  turn;.  pNew->bR
14f90 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
14fa0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
14fb0 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77  Y_DESC));.  pNew
14fc0 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 62  ->bSkipEmpty = b
14fd0 53 6b 69 70 45 6d 70 74 79 3b 0a 20 20 70 4e 65  SkipEmpty;.  pNe
14fe0 77 2d 3e 70 53 74 72 75 63 74 20 3d 20 70 53 74  w->pStruct = pSt
14ff0 72 75 63 74 3b 0a 20 20 66 74 73 35 53 74 72 75  ruct;.  fts5Stru
15000 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74  ctureRef(pStruct
15010 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
15020 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  ize each of the 
15030 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e  component segmen
15040 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a  t iterators. */.
15050 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
15060 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
15070 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d  ureLevel *pEnd =
15080 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
15090 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
150a0 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  l];.    if( p->p
150b0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hash ){.      /*
150c0 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69   Add a segment i
150d0 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  terator for the 
150e0 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
150f0 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62   of the hash tab
15100 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  le. */.      Fts
15110 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
15120 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
15130 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74  ter++];.      ft
15140 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69  s5SegIterHashIni
15150 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  t(p, pTerm, nTer
15160 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29  m, flags, pIter)
15170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
15180 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
15190 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
151a0 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
151b0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76      for(iSeg=pLv
151c0 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  l->nSeg-1; iSeg>
151d0 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
151e0 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
151f0 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
15200 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
15210 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73  eg];.        Fts
15220 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
15230 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
15240 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
15250 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
15260 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
15270 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  gIterInit(p, pSe
15280 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
15290 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
152a0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
152b0 65 65 6b 49 6e 69 74 28 70 2c 20 26 62 75 66 2c  eekInit(p, &buf,
152c0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
152d0 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65  lags, pSeg, pIte
152e0 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
152f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
15300 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20  lse{.    pLvl = 
15310 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
15320 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f  [iLevel];.    fo
15330 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69  r(iSeg=nSeg-1; i
15340 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
15350 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
15360 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d  erInit(p, &pLvl-
15370 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e  >aSeg[iSeg], &pN
15380 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
15390 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
153a0 61 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e  assert( iIter==n
153b0 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Seg );..  /* If 
153c0 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73 75  the above was su
153d0 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63  ccessful, each c
153e0 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f  omponent iterato
153f0 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20  rs now points . 
15400 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74   ** to the first
15410 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65   entry in its se
15420 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63  gment. In this c
15430 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  ase initialize t
15440 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b  he .  ** aFirst[
15450 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  ] array. Or, if 
15460 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
15470 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65 20  urred, free the 
15480 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62  iterator.  ** ob
15490 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68 65  ject and set the
154a0 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
154b0 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20   to NULL.  */.  
154c0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
154d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28  E_OK ){.    for(
154e0 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67  iIter=pNew->nSeg
154f0 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
15500 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
15510 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
15520 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
15530 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
15540 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
15550 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
15560 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d  erNext(p, &pNew-
15570 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a  >aSeg[iEq], 0);.
15580 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
15590 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
155a0 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65   pNew, iEq, iIte
155b0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
155c0 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
155d0 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b  terSetEof(pNew);
155e0 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
155f0 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
15600 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
15610 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
15620 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74  y && fts5MultiIt
15630 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65  erIsEmpty(p, pNe
15640 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  w) ){.      fts5
15650 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
15660 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20   pNew, 0, 0);.  
15670 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15680 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
15690 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ee(p, pNew);.   
156a0 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
156b0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
156c0 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(&buf);.}../*.*
156d0 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35  * Create an Fts5
156e0 49 6e 64 65 78 49 74 65 72 20 74 68 61 74 20 69  IndexIter that i
156f0 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
15700 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76  the doclist prov
15710 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ided.** as the s
15720 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
15730 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
15740 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
15750 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15770 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15780 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
15790 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44  ithin */.  Fts5D
157a0 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20  ata *pData,     
157b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
157c0 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74 65  clist to iterate
157d0 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e   through */.  in
157e0 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15800 20 54 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e   True for descen
15810 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
15820 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
15830 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
15840 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
15850 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
15860 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b  IndexIter *pNew;
15870 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75  .  pNew = fts5Mu
15880 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20  ltiIterAlloc(p, 
15890 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  2);.  if( pNew )
158a0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
158b0 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
158c0 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20  ->aSeg[1];..    
158d0 70 4e 65 77 2d 3e 62 46 69 6c 74 65 72 65 64 20  pNew->bFiltered 
158e0 3d 20 31 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  = 1;.    pIter->
158f0 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45 47  flags = FTS5_SEG
15900 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
15910 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c    if( pData->szL
15920 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  eaf>0 ){.      p
15930 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44  Iter->pLeaf = pD
15940 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ata;.      pIter
15950 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
15960 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44  fts5GetVarint(pD
15970 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  ata->p, (u64*)&p
15980 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
15990 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
159a0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61 74  ofDoclist = pDat
159b0 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65  a->nn;.      pNe
159c0 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
159d0 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  rst = 1;.      i
159e0 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
159f0 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d      pNew->bRev =
15a00 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   1;.        pIte
15a10 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
15a20 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
15a30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
15a40 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
15a50 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
15a60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
15a70 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
15a80 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
15a90 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
15aa0 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
15ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
15ac0 65 77 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  ew->bEof = 1;.  
15ad0 20 20 7d 0a 0a 20 20 20 20 2a 70 70 4f 75 74 20    }..    *ppOut 
15ae0 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20 66  = pNew;.  }..  f
15af0 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
15b00 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Data);.}../*.** 
15b10 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
15b20 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 61  he iterator is a
15b30 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20 65  t EOF or if an e
15b40 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
15b50 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74 68  d. .** False oth
15b60 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
15b70 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
15b80 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
15b90 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74   *p, Fts5IndexIt
15ba0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
15bb0 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20 20 20  sert( p->rc .   
15bc0 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e 61 53     || (pIter->aS
15bd0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
15be0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c  t[1].iFirst ].pL
15bf0 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e  eaf==0)==pIter->
15c00 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65 74  bEof .  );.  ret
15c10 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70 49  urn (p->rc || pI
15c20 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f  ter->bEof);.}../
15c30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15c40 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65 6e 74  rowid of the ent
15c50 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ry that the iter
15c60 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
15c70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49 66 20  oints.** to. If 
15c80 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69  the iterator poi
15c90 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65 6e 20  nts to EOF when 
15ca0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15cb0 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a 20 72   called the.** r
15cc0 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65 66  esults are undef
15cd0 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
15ce0 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49 74 65  i64 fts5MultiIte
15cf0 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  rRowid(Fts5Index
15d00 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15d10 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 61  assert( pIter->a
15d20 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
15d30 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 70  st[1].iFirst ].p
15d40 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72 6e  Leaf );.  return
15d50 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49   pIter->aSeg[ pI
15d60 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15d70 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b 0a  First ].iRowid;.
15d80 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
15d90 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
15da0 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74 20  e next entry at 
15db0 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61  or following iMa
15dc0 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tch..*/.static v
15dd0 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
15de0 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74 73  rNextFrom(.  Fts
15df0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
15e00 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
15e10 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61 74 63  er, .  i64 iMatc
15e20 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20 31 20  h.){.  while( 1 
15e30 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
15e40 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69  d;.    fts5Multi
15e50 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
15e60 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b 0a 20  r, 1, iMatch);. 
15e70 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69     if( fts5Multi
15e80 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
15e90 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  ) ) break;.    i
15ea0 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74  Rowid = fts5Mult
15eb0 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
15ec0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
15ed0 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69 52 6f  ->bRev==0 && iRo
15ee0 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
15ef0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 49 74  eak;.    if( pIt
15f00 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26 20 69  er->bRev!=0 && i
15f10 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
15f20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  break;.  }.}../*
15f30 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
15f40 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
15f50 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
15f60 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65 64 20  term associated 
15f70 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65 6e 74  with the .** ent
15f80 72 79 20 74 68 61 74 20 74 68 65 20 69 74 65 72  ry that the iter
15f90 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79 20 70  ator currently p
15fa0 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61  oints to..*/.sta
15fb0 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a 66 74  tic const u8 *ft
15fc0 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
15fd0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
15fe0 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a  Iter, int *pn){.
15ff0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
16000 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
16010 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
16020 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70  ].iFirst ];.  *p
16030 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20  n = p->term.n;. 
16040 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e   return p->term.
16050 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  p;.}..static voi
16060 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61  d fts5ChunkItera
16070 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  te(.  Fts5Index 
16080 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16090 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
160a0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
160b0 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20  egIter *pSeg,   
160c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
160d0 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20 69 74  slist of this it
160e0 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64  erator */.  void
160f0 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
16100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
16110 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66  ontext pointer f
16120 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61  or xChunk callba
16130 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  ck */.  void (*x
16140 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64 65 78  Chunk)(Fts5Index
16150 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20  *, void*, const 
16160 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69  u8*, int).){.  i
16170 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e  nt nRem = pSeg->
16180 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 2f  nPos;          /
16190 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
161a0 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20  s still to come 
161b0 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
161c0 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a  Data = 0;.  u8 *
161d0 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e  pChunk = &pSeg->
161e0 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69  pLeaf->p[pSeg->i
161f0 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69  LeafOffset];.  i
16200 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28  nt nChunk = MIN(
16210 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61  nRem, pSeg->pLea
16220 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67  f->szLeaf - pSeg
16230 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a  ->iLeafOffset);.
16240 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65    int pgno = pSe
16250 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  g->iLeafPgno;.  
16260 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d 20 30  int pgnoSave = 0
16270 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67 2d 3e  ;..  if( (pSeg->
16280 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
16290 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d 3d 30  ITER_REVERSE)==0
162a0 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61 76 65   ){.    pgnoSave
162b0 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a   = pgno+1;.  }..
162c0 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
162d0 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43 74 78    xChunk(p, pCtx
162e0 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
162f0 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d 20 6e  );.    nRem -= n
16300 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73 35 44  Chunk;.    fts5D
16310 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
16320 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 6d 3c  );.    if( nRem<
16330 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61  =0 ){.      brea
16340 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
16350 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20      pgno++;.    
16360 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
16370 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
16380 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
16390 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  g->pSeg->iSegid,
163a0 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 69   pgno));.      i
163b0 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20 62 72  f( pData==0 ) br
163c0 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68 75 6e  eak;.      pChun
163d0 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b 34 5d  k = &pData->p[4]
163e0 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b 20 3d  ;.      nChunk =
163f0 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61 74 61   MIN(nRem, pData
16400 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b 0a 20  ->szLeaf - 4);. 
16410 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 70       if( pgno==p
16420 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20 20 20  gnoSave ){.     
16430 20 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d     assert( pSeg-
16440 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
16450 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70  .        pSeg->p
16460 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61 74 61  NextLeaf = pData
16470 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74 61 20  ;.        pData 
16480 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
16490 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a   }.  }.}..../*.*
164a0 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
164b0 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72 20   segment-id for 
164c0 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70 53  the structure pS
164d0 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20 73  truct. The new s
164e0 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75 73  egment.** id mus
164f0 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20 61  t be between 1 a
16500 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73 69  nd 65335 inclusi
16510 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74  ve, and must not
16520 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a 20   be used by .** 
16530 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65 78  any currently ex
16540 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e 20  isting segment. 
16550 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65 6e  If a free segmen
16560 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20 66  t id cannot be f
16570 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ound,.** SQLITE_
16580 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  FULL is returned
16590 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
165a0 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
165b0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
165c0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
165d0 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65 74  op. 0 is .** ret
165e0 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  urned in this ca
165f0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
16600 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65  t fts5AllocateSe
16610 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  gid(Fts5Index *p
16620 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  , Fts5Structure 
16630 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74  *pStruct){.  int
16640 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20 20   iSegid = 0;..  
16650 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
16660 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
16670 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
16680 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d  t>=FTS5_MAX_SEGM
16690 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ENT ){.      p->
166a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
166b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
166c0 20 20 20 77 68 69 6c 65 28 20 69 53 65 67 69 64     while( iSegid
166d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
166e0 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
166f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
16700 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
16710 28 75 33 32 29 2c 20 28 76 6f 69 64 2a 29 26 69  (u32), (void*)&i
16720 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
16730 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 20  iSegid = iSegid 
16740 26 20 28 28 31 20 3c 3c 20 46 54 53 35 5f 44 41  & ((1 << FTS5_DA
16750 54 41 5f 49 44 5f 42 29 2d 31 29 3b 0a 20 20 20  TA_ID_B)-1);.   
16760 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
16770 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
16780 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
16790 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 53            for(iS
167a0 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
167b0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
167c0 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
167d0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
167e0 69 53 65 67 69 64 3d 3d 70 53 74 72 75 63 74 2d  iSegid==pStruct-
167f0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53  >aLevel[iLvl].aS
16800 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20  eg[iSeg].iSegid 
16810 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
16820 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 20 20 20   iSegid = 0;.   
16830 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16860 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 53 65   }..  return iSe
16870 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  gid;.}../*.** Di
16880 73 63 61 72 64 20 61 6c 6c 20 64 61 74 61 20 63  scard all data c
16890 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
168a0 69 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c  in the hash-tabl
168b0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
168c0 69 64 20 66 74 73 35 49 6e 64 65 78 44 69 73 63  id fts5IndexDisc
168d0 61 72 64 44 61 74 61 28 46 74 73 35 49 6e 64 65  ardData(Fts5Inde
168e0 78 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  x *p){.  assert(
168f0 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20 70 2d 3e   p->pHash || p->
16900 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
16910 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73  );.  if( p->pHas
16920 68 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  h ){.    sqlite3
16930 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 2d  Fts5HashClear(p-
16940 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 70 2d 3e  >pHash);.    p->
16950 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30  nPendingData = 0
16960 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
16970 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
16980 66 20 74 68 65 20 70 72 65 66 69 78 2c 20 69 6e  f the prefix, in
16990 20 62 79 74 65 73 2c 20 74 68 61 74 20 62 75 66   bytes, that buf
169a0 66 65 72 20 28 6e 4e 65 77 2f 70 4e 65 77 29 20  fer (nNew/pNew) 
169b0 73 68 61 72 65 73 0a 2a 2a 20 77 69 74 68 20 62  shares.** with b
169c0 75 66 66 65 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64  uffer (nOld/pOld
169d0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
169e0 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
169f0 65 73 73 28 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c  ess(.  int nOld,
16a00 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64 2c   const u8 *pOld,
16a10 0a 20 20 69 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e  .  int nNew, con
16a20 73 74 20 75 38 20 2a 70 4e 65 77 0a 29 7b 0a 20  st u8 *pNew.){. 
16a30 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
16a40 28 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72  ( fts5BlobCompar
16a50 65 28 70 4f 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e  e(pOld, nOld, pN
16a60 65 77 2c 20 6e 4e 65 77 29 3c 30 20 29 3b 0a 20  ew, nNew)<0 );. 
16a70 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
16a80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
16a90 70 4f 6c 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d  pOld[i]!=pNew[i]
16aa0 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20   ) break;.  }.  
16ab0 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61  return i;.}..sta
16ac0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
16ad0 74 65 44 6c 69 64 78 43 6c 65 61 72 28 0a 20 20  teDlidxClear(.  
16ae0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
16af0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
16b00 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 62  pWriter,.  int b
16b10 46 6c 75 73 68 20 20 20 20 20 20 20 20 20 20 20  Flush           
16b20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
16b30 20 74 72 75 65 2c 20 77 72 69 74 65 20 64 6c 69   true, write dli
16b40 64 78 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b  dx to disk */.){
16b50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
16b60 72 74 28 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c  rt( bFlush==0 ||
16b70 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64   (pWriter->nDlid
16b80 78 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e  x>0 && pWriter->
16b90 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e  aDlidx[0].buf.n>
16ba0 30 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  0) );.  for(i=0;
16bb0 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69   i<pWriter->nDli
16bc0 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74  dx; i++){.    Ft
16bd0 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
16be0 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
16bf0 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20  ->aDlidx[i];.   
16c00 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66   if( pDlidx->buf
16c10 2e 6e 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  .n==0 ) break;. 
16c20 20 20 20 69 66 28 20 62 46 6c 75 73 68 20 29 7b     if( bFlush ){
16c30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16c40 44 6c 69 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29  Dlidx->pgno!=0 )
16c50 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
16c60 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20  Write(p, .      
16c70 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
16c80 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
16c90 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d  egid, i, pDlidx-
16ca0 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20  >pgno),.        
16cb0 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c    pDlidx->buf.p,
16cc0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20   pDlidx->buf.n. 
16cd0 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
16ce0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
16cf0 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d  ferZero(&pDlidx-
16d00 3e 62 75 66 29 3b 0a 20 20 20 20 70 44 6c 69 64  >buf);.    pDlid
16d10 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  x->bPrevValid = 
16d20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
16d30 47 72 6f 77 20 74 68 65 20 70 57 72 69 74 65 72  Grow the pWriter
16d40 2d 3e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79  ->aDlidx[] array
16d50 20 74 6f 20 61 74 20 6c 65 61 73 74 20 6e 4c 76   to at least nLv
16d60 6c 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69  l elements in si
16d70 7a 65 2e 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61  ze..** Any new a
16d80 72 72 61 79 20 65 6c 65 6d 65 6e 74 73 20 61 72  rray elements ar
16d90 65 20 7a 65 72 6f 65 64 20 62 65 66 6f 72 65 20  e zeroed before 
16da0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
16db0 61 74 69 63 20 69 6e 74 20 66 74 73 35 57 72 69  atic int fts5Wri
16dc0 74 65 44 6c 69 64 78 47 72 6f 77 28 0a 20 20 46  teDlidxGrow(.  F
16dd0 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
16de0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16df0 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76  riter,.  int nLv
16e00 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  l.){.  if( p->rc
16e10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
16e20 4c 76 6c 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44  Lvl>=pWriter->nD
16e30 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35  lidx ){.    Fts5
16e40 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
16e50 69 64 78 20 3d 20 28 46 74 73 35 44 6c 69 64 78  idx = (Fts5Dlidx
16e60 57 72 69 74 65 72 2a 29 73 71 6c 69 74 65 33 5f  Writer*)sqlite3_
16e70 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20  realloc(.       
16e80 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16e90 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
16ea0 64 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c  dxWriter) * nLvl
16eb0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
16ec0 61 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20  aDlidx==0 ){.   
16ed0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
16ee0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
16ef0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42  se{.      int nB
16f00 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
16f10 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20  5DlidxWriter) * 
16f20 28 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d  (nLvl - pWriter-
16f30 3e 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  >nDlidx);.      
16f40 6d 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70  memset(&aDlidx[p
16f50 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c  Writer->nDlidx],
16f60 20 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20   0, nByte);.    
16f70 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64    pWriter->aDlid
16f80 78 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20  x = aDlidx;.    
16f90 20 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64    pWriter->nDlid
16fa0 78 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a  x = nLvl;.    }.
16fb0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e    }.  return p->
16fc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
16fd0 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
16fe0 69 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75  ist-index accumu
16ff0 6c 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65  lating in pWrite
17000 72 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c  r->aDlidx[] is l
17010 61 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20  arge.** enough, 
17020 66 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b  flush it to disk
17030 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f   and return 1. O
17040 74 68 65 72 77 69 73 65 20 64 69 73 63 61 72 64  therwise discard
17050 20 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a   it and return.*
17060 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  * zero..*/.stati
17070 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 46  c int fts5WriteF
17080 6c 75 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e  lushDlidx(Fts5In
17090 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
170a0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
170b0 0a 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30  .  int bFlag = 0
170c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  ;..  /* If there
170d0 20 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44   were FTS5_MIN_D
170e0 4c 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72  LIDX_SIZE or mor
170f0 65 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67  e empty leaf pag
17100 65 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  es written.  ** 
17110 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  to the database,
17120 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20   also write the 
17130 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f  doclist-index to
17140 20 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28   disk.  */.  if(
17150 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
17160 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70  [0].buf.n>0 && p
17170 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d  Writer->nEmpty>=
17180 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
17190 49 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67  IZE ){.    bFlag
171a0 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35   = 1;.  }.  fts5
171b0 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28  WriteDlidxClear(
171c0 70 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61  p, pWriter, bFla
171d0 67 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e  g);.  pWriter->n
171e0 45 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74  Empty = 0;.  ret
171f0 75 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a  urn bFlag;.}../*
17200 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17210 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
17220 65 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20  ever processing 
17230 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  of the doclist f
17240 6f 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20  or the .** last 
17250 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67  term on leaf pag
17260 65 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50  e (pWriter->iBtP
17270 61 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65  age) is complete
17280 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f  d. .**.** The do
17290 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20  clist-index for 
172a0 74 68 61 74 20 74 65 72 6d 20 69 73 20 63 75 72  that term is cur
172b0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e  rently stored in
172c0 2d 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74  -memory within t
172d0 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69  he.** Fts5SegWri
172e0 74 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72  ter.aDlidx[] arr
172f0 61 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72  ay. If it is lar
17300 67 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20  ge enough, this 
17310 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74  function.** writ
17320 65 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73  es it out to dis
17330 6b 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20  k. Or, if it is 
17340 74 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74  too small to bot
17350 68 65 72 20 77 69 74 68 2c 20 64 69 73 63 61 72  her with, discar
17360 64 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20  ds.** it..**.** 
17370 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 62 74  Fts5SegWriter.bt
17380 74 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63  term currently c
17390 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73  ontains the firs
173a0 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69  t term on page i
173b0 42 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  BtPage..*/.stati
173c0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
173d0 46 6c 75 73 68 42 74 72 65 65 28 46 74 73 35 49  FlushBtree(Fts5I
173e0 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
173f0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29  Writer *pWriter)
17400 7b 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a  {.  int bFlag;..
17410 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65    assert( pWrite
17420 72 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57  r->iBtPage || pW
17430 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30  riter->nEmpty==0
17440 20 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65   );.  if( pWrite
17450 72 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20  r->iBtPage==0 ) 
17460 72 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20  return;.  bFlag 
17470 3d 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  = fts5WriteFlush
17480 44 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65 72  Dlidx(p, pWriter
17490 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  );..  if( p->rc=
174a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
174b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
174c0 3d 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65  = (pWriter->btte
174d0 72 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68  rm.n>0?(const ch
174e0 61 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74  ar*)pWriter->btt
174f0 65 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f  erm.p:"");.    /
17500 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
17510 77 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65  was already done
17520 20 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69   in fts5WriteIni
17530 74 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73  t(): */.    /* s
17540 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
17550 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31  p->pIdxWriter, 1
17560 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
17570 64 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  d); */.    sqlit
17580 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
17590 70 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a  pIdxWriter, 2, z
175a0 2c 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  , pWriter->btter
175b0 6d 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  m.n, SQLITE_STAT
175c0 49 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  IC);.    sqlite3
175d0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
175e0 49 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46  IdxWriter, 3, bF
175f0 6c 61 67 20 2b 20 28 28 69 36 34 29 70 57 72 69  lag + ((i64)pWri
17600 74 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29  ter->iBtPage<<1)
17610 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
17620 74 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65  tep(p->pIdxWrite
17630 72 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  r);.    p->rc = 
17640 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d  sqlite3_reset(p-
17650 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
17660 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  }.  pWriter->iBt
17670 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Page = 0;.}../*.
17680 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  ** This is calle
17690 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
176a0 6c 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74  leaf page except
176b0 20 74 68 65 20 66 69 72 73 74 20 74 68 61 74 20   the first that 
176c0 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74 20 6c  contains.** at l
176d0 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 20 41  east one term. A
176e0 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d 2f 70  rgument (nTerm/p
176f0 54 65 72 6d 29 20 69 73 20 74 68 65 20 73 70 6c  Term) is the spl
17700 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72 6d 20  it-key - a term 
17710 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72 67 65  that.** is large
17720 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72 6d 73  r than all terms
17730 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61 72 6c   written to earl
17740 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e 64 20  ier leaves, and 
17750 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73  equal to or.** s
17760 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
17770 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 74 68  first term on th
17780 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a  e new leaf..**.*
17790 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
177a0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
177b0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
177c0 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 66 20  ts5Index.rc. If 
177d0 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61 73 20  an error.** has 
177e0 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
177f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
17800 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
17810 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
17820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
17830 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d 28  5WriteBtreeTerm(
17840 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17860 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
17870 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
17880 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17890 72 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f  riter,         /
178a0 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20  * Writer object 
178b0 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20  */.  int nTerm, 
178c0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20  const u8 *pTerm 
178d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 74 65       /* First te
178e0 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65 20 2a  rm on new page *
178f0 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69 74 65  /.){.  fts5Write
17900 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70 57  FlushBtree(p, pW
17910 72 69 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75  riter);.  fts5Bu
17920 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
17930 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
17940 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
17950 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  .  pWriter->iBtP
17960 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77  age = pWriter->w
17970 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f  riter.pgno;.}../
17980 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
17990 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
179a0 6e 20 66 6c 75 73 68 69 6e 67 20 61 20 6c 65 61  n flushing a lea
179b0 66 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  f page that cont
179c0 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73  ains no.** terms
179d0 20 61 74 20 61 6c 6c 20 74 6f 20 64 69 73 6b 2e   at all to disk.
179e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
179f0 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
17a00 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
17a10 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17a20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
17a30 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
17a40 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
17a50 72 20 2a 70 57 72 69 74 65 72 20 20 20 20 20 20  r *pWriter      
17a60 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
17a70 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20  ject */.){.  /* 
17a80 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6e 6f  If there were no
17a90 20 72 6f 77 69 64 73 20 6f 6e 20 74 68 65 20 6c   rowids on the l
17aa0 65 61 66 20 70 61 67 65 20 65 69 74 68 65 72 20  eaf page either 
17ab0 61 6e 64 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  and the doclist-
17ac0 69 6e 64 65 78 0a 20 20 2a 2a 20 68 61 73 20 61  index.  ** has a
17ad0 6c 72 65 61 64 79 20 62 65 65 6e 20 73 74 61 72  lready been star
17ae0 74 65 64 2c 20 61 70 70 65 6e 64 20 61 6e 20 30  ted, append an 0
17af0 78 30 30 20 62 79 74 65 20 74 6f 20 69 74 2e 20  x00 byte to it. 
17b00 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
17b10 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
17b20 50 61 67 65 20 26 26 20 70 57 72 69 74 65 72 2d  Page && pWriter-
17b30 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
17b40 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  >0 ){.    Fts5Dl
17b50 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64  idxWriter *pDlid
17b60 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
17b70 6c 69 64 78 5b 30 5d 3b 0a 20 20 20 20 61 73 73  lidx[0];.    ass
17b80 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 50 72  ert( pDlidx->bPr
17b90 65 76 56 61 6c 69 64 20 29 3b 0a 20 20 20 20 73  evValid );.    s
17ba0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
17bb0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
17bc0 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
17bd0 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f, 0);.  }..  /*
17be0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 22   Increment the "
17bf0 6e 75 6d 62 65 72 20 6f 66 20 73 65 71 75 65 6e  number of sequen
17c00 74 69 61 6c 20 6c 65 61 76 65 73 20 77 69 74 68  tial leaves with
17c10 6f 75 74 20 61 20 74 65 72 6d 22 20 63 6f 75 6e  out a term" coun
17c20 74 65 72 2e 20 2a 2f 0a 20 20 70 57 72 69 74 65  ter. */.  pWrite
17c30 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a  r->nEmpty++;.}..
17c40 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 44  static i64 fts5D
17c50 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74  lidxExtractFirst
17c60 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65 72  Rowid(Fts5Buffer
17c70 20 2a 70 42 75 66 29 7b 0a 20 20 69 36 34 20 69   *pBuf){.  i64 i
17c80 52 6f 77 69 64 3b 0a 20 20 69 6e 74 20 69 4f 66  Rowid;.  int iOf
17c90 66 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 31 20 2b  f;..  iOff = 1 +
17ca0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
17cb0 70 42 75 66 2d 3e 70 5b 31 5d 2c 20 28 75 36 34  pBuf->p[1], (u64
17cc0 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 66 74  *)&iRowid);.  ft
17cd0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75  s5GetVarint(&pBu
17ce0 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
17cf0 2a 29 26 69 52 6f 77 69 64 29 3b 0a 20 20 72 65  *)&iRowid);.  re
17d00 74 75 72 6e 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a  turn iRowid;.}..
17d10 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20 69 52 6f 77  /*.** Rowid iRow
17d20 69 64 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  id has just been
17d30 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
17d40 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
17d50 67 65 2e 20 49 74 20 69 73 20 74 68 65 0a 2a 2a  ge. It is the.**
17d60 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20 70 61   first on the pa
17d70 67 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ge. This functio
17d80 6e 20 61 70 70 65 6e 64 73 20 61 6e 20 61 70 70  n appends an app
17d90 72 6f 70 72 69 61 74 65 20 65 6e 74 72 79 20 74  ropriate entry t
17da0 6f 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  o the current.**
17db0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
17dc0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
17dd0 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
17de0 65 6e 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  end(.  Fts5Index
17df0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
17e00 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
17e10 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
17e20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
17e30 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f  bDone = 0;..  fo
17e40 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51  r(i=0; p->rc==SQ
17e50 4c 49 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65  LITE_OK && bDone
17e60 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  ==0; i++){.    i
17e70 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 46 74 73  64 iVal;.    Fts
17e80 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44  5DlidxWriter *pD
17e90 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
17ea0 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 0a 20 20 20  >aDlidx[i];..   
17eb0 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62 75 66   if( pDlidx->buf
17ec0 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  .n>=p->pConfig->
17ed0 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pgsz ){.      /*
17ee0 20 54 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   The current doc
17ef0 6c 69 73 74 2d 69 6e 64 65 78 20 70 61 67 65 20  list-index page 
17f00 69 73 20 66 75 6c 6c 2e 20 57 72 69 74 65 20 69  is full. Write i
17f10 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 70 75  t to disk and pu
17f20 73 68 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  sh.      ** a co
17f30 70 79 20 6f 66 20 69 52 6f 77 69 64 20 28 77 68  py of iRowid (wh
17f40 69 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20  ich will become 
17f50 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
17f60 6f 6e 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20  on the next.    
17f70 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64    ** doclist-ind
17f80 65 78 20 6c 65 61 66 20 70 61 67 65 29 20 75 70  ex leaf page) up
17f90 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 6c   into the next l
17fa0 65 76 65 6c 20 6f 66 20 74 68 65 20 62 2d 74 72  evel of the b-tr
17fb0 65 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 69 65  ee .      ** hie
17fc0 72 61 72 63 68 79 2e 20 49 66 20 74 68 65 20 6e  rarchy. If the n
17fd0 6f 64 65 20 62 65 69 6e 67 20 66 6c 75 73 68 65  ode being flushe
17fe0 64 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  d is currently t
17ff0 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20  he root node,.  
18000 20 20 20 20 2a 2a 20 61 6c 73 6f 20 70 75 73 68      ** also push
18010 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69 64   its first rowid
18020 20 75 70 77 61 72 64 73 2e 20 2a 2f 0a 20 20 20   upwards. */.   
18030 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
18040 5b 30 5d 20 3d 20 30 78 30 31 3b 20 20 20 20 2f  [0] = 0x01;    /
18050 2a 20 4e 6f 74 20 74 68 65 20 72 6f 6f 74 20 6e  * Not the root n
18060 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 66 74 73  ode */.      fts
18070 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
18080 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
18090 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65  IDX_ROWID(pWrite
180a0 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44  r->iSegid, i, pD
180b0 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20  lidx->pgno),.   
180c0 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62         pDlidx->b
180d0 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75  uf.p, pDlidx->bu
180e0 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f.n.      );.   
180f0 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
18100 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72  xGrow(p, pWriter
18110 2c 20 69 2b 32 29 3b 0a 20 20 20 20 20 20 70 44  , i+2);.      pD
18120 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  lidx = &pWriter-
18130 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20  >aDlidx[i];.    
18140 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
18150 49 54 45 5f 4f 4b 20 26 26 20 70 44 6c 69 64 78  ITE_OK && pDlidx
18160 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a  [1].buf.n==0 ){.
18170 20 20 20 20 20 20 20 20 69 36 34 20 69 46 69 72          i64 iFir
18180 73 74 20 3d 20 66 74 73 35 44 6c 69 64 78 45 78  st = fts5DlidxEx
18190 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
181a0 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 0a  &pDlidx->buf);..
181b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
181c0 77 61 73 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  was the root nod
181d0 65 2e 20 50 75 73 68 20 69 74 73 20 66 69 72 73  e. Push its firs
181e0 74 20 72 6f 77 69 64 20 75 70 20 74 6f 20 74 68  t rowid up to th
181f0 65 20 6e 65 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20  e new root. */. 
18200 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d         pDlidx[1]
18210 2e 70 67 6e 6f 20 3d 20 70 44 6c 69 64 78 2d 3e  .pgno = pDlidx->
18220 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 71  pgno;.        sq
18230 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18240 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18250 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62  rc, &pDlidx[1].b
18260 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  uf, 0);.        
18270 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18280 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18290 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d  ->rc, &pDlidx[1]
182a0 2e 62 75 66 2c 20 70 44 6c 69 64 78 2d 3e 70 67  .buf, pDlidx->pg
182b0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  no);.        sql
182c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
182d0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
182e0 63 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75  c, &pDlidx[1].bu
182f0 66 2c 20 69 46 69 72 73 74 29 3b 0a 20 20 20 20  f, iFirst);.    
18300 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 62 50      pDlidx[1].bP
18310 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
18320 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e        pDlidx[1].
18330 69 50 72 65 76 20 3d 20 69 46 69 72 73 74 3b 0a  iPrev = iFirst;.
18340 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
18350 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
18360 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75  Zero(&pDlidx->bu
18370 66 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78  f);.      pDlidx
18380 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30  ->bPrevValid = 0
18390 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  ;.      pDlidx->
183a0 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  pgno++;.    }els
183b0 65 7b 0a 20 20 20 20 20 20 62 44 6f 6e 65 20 3d  e{.      bDone =
183c0 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   1;.    }..    i
183d0 66 28 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76  f( pDlidx->bPrev
183e0 56 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 69  Valid ){.      i
183f0 56 61 6c 20 3d 20 69 52 6f 77 69 64 20 2d 20 70  Val = iRowid - p
18400 44 6c 69 64 78 2d 3e 69 50 72 65 76 3b 0a 20 20  Dlidx->iPrev;.  
18410 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
18420 36 34 20 69 50 67 6e 6f 20 3d 20 28 69 3d 3d 30  64 iPgno = (i==0
18430 20 3f 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74   ? pWriter->writ
18440 65 72 2e 70 67 6e 6f 20 3a 20 70 44 6c 69 64 78  er.pgno : pDlidx
18450 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a 20 20 20 20  [-1].pgno);.    
18460 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
18470 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20  ->buf.n==0 );.  
18480 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
18490 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
184a0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
184b0 78 2d 3e 62 75 66 2c 20 21 62 44 6f 6e 65 29 3b  x->buf, !bDone);
184c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
184d0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
184e0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
184f0 6c 69 64 78 2d 3e 62 75 66 2c 20 69 50 67 6e 6f  lidx->buf, iPgno
18500 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  );.      iVal = 
18510 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a 20  iRowid;.    }.. 
18520 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18530 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18540 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
18550 2d 3e 62 75 66 2c 20 69 56 61 6c 29 3b 0a 20 20  ->buf, iVal);.  
18560 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
18570 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 70 44  alid = 1;.    pD
18580 6c 69 64 78 2d 3e 69 50 72 65 76 20 3d 20 69 52  lidx->iPrev = iR
18590 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  owid;.  }.}..sta
185a0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
185b0 74 65 46 6c 75 73 68 4c 65 61 66 28 46 74 73 35  teFlushLeaf(Fts5
185c0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
185d0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
185e0 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
185f0 74 20 75 38 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20  t u8 zero[] = { 
18600 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
18610 2c 20 30 78 30 30 20 7d 3b 0a 20 20 46 74 73 35  , 0x00 };.  Fts5
18620 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67  PageWriter *pPag
18630 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72  e = &pWriter->wr
18640 69 74 65 72 3b 0a 20 20 69 36 34 20 69 52 6f 77  iter;.  i64 iRow
18650 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  id;..  assert( (
18660 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d  pPage->pgidx.n==
18670 30 29 3d 3d 28 70 57 72 69 74 65 72 2d 3e 62 46  0)==(pWriter->bF
18680 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 29 20  irstTermInPage) 
18690 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
186a0 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66   szLeaf header f
186b0 69 65 6c 64 2e 20 2a 2f 0a 20 20 61 73 73 65 72  ield. */.  asser
186c0 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55 31 36  t( 0==fts5GetU16
186d0 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32  (&pPage->buf.p[2
186e0 5d 29 20 29 3b 0a 20 20 66 74 73 35 50 75 74 55  ]) );.  fts5PutU
186f0 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
18700 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  [2], pPage->buf.
18710 6e 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74  n);..  if( pWrit
18720 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
18730 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e  Page ){.    /* N
18740 6f 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74  o term was writt
18750 65 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e  en to this page.
18760 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
18770 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d  pPage->pgidx.n==
18780 30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69  0 );.    fts5Wri
18790 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c  teBtreeNoTerm(p,
187a0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c   pWriter);.  }el
187b0 73 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e  se{.    /* Appen
187c0 64 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74  d the pgidx to t
187d0 68 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20  he page buffer. 
187e0 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68  Set the szLeaf h
187f0 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  eader field. */.
18800 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18810 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
18820 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50   &pPage->buf, pP
18830 61 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50  age->pgidx.n, pP
18840 61 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20  age->pgidx.p);. 
18850 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
18860 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64  he page out to d
18870 69 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20  isk */.  iRowid 
18880 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
18890 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53  OWID(pWriter->iS
188a0 65 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e  egid, pPage->pgn
188b0 6f 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72  o);.  fts5DataWr
188c0 69 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70  ite(p, iRowid, p
188d0 50 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61  Page->buf.p, pPa
188e0 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f  ge->buf.n);..  /
188f0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
18900 20 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20   next page. */. 
18910 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
18920 26 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20  &pPage->buf);.  
18930 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
18940 70 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20  pPage->pgidx);. 
18950 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
18960 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
18970 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65  Page->buf, 4, ze
18980 72 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50  ro);.  pPage->iP
18990 72 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20  revPgidx = 0;.  
189a0 70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a  pPage->pgno++;..
189b0 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68    /* Increase th
189c0 65 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e  e leaves written
189d0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57   counter */.  pW
189e0 72 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74  riter->nLeafWrit
189f0 74 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65  ten++;..  /* The
18a00 20 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20   new leaf holds 
18a10 6e 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69  no terms or rowi
18a20 64 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d  ds */.  pWriter-
18a30 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
18a40 65 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72  e = 1;.  pWriter
18a50 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
18a60 61 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  age = 1;.}../*.*
18a70 2a 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54  * Append term pT
18a80 65 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65  erm/nTerm to the
18a90 20 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77   segment being w
18aa0 72 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72  ritten by the wr
18ab0 69 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61  iter passed.** a
18ac0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
18ad0 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ument..**.** If 
18ae0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
18af0 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
18b00 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
18b10 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
18b20 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
18b30 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
18b40 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
18b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18b60 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64   fts5WriteAppend
18b70 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
18b80 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
18b90 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
18ba0 0a 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f  .  int nTerm, co
18bb0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29  nst u8 *pTerm .)
18bc0 7b 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b  {.  int nPrefix;
18bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18be0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
18bf0 70 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69  prefix compressi
18c00 6f 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20  on for term */. 
18c10 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
18c20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
18c30 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73  r->writer;.  Fts
18c40 35 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20  5Buffer *pPgidx 
18c50 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
18c60 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73  er.pgidx;..  ass
18c70 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
18c80 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
18c90 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e  t( pPage->buf.n>
18ca0 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =4 );.  assert( 
18cb0 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c  pPage->buf.n>4 |
18cc0 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
18cd0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a  tTermInPage );..
18ce0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72    /* If the curr
18cf0 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73  ent leaf page is
18d00 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20   full, flush it 
18d10 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66  to disk. */.  if
18d20 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
18d30 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54  + pPgidx->n + nT
18d40 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f  erm + 2)>=p->pCo
18d50 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
18d60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66    if( pPage->buf
18d70 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74  .n>4 ){.      ft
18d80 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
18d90 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
18da0 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
18db0 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26  erGrow(&p->rc, &
18dc0 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
18dd0 6d 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  m+FTS5_DATA_PADD
18de0 49 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  ING);.  }.  .  /
18df0 2a 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e  * TODO1: Updatin
18e00 67 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f  g pgidx here. */
18e10 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20  .  pPgidx->n += 
18e20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
18e30 72 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67  rint(.      &pPg
18e40 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e  idx->p[pPgidx->n
18e50 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ], pPage->buf.n 
18e60 2d 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67  - pPage->iPrevPg
18e70 69 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65  idx.  );.  pPage
18e80 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 70  ->iPrevPgidx = p
18e90 50 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66  Page->buf.n;.#if
18ea0 20 30 0a 20 20 66 74 73 35 50 75 74 55 31 36 28   0.  fts5PutU16(
18eb0 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64  &pPgidx->p[pPgid
18ec0 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75  x->n], pPage->bu
18ed0 66 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e  f.n);.  pPgidx->
18ee0 6e 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a  n += 2;.#endif..
18ef0 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
18f00 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
18f10 29 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  ){.    nPrefix =
18f20 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   0;.    if( pPag
18f30 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20  e->pgno!=1 ){.  
18f40 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
18f50 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
18f60 20 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20   a leaf that is 
18f70 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74  not the leftmost
18f80 20 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a   leaf in.      *
18f90 2a 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d  * the segment b-
18fa0 74 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61  tree. In this ca
18fb0 73 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61  se it is necessa
18fc0 72 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d  ry to add a term
18fd0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   to.      ** the
18fe0 20 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68   b-tree hierarch
18ff0 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61  y that is (a) la
19000 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61  rger than the la
19010 72 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20  rgest term .    
19020 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69    ** already wri
19030 74 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d  tten to the segm
19040 65 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c  ent and (b) smal
19050 6c 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ler than or equa
19060 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  l to.      ** th
19070 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65  is term. In othe
19080 72 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69  r words, a prefi
19090 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  x of (pTerm/nTer
190a0 6d 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20  m) that is one. 
190b0 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e       ** byte lon
190c0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e  ger than the lon
190d0 67 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65  gest prefix (pTe
190e0 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73  rm/nTerm) shares
190f0 20 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20   with the.      
19100 2a 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  ** previous term
19110 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
19120 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68    ** Usually, th
19130 65 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20  e previous term 
19140 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  is available in 
19150 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65  pPage->term. The
19160 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20   exception.     
19170 20 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69   ** is if this i
19180 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
19190 20 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69   written in an i
191a0 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65  ncremental-merge
191b0 20 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20   step..      ** 
191c0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
191d0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
191e0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c  s not available,
191f0 20 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61   so just write a
19200 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
19210 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  f (pTerm/nTerm) 
19220 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  into the parent 
19230 6e 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c  node. This is sl
19240 69 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20  ightly.      ** 
19250 69 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74  inefficient, but
19260 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20   still correct. 
19270 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
19280 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69  = nTerm;.      i
19290 66 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  f( pPage->term.n
192a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20   ){.        n = 
192b0 31 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f  1 + fts5PrefixCo
192c0 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65  mpress(pPage->te
192d0 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72  rm.n, pPage->ter
192e0 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72  m.p, nTerm, pTer
192f0 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  m);.      }.    
19300 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
19310 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c  Term(p, pWriter,
19320 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20   n, pTerm);.    
19330 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74    pPage = &pWrit
19340 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20  er->writer;.    
19350 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  }.  }else{.    n
19360 50 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65  Prefix = fts5Pre
19370 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
19380 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
19390 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c  ->term.p, nTerm,
193a0 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73   pTerm);.    fts
193b0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
193c0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
193d0 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78  ge->buf, nPrefix
193e0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70  );.  }..  /* App
193f0 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  end the number o
19400 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64  f bytes of new d
19410 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65  ata, then the te
19420 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20  rm data itself. 
19430 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e   ** to the page.
19440 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
19450 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
19460 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
19470 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69  , nTerm - nPrefi
19480 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
19490 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
194a0 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
194b0 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c  nTerm - nPrefix,
194c0 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d   &pTerm[nPrefix]
194d0 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20  );..  /* Update 
194e0 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74  the Fts5PageWrit
194f0 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a  er.term field. *
19500 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  /.  fts5BufferSe
19510 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
19520 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  ->term, nTerm, p
19530 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72  Term);.  pWriter
19540 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
19550 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74  ge = 0;..  pWrit
19560 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
19570 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72  nPage = 0;.  pWr
19580 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
19590 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a  dInDoclist = 1;.
195a0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
195b0 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44   || (pWriter->nD
195c0 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65  lidx>0 && pWrite
195d0 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
195e0 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69  .n==0) );.  pWri
195f0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70  ter->aDlidx[0].p
19600 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e  gno = pPage->pgn
19610 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65  o;.}../*.** Appe
19620 6e 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70  nd a rowid and p
19630 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
19640 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77  e field to the w
19650 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a  riters output. .
19660 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19670 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f  ts5WriteAppendRo
19680 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
19690 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
196a0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
196b0 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20 20    i64 iRowid,.  
196c0 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69 66  int nPos.){.  if
196d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
196e0 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
196f0 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
19700 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
19710 65 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50  er;..    if( (pP
19720 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61  age->buf.n + pPa
19730 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d  ge->pgidx.n)>=p-
19740 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
19750 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  {.      fts5Writ
19760 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57  eFlushLeaf(p, pW
19770 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  riter);.    }.. 
19780 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
19790 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74   to be the first
197a0 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74   rowid written t
197b0 6f 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20  o the page, set 
197c0 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69  the .    ** rowi
197d0 64 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  d-pointer in the
197e0 20 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c   page-header. Al
197f0 73 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75  so append a valu
19800 65 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20  e to the dlidx. 
19810 20 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e     ** buffer, in
19820 20 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d   case a doclist-
19830 69 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65  index is require
19840 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  d.  */.    if( p
19850 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
19860 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  widInPage ){.   
19870 20 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50     fts5PutU16(pP
19880 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
19890 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20  e->buf.n);.     
198a0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
198b0 70 70 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72  ppend(p, pWriter
198c0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
198d0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  ..    /* Write t
198e0 68 65 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20  he rowid. */.   
198f0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
19900 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
19910 73 74 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62  st || pWriter->b
19920 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
19930 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
19940 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19950 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19960 3e 62 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20  >buf, iRowid);. 
19970 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19980 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c  assert( p->rc ||
19990 20 69 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d   iRowid>pWriter-
199a0 3e 69 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20  >iPrevRowid );. 
199b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
199c0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
199d0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
199e0 20 69 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65   iRowid - pWrite
199f0 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a  r->iPrevRowid);.
19a00 20 20 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65      }.    pWrite
19a10 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20  r->iPrevRowid = 
19a20 69 52 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69  iRowid;.    pWri
19a30 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
19a40 49 6e 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20  InDoclist = 0;. 
19a50 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
19a60 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
19a70 30 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66  0;..    fts5Buff
19a80 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
19a90 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
19aa0 75 66 2c 20 6e 50 6f 73 29 3b 0a 20 20 7d 0a 7d  uf, nPos);.  }.}
19ab0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
19ac0 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
19ad0 6c 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35  listData(.  Fts5
19ae0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
19af0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
19b00 74 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ter, .  const u8
19b10 20 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20   *aData, .  int 
19b20 6e 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50  nData.){.  Fts5P
19b30 61 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65  ageWriter *pPage
19b40 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
19b50 74 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  ter;.  const u8 
19b60 2a 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e  *a = aData;.  in
19b70 74 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a  t n = nData;.  .
19b80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f    assert( p->pCo
19b90 6e 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a  nfig->pgsz>0 );.
19ba0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
19bb0 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20  SQLITE_OK .     
19bc0 26 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  && (pPage->buf.n
19bd0 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e   + pPage->pgidx.
19be0 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66  n + n)>=p->pConf
19bf0 69 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20  ig->pgsz .  ){. 
19c00 20 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d     int nReq = p-
19c10 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d  >pConfig->pgsz -
19c20 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20   pPage->buf.n - 
19c30 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a  pPage->pgidx.n;.
19c40 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
19c50 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43  0;.    while( nC
19c60 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20  opy<nReq ){.    
19c70 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20    i64 dummy;.   
19c80 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35     nCopy += fts5
19c90 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f  GetVarint(&a[nCo
19ca0 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d  py], (u64*)&dumm
19cb0 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  y);.    }.    ft
19cc0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
19cd0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
19ce0 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61  e->buf, nCopy, a
19cf0 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70  );.    a += nCop
19d00 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70  y;.    n -= nCop
19d10 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  y;.    fts5Write
19d20 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
19d30 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  iter);.  }.  if(
19d40 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35   n>0 ){.    fts5
19d50 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
19d60 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19d70 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d  >buf, n, a);.  }
19d80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
19d90 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20  any data cached 
19da0 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62  by the writer ob
19db0 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61  ject to the data
19dc0 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a  base. Free any.*
19dd0 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  * allocations as
19de0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
19df0 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61  e writer..*/.sta
19e00 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
19e10 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35  teFinish(.  Fts5
19e20 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
19e30 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
19e40 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ter,         /* 
19e50 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
19e60 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20  .  int *pnLeaf  
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65     /* OUT: Numbe
19e90 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
19ea0 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a  in b-tree */.){.
19eb0 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50    int i;.  Fts5P
19ec0 61 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66  ageWriter *pLeaf
19ed0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69   = &pWriter->wri
19ee0 74 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ter;.  if( p->rc
19ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19f00 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66     assert( pLeaf
19f10 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20  ->pgno>=1 );.   
19f20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e   if( pLeaf->buf.
19f30 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
19f40 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
19f50 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
19f60 20 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d   }.    *pnLeaf =
19f70 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a   pLeaf->pgno-1;.
19f80 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
19f90 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
19fa0 65 72 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42  er);.  }.  fts5B
19fb0 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
19fc0 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
19fd0 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
19fe0 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75  ->buf);.  fts5Bu
19ff0 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1a000 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42  >pgidx);.  fts5B
1a010 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74  ufferFree(&pWrit
1a020 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20  er->btterm);..  
1a030 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
1a040 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29  er->nDlidx; i++)
1a050 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1a060 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72  5BufferFree(&pWr
1a070 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e  iter->aDlidx[i].
1a080 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  buf);.  }.  sqli
1a090 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
1a0a0 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74  ->aDlidx);.}..st
1a0b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1a0c0 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49  iteInit(.  Fts5I
1a0d0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1a0e0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1a0f0 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  er, .  int iSegi
1a100 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  d.){.  const int
1a110 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70 43   nBuffer = p->pC
1a120 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54  onfig->pgsz + FT
1a130 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b  S5_DATA_PADDING;
1a140 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74  ..  memset(pWrit
1a150 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
1a160 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
1a170 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1a180 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74   = iSegid;..  ft
1a190 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
1a1a0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b  (p, pWriter, 1);
1a1b0 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  .  pWriter->writ
1a1c0 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70  er.pgno = 1;.  p
1a1d0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1a1e0 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
1a1f0 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1a200 20 3d 20 31 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77   = 1;..  /* Grow
1a210 20 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73   the two buffers
1a220 20 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69   to pgsz + paddi
1a230 6e 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ng bytes in size
1a240 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1a250 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70  rGrow(&p->rc, &p
1a260 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1a270 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29 3b 0a  gidx, nBuffer);.
1a280 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77    fts5BufferGrow
1a290 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
1a2a0 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 6e  r->writer.buf, n
1a2b0 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28 20  Buffer);..  if( 
1a2c0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d 30  p->pIdxWriter==0
1a2d0 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66   ){.    Fts5Conf
1a2e0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
1a2f0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74  >pConfig;.    ft
1a300 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74  s5IndexPrepareSt
1a310 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57 72  mt(p, &p->pIdxWr
1a320 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
1a330 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
1a340 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27 25   "INSERT INTO '%
1a350 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67 69  q'.'%q_idx'(segi
1a360 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c  d,term,pgno) VAL
1a370 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20  UES(?,?,?)", .  
1a380 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
1a390 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  >zDb, pConfig->z
1a3a0 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d  Name.    ));.  }
1a3b0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
1a3c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a3d0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
1a3e0 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70 61  e 4-byte leaf-pa
1a3f0 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78 30  ge header to 0x0
1a400 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  0. */.    memset
1a410 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  (pWriter->writer
1a420 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20  .buf.p, 0, 4);. 
1a430 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74     pWriter->writ
1a440 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20  er.buf.n = 4;.. 
1a450 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20 63     /* Bind the c
1a460 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73 65  urrent output se
1a470 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65 20  gment id to the 
1a480 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54 68  index-writer. Th
1a490 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20  is is an.    ** 
1a4a0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65  optimization ove
1a4b0 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73 61  r binding the sa
1a4c0 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61 6e  me value over an
1a4d0 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20 61  d over as rows a
1a4e0 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74  re.    ** insert
1a4f0 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62 79  ed into %_idx by
1a500 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72 69   the current wri
1a510 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ter.  */.    sql
1a520 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
1a530 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20  >pIdxWriter, 1, 
1a540 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29  pWriter->iSegid)
1a550 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
1a560 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77 61  terator pIter wa
1a570 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  s used to iterat
1a580 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  e through the in
1a590 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66 20  put segments of 
1a5a0 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65  on an.** increme
1a5b0 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72 61  ntal merge opera
1a5c0 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63 74  tion. This funct
1a5d0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69 66  ion is called if
1a5e0 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c   the incremental
1a5f0 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20 68  .** merge step h
1a600 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74 20  as finished but 
1a610 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e 6f  the input has no
1a620 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  t been completel
1a630 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a  y exhausted..*/.
1a640 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1a650 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74 73  TrimSegments(Fts
1a660 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
1a670 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
1a680 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73  {.  int i;.  Fts
1a690 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d  5Buffer buf;.  m
1a6a0 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73  emset(&buf, 0, s
1a6b0 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
1a6c0 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ));.  for(i=0; i
1a6d0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
1a6e0 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49  +){.    Fts5SegI
1a6f0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
1a700 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20  er->aSeg[i];.   
1a710 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67 3d   if( pSeg->pSeg=
1a720 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e  =0 ){.      /* n
1a730 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  o-op */.    }els
1a740 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61  e if( pSeg->pLea
1a750 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  f==0 ){.      /*
1a760 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20 74   All keys from t
1a770 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  his input segmen
1a780 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61 6e  t have been tran
1a790 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f 75  sfered to the ou
1a7a0 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20 53  tput..      ** S
1a7b0 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72 73  et both the firs
1a7c0 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65 2d  t and last page-
1a7d0 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f 20  numbers to 0 to 
1a7e0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
1a7f0 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d 65  e.      ** segme
1a800 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79 2e  nt is now empty.
1a810 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   */.      pSeg->
1a820 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1a830 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   0;.      pSeg->
1a840 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
1a850 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
1a860 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1a870 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1a880 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20 4f  Offset;     /* O
1a890 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69 72  ffset on new fir
1a8a0 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  st leaf page */.
1a8b0 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66 52        i64 iLeafR
1a8c0 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73 35  owid;.      Fts5
1a8d0 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20  Data *pData;.   
1a8e0 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53 65     int iId = pSe
1a8f0 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  g->pSeg->iSegid;
1a900 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b 34  .      u8 aHdr[4
1a910 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30 2c  ] = {0x00, 0x00,
1a920 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a 20   0x00, 0x00};.. 
1a930 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64 20       iLeafRowid 
1a940 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
1a950 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d 3e  OWID(iId, pSeg->
1a960 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a  iTermLeafPgno);.
1a970 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66 74        pData = ft
1a980 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 4c  s5DataRead(p, iL
1a990 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1a9a0 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20   if( pData ){.  
1a9b0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1a9c0 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20 20  Zero(&buf);.    
1a9d0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1a9e0 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ow(&p->rc, &buf,
1a9f0 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20   pData->nn);.   
1aa00 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1aa10 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
1aa20 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28 61  , &buf, sizeof(a
1aa30 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20 20  Hdr), aHdr);.   
1aa40 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
1aa50 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1aa60 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e  rc, &buf, pSeg->
1aa70 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20  term.n);.       
1aa80 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1aa90 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1aaa0 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e  uf, pSeg->term.n
1aab0 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b  , pSeg->term.p);
1aac0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1aad0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1aae0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74  ->rc, &buf, pDat
1aaf0 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20  a->szLeaf-iOff, 
1ab00 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
1ab10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
1ab20 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1ab30 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  {.          /* S
1ab40 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66 69  et the szLeaf fi
1ab50 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  eld */.         
1ab60 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75 66   fts5PutU16(&buf
1ab70 2e 70 5b 32 5d 2c 20 62 75 66 2e 6e 29 3b 0a 20  .p[2], buf.n);. 
1ab80 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1ab90 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20    /* Set up the 
1aba0 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61  new page-index a
1abb0 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  rray */.        
1abc0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1abd0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1abe0 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  buf, 4);.       
1abf0 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66   if( pSeg->iLeaf
1ac00 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54 65 72  Pgno==pSeg->iTer
1ac10 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20  mLeafPgno .     
1ac20 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e      && pSeg->iEn
1ac30 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61  dofDoclist<pData
1ac40 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20  ->szLeaf .      
1ac50 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69    ){.          i
1ac60 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74 61  nt nDiff = pData
1ac70 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d  ->szLeaf - pSeg-
1ac80 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b 0a  >iEndofDoclist;.
1ac90 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1aca0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1acb0 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 62  (&p->rc, &buf, b
1acc0 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69 66 66  uf.n - 1 - nDiff
1acd0 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20   - 4);.         
1ace0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1acf0 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62  dBlob(&p->rc, &b
1ad00 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  uf, .           
1ad10 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d 20 70     pData->nn - p
1ad20 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 2c 20  Seg->iPgidxOff, 
1ad30 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67 2d 3e  &pData->p[pSeg->
1ad40 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20 20 20  iPgidxOff].     
1ad50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
1ad60 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  }..        fts5D
1ad70 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
1ad80 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
1ad90 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1ada0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1adb0 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20  afPgno;.        
1adc0 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70  fts5DataDelete(p
1add0 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
1ade0 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c  OWID(iId, 1), iL
1adf0 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  eafRowid);.     
1ae00 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65     fts5DataWrite
1ae10 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c 20  (p, iLeafRowid, 
1ae20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20  buf.p, buf.n);. 
1ae30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1ae40 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
1ae50 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74 61 74  e(&buf);.}..stat
1ae60 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67  ic void fts5Merg
1ae70 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 28 0a  eChunkCallback(.
1ae80 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1ae90 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a  .  void *pCtx, .
1aea0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
1aeb0 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
1aec0 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  {.  Fts5SegWrite
1aed0 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28 46 74  r *pWriter = (Ft
1aee0 73 35 53 65 67 57 72 69 74 65 72 2a 29 70 43 74  s5SegWriter*)pCt
1aef0 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65 41 70  x;.  fts5WriteAp
1af00 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
1af10 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43 68 75  p, pWriter, pChu
1af20 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d 0a 0a  nk, nChunk);.}..
1af30 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  /*.**.*/.static 
1af40 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
1af50 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74 73 35  rgeLevel(.  Fts5
1af60 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1af70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1af80 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1af90 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1afa0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1afb0 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
1afc0 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66 20 69  T: Stucture of i
1afd0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  ndex */.  int iL
1afe0 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  vl,             
1aff0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
1b000 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  el to read input
1b010 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a   from */.  int *
1b020 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20 20 20  pnRem           
1b030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
1b040 69 74 65 20 75 70 20 74 6f 20 74 68 69 73 20 6d  ite up to this m
1b050 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61 76 65  any output leave
1b060 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  s */.){.  Fts5St
1b070 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
1b080 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
1b090 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
1b0a0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
1b0b0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b0c0 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ];.  Fts5Structu
1b0d0 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f 75 74  reLevel *pLvlOut
1b0e0 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ;.  Fts5IndexIte
1b0f0 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20 20 20  r *pIter = 0;   
1b100 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
1b110 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20 64 61  to read input da
1b120 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d  ta */.  int nRem
1b130 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65   = pnRem ? *pnRe
1b140 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75  m : 0;  /* Outpu
1b150 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  t leaf pages lef
1b160 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1b170 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20 20 20  int nInput;     
1b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b190 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
1b1a0 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
1b1b0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77   Fts5SegWriter w
1b1c0 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  riter;          
1b1d0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1b1e0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
1b1f0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
1b200 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74  g;     /* Output
1b210 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
1b220 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20  s5Buffer term;. 
1b230 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20 20 20   int bOldest;   
1b240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b250 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20   /* True if the 
1b260 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
1b270 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a  s the oldest */.
1b280 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c  .  assert( iLvl<
1b290 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
1b2a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 76  );.  assert( pLv
1b2b0 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d  l->nMerge<=pLvl-
1b2c0 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65 6d 73  >nSeg );..  mems
1b2d0 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
1b2e0 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69  izeof(Fts5SegWri
1b2f0 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ter));.  memset(
1b300 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
1b310 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
1b320 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
1b330 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f 75 74  e ){.    pLvlOut
1b340 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1b350 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20  vel[iLvl+1];.   
1b360 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f 75 74   assert( pLvlOut
1b370 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20 20 20  ->nSeg>0 );.    
1b380 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
1b390 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65 67 20  Merge;.    pSeg 
1b3a0 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67  = &pLvlOut->aSeg
1b3b0 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31  [pLvlOut->nSeg-1
1b3c0 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
1b3d0 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
1b3e0 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b  , pSeg->iSegid);
1b3f0 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72 69 74  .    writer.writ
1b400 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e  er.pgno = pSeg->
1b410 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20 20 20  pgnoLast+1;.    
1b420 77 72 69 74 65 72 2e 69 42 74 50 61 67 65 20 3d  writer.iBtPage =
1b430 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1b440 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 66 74   int iSegid = ft
1b450 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
1b460 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  p, pStruct);..  
1b470 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68 65 20    /* Extend the 
1b480 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f 62  Fts5Structure ob
1b490 6a 65 63 74 20 61 73 20 72 65 71 75 69 72 65 64  ject as required
1b4a0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 6f   to ensure the o
1b4b0 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73 65 67  utput.    ** seg
1b4c0 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a 2f 0a  ment exists. */.
1b4d0 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d 70 53      if( iLvl==pS
1b4e0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20  truct->nLevel-1 
1b4f0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
1b500 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
1b510 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63 74 29  p->rc, ppStruct)
1b520 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 20  ;.      pStruct 
1b530 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
1b540 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1b550 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
1b560 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
1b570 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a   iLvl+1, 1, 0);.
1b580 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
1b590 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 76 6c  return;.    pLvl
1b5a0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1b5b0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 70  vel[iLvl];.    p
1b5c0 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
1b5d0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
1b5e0 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72 69 74  ];..    fts5Writ
1b5f0 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
1b600 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
1b610 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20 73  /* Add the new s
1b620 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20 6f 75  egment to the ou
1b630 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  tput level */.  
1b640 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
1b650 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
1b660 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c 76 6c  >nSeg];.    pLvl
1b670 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
1b680 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
1b690 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67 2d 3e   = 1;.    pSeg->
1b6a0 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1b6b0 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53  .    pStruct->nS
1b6c0 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f  egment++;..    /
1b6d0 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66 72 6f  * Read input fro
1b6e0 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69  m all segments i
1b6f0 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65  n the input leve
1b700 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75 74 20  l */.    nInput 
1b710 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20  = pLvl->nSeg;.  
1b720 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20 28 70  }.  bOldest = (p
1b730 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d 31 20  LvlOut->nSeg==1 
1b740 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
1b750 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20  el==iLvl+2);..  
1b760 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d 30 20  assert( iLvl>=0 
1b770 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d 75 6c  );.  for(fts5Mul
1b780 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74  tiIterNew(p, pSt
1b790 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ruct, 0, 0, 0, 0
1b7a0 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20  , iLvl, nInput, 
1b7b0 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
1b7c0 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
1b7d0 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
1b7e0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
1b7f0 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
1b800 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46  0, 0).  ){.    F
1b810 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1b820 49 74 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  Iter = &pIter->a
1b830 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1b840 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
1b850 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20      int nPos;   
1b860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b870 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69    /* position-li
1b880 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61  st size field va
1b890 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  lue */.    int n
1b8a0 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Term;.    const 
1b8b0 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20  u8 *pTerm;..    
1b8c0 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65 79  /* Check for key
1b8d0 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20 2a   annihilation. *
1b8e0 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 49 74  /.    if( pSegIt
1b8f0 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20 28  er->nPos==0 && (
1b900 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67 49  bOldest || pSegI
1b910 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29 20  ter->bDel==0) ) 
1b920 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20 70  continue;..    p
1b930 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69  Term = fts5Multi
1b940 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
1b950 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66 28  &nTerm);.    if(
1b960 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20 7c   nTerm!=term.n |
1b970 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20  | memcmp(pTerm, 
1b980 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29  term.p, nTerm) )
1b990 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e 52 65  {.      if( pnRe
1b9a0 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61  m && writer.nLea
1b9b0 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b  fWritten>nRem ){
1b9c0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1b9d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1b9e0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65 77 20  * This is a new 
1b9f0 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61 20 74  term. Append a t
1ba00 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74 70 75  erm to the outpu
1ba10 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  t segment. */.  
1ba20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
1ba30 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74  endTerm(p, &writ
1ba40 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  er, nTerm, pTerm
1ba50 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1ba60 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
1ba70 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
1ba80 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rm);.    }..    
1ba90 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72 6f  /* Append the ro
1baa0 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75  wid to the outpu
1bab0 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49 54  t */.    /* WRIT
1bac0 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
1bad0 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65 67 49      nPos = pSegI
1bae0 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20 70 53  ter->nPos*2 + pS
1baf0 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a 20 20  egIter->bDel;.  
1bb00 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
1bb10 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69 74 65  dRowid(p, &write
1bb20 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r, fts5MultiIter
1bb30 52 6f 77 69 64 28 70 49 74 65 72 29 2c 20 6e 50  Rowid(pIter), nP
1bb40 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70 70  os);..    /* App
1bb50 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  end the position
1bb60 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20 74 68  -list data to th
1bb70 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
1bb80 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
1bb90 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76  (p, pSegIter, (v
1bba0 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74  oid*)&writer, ft
1bbb0 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
1bbc0 62 61 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  back);.  }..  /*
1bbd0 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73 74 20   Flush the last 
1bbe0 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64 69 73  leaf page to dis
1bbf0 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74 70 75  k. Set the outpu
1bc00 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  t segment b-tree
1bc10 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61 6e 64   height.  ** and
1bc20 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
1bc30 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20 73 61  number at the sa
1bc40 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20 20 66  me time.  */.  f
1bc50 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70  ts5WriteFinish(p
1bc60 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53 65 67  , &writer, &pSeg
1bc70 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20  ->pgnoLast);..  
1bc80 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65  if( fts5MultiIte
1bc90 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29  rEof(p, pIter) )
1bca0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20  {.    int i;..  
1bcb0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1bcc0 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
1bcd0 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ts from the %_da
1bce0 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  ta table */.    
1bcf0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 70 75  for(i=0; i<nInpu
1bd00 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  t; i++){.      f
1bd10 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65 67  ts5DataRemoveSeg
1bd20 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e 61 53  ment(p, pLvl->aS
1bd30 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b 0a 20  eg[i].iSegid);. 
1bd40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
1bd50 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
1bd60 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
1bd70 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20  the input level 
1bd80 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  */.    if( pLvl-
1bd90 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20 29 7b  >nSeg!=nInput ){
1bda0 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65  .      int nMove
1bdb0 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d   = (pLvl->nSeg -
1bdc0 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a 65 6f   nInput) * sizeo
1bdd0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
1bde0 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6d  egment);.      m
1bdf0 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61 53 65  emmove(pLvl->aSe
1be00 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e  g, &pLvl->aSeg[n
1be10 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a  Input], nMove);.
1be20 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72 75 63      }.    pStruc
1be30 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d 20 6e  t->nSegment -= n
1be40 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
1be50 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75 74 3b  >nSeg -= nInput;
1be60 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
1be70 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  e = 0;.    if( p
1be80 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30  Seg->pgnoLast==0
1be90 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c 4f 75   ){.      pLvlOu
1bea0 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20  t->nSeg--;.     
1beb0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1bec0 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  nt--;.    }.  }e
1bed0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
1bee0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e   pSeg->pgnoLast>
1bef0 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54 72 69  0 );.    fts5Tri
1bf00 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70 49 74  mSegments(p, pIt
1bf10 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e  er);.    pLvl->n
1bf20 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74 3b 0a  Merge = nInput;.
1bf30 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69    }..  fts5Multi
1bf40 49 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65  IterFree(p, pIte
1bf50 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r);.  fts5Buffer
1bf60 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 69  Free(&term);.  i
1bf70 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e 52 65  f( pnRem ) *pnRe
1bf80 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c 65 61  m -= writer.nLea
1bf90 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f 2a 0a  fWritten;.}../*.
1bfa0 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50 67 20  ** Do up to nPg 
1bfb0 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d 65 72  pages of automer
1bfc0 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65 20 69  ge work on the i
1bfd0 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndex..*/.static 
1bfe0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 4d 65  void fts5IndexMe
1bff0 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
1c000 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1c010 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1c020 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1c030 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1c040 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
1c050 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
1c060 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
1c070 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  of index */.  in
1c080 74 20 6e 50 67 20 20 20 20 20 20 20 20 20 20 20  t nPg           
1c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c0a0 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20 74   Pages of work t
1c0b0 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  o do */.){.  int
1c0c0 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 46   nRem = nPg;.  F
1c0d0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1c0e0 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1c0f0 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52 65 6d  t;.  while( nRem
1c100 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c  >0 && p->rc==SQL
1c110 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
1c120 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
1c130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
1c140 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1c150 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e  levels */.    in
1c160 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20  t iBestLvl = 0; 
1c170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
1c180 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68 65 20  el offering the 
1c190 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67 6d 65  most input segme
1c1a0 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  nts */.    int n
1c1b0 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Best = 0;       
1c1c0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1c1d0 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
1c1e0 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c  ts on best level
1c1f0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
1c200 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68 65 20  iBestLvl to the 
1c210 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e  level to read in
1c220 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  put segments fro
1c230 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  m. */.    assert
1c240 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1c250 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  l>0 );.    for(i
1c260 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
1c270 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
1c280 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
1c290 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1c2a0 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
1c2b0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
1c2c0 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
1c2d0 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20 20 20  Merge ){.       
1c2e0 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
1c2f0 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  e>nBest ){.     
1c300 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d 20       iBestLvl = 
1c310 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20 20 20  iLvl;.          
1c320 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d  nBest = pLvl->nM
1c330 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  erge;.        }.
1c340 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c360 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73   pLvl->nSeg>nBes
1c370 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 42 65  t ){.        nBe
1c380 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  st = pLvl->nSeg;
1c390 0a 20 20 20 20 20 20 20 20 69 42 65 73 74 4c 76  .        iBestLv
1c3a0 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20  l = iLvl;.      
1c3b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
1c3c0 49 66 20 6e 42 65 73 74 20 69 73 20 73 74 69 6c  If nBest is stil
1c3d0 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20 69 6e  l 0, then the in
1c3e0 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d 70 74  dex must be empt
1c3f0 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y. */.#ifdef SQL
1c400 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 66 6f  ITE_DEBUG.    fo
1c410 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d  r(iLvl=0; nBest=
1c420 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74 72 75  =0 && iLvl<pStru
1c430 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1c440 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
1c450 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  t( pStruct->aLev
1c460 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30  el[iLvl].nSeg==0
1c470 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
1c480 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73 74 3c  ..    if( nBest<
1c490 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
1c4a0 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20 20 20  omerge .        
1c4b0 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
1c4c0 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65  el[iBestLvl].nMe
1c4d0 72 67 65 3d 3d 30 20 0a 20 20 20 20 20 20 29 7b  rge==0 .      ){
1c4e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c4f0 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e 64 65    }.    fts5Inde
1c500 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
1c510 70 53 74 72 75 63 74 2c 20 69 42 65 73 74 4c 76  pStruct, iBestLv
1c520 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20 69  l, &nRem);.    i
1c530 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c540 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
1c550 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d  aLevel[iBestLvl]
1c560 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20  .nMerge==0 ){.  
1c570 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1c580 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42 65 73  ePromote(p, iBes
1c590 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29  tLvl+1, pStruct)
1c5a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1c5b0 70 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63  pStruct = pStruc
1c5c0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74 6f  t;.}../*.** A to
1c5d0 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65 61  tal of nLeaf lea
1c5e0 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61 20  f pages of data 
1c5f0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66 6c  has just been fl
1c600 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65 6c  ushed to a level
1c610 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20 54  -0.** segment. T
1c620 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70 64  his function upd
1c630 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d 63  ates the write-c
1c640 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e 67  ounter according
1c650 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e 65  ly and, if.** ne
1c660 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72 6d  cessary, perform
1c670 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  s incremental me
1c680 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a 20  rge work..**.** 
1c690 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1c6a0 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
1c6b0 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
1c6c0 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
1c6d0 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
1c6e0 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1c6f0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1c700 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1c710 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75 74  oid fts5IndexAut
1c720 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e  omerge(.  Fts5In
1c730 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
1c740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
1c750 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
1c760 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
1c770 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20  ure **ppStruct, 
1c780 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
1c790 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75   Current structu
1c7a0 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1c7b0 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20 20   int nLeaf      
1c7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75   /* Number of ou
1c7e0 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73 74  tput leaves just
1c7f0 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a 20   written */.){. 
1c800 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c810 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f 6e  TE_OK && p->pCon
1c820 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 3e  fig->nAutomerge>
1c830 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
1c840 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
1c850 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
1c860 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20 20   u64 nWrite;    
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c880 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  * Initial value 
1c890 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  of write-counter
1c8a0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f 72   */.    int nWor
1c8b0 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
1c8c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c8d0 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20 74  of work-quanta t
1c8e0 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20 20  o perform */.   
1c8f0 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20 20   int nRem;      
1c900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c910 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  * Number of leaf
1c920 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77   pages left to w
1c930 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rite */..    /* 
1c940 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74 65  Update the write
1c950 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65 20  -counter. While 
1c960 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e 57  doing so, set nW
1c970 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72 69  ork. */.    nWri
1c980 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57  te = pStruct->nW
1c990 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20  riteCounter;.   
1c9a0 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28 28   nWork = (int)((
1c9b0 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66 29  (nWrite + nLeaf)
1c9c0 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
1c9d0 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d 3e   - (nWrite / p->
1c9e0 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20 20  nWorkUnit));.   
1c9f0 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65   pStruct->nWrite
1ca00 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61 66  Counter += nLeaf
1ca10 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69 6e  ;.    nRem = (in
1ca20 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20  t)(p->nWorkUnit 
1ca30 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75 63  * nWork * pStruc
1ca40 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20 20  t->nLevel);..   
1ca50 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28   fts5IndexMerge(
1ca60 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52 65  p, ppStruct, nRe
1ca70 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  m);.  }.}..stati
1ca80 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1ca90 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46  Crisismerge(.  F
1caa0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1cab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cac0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1cad0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1cae0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1caf0 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct        /* IN
1cb00 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
1cb10 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
1cb20 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
1cb30 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e  nt nCrisis = p->
1cb40 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73  pConfig->nCrisis
1cb50 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72  Merge;.  Fts5Str
1cb60 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
1cb70 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69  = *ppStruct;.  i
1cb80 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20  nt iLvl = 0;..  
1cb90 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
1cba0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72  QLITE_OK || pStr
1cbb0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b  uct->nLevel>0 );
1cbc0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
1cbd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
1cbe0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1cbf0 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69  vl].nSeg>=nCrisi
1cc00 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64  s ){.    fts5Ind
1cc10 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
1cc20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20  &pStruct, iLvl, 
1cc30 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
1cc40 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1cc50 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
1cc60 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a  vel>(iLvl+1) );.
1cc70 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1cc80 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c  ePromote(p, iLvl
1cc90 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
1cca0 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20    iLvl++;.  }.  
1ccb0 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
1ccc0 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  uct;.}..static i
1ccd0 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  nt fts5IndexRetu
1cce0 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  rn(Fts5Index *p)
1ccf0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
1cd00 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  rc;.  p->rc = SQ
1cd10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72  LITE_OK;.  retur
1cd20 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66  n rc;.}..typedef
1cd30 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73   struct Fts5Flus
1cd40 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74  hCtx Fts5FlushCt
1cd50 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c  x;.struct Fts5Fl
1cd60 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49  ushCtx {.  Fts5I
1cd70 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74  ndex *pIdx;.  Ft
1cd80 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
1cd90 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  er; .};../*.** B
1cda0 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e  uffer aBuf[] con
1cdb0 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  tains a list of 
1cdc0 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61  varints, all sma
1cdd0 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74  ll enough to fit
1cde0 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20  .** in a 32-bit 
1cdf0 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20  integer. Return 
1ce00 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1ce10 6c 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f  largest prefix o
1ce20 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20  f this .** list 
1ce30 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65  nMax bytes or le
1ce40 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ss in size..*/.s
1ce50 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f  tatic int fts5Po
1ce60 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73  slistPrefix(cons
1ce70 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20  t u8 *aBuf, int 
1ce80 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74  nMax){.  int ret
1ce90 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20  ;.  u32 dummy;. 
1cea0 20 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61   ret = fts5GetVa
1ceb0 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d  rint32(aBuf, dum
1cec0 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e  my);.  if( ret<n
1ced0 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  Max ){.    while
1cee0 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ( 1 ){.      int
1cef0 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69   i = fts5GetVari
1cf00 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c  nt32(&aBuf[ret],
1cf10 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69   dummy);.      i
1cf20 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e  f( (ret + i) > n
1cf30 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Max ) break;.   
1cf40 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20     ret += i;.   
1cf50 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1cf60 72 65 74 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  ret;.}..#define 
1cf70 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
1cf80 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
1cf90 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20  Blob, nBlob) {  
1cfa0 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
1cfb0 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28  pBuf)->nSpace>=(
1cfc0 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29  (pBuf)->n+nBlob)
1cfd0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
1cfe0 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75  \.  memcpy(&(pBu
1cff0 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
1d000 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
1d010 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1d020 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42   (pBuf)->n += nB
1d030 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
1d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d050 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
1d060 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1d070 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
1d080 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20  t(pBuf, iVal) { 
1d090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1d0a0 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20  .  (pBuf)->n += 
1d0b0 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
1d0c0 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b  rint(&(pBuf)->p[
1d0d0 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61  (pBuf)->n], (iVa
1d0e0 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74  l));  \.  assert
1d0f0 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
1d100 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20  >=(pBuf)->n );  
1d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d120 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
1d130 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e  ** Flush the con
1d140 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f  tents of in-memo
1d150 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69 48  ry hash table iH
1d160 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76  ash to a new lev
1d170 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74  el-0 .** segment
1d180 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75   on disk. Also u
1d190 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65 73  pdate the corres
1d1a0 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72  ponding structur
1d1b0 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  e record..**.** 
1d1c0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
1d1d0 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73 35  rs, set the Fts5
1d1e0 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63  Index.rc error c
1d1f0 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ode. If an error
1d200 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
1d210 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1d220 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1d230 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
1d240 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65  oid fts5FlushOne
1d250 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a  Hash(Fts5Index *
1d260 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a  p){.  Fts5Hash *
1d270 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68  pHash = p->pHash
1d280 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ;.  Fts5Structur
1d290 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e  e *pStruct;.  in
1d2a0 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20  t iSegid;.  int 
1d2b0 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20  pgnoLast = 0;   
1d2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d2d0 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   Last leaf page 
1d2e0 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e  number in segmen
1d2f0 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69  t */..  /* Obtai
1d300 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  n a reference to
1d310 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75 63   the index struc
1d320 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74  ture and allocat
1d330 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1d340 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  id.  ** for the 
1d350 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d  new level-0 segm
1d360 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75  ent.  */.  pStru
1d370 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1d380 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65  reRead(p);.  iSe
1d390 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61  gid = fts5Alloca
1d3a0 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75  teSegid(p, pStru
1d3b0 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67  ct);..  if( iSeg
1d3c0 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  id ){.    const 
1d3d0 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43  int pgsz = p->pC
1d3e0 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20 20  onfig->pgsz;..  
1d3f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
1d400 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
1d410 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77  /* New segment w
1d420 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f  ithin pStruct */
1d430 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
1d440 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20  *pBuf;          
1d450 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20     /* Buffer in 
1d460 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c  which to assembl
1d470 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20  e leaf page */. 
1d480 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70     Fts5Buffer *p
1d490 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  Pgidx;          
1d4a0 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68   /* Buffer in wh
1d4b0 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20  ich to assemble 
1d4c0 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74  pgidx */..    Ft
1d4d0 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
1d4e0 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  er;.    fts5Writ
1d4f0 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72  eInit(p, &writer
1d500 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20  , iSegid);..    
1d510 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77  pBuf = &writer.w
1d520 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70  riter.buf;.    p
1d530 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e  Pgidx = &writer.
1d540 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20  writer.pgidx;.. 
1d550 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49     /* fts5WriteI
1d560 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76  nit() should hav
1d570 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68  e initialized th
1d580 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f  e buffers to (mo
1d590 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a  st likely).    *
1d5a0 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  * the maximum sp
1d5b0 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  ace required. */
1d5c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
1d5d0 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61  rc || pBuf->nSpa
1d5e0 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35  ce>=(pgsz + FTS5
1d5f0 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29  _DATA_PADDING) )
1d600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  ;.    assert( p-
1d610 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e  >rc || pPgidx->n
1d620 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46  Space>=(pgsz + F
1d630 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
1d640 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67  ) );..    /* Beg
1d650 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f  in scanning thro
1d660 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20 65  ugh hash table e
1d670 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f  ntries. This loo
1d680 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20  p runs once for 
1d690 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d  each.    ** term
1d6a0 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74  /doclist current
1d6b0 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e  ly stored within
1d6c0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
1d6d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
1d6e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1d6f0 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
1d700 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
1d710 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20  nInit(pHash, 0, 
1d720 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  0);.    }.    wh
1d730 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1d740 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
1d750 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
1d760 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20  of(pHash) ){.   
1d770 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1d780 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f  Term;          /
1d790 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
1d7a0 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  ing term */.    
1d7b0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63    const u8 *pDoc
1d7c0 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  list;         /*
1d7d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   Pointer to docl
1d7e0 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72  ist for this ter
1d7f0 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  m */.      int n
1d800 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
1d810 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d820 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74  f doclist in byt
1d830 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20  es */..      /* 
1d840 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 66  Write the term f
1d850 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f  or this entry to
1d860 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20   disk. */.      
1d870 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
1d880 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20  canEntry(pHash, 
1d890 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73  &zTerm, &pDoclis
1d8a0 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  t, &nDoclist);. 
1d8b0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70       fts5WriteAp
1d8c0 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69  pendTerm(p, &wri
1d8d0 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  ter, (int)strlen
1d8e0 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20  (zTerm), (const 
1d8f0 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20  u8*)zTerm);..   
1d900 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74 65     assert( write
1d910 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  r.bFirstRowidInP
1d920 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  age==0 );.      
1d930 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d  if( pgsz>=(pBuf-
1d940 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b  >n + pPgidx->n +
1d950 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20 29   nDoclist + 1) )
1d960 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
1d970 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
1d980 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
1d990 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f  current leaf. */
1d9a0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1d9b0 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1d9c0 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74  b(pBuf, pDoclist
1d9d0 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20  , nDoclist);.   
1d9e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d9f0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 30    i64 iRowid = 0
1da00 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 44  ;.        i64 iD
1da10 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  elta = 0;.      
1da20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
1da30 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
1da40 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77  entire doclist w
1da50 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
1da60 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66 6f  his leaf. The fo
1da70 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20 20  llowing .       
1da80 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74 65   ** loop iterate
1da90 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70 6f  s through the po
1daa0 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b 65  slists that make
1dab0 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20   up the current 
1dac0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  .        ** docl
1dad0 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
1dae0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1daf0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
1db00 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20  <nDoclist ){.   
1db10 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b         int nPos;
1db20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1db30 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20  Copy;.          
1db40 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20  int bDummy;.    
1db50 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
1db60 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 6f  s5GetVarint(&pDo
1db70 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36  clist[iOff], (u6
1db80 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
1db90 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 66         nCopy = f
1dba0 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
1dbb0 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  e(&pDoclist[iOff
1dbc0 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
1dbd0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 43  y);.          nC
1dbe0 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20  opy += nPos;.   
1dbf0 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b 3d         iRowid +=
1dc00 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20   iDelta;.       
1dc10 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66     .          if
1dc20 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52  ( writer.bFirstR
1dc30 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
1dc40 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75            fts5Pu
1dc50 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d  tU16(&pBuf->p[0]
1dc60 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a  , pBuf->n);   /*
1dc70 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
1dc80 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
1dc90 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73      pBuf->n += s
1dca0 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
1dcb0 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75  int(&pBuf->p[pBu
1dcc0 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a  f->n], iRowid);.
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 77 72 69 74              writ
1dce0 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
1dcf0 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Page = 0;.      
1dd00 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
1dd10 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 26 77  lidxAppend(p, &w
1dd20 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
1dd30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1dd40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75  .            pBu
1dd50 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  f->n += sqlite3F
1dd60 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
1dd70 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
1dd80 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20  iDelta);.       
1dd90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61     }.          a
1dda0 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d  ssert( pBuf->n<=
1ddb0 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a  pBuf->nSpace );.
1ddc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28  .          if( (
1ddd0 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78  pBuf->n + pPgidx
1dde0 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20  ->n + nCopy) <= 
1ddf0 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
1de00 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1de10 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66  e poslist will f
1de20 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  it on the curren
1de30 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a  t leaf. So copy.
1de40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
1de50 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a  t in one go. */.
1de60 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1de70 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1de80 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63  Blob(pBuf, &pDoc
1de90 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70  list[iOff], nCop
1dea0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  y);.          }e
1deb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1dec0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
1ded0 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20  oslist will not 
1dee0 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66  fit on this leaf
1def0 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20  . So it needs.  
1df00 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
1df10 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73  be broken into s
1df20 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ections. The onl
1df30 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20  y qualification 
1df40 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  being.          
1df50 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76    ** that each v
1df60 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74  arint must be st
1df70 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c  ored contiguousl
1df80 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  y.  */.         
1df90 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f     const u8 *pPo
1dfa0 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73  slist = &pDoclis
1dfb0 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20  t[iOff];.       
1dfc0 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20       int iPos = 
1dfd0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  0;.            w
1dfe0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1dff0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e000 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61          int nSpa
1e010 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66  ce = pgsz - pBuf
1e020 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b  ->n - pPgidx->n;
1e030 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
1e040 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt n = 0;.      
1e050 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 43 6f          if( (nCo
1e060 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61  py - iPos)<=nSpa
1e070 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ce ){.          
1e080 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20        n = nCopy 
1e090 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  - iPos;.        
1e0a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
1e0c0 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
1e0d0 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f  ix(&pPoslist[iPo
1e0e0 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20  s], nSpace);.   
1e0f0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1e100 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
1e110 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20  t( n>0 );.      
1e120 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1e130 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
1e140 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69 73 74  (pBuf, &pPoslist
1e150 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20  [iPos], n);.    
1e160 20 20 20 20 20 20 20 20 20 20 69 50 6f 73 20 2b            iPos +
1e170 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = n;.           
1e180 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
1e190 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67  + pPgidx->n)>=pg
1e1a0 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sz ){.          
1e1b0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1e1c0 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
1e1d0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
1e1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1e1f0 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43      if( iPos>=nC
1e200 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  opy ) break;.   
1e210 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e230 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a   iOff += nCopy;.
1e240 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e250 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  }..      /* TODO
1e260 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72 6d 69  2: Doclist termi
1e270 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20 68 65  nator written he
1e280 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  re. */.      /* 
1e290 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b  pBuf->p[pBuf->n+
1e2a0 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20  +] = '\0'; */.  
1e2b0 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66      assert( pBuf
1e2c0 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63  ->n<=pBuf->nSpac
1e2d0 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  e );.      sqlit
1e2e0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65  e3Fts5HashScanNe
1e2f0 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d  xt(pHash);.    }
1e300 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
1e310 48 61 73 68 43 6c 65 61 72 28 70 48 61 73 68 29  HashClear(pHash)
1e320 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
1e330 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
1e340 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  , &pgnoLast);.. 
1e350 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1e360 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20   Fts5Structure. 
1e370 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  It is written ba
1e380 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
1e390 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  se by the.    **
1e3a0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1e3b0 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c  lease() call bel
1e3c0 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ow.  */.    if( 
1e3d0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
1e3e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1e3f0 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1e400 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75  l(&p->rc, &pStru
1e410 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ct);.    }.    f
1e420 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
1e430 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
1e440 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30  pStruct, 0, 1, 0
1e450 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1e460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1e470 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74       pSeg = &pSt
1e480 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
1e490 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61  aSeg[ pStruct->a
1e4a0 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20  Level[0].nSeg++ 
1e4b0 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69  ];.      pSeg->i
1e4c0 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
1e4d0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f        pSeg->pgno
1e4e0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
1e4f0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
1e500 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  = pgnoLast;.    
1e510 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
1e520 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ent++;.    }.   
1e530 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
1e540 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72  omote(p, 0, pStr
1e550 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  uct);.  }..  fts
1e560 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28  5IndexAutomerge(
1e570 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e  p, &pStruct, pgn
1e580 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e  oLast);.  fts5In
1e590 64 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70  dexCrisismerge(p
1e5a0 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66  , &pStruct);.  f
1e5b0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
1e5c0 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  e(p, pStruct);. 
1e5d0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1e5e0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
1e5f0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
1e600 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  ny data stored i
1e610 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1e620 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74  hash tables to t
1e630 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  he database..*/.
1e640 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1e650 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49  IndexFlush(Fts5I
1e660 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55  ndex *p){.  /* U
1e670 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74  nless it is empt
1e680 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73  y, flush the has
1e690 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20  h table to disk 
1e6a0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e  */.  if( p->nPen
1e6b0 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20  dingData ){.    
1e6c0 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
1e6d0 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64   );.    p->nPend
1e6e0 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ingData = 0;.   
1e6f0 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73   fts5FlushOneHas
1e700 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e  h(p);.  }.}...in
1e710 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1e720 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35 49  exOptimize(Fts5I
1e730 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
1e740 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1e750 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ct;.  Fts5Struct
1e760 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20  ure *pNew = 0;. 
1e770 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a 0a   int nSeg = 0;..
1e780 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
1e790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
1e7a0 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70  fts5IndexFlush(p
1e7b0 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
1e7c0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
1e7d0 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72  (p);..  if( pStr
1e7e0 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  uct ){.    asser
1e7f0 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
1e800 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
1e810 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
1e820 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
1e830 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d   nSeg = pStruct-
1e840 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69  >nSegment;.    i
1e850 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20  f( nSeg>1 ){.   
1e860 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
1e870 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
1e880 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42 79 74  ure);.      nByt
1e890 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e  e += (pStruct->n
1e8a0 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f  Level+1) * sizeo
1e8b0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
1e8c0 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70 4e 65  evel);.      pNe
1e8d0 77 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  w = (Fts5Structu
1e8e0 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  re*)sqlite3Fts5M
1e8f0 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63  allocZero(&p->rc
1e900 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
1e910 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 20 29    }.  if( pNew )
1e920 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
1e930 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a  ureLevel *pLvl;.
1e940 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
1e950 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
1e960 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1e970 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  nt);.    pNew->n
1e980 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
1e990 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70  >nLevel+1;.    p
1e9a0 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  New->nRef = 1;. 
1e9b0 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43     pNew->nWriteC
1e9c0 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74  ounter = pStruct
1e9d0 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  ->nWriteCounter;
1e9e0 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65  .    pLvl = &pNe
1e9f0 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63  w->aLevel[pStruc
1ea00 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  t->nLevel];.    
1ea10 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74  pLvl->aSeg = (Ft
1ea20 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1ea30 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  nt*)sqlite3Fts5M
1ea40 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63  allocZero(&p->rc
1ea50 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66  , nByte);.    if
1ea60 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a  ( pLvl->aSeg ){.
1ea70 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
1ea80 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  iSeg;.      int 
1ea90 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20  iSegOut = 0;.   
1eaa0 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
1eab0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1eac0 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1ead0 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
1eae0 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
1eaf0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1eb00 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
1eb10 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67        pLvl->aSeg
1eb20 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72  [iSegOut] = pStr
1eb30 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1eb40 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ].aSeg[iSeg];.  
1eb50 20 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b          iSegOut+
1eb60 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
1eb70 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d     }.      pNew-
1eb80 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c  >nSegment = pLvl
1eb90 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20  ->nSeg = nSeg;. 
1eba0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ebb0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65  sqlite3_free(pNe
1ebc0 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  w);.      pNew =
1ebd0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
1ebe0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
1ebf0 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77   int iLvl = pNew
1ec00 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20  ->nLevel-1;.    
1ec10 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
1ec20 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d  LITE_OK && pNew-
1ec30 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1ec40 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  eg>0 ){.      in
1ec50 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50  t nRem = FTS5_OP
1ec60 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20  T_WORK_UNIT;.   
1ec70 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1ec80 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c  eLevel(p, &pNew,
1ec90 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20   iLvl, &nRem);. 
1eca0 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74     }..    fts5St
1ecb0 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
1ecc0 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53  pNew);.    fts5S
1ecd0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
1ece0 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74  pNew);.  }..  ft
1ecf0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1ed00 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72  se(pStruct);.  r
1ed10 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
1ed20 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e  eturn(p); .}..in
1ed30 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
1ed40 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65  exMerge(Fts5Inde
1ed50 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65  x *p, int nMerge
1ed60 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
1ed70 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20  re *pStruct;..  
1ed80 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
1ed90 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
1eda0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26    if( pStruct &&
1edb0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1edc0 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
1edd0 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  xMerge(p, &pStru
1ede0 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 20  ct, nMerge);.   
1edf0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1ee00 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
1ee10 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63  .  }.  fts5Struc
1ee20 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1ee30 75 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  uct);..  return 
1ee40 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
1ee50 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  p);.}..static vo
1ee60 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61  id fts5PoslistCa
1ee70 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
1ee80 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20  dex *p, .  void 
1ee90 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
1eea0 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
1eeb0 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
1eec0 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e  assert_nc( nChun
1eed0 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43  k>=0 );.  if( nC
1eee0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74  hunk>0 ){.    ft
1eef0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1ef00 6e 64 42 6c 6f 62 28 28 46 74 73 35 42 75 66 66  ndBlob((Fts5Buff
1ef10 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c 20 70 43  er*)pContext, pC
1ef20 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20  hunk, nChunk);. 
1ef30 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74   }.}..typedef st
1ef40 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ruct PoslistCall
1ef50 62 61 63 6b 43 74 78 20 50 6f 73 6c 69 73 74 43  backCtx PoslistC
1ef60 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73 74 72 75  allbackCtx;.stru
1ef70 63 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ct PoslistCallba
1ef80 63 6b 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75  ckCtx {.  Fts5Bu
1ef90 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20  ffer *pBuf;     
1efa0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70            /* App
1efb0 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66 66  end to this buff
1efc0 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  er */.  Fts5Cols
1efd0 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20  et *pColset;    
1efe0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72          /* Restr
1eff0 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74  ict matches to t
1f000 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20  his column */.  
1f010 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20 20  int eState;     
1f020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f030 2f 2a 20 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a  /* See above */.
1f040 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20  };../*.** TODO: 
1f050 4d 61 6b 65 20 74 68 69 73 20 6d 6f 72 65 20 65  Make this more e
1f060 66 66 69 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61  fficient!.*/.sta
1f070 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
1f080 78 43 6f 6c 73 65 74 54 65 73 74 28 46 74 73 35  xColsetTest(Fts5
1f090 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
1f0a0 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e   int iCol){.  in
1f0b0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1f0c0 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b  i<pColset->nCol;
1f0d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   i++){.    if( p
1f0e0 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d  Colset->aiCol[i]
1f0f0 3d 3d 69 43 6f 6c 20 29 20 72 65 74 75 72 6e 20  ==iCol ) return 
1f100 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1f110 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  0;.}..static voi
1f120 64 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c  d fts5PoslistFil
1f130 74 65 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46  terCallback(.  F
1f140 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1f150 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20  void *pContext, 
1f160 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68  .  const u8 *pCh
1f170 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a  unk, int nChunk.
1f180 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c  ){.  PoslistCall
1f190 62 61 63 6b 43 74 78 20 2a 70 43 74 78 20 3d 20  backCtx *pCtx = 
1f1a0 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  (PoslistCallback
1f1b0 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20  Ctx*)pContext;. 
1f1c0 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68 75   assert_nc( nChu
1f1d0 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e  nk>=0 );.  if( n
1f1e0 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f  Chunk>0 ){.    /
1f1f0 2a 20 53 65 61 72 63 68 20 74 68 72 6f 75 67 68  * Search through
1f200 20 74 6f 20 66 69 6e 64 20 74 68 65 20 66 69 72   to find the fir
1f210 73 74 20 76 61 72 69 6e 74 20 77 69 74 68 20 76  st varint with v
1f220 61 6c 75 65 20 31 2e 20 54 68 69 73 20 69 73 20  alue 1. This is 
1f230 74 68 65 0a 20 20 20 20 2a 2a 20 73 74 61 72 74  the.    ** start
1f240 20 6f 66 20 74 68 65 20 6e 65 78 74 20 63 6f 6c   of the next col
1f250 75 6d 6e 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20  umns hits. */.  
1f260 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
1f270 20 69 6e 74 20 69 53 74 61 72 74 20 3d 20 30 3b   int iStart = 0;
1f280 0a 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ..    if( pCtx->
1f290 65 53 74 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20  eState==2 ){.   
1f2a0 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20     int iCol;.   
1f2b0 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
1f2c0 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69  rint32(pChunk, i
1f2d0 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69  , iCol);.      i
1f2e0 66 28 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73  f( fts5IndexCols
1f2f0 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f  etTest(pCtx->pCo
1f300 6c 73 65 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20  lset, iCol) ){. 
1f310 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
1f320 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ate = 1;.       
1f330 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1f340 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78  ppendVarint(pCtx
1f350 2d 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20 20  ->pBuf, 1);.    
1f360 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f370 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
1f380 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1f390 0a 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20  ..    do {.     
1f3a0 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b   while( i<nChunk
1f3b0 20 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30   && pChunk[i]!=0
1f3c0 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 77  x01 ){.        w
1f3d0 68 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20  hile( pChunk[i] 
1f3e0 26 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20  & 0x80 ) i++;.  
1f3f0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
1f400 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 74   }.      if( pCt
1f410 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  x->eState ){.   
1f420 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1f430 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
1f440 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
1f450 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
1f460 61 72 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  art);.      }.  
1f470 20 20 20 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b      if( i<nChunk
1f480 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
1f490 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 53  iCol;.        iS
1f4a0 74 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  tart = i;.      
1f4b0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69    i++;.        i
1f4c0 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a  f( i>=nChunk ){.
1f4d0 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e            pCtx->
1f4e0 65 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20  eState = 2;.    
1f4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f500 20 20 20 20 20 66 74 73 35 46 61 73 74 47 65 74       fts5FastGet
1f510 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c  Varint32(pChunk,
1f520 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20   i, iCol);.     
1f530 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74       pCtx->eStat
1f540 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43 6f 6c  e = fts5IndexCol
1f550 73 65 74 54 65 73 74 28 70 43 74 78 2d 3e 70 43  setTest(pCtx->pC
1f560 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20  olset, iCol);.  
1f570 20 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78          if( pCtx
1f580 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1f590 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1f5a0 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
1f5b0 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70 43  (pCtx->pBuf, &pC
1f5c0 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d  hunk[iStart], i-
1f5d0 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20 20  iStart);.       
1f5e0 20 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b       iStart = i;
1f5f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f610 20 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68     }while( i<nCh
1f620 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  unk );.  }.}../*
1f630 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74  .** Iterator pIt
1f640 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  er currently poi
1f650 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65  nts to a valid e
1f660 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20  ntry (not EOF). 
1f670 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
1f680 20 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73   appends the pos
1f690 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20  ition list data 
1f6a0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1f6b0 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66  entry to.** buff
1f6c0 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73  er pBuf. It does
1f6d0 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79   not make a copy
1f6e0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
1f6f0 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69  -list size.** fi
1f700 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
1f710 6f 69 64 20 66 74 73 35 53 65 67 69 74 65 72 50  oid fts5SegiterP
1f720 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
1f730 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65  dex *p,.  Fts5Se
1f740 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46  gIter *pSeg,.  F
1f750 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
1f760 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  et,.  Fts5Buffer
1f770 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20   *pBuf.){.  if( 
1f780 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f  0==fts5BufferGro
1f790 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  w(&p->rc, pBuf, 
1f7a0 70 53 65 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20  pSeg->nPos) ){. 
1f7b0 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d     if( pColset==
1f7c0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43  0 ){.      fts5C
1f7d0 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
1f7e0 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66  Seg, (void*)pBuf
1f7f0 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  , fts5PoslistCal
1f800 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  lback);.    }els
1f810 65 7b 0a 20 20 20 20 20 20 50 6f 73 6c 69 73 74  e{.      Poslist
1f820 43 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78  CallbackCtx sCtx
1f830 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 70 42 75  ;.      sCtx.pBu
1f840 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20 20  f = pBuf;.      
1f850 73 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70  sCtx.pColset = p
1f860 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 73 43  Colset;.      sC
1f870 74 78 2e 65 53 74 61 74 65 20 3d 20 66 74 73 35  tx.eState = fts5
1f880 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
1f890 70 43 6f 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20  pColset, 0);.   
1f8a0 20 20 20 61 73 73 65 72 74 28 20 73 43 74 78 2e     assert( sCtx.
1f8b0 65 53 74 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74  eState==0 || sCt
1f8c0 78 2e 65 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20  x.eState==1 );. 
1f8d0 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
1f8e0 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28  erate(p, pSeg, (
1f8f0 76 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73  void*)&sCtx, fts
1f900 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61  5PoslistFilterCa
1f910 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  llback);.    }. 
1f920 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f   }.}../*.** IN/O
1f930 55 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a 70  UT parameter (*p
1f940 61 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 70  a) points to a p
1f950 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62  osition list n b
1f960 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49 66  ytes in size. If
1f970 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  .** the position
1f980 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 65   list contains e
1f990 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d  ntries for colum
1f9a0 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70  n iCol, then (*p
1f9b0 61 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20  a) is set.** to 
1f9c0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75 62  point to the sub
1f9d0 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66  -position-list f
1f9e0 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61  or that column a
1f9f0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
1fa00 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74 20  .** bytes in it 
1fa10 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66  returned. Or, if
1fa20 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70 6f   the argument po
1fa30 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73  sition list does
1fa40 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20   not.** contain 
1fa50 61 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72 20  any entries for 
1fa60 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74  column iCol, ret
1fa70 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63  urn 0..*/.static
1fa80 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78   int fts5IndexEx
1fa90 74 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73  tractCol(.  cons
1faa0 74 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20 20  t u8 **pa,      
1fab0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fac0 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20 74  N/OUT: Pointer t
1fad0 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69  o poslist */.  i
1fae0 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20  nt n,           
1faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb00 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f  * IN: Size of po
1fb10 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20 2a  slist in bytes *
1fb20 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20 20  /.  int iCol    
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb40 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
1fb50 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70 6f   extract from po
1fb60 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  slist */.){.  in
1fb70 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b 20  t iCurrent = 0; 
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1fb90 20 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72 65   Anything before
1fba0 20 74 68 65 20 66 69 72 73 74 20 30 78 30 31 20   the first 0x01 
1fbb0 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f  is col 0 */.  co
1fbc0 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b  nst u8 *p = *pa;
1fbd0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e  .  const u8 *pEn
1fbe0 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20  d = &p[n];      
1fbf0 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70     /* One byte p
1fc00 61 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69 74  ast end of posit
1fc10 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 75 38  ion list */.  u8
1fc20 20 70 72 65 76 20 3d 20 30 3b 0a 0a 20 20 77 68   prev = 0;..  wh
1fc30 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65  ile( iCol>iCurre
1fc40 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76  nt ){.    /* Adv
1fc50 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75  ance pointer p u
1fc60 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74  ntil it points t
1fc70 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30  o pEnd or an 0x0
1fc80 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20  1 byte that is. 
1fc90 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f     ** not part o
1fca0 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  f a varint */.  
1fcb0 20 20 77 68 69 6c 65 28 20 28 70 72 65 76 20 26    while( (prev &
1fcc0 20 30 78 38 30 29 20 7c 7c 20 2a 70 21 3d 30 78   0x80) || *p!=0x
1fcd0 30 31 20 29 7b 0a 20 20 20 20 20 20 70 72 65 76  01 ){.      prev
1fce0 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 20 20 69   = *p++;.      i
1fcf0 66 28 20 70 3d 3d 70 45 6e 64 20 29 20 72 65 74  f( p==pEnd ) ret
1fd00 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1fd10 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20   *pa = p++;.    
1fd20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  p += fts5GetVari
1fd30 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74  nt32(p, iCurrent
1fd40 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f  );.  }.  if( iCo
1fd50 6c 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65  l!=iCurrent ) re
1fd60 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64  turn 0;..  /* Ad
1fd70 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20  vance pointer p 
1fd80 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
1fd90 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78  to pEnd or an 0x
1fda0 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a  01 byte that is.
1fdb0 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66    ** not part of
1fdc0 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 61   a varint */.  a
1fdd0 73 73 65 72 74 28 20 28 70 72 65 76 20 26 20 30  ssert( (prev & 0
1fde0 78 38 30 29 3d 3d 30 20 29 3b 0a 20 20 77 68 69  x80)==0 );.  whi
1fdf0 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28 28  le( p<pEnd && ((
1fe00 70 72 65 76 20 26 20 30 78 38 30 29 20 7c 7c 20  prev & 0x80) || 
1fe10 2a 70 21 3d 30 78 30 31 29 20 29 7b 0a 20 20 20  *p!=0x01) ){.   
1fe20 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20   prev = *p++;.  
1fe30 7d 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20 28  }.  return p - (
1fe40 2a 70 61 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  *pa);.}.../*.** 
1fe50 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69 20  Iterator pMulti 
1fe60 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1fe70 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1fe80 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
1fe90 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
1fea0 70 65 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77  pends the follow
1feb0 69 6e 67 20 74 6f 20 62 75 66 66 65 72 20 70 42  ing to buffer pB
1fec0 75 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  uf:.**.**   * Th
1fed0 65 20 76 61 72 69 6e 74 20 69 44 65 6c 74 61 2c  e varint iDelta,
1fee0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20   and.**   * the 
1fef0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74 68  position list th
1ff00 61 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  at currently poi
1ff10 6e 74 73 20 74 6f 2c 20 69 6e 63 6c 75 64 69 6e  nts to, includin
1ff20 67 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  g the size field
1ff30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1ff40 65 6e 74 20 70 43 6f 6c 73 65 74 20 69 73 20 4e  ent pColset is N
1ff50 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 70 6f  ULL, then the po
1ff60 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20 66  sition list is f
1ff70 69 6c 74 65 72 65 64 20 61 63 63 6f 72 64 69 6e  iltered accordin
1ff80 67 0a 2a 2a 20 74 6f 20 70 43 6f 6c 73 65 74 20  g.** to pColset 
1ff90 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 70 70  before being app
1ffa0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
1ffb0 66 65 72 2e 20 49 66 20 74 68 69 73 20 6d 65 61  fer. If this mea
1ffc0 6e 73 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  ns there are.** 
1ffd0 6e 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  no entries in th
1ffe0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c  e position list,
1fff0 20 6e 6f 74 68 69 6e 67 20 69 73 20 61 70 70 65   nothing is appe
20000 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
20010 65 72 20 28 6e 6f 74 0a 2a 2a 20 65 76 65 6e 20  er (not.** even 
20020 69 44 65 6c 74 61 29 2e 0a 2a 2a 0a 2a 2a 20 49  iDelta)..**.** I
20030 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
20040 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  s, an error code
20050 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72   is left in p->r
20060 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  c. .*/.static in
20070 74 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c  t fts5AppendPosl
20080 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
20090 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74   *p,.  i64 iDelt
200a0 61 2c 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  a,.  Fts5IndexIt
200b0 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74  er *pMulti,.  Ft
200c0 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
200d0 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  t,.  Fts5Buffer 
200e0 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70  *pBuf.){.  if( p
200f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
20100 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
20110 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c  er *pSeg = &pMul
20120 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69  ti->aSeg[ pMulti
20130 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
20140 73 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  st ];.    assert
20150 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
20160 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30  of(p, pMulti)==0
20170 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20180 70 53 65 67 2d 3e 6e 50 6f 73 3e 30 20 29 3b 0a  pSeg->nPos>0 );.
20190 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35 42      if( 0==fts5B
201a0 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
201b0 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50  , pBuf, pSeg->nP
201c0 6f 73 2b 39 2b 39 29 20 29 7b 0a 0a 20 20 20 20  os+9+9) ){..    
201d0 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
201e0 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
201f0 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d  os<=pSeg->pLeaf-
20200 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20  >szLeaf .       
20210 26 26 20 28 70 43 6f 6c 73 65 74 3d 3d 30 20 7c  && (pColset==0 |
20220 7c 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d  | pColset->nCol=
20230 3d 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  =1).      ){.   
20240 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
20250 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  Pos = &pSeg->pLe
20260 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
20270 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20  fOffset];.      
20280 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
20290 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 20      if( pColset 
202a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 6f  ){.          nPo
202b0 73 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  s = fts5IndexExt
202c0 72 61 63 74 43 6f 6c 28 26 70 50 6f 73 2c 20 70  ractCol(&pPos, p
202d0 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73  Seg->nPos, pCols
202e0 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20  et->aiCol[0]);. 
202f0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 6f           if( nPo
20300 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  s==0 ) return 1;
20310 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
20320 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 20 3d            nPos =
20330 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20   pSeg->nPos;.   
20340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
20350 73 73 65 72 74 28 20 6e 50 6f 73 3e 30 20 29 3b  ssert( nPos>0 );
20360 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
20370 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
20380 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61  int(pBuf, iDelta
20390 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
203a0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
203b0 61 72 69 6e 74 28 70 42 75 66 2c 20 6e 50 6f 73  arint(pBuf, nPos
203c0 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  *2);.        fts
203d0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
203e0 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 50 6f 73  dBlob(pBuf, pPos
203f0 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 7d  , nPos);.      }
20400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
20410 74 20 69 53 76 31 3b 0a 20 20 20 20 20 20 20 20  t iSv1;.        
20420 69 6e 74 20 69 53 76 32 3b 0a 20 20 20 20 20 20  int iSv2;.      
20430 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20    int iData;..  
20440 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20        /* Append 
20450 69 44 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20  iDelta */.      
20460 20 20 69 53 76 31 20 3d 20 70 42 75 66 2d 3e 6e    iSv1 = pBuf->n
20470 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
20480 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
20490 72 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74  rint(pBuf, iDelt
204a0 61 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  a);..        /* 
204b0 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45  WRITEPOSLISTSIZE
204c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 53 76 32   */.        iSv2
204d0 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20   = pBuf->n;.    
204e0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
204f0 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70  feAppendVarint(p
20500 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2a  Buf, pSeg->nPos*
20510 32 29 3b 0a 20 20 20 20 20 20 20 20 69 44 61 74  2);.        iDat
20520 61 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 0a 20 20  a = pBuf->n;..  
20530 20 20 20 20 20 20 66 74 73 35 53 65 67 69 74 65        fts5Segite
20540 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 53 65 67  rPoslist(p, pSeg
20550 2c 20 70 43 6f 6c 73 65 74 2c 20 70 42 75 66 29  , pColset, pBuf)
20560 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ;..        if( p
20570 43 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Colset ){.      
20580 20 20 20 20 69 6e 74 20 6e 41 63 74 75 61 6c 20      int nActual 
20590 3d 20 70 42 75 66 2d 3e 6e 20 2d 20 69 44 61 74  = pBuf->n - iDat
205a0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  a;.          if(
205b0 20 6e 41 63 74 75 61 6c 21 3d 70 53 65 67 2d 3e   nActual!=pSeg->
205c0 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20  nPos ){.        
205d0 20 20 20 20 69 66 28 20 6e 41 63 74 75 61 6c 3d      if( nActual=
205e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
205f0 20 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 69 53      pBuf->n = iS
20600 76 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  v1;.            
20610 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
20620 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
20640 20 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46   nReq = sqlite3F
20650 74 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28  ts5GetVarintLen(
20660 28 75 33 32 29 28 6e 41 63 74 75 61 6c 2a 32 29  (u32)(nActual*2)
20670 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
20680 20 77 68 69 6c 65 28 20 69 53 76 32 3c 28 69 44   while( iSv2<(iD
20690 61 74 61 2d 6e 52 65 71 29 20 29 7b 20 70 42 75  ata-nReq) ){ pBu
206a0 66 2d 3e 70 5b 69 53 76 32 2b 2b 5d 20 3d 20 30  f->p[iSv2++] = 0
206b0 78 38 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20  x80; }.         
206c0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
206d0 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
206e0 3e 70 5b 69 53 76 32 5d 2c 20 6e 41 63 74 75 61  >p[iSv2], nActua
206f0 6c 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l*2);.          
20700 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
20710 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20720 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  }..    }.  }..  
20730 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
20740 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63  tic void fts5Doc
20750 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73  listIterNext(Fts
20760 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49  5DoclistIter *pI
20770 74 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20  ter){.  u8 *p = 
20780 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
20790 2b 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b  + pIter->nSize +
207a0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
207b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
207c0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a  er->aPoslist );.
207d0 20 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e    if( p>=pIter->
207e0 61 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65  aEof ){.    pIte
207f0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b  r->aPoslist = 0;
20800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
20810 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70  4 iDelta;..    p
20820 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
20830 74 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  t(p, (u64*)&iDel
20840 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta);.    pIter->
20850 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
20860 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70  ;..    /* Read p
20870 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a  osition list siz
20880 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30  e */.    if( p[0
20890 5d 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20  ] & 0x80 ){.    
208a0 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
208b0 20 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d    pIter->nSize =
208c0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
208d0 28 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20  (p, nPos);.     
208e0 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74   pIter->nPoslist
208f0 20 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20   = (nPos>>1);.  
20900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
20910 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d  Iter->nPoslist =
20920 20 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e   ((int)(p[0])) >
20930 3e 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72  > 1;.      pIter
20940 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20  ->nSize = 1;.   
20950 20 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   }..    pIter->a
20960 50 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d  Poslist = p;.  }
20970 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
20980 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49  fts5DoclistIterI
20990 6e 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65  nit(.  Fts5Buffe
209a0 72 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35  r *pBuf, .  Fts5
209b0 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
209c0 65 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70  er.){.  memset(p
209d0 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
209e0 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65  *pIter));.  pIte
209f0 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42  r->aPoslist = pB
20a00 75 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e  uf->p;.  pIter->
20a10 61 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b  aEof = &pBuf->p[
20a20 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35  pBuf->n];.  fts5
20a30 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
20a40 70 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30  pIter);.}..#if 0
20a50 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
20a60 64 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65  doclist to buffe
20a70 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
20a80 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75  is function assu
20a90 6d 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77  mes that space w
20aa0 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72  ithin the buffer
20ab0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
20ac0 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a  n.** allocated..
20ad0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
20ae0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
20af0 63 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65  cid(.  Fts5Buffe
20b00 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20  r *pBuf,        
20b10 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
20b20 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
20b30 20 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77    i64 *piLastRow
20b40 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
20b50 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65    /* IN/OUT: Pre
20b60 76 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74  vious rowid writ
20b70 74 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a  ten (if any) */.
20b80 20 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20    i64 iRowid    
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 20 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70    /* Rowid to ap
20bb0 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  pend */.){.  ass
20bc0 65 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20  ert( pBuf->n!=0 
20bd0 7c 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64  || (*piLastRowid
20be0 29 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75  )==0 );.  fts5Bu
20bf0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
20c00 72 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69  rint(pBuf, iRowi
20c10 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  d - *piLastRowid
20c20 29 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69  );.  *piLastRowi
20c30 64 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65  d = iRowid;.}.#e
20c40 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74  ndif..#define ft
20c50 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
20c60 69 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f  id(pBuf, iLastRo
20c70 77 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20  wid, iRowid) {  
20c80 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28       \.  assert(
20c90 20 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c   (pBuf)->n!=0 ||
20ca0 20 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30   (iLastRowid)==0
20cb0 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
20cc0 20 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75        \.  fts5Bu
20cd0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
20ce0 72 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52  rint((pBuf), (iR
20cf0 6f 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f  owid) - (iLastRo
20d00 77 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73  wid)); \.  (iLas
20d10 74 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69  tRowid) = (iRowi
20d20 64 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  d);             
20d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d40 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a          \.}../*.
20d50 2a 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e  ** Buffers p1 an
20d60 64 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63  d p2 contain doc
20d70 6c 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63  lists. This func
20d80 74 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20  tion merges the 
20d90 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68  content.** of th
20da0 65 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74  e two doclists t
20db0 6f 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73  ogether and sets
20dc0 20 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68   buffer p1 to th
20dd0 65 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a  e result before.
20de0 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  ** returning..**
20df0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
20e00 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
20e10 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
20e20 20 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72   p->rc. If an er
20e30 72 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61  ror has.** alrea
20e40 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
20e50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
20e60 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
20e70 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50   void fts5MergeP
20e80 72 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74  refixLists(.  Ft
20e90 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
20ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20eb0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
20ec0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  ject */.  Fts5Bu
20ed0 66 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20  ffer *p1,       
20ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
20ef0 73 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65  st list to merge
20f00 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
20f10 20 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20   *p2            
20f20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20        /* Second 
20f30 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
20f40 0a 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20  .){.  if( p2->n 
20f50 29 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74  ){.    i64 iLast
20f60 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46  Rowid = 0;.    F
20f70 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
20f80 31 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  1;.    Fts5Docli
20f90 73 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46  stIter i2;.    F
20fa0 74 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20  ts5Buffer out;. 
20fb0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d     Fts5Buffer tm
20fc0 70 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f  p;.    memset(&o
20fd0 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75  ut, 0, sizeof(ou
20fe0 74 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  t));.    memset(
20ff0 26 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &tmp, 0, sizeof(
21000 74 6d 70 29 29 3b 0a 0a 20 20 20 20 66 74 73 35  tmp));..    fts5
21010 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
21020 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b  c, &out, p1->n +
21030 20 70 32 2d 3e 6e 29 3b 0a 20 20 20 20 66 74 73   p2->n);.    fts
21040 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
21050 28 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66  (p1, &i1);.    f
21060 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
21070 69 74 28 70 32 2c 20 26 69 32 29 3b 0a 20 20 20  it(p2, &i2);.   
21080 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
21090 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e  QLITE_OK && (i1.
210a0 61 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69  aPoslist!=0 || i
210b0 32 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29  2.aPoslist!=0) )
210c0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61  {.      if( i2.a
210d0 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69  Poslist==0 || (i
210e0 31 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 69 31  1.aPoslist && i1
210f0 2e 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69  .iRowid<i2.iRowi
21100 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  d) ){.        /*
21110 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
21120 20 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i1 */.        f
21130 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
21140 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
21150 6f 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29  owid, i1.iRowid)
21160 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
21170 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
21180 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61 50 6f 73  ob(&out, i1.aPos
21190 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  list, i1.nPoslis
211a0 74 2b 69 31 2e 6e 53 69 7a 65 29 3b 0a 20 20 20  t+i1.nSize);.   
211b0 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
211c0 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20  IterNext(&i1);. 
211d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
211e0 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73  e if( i1.aPoslis
211f0 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69  t==0 || i2.iRowi
21200 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a  d!=i1.iRowid ){.
21210 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
21220 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f  entry from i2 */
21230 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
21240 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
21250 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
21260 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
21270 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
21280 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75  feAppendBlob(&ou
21290 74 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  t, i2.aPoslist, 
212a0 69 32 2e 6e 50 6f 73 6c 69 73 74 2b 69 32 2e 6e  i2.nPoslist+i2.n
212b0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66  Size);.        f
212c0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
212d0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d  xt(&i2);.      }
212e0 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  .      else{.   
212f0 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20 3d       i64 iPos1 =
21300 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
21310 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20 20  iPos2 = 0;.     
21320 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20 30     int iOff1 = 0
21330 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f  ;.        int iO
21340 66 66 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ff2 = 0;.       
21350 20 75 38 20 2a 61 31 20 3d 20 26 69 31 2e 61 50   u8 *a1 = &i1.aP
21360 6f 73 6c 69 73 74 5b 69 31 2e 6e 53 69 7a 65 5d  oslist[i1.nSize]
21370 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 32  ;.        u8 *a2
21380 20 3d 20 26 69 32 2e 61 50 6f 73 6c 69 73 74 5b   = &i2.aPoslist[
21390 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a 20 20 20 20  i2.nSize];..    
213a0 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57      Fts5PoslistW
213b0 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20  riter writer;.  
213c0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72        memset(&wr
213d0 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  iter, 0, sizeof(
213e0 77 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20  writer));..     
213f0 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20     /* Merge the 
21400 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  two position lis
21410 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ts. */ .        
21420 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
21430 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74  ocid(&out, iLast
21440 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
21450 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
21460 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b  ufferZero(&tmp);
21470 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
21480 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
21490 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
214a0 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
214b0 73 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s1);.        sql
214c0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
214d0 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f  ext64(a2, i2.nPo
214e0 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26  slist, &iOff2, &
214f0 69 50 6f 73 32 29 3b 0a 0a 20 20 20 20 20 20 20  iPos2);..       
21500 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
21510 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 50 6f  QLITE_OK && (iPo
21520 73 31 3e 3d 30 20 7c 7c 20 69 50 6f 73 32 3e 3d  s1>=0 || iPos2>=
21530 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
21540 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20  i64 iNew;.      
21550 20 20 20 20 69 66 28 20 69 50 6f 73 32 3c 30 20      if( iPos2<0 
21560 7c 7c 20 28 69 50 6f 73 31 3e 3d 30 20 26 26 20  || (iPos1>=0 && 
21570 69 50 6f 73 31 3c 69 50 6f 73 32 29 20 29 7b 0a  iPos1<iPos2) ){.
21580 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77              iNew
21590 20 3d 20 69 50 6f 73 31 3b 0a 20 20 20 20 20 20   = iPos1;.      
215a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
215b0 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61  5PoslistNext64(a
215c0 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20  1, i1.nPoslist, 
215d0 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b  &iOff1, &iPos1);
215e0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
215f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e  {.            iN
21600 65 77 20 3d 20 69 50 6f 73 32 3b 0a 20 20 20 20  ew = iPos2;.    
21610 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
21620 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
21630 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
21640 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
21650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
21660 66 28 20 69 50 6f 73 31 3d 3d 69 50 6f 73 32 20  f( iPos1==iPos2 
21670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
21680 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
21690 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
216a0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
216b0 31 2c 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  1,&iPos1);.     
216c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
216d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
216e0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
216f0 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
21700 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69  ppend(&tmp, &wri
21710 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20  ter, iNew);.    
21720 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
21730 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
21740 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ZE */.        ft
21750 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
21760 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 74  ndVarint(&out, t
21770 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20 20 20  mp.n * 2);.     
21780 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
21790 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
217a0 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b  , tmp.p, tmp.n);
217b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
217c0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
217d0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
217e0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
217f0 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
21800 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
21810 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
21820 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
21830 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
21840 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
21850 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
21860 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
21870 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
21880 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65  erSwap(Fts5Buffe
21890 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65  r *p1, Fts5Buffe
218a0 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75  r *p2){.  Fts5Bu
218b0 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a  ffer tmp = *p1;.
218c0 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a    *p1 = *p2;.  *
218d0 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61  p2 = tmp;.}..sta
218e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74  tic void fts5Set
218f0 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20  upPrefixIter(.  
21900 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64  /* Index to read
21930 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   from */.  int b
21940 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  Desc,           
21950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21960 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59  ue for "ORDER BY
21970 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a   rowid DESC" */.
21980 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b    const u8 *pTok
21990 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
219a0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
219b0 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f  aining prefix to
219c0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20   match */.  int 
219d0 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
219e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
219f0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54  ize of buffer pT
21a00 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  oken in bytes */
21a10 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
21a20 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
21a30 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d     /* Restrict m
21a40 61 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20  atches to these 
21a50 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73  columns */.  Fts
21a60 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49  5IndexIter **ppI
21a70 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ter          /* 
21a80 4f 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f  OUT: New iterato
21a90 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74  r */.){.  Fts5St
21aa0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
21ab0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ;.  Fts5Buffer *
21ac0 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e  aBuf;.  const in
21ad0 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20  t nBuf = 32;..  
21ae0 61 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66  aBuf = (Fts5Buff
21af0 65 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f  er*)fts5IdxMallo
21b00 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  c(p, sizeof(Fts5
21b10 42 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20  Buffer)*nBuf);. 
21b20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53   pStruct = fts5S
21b30 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
21b40 0a 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20  ..  if( aBuf && 
21b50 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63  pStruct ){.    c
21b60 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d  onst int flags =
21b70 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
21b80 5f 53 43 41 4e 3b 0a 20 20 20 20 69 6e 74 20 69  _SCAN;.    int i
21b90 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  ;.    i64 iLastR
21ba0 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
21bb0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 31 20  s5IndexIter *p1 
21bc0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72  = 0;     /* Iter
21bd0 61 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74  ator used to gat
21be0 68 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e  her data from in
21bf0 64 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  dex */.    Fts5D
21c00 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  ata *pData;.    
21c10 46 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69  Fts5Buffer docli
21c20 73 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77  st;.    int bNew
21c30 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 6d  Term = 0;..    m
21c40 65 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20  emset(&doclist, 
21c50 30 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73  0, sizeof(doclis
21c60 74 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73  t));.    for(fts
21c70 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
21c80 20 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61   pStruct, 1, fla
21c90 67 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  gs, pToken, nTok
21ca0 65 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b  en, -1, 0, &p1);
21cb0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
21cc0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29  tiIterEof(p, p1)
21cd0 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ==0;.        fts
21ce0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28  5MultiIterNext2(
21cf0 70 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d  p, p1, &bNewTerm
21d00 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
21d10 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
21d20 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
21d30 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  1);.      int nT
21d40 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  erm;.      const
21d50 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73   u8 *pTerm = fts
21d60 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
21d70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  1, &nTerm);.    
21d80 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d    assert_nc( mem
21d90 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
21da0 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
21db0 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
21dc0 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
21dd0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
21de0 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d  Term<nToken || m
21df0 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54  emcmp(pToken, pT
21e00 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62  erm, nToken) ) b
21e10 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
21e20 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74       if( doclist
21e30 2e 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  .n>0 && iRowid<=
21e40 69 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20  iLastRowid ){.  
21e50 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
21e60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
21e70 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b  && doclist.n; i+
21e80 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
21e90 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
21ea0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
21eb0 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
21ec0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
21ed0 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
21ee0 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
21ef0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
21f00 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
21f10 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
21f20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
21f30 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
21f40 4c 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73  Lists(p, &doclis
21f50 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
21f60 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
21f70 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69  fferZero(&aBuf[i
21f80 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
21f90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21fa0 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30    iLastRowid = 0
21fb0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21fc0 20 69 66 28 20 21 66 74 73 35 41 70 70 65 6e 64   if( !fts5Append
21fd0 50 6f 73 6c 69 73 74 28 70 2c 20 69 52 6f 77 69  Poslist(p, iRowi
21fe0 64 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31  d-iLastRowid, p1
21ff0 2c 20 70 43 6f 6c 73 65 74 2c 20 26 64 6f 63 6c  , pColset, &docl
22000 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
22010 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
22020 77 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  wid;.      }.   
22030 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   }..    for(i=0;
22040 20 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20   i<nBuf; i++){. 
22050 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
22060 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22070 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72       fts5MergePr
22080 65 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f  efixLists(p, &do
22090 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
220a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
220b0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
220c0 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aBuf[i]);.    }.
220d0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
220e0 72 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20  rFree(p, p1);.. 
220f0 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49     pData = fts5I
22100 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65  dxMalloc(p, size
22110 6f 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64  of(Fts5Data) + d
22120 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69  oclist.n);.    i
22130 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
22140 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38    pData->p = (u8
22150 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20  *)&pData[1];.   
22160 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70     pData->nn = p
22170 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64  Data->szLeaf = d
22180 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20  oclist.n;.      
22190 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c  memcpy(pData->p,
221a0 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c   doclist.p, docl
221b0 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  ist.n);.      ft
221c0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28  s5MultiIterNew2(
221d0 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c  p, pData, bDesc,
221e0 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a   ppIter);.    }.
221f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
22200 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ee(&doclist);.  
22210 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
22220 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
22230 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
22240 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a  ee(aBuf);.}.../*
22250 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
22260 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
22270 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
22280 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
22290 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20  ) pertain.** to 
222a0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
222b0 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a  h rowid iRowid..
222c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
222d0 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
222e0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
222f0 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34  int bDelete, i64
22300 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65   iRowid){.  asse
22310 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
22320 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  E_OK );..  /* Al
22330 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20  locate the hash 
22340 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20  table if it has 
22350 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
22360 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
22370 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20  if( p->pHash==0 
22380 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
22390 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65  qlite3Fts5HashNe
223a0 77 28 26 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d  w(&p->pHash, &p-
223b0 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a  >nPendingData);.
223c0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20    }..  /* Flush 
223d0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
223e0 6f 20 64 69 73 6b 20 69 66 20 72 65 71 75 69 72  o disk if requir
223f0 65 64 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77  ed */.  if( iRow
22400 69 64 3c 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  id<p->iWriteRowi
22410 64 20 0a 20 20 20 7c 7c 20 28 69 52 6f 77 69 64  d .   || (iRowid
22420 3d 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64  ==p->iWriteRowid
22430 20 26 26 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d   && p->bDelete==
22440 30 29 0a 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65  0).   || (p->nPe
22450 6e 64 69 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e  ndingData > p->n
22460 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 29 20  MaxPendingData) 
22470 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  .  ){.    fts5In
22480 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
22490 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  ..  p->iWriteRow
224a0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
224b0 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c  ->bDelete = bDel
224c0 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ete;.  return ft
224d0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
224e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
224f0 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a  t data to disk..
22500 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22510 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
22520 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43  Index *p, int bC
22530 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74  ommit){.  assert
22540 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
22550 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
22560 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28  xFlush(p);.  if(
22570 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43   bCommit ) fts5C
22580 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
22590 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
225a0 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
225b0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79  *.** Discard any
225c0 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
225d0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61  the in-memory ha
225e0 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f  sh tables. Do no
225f0 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f  t write it.** to
22600 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 41   the database. A
22610 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73  dditionally, ass
22620 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ume that the con
22630 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64  tents of the %_d
22640 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79  ata.** table may
22650 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e   have changed on
22660 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e   disk. So any in
22670 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f  -memory caches o
22680 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63  f %_data .** rec
22690 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76  ords must be inv
226a0 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  alidated..*/.int
226b0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
226c0 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e  xRollback(Fts5In
226d0 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43  dex *p){.  fts5C
226e0 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20  loseReader(p);. 
226f0 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61 72   fts5IndexDiscar
22700 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65  dData(p);.  asse
22710 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
22720 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
22730 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22740 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
22750 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
22760 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74  ely empty when t
22770 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22780 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20  called. This.** 
22790 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
227a0 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20 69  es it with the i
227b0 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72 65  nitial structure
227c0 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
227d0 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20  h index,.** and 
227e0 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73  the initial vers
227f0 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72  ion of the "aver
22800 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61 20  ages" record (a 
22810 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e  zero-byte blob).
22820 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
22830 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46  ts5IndexReinit(F
22840 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
22850 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73 3b  Fts5Structure s;
22860 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c  .  memset(&s, 0,
22870 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
22880 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44  cture));.  fts5D
22890 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
228a0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
228b0 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20   (const u8*)"", 
228c0 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  0);.  fts5Struct
228d0 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b  ureWrite(p, &s);
228e0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
228f0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
22900 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65  ./*.** Open a ne
22910 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  w Fts5Index hand
22920 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65 61  le. If the bCrea
22930 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  te argument is t
22940 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61  rue, create.** a
22950 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
22960 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64  e underlying %_d
22970 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ata table..**.**
22980 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
22990 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74  set *pp to point
229a0 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
229b0 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  ct and return SQ
229c0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65  LITE_OK..** Othe
229d0 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74  rwise, set *pp t
229e0 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72  o NULL and retur
229f0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
22a00 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73  r code..*/.int s
22a10 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
22a20 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69  pen(.  Fts5Confi
22a30 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69  g *pConfig, .  i
22a40 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46  nt bCreate, .  F
22a50 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20  ts5Index **pp,. 
22a60 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
22a70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22a80 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64  TE_OK;.  Fts5Ind
22a90 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  ex *p;          
22aa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
22ab0 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70  object */..  *pp
22ac0 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65   = p = (Fts5Inde
22ad0 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  x*)sqlite3Fts5Ma
22ae0 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69  llocZero(&rc, si
22af0 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29  zeof(Fts5Index))
22b00 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e  TE_OK ){.    p->
22b20 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69  pConfig = pConfi
22b30 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55  g;.    p->nWorkU
22b40 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f  nit = FTS5_WORK_
22b50 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 6e 4d 61  UNIT;.    p->nMa
22b60 78 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 31  xPendingData = 1
22b70 30 32 34 2a 31 30 32 34 3b 0a 20 20 20 20 70 2d  024*1024;.    p-
22b80 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c 69  >zDataTbl = sqli
22b90 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28 26  te3Fts5Mprintf(&
22ba0 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20 70  rc, "%s_data", p
22bb0 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b 0a  Config->zName);.
22bc0 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74 61      if( p->zData
22bd0 54 62 6c 20 26 26 20 62 43 72 65 61 74 65 20 29  Tbl && bCreate )
22be0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
22bf0 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54 61  ite3Fts5CreateTa
22c00 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20 70  ble(.          p
22c10 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c 20  Config, "data", 
22c20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  "id INTEGER PRIM
22c30 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42  ARY KEY, block B
22c40 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a 20  LOB", 0, pzErr. 
22c50 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
22c60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22c70 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
22c80 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
22c90 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c 20  eTable(pConfig, 
22ca0 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20 20  "idx", .        
22cb0 20 20 20 20 22 73 65 67 69 64 2c 20 74 65 72 6d      "segid, term
22cc0 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20  , pgno, PRIMARY 
22cd0 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29  KEY(segid, term)
22ce0 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ", .            
22cf0 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 20  1, pzErr.       
22d00 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
22d10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
22d30 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
22d40 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a 20  ndexReinit(p);. 
22d50 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22d60 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ..  assert( rc!=
22d70 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
22d80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
22d90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
22da0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22db0 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20 2a  xClose(p);.    *
22dc0 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  pp = 0;.  }.  re
22dd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22de0 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c 65  * Close a handle
22df0 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61   opened by an ea
22e00 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71  rlier call to sq
22e10 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70  lite3Fts5IndexOp
22e20 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
22e30 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f  ite3Fts5IndexClo
22e40 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  se(Fts5Index *p)
22e50 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
22e60 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
22e70 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
22e80 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b 0a  ->pReader==0 );.
22e90 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
22ea0 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72 29  lize(p->pWriter)
22eb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
22ec0 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65 74  nalize(p->pDelet
22ed0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
22ee0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64  _finalize(p->pId
22ef0 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73 71  xWriter);.    sq
22f00 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22f10 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a  ->pIdxDeleter);.
22f20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
22f30 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c 65  lize(p->pIdxSele
22f40 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ct);.    sqlite3
22f50 46 74 73 35 48 61 73 68 46 72 65 65 28 70 2d 3e  Fts5HashFree(p->
22f60 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c 69  pHash);.    sqli
22f70 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44 61 74  te3_free(p->zDat
22f80 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  aTbl);.    sqlit
22f90 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 7d 0a  e3_free(p);.  }.
22fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22fb0 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70  /*.** Argument p
22fc0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
22fd0 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 75  fer containing u
22fe0 74 66 2d 38 20 74 65 78 74 20 74 68 61 74 20 69  tf-8 text that i
22ff0 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a 2a 2a  s n bytes in .**
23000 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68   size. Return th
23010 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
23020 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72 20 63  s in the nChar c
23030 68 61 72 61 63 74 65 72 20 70 72 65 66 69 78 20  haracter prefix 
23040 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66 65 72  of the.** buffer
23050 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72 65 20  , or 0 if there 
23060 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20 6e 43  are less than nC
23070 68 61 72 20 63 68 61 72 61 63 74 65 72 73 20 69  har characters i
23080 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74 61 74  n total..*/.stat
23090 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
230a0 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
230b0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 2c 20  (const char *p, 
230c0 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74 20 6e  int nByte, int n
230d0 43 68 61 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  Char){.  int n =
230e0 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   0;.  int i;.  f
230f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61 72 3b  or(i=0; i<nChar;
23100 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6e   i++){.    if( n
23110 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75 72 6e  >=nByte ) return
23120 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e 70 75   0;      /* Inpu
23130 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77 65 72  t contains fewer
23140 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61 72   than nChar char
23150 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 75 6e  s */.    if( (un
23160 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b 6e 2b  signed char)p[n+
23170 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20 20 20  +]>=0xc0 ){.    
23180 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d 20 26    while( (p[n] &
23190 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 6e   0xc0)==0x80 ) n
231a0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
231b0 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
231c0 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54 46 2d  ** pIn is a UTF-
231d0 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67  8 encoded string
231e0 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e 20 73  , nIn bytes in s
231f0 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ize. Return the 
23200 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75 6e 69  number of.** uni
23210 63 6f 64 65 20 63 68 61 72 61 63 74 65 72 73 20  code characters 
23220 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e 0a 2a  in the string..*
23230 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
23240 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28 63 6f  5IndexCharlen(co
23250 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c 20 69  nst char *pIn, i
23260 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74 20 6e  nt nIn){.  int n
23270 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20 20 20  Char = 0;       
23280 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20 3d 20       .  int i = 
23290 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 49  0;.  while( i<nI
232a0 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28 75 6e  n ){.    if( (un
232b0 73 69 67 6e 65 64 20 63 68 61 72 29 70 49 6e 5b  signed char)pIn[
232c0 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20  i++]>=0xc0 ){.  
232d0 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 49 6e      while( i<nIn
232e0 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20 30 78   && (pIn[i] & 0x
232f0 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b 2b 3b  c0)==0x80 ) i++;
23300 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68 61 72  .    }.    nChar
23310 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
23320 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   nChar;.}../*.**
23330 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d 6f 76   Insert or remov
23340 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66 72 6f  e data to or fro
23350 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45 61 63  m the index. Eac
23360 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d 65 6e  h time a documen
23370 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64 20 74  t is .** added t
23380 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66 72 6f  o or removed fro
23390 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 69  m the index, thi
233a0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
233b0 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  lled one or more
233c0 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a  .** times..**.**
233d0 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74 2c 20   For an insert, 
233e0 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
233f0 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  d once for each 
23400 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e 65 77  token in the new
23410 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20 49 66   document..** If
23420 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69   the operation i
23430 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74 20 6d  s a delete, it m
23440 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 28 61  ust be called (a
23450 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20 66 6f  t least) once fo
23460 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71 75 65  r each.** unique
23470 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 64 6f   token in the do
23480 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 69  cument with an i
23490 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73 20 74  Col value less t
234a0 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20 69 50  han zero. The iP
234b0 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 69  os.** argument i
234c0 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20 61 20  s ignored for a 
234d0 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74 20 73  delete..*/.int s
234e0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57  qlite3Fts5IndexW
234f0 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rite(.  Fts5Inde
23500 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
23510 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
23520 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a   to write to */.
23530 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
23540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23550 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 6b 65    /* Column toke
23560 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28 2d 76  n appears in (-v
23570 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a 2f 0a  e -> delete) */.
23580 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20 20    int iPos,     
23590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
235a0 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6f 66    /* Position of
235b0 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20 63 6f   token within co
235c0 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lumn */.  const 
235d0 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
235e0 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54 6f 6b  t nToken  /* Tok
235f0 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72 65 6d  en to add or rem
23600 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d 20 69  ove to or from i
23610 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ndex */.){.  int
23620 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
23630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23640 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
23650 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65 73 20  through indexes 
23660 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
23670 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
23680 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
23690 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
236a0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
236b0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20 61 73  ->pConfig;..  as
236c0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
236d0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
236e0 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d 70 2d  rt( (iCol<0)==p-
236f0 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20 20 2f  >bDelete );..  /
23700 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20  * Add the entry 
23710 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d  to the main term
23720 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63  s index. */.  rc
23730 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
23740 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70  shWrite(.      p
23750 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69  ->pHash, p->iWri
23760 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
23770 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50  Pos, FTS5_MAIN_P
23780 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e  REFIX, pToken, n
23790 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f  Token.  );..  fo
237a0 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
237b0 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d  ->nPrefix && rc=
237c0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
237d0 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
237e0 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
237f0 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b  enToBytelen(pTok
23800 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e  en, nToken, pCon
23810 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29  fig->aPrefix[i])
23820 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
23830 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23840 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
23850 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20  te(p->pHash, .  
23860 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74          p->iWrit
23870 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
23880 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
23890 45 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65 6e  EFIX+i+1, pToken
238a0 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b  , nByte.      );
238b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
238c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
238d0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
238e0 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
238f0 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77 69   though all rowi
23900 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  d that match the
23910 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 74   .** specified t
23920 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70 72  oken or token pr
23930 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  efix..*/.int sql
23940 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
23950 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ry(.  Fts5Index 
23960 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
23970 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
23980 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  ex to query */. 
23990 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 6f   const char *pTo
239a0 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c  ken, int nToken,
239b0 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70 72   /* Token (or pr
239c0 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20 66  efix) to query f
239d0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  or */.  int flag
239e0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
239f0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
23a00 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45  of FTS5INDEX_QUE
23a10 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  RY_X flags */.  
23a20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
23a30 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
23a40 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20 63  /* Match these c
23a50 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a 20  olumns only */. 
23a60 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
23a70 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
23a80 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
23a90 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
23aa0 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
23ab0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
23ac0 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64  onfig;.  Fts5Ind
23ad0 65 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30  exIter *pRet = 0
23ae0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
23af0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
23b00 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  uf = {0, 0, 0};.
23b10 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45  .  /* If the QUE
23b20 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20  RY_SCAN flag is 
23b30 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66  set, all other f
23b40 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65  lags must be cle
23b50 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ar. */.  assert(
23b60 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
23b70 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d  DEX_QUERY_SCAN)=
23b80 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54 53  =0 || flags==FTS
23b90 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
23ba0 4e 20 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35  N );..  if( fts5
23bb0 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
23bc0 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b  c, &buf, nToken+
23bd0 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d  1)==0 ){.    mem
23be0 63 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70  cpy(&buf.p[1], p
23bf0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
23c00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
23c10 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 74  EBUG.    /* If t
23c20 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  he QUERY_TEST_NO
23c30 49 44 58 20 66 6c 61 67 20 77 61 73 20 73 70 65  IDX flag was spe
23c40 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69  cified, then thi
23c50 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20  s must be a.    
23c60 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e  ** prefix-query.
23c70 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e   Instead of usin
23c80 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78  g a prefix-index
23c90 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29   (if one exists)
23ca0 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61  , .    ** evalua
23cb0 74 65 20 74 68 65 20 70 72 65 66 69 78 20 71 75  te the prefix qu
23cc0 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61  ery using the ma
23cd0 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68  in FTS index. Th
23ce0 69 73 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a  is is used.    *
23cf0 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73  * for internal s
23d00 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62  anity checking b
23d10 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  y the integrity-
23d20 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a  check in debug .
23d30 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79      ** mode only
23d40 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43  .  */.    if( pC
23d50 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e  onfig->bPrefixIn
23d60 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  dex==0 || (flags
23d70 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
23d80 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29  RY_TEST_NOIDX) )
23d90 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
23da0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
23db0 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29  X_QUERY_PREFIX )
23dc0 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31  ;.      iIdx = 1
23dd0 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  +pConfig->nPrefi
23de0 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  x;.    }else.#en
23df0 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67  dif.    if( flag
23e00 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
23e10 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  ERY_PREFIX ){.  
23e20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20      int nChar = 
23e30 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
23e40 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  (pToken, nToken)
23e50 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78  ;.      for(iIdx
23e60 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  =1; iIdx<=pConfi
23e70 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
23e80 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
23e90 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
23ea0 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72  x[iIdx-1]==nChar
23eb0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
23ec0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
23ed0 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
23ee0 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20  nPrefix ){.     
23ef0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
23f00 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
23f10 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
23f20 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
23f30 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
23f40 58 20 2b 20 69 49 64 78 3b 0a 20 20 20 20 20 20  X + iIdx;.      
23f50 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
23f60 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
23f70 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75  IterNew(p, pStru
23f80 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c 20 62 75  ct, 1, flags, bu
23f90 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d  f.p, nToken+1, -
23fa0 31 2c 20 30 2c 20 26 70 52 65 74 29 3b 0a 20 20  1, 0, &pRet);.  
23fb0 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
23fc0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
23fd0 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
23fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
23ff0 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73  t bDesc = (flags
24000 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
24010 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20  RY_DESC)!=0;.   
24020 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54     buf.p[0] = FT
24030 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a  S5_MAIN_PREFIX;.
24040 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70 50        fts5SetupP
24050 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44 65  refixIter(p, bDe
24060 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65  sc, buf.p, nToke
24070 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70  n+1, pColset, &p
24080 52 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Ret);.    }..   
24090 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20   if( p->rc ){.  
240a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
240b0 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a  terClose(pRet);.
240c0 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a        pRet = 0;.
240d0 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52        fts5CloseR
240e0 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a  eader(p);.    }.
240f0 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 52      *ppIter = pR
24100 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  et;.    sqlite3F
24110 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
24120 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  uf);.  }.  retur
24130 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
24140 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n(p);.}../*.** R
24150 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
24160 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
24170 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
24180 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46  gument is at EOF
24190 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
241a0 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73 35  Fts5IterEof(Fts5
241b0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
241c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
241d0 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
241e0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
241f0 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f  eturn pIter->bEo
24200 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  f;.}../*.** Move
24210 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
24220 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f  ching rowid. .*/
24230 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24240 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64  IterNext(Fts5Ind
24250 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
24260 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
24270 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
24280 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
24290 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49  MultiIterNext(pI
242a0 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
242b0 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74  er, 0, 0);.  ret
242c0 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
242d0 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  urn(pIter->pInde
242e0 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  x);.}../*.** Mov
242f0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
24300 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69  tching term/rowi
24310 64 2e 20 55 73 65 64 20 62 79 20 74 68 65 20 66  d. Used by the f
24320 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e  ts5vocab module.
24330 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
24340 74 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28  ts5IterNextScan(
24350 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
24360 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64  Iter){.  Fts5Ind
24370 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70  ex *p = pIter->p
24380 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74  Index;..  assert
24390 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
243a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
243b0 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ;..  fts5MultiIt
243c0 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c  erNext(p, pIter,
243d0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d   0, 0);.  if( p-
243e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
243f0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
24400 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
24410 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
24420 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
24430 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  ];.    if( pSeg-
24440 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e  >pLeaf && pSeg->
24450 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f  term.p[0]!=FTS5_
24460 4d 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20  MAIN_PREFIX ){. 
24470 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
24480 65 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66  ease(pSeg->pLeaf
24490 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70  );.      pSeg->p
244a0 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  Leaf = 0;.      
244b0 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b  pIter->bEof = 1;
244c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
244d0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
244e0 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
244f0 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
24500 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
24510 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68  atching rowid th
24520 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20  at occurs at or 
24530 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68  after iMatch. Th
24540 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20  e.** definition 
24550 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72 22  of "at or after"
24560 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
24570 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74 6f  her this iterato
24580 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e  r iterates.** in
24590 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65   ascending or de
245a0 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f  scending rowid o
245b0 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rder..*/.int sql
245c0 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
245d0 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74  From(Fts5IndexIt
245e0 65 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69  er *pIter, i64 i
245f0 4d 61 74 63 68 29 7b 0a 20 20 66 74 73 35 4d 75  Match){.  fts5Mu
24600 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ltiIterNextFrom(
24610 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
24620 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20  Iter, iMatch);. 
24630 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
24640 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
24650 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
24660 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
24670 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36  ent rowid..*/.i6
24680 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  4 sqlite3Fts5Ite
24690 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78  rRowid(Fts5Index
246a0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
246b0 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69  return fts5Multi
246c0 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
246d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
246e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  n the current te
246f0 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  rm..*/.const cha
24700 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74  r *sqlite3Fts5It
24710 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
24720 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
24730 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a   *pn){.  int n;.
24740 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
24750 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66  = (const char*)f
24760 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d  ts5MultiIterTerm
24770 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a  (pIter, &n);.  *
24780 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75  pn = n-1;.  retu
24790 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74  rn &z[1];.}...st
247a0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
247b0 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 20  exExtractColset 
247c0 28 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  (.  Fts5Colset *
247d0 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
247e0 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f      /* Colset to
247f0 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20   filter on */.  
24800 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c 20  const u8 *pPos, 
24810 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20 20 20 20  int nPos,       
24820 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74  /* Position list
24830 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
24840 20 2a 70 42 75 66 20 20 20 20 20 20 20 20 20 20   *pBuf          
24850 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
24860 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69  buffer */.){.  i
24870 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
24880 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66  K;.  int i;..  f
24890 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42  ts5BufferZero(pB
248a0 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  uf);.  for(i=0; 
248b0 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b  i<pColset->nCol;
248c0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
248d0 20 75 38 20 2a 70 53 75 62 20 3d 20 70 50 6f 73   u8 *pSub = pPos
248e0 3b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d  ;.    int nSub =
248f0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
24900 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73  tCol(&pSub, nPos
24910 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  , pColset->aiCol
24920 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  [i]);.    if( nS
24930 75 62 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ub ){.      fts5
24940 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
24950 28 26 72 63 2c 20 70 42 75 66 2c 20 6e 53 75 62  (&rc, pBuf, nSub
24960 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20  , pSub);.    }. 
24970 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
24980 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
24990 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
249a0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
249b0 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  g a copy of the 
249c0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f  position list fo
249d0 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74  r.** the current
249e0 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76   entry. Output v
249f0 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73  ariable *pn is s
24a00 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
24a10 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a  f the buffer .**
24a20 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65   in bytes before
24a30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
24a40 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 70  * The returned p
24a50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65  osition list doe
24a60 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68  s not include th
24a70 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  e "number of byt
24a80 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69  es" varint.** fi
24a90 65 6c 64 20 74 68 61 74 20 73 74 61 72 74 73 20  eld that starts 
24aa0 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
24ab0 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e  t on disk..*/.in
24ac0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  t sqlite3Fts5Ite
24ad0 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  rPoslist(.  Fts5
24ae0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
24af0 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  , .  Fts5Colset 
24b00 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
24b10 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66       /* Column f
24b20 69 6c 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20  ilter (or NULL) 
24b30 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a  */.  const u8 **
24b40 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pp,             
24b50 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69       /* OUT: Poi
24b60 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e  nter to position
24b70 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20  -list data */.  
24b80 69 6e 74 20 2a 70 6e 2c 20 20 20 20 20 20 20 20  int *pn,        
24b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ba0 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20  /* OUT: Size of 
24bb0 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e  position-list in
24bc0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 36 34 20   bytes */.  i64 
24bd0 2a 70 69 52 6f 77 69 64 20 20 20 20 20 20 20 20  *piRowid        
24be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
24bf0 55 54 3a 20 43 75 72 72 65 6e 74 20 72 6f 77 69  UT: Current rowi
24c00 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65  d */.){.  Fts5Se
24c10 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
24c20 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
24c30 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
24c40 72 73 74 20 5d 3b 0a 20 20 61 73 73 65 72 74 28  rst ];.  assert(
24c50 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e   pIter->pIndex->
24c60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
24c70 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 70 53  .  *piRowid = pS
24c80 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66  eg->iRowid;.  if
24c90 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66  ( pSeg->iLeafOff
24ca0 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d  set+pSeg->nPos<=
24cb0 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
24cc0 65 61 66 20 29 7b 0a 20 20 20 20 75 38 20 2a 70  eaf ){.    u8 *p
24cd0 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65  Pos = &pSeg->pLe
24ce0 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61  af->p[pSeg->iLea
24cf0 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69 66  fOffset];.    if
24d00 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20  ( pColset==0 || 
24d10 70 49 74 65 72 2d 3e 62 46 69 6c 74 65 72 65 64  pIter->bFiltered
24d20 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20   ){.      *pn = 
24d30 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  pSeg->nPos;.    
24d40 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20    *pp = pPos;.  
24d50 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f 6c    }else if( pCol
24d60 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a  set->nCol==1 ){.
24d70 20 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f 73        *pp = pPos
24d80 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 66 74  ;.      *pn = ft
24d90 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
24da0 6c 28 70 70 2c 20 70 53 65 67 2d 3e 6e 50 6f 73  l(pp, pSeg->nPos
24db0 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  , pColset->aiCol
24dc0 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [0]);.    }else{
24dd0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
24de0 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
24df0 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74  slist);.      ft
24e00 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f  s5IndexExtractCo
24e10 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c 20 70 50  lset(pColset, pP
24e20 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20  os, pSeg->nPos, 
24e30 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
24e40 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 49  ;.      *pp = pI
24e50 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
24e60 20 20 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65        *pn = pIte
24e70 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20  r->poslist.n;.  
24e80 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
24e90 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
24ea0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
24eb0 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
24ec0 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
24ed0 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43  pIndex, pSeg, pC
24ee0 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
24ef0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 70  oslist);.    *pp
24f00 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
24f10 74 2e 70 3b 0a 20 20 20 20 2a 70 6e 20 3d 20 70  t.p;.    *pn = p
24f20 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b  Iter->poslist.n;
24f30 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74  .  }.  return ft
24f40 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
24f50 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
24f60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
24f70 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72 20  tion is similar 
24f80 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  to sqlite3Fts5It
24f90 65 72 50 6f 73 6c 69 73 74 28 29 2c 20 65 78 63  erPoslist(), exc
24fa0 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20 63  ept that it.** c
24fb0 6f 70 69 65 73 20 74 68 65 20 70 6f 73 69 74 69  opies the positi
24fc0 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 74 68 65  on list into the
24fd0 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65 64   buffer supplied
24fe0 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a   as the second .
24ff0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
25000 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
25010 74 65 72 50 6f 73 6c 69 73 74 42 75 66 66 65 72  terPoslistBuffer
25020 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
25030 70 49 74 65 72 2c 20 46 74 73 35 42 75 66 66 65  pIter, Fts5Buffe
25040 72 20 2a 70 42 75 66 29 7b 0a 20 20 46 74 73 35  r *pBuf){.  Fts5
25050 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
25060 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 46 74 73 35  ->pIndex;.  Fts5
25070 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
25080 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
25090 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
250a0 46 69 72 73 74 20 5d 3b 0a 20 20 61 73 73 65 72  First ];.  asser
250b0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
250c0 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 42 75 66  _OK );.  fts5Buf
250d0 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
250e0 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
250f0 69 73 74 28 70 2c 20 70 53 65 67 2c 20 30 2c 20  ist(p, pSeg, 0, 
25100 70 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  pBuf);.  return 
25110 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
25120 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  p);.}../*.** Clo
25130 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20 6f  se an iterator o
25140 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  pened by an earl
25150 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ier call to sqli
25160 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65 72  te3Fts5IndexQuer
25170 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  y()..*/.void sql
25180 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73  ite3Fts5IterClos
25190 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  e(Fts5IndexIter 
251a0 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70  *pIter){.  if( p
251b0 49 74 65 72 20 29 7b 0a 20 20 20 20 46 74 73 35  Iter ){.    Fts5
251c0 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20  Index *pIndex = 
251d0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20  pIter->pIndex;. 
251e0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
251f0 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49 6e 64  Free(pIter->pInd
25200 65 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  ex, pIter);.    
25210 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
25220 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a  pIndex);.  }.}..
25230 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 64  /*.** Read and d
25240 65 63 6f 64 65 20 74 68 65 20 22 61 76 65 72 61  ecode the "avera
25250 67 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f 6d  ges" record from
25260 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a   the database. .
25270 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
25280 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69 6e  anSize must poin
25290 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  t to an array of
252a0 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65 72   size nCol, wher
252b0 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68 65  e nCol is.** the
252c0 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20   number of user 
252d0 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  defined columns 
252e0 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  in the FTS table
252f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25300 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72  Fts5IndexGetAver
25310 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
25320 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69  p, i64 *pnRow, i
25330 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20 69  64 *anSize){.  i
25340 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f  nt nCol = p->pCo
25350 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74  nfig->nCol;.  Ft
25360 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a  s5Data *pData;..
25370 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20 20    *pnRow = 0;.  
25380 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20 30  memset(anSize, 0
25390 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a 20  , sizeof(i64) * 
253a0 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d  nCol);.  pData =
253b0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
253c0 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52   FTS5_AVERAGES_R
253d0 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  OWID);.  if( p->
253e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
253f0 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20   pData->nn ){.  
25400 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
25410 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69   int iCol;.    i
25420 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
25430 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20  t(&pData->p[i], 
25440 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20 20  (u64*)pnRow);.  
25450 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 3c    for(iCol=0; i<
25460 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43 6f  pData->nn && iCo
25470 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  l<nCol; iCol++){
25480 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
25490 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
254a0 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26 61  ->p[i], (u64*)&a
254b0 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20  nSize[iCol]);.  
254c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44    }.  }..  fts5D
254d0 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
254e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
254f0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
25500 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  }../*.** Replace
25510 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61 76   the current "av
25520 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 77  erages" record w
25530 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
25540 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a   of the buffer .
25550 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  ** supplied as t
25560 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25570 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
25580 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76  e3Fts5IndexSetAv
25590 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
255a0 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70   *p, const u8 *p
255b0 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
255c0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
255d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
255e0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
255f0 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
25600 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e  _ROWID, pData, n
25610 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
25620 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
25630 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
25640 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
25650 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74  mber of blocks t
25660 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72  his module has r
25670 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
25680 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e  ata.** table sin
25690 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65  ce it was create
256a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
256b0 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28  3Fts5IndexReads(
256c0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
256d0 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64   return p->nRead
256e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
256f0 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65  he 32-bit cookie
25700 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74   value stored at
25710 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c   the start of al
25720 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  l structure .** 
25730 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76  records to the v
25740 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
25750 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
25760 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  nt..**.** Return
25770 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
25780 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
25790 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
257a0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  e if an error.**
257b0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
257c0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
257d0 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e  SetCookie(Fts5In
257e0 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77  dex *p, int iNew
257f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
25820 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
25830 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
25840 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20  g = p->pConfig; 
25850 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
25860 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
25870 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20  u8 aCookie[4];  
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72       /* Binary r
258a0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
258b0 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74   iNew */.  sqlit
258c0 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d  e3_blob *pBlob =
258d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
258e0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
258f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
25900 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69  Put32(aCookie, i
25910 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  New);..  rc = sq
25920 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
25930 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f  pConfig->db, pCo
25940 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
25950 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22  ataTbl, .      "
25960 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52  block", FTS5_STR
25970 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c  UCTURE_ROWID, 1,
25980 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69   &pBlob.  );.  i
25990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
259a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
259b0 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62  blob_write(pBlob
259c0 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29  , aCookie, 4, 0)
259d0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
259e0 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42  e3_blob_close(pB
259f0 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  lob);.  }..  ret
25a00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
25a10 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c  qlite3Fts5IndexL
25a20 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e  oadConfig(Fts5In
25a30 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
25a40 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
25a50 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  t;.  pStruct = f
25a60 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
25a70 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  (p);.  fts5Struc
25a80 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
25a90 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  uct);.  return f
25aa0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
25ab0 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  );.}.../********
25ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
25b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
25b50 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74  Below this point
25b60 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
25b70 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  tation of the in
25b80 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a  tegrity-check .*
25b90 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e  * functionality.
25ba0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
25bb0 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b  n a simple check
25bc0 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20  sum value based 
25bd0 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  on the arguments
25be0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34 20  ..*/.static u64 
25bf0 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
25c00 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69  sum(.  i64 iRowi
25c10 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20  d, .  int iCol, 
25c20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20  .  int iPos, .  
25c30 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73  int iIdx,.  cons
25c40 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20  t char *pTerm,. 
25c50 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20   int nTerm.){.  
25c60 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74  int i;.  u64 ret
25c70 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74   = iRowid;.  ret
25c80 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
25c90 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  Col;.  ret += (r
25ca0 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20  et<<3) + iPos;. 
25cb0 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72   if( iIdx>=0 ) r
25cc0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
25cd0 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46   (FTS5_MAIN_PREF
25ce0 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f  IX + iIdx);.  fo
25cf0 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
25d00 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74  i++) ret += (ret
25d10 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b  <<3) + pTerm[i];
25d20 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
25d30 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
25d40 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
25d50 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72   function is pur
25d60 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  ely an internal 
25d70 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f  test. It does no
25d80 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20  t contribute to 
25d90 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e  .** FTS function
25da0 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74  ality, or even t
25db0 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
25dc0 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  ck, in any way..
25dd0 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69  **.** Instead, i
25de0 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65  t tests that the
25df0 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e   same set of pgn
25e00 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  o/rowid combinat
25e10 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73  ions are .** vis
25e20 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73 20  ited regardless 
25e30 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 64  of whether the d
25e40 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65  oclist-index ide
25e50 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
25e60 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f  eters.** iSegid/
25e70 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74 65  iLeaf is iterate
25e80 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72  d in forwards or
25e90 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a   reverse order..
25ea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
25eb0 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
25ec0 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rse(.  Fts5Index
25ed0 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65 67   *p, .  int iSeg
25ee0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
25ef0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
25f00 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72  nt id to load fr
25f10 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  om */.  int iLea
25f20 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
25f30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
25f40 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f  doclist-index fo
25f50 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29  r this leaf */.)
25f60 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
25f70 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20  r *pDlidx = 0;. 
25f80 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33   u64 cksum1 = 13
25f90 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  ;.  u64 cksum2 =
25fa0 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69   13;..  for(pDli
25fb0 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
25fc0 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69  Init(p, 0, iSegi
25fd0 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20  d, iLeaf);.     
25fe0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
25ff0 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
26000 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
26010 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
26020 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  dx).  ){.    i64
26030 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c   iRowid = fts5Dl
26040 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
26050 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67  idx);.    int pg
26060 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
26070 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
26080 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
26090 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
260a0 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b  sum1 += iRowid +
260b0 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29   ((i64)pgno<<32)
260c0 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
260d0 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
260e0 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
260f0 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66  ..  for(pDlidx=f
26100 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
26110 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20 69  (p, 1, iSegid, i
26120 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73  Leaf);.      fts
26130 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
26140 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
26150 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
26160 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 0a  Prev(p, pDlidx).
26170 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f    ){.    i64 iRo
26180 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49  wid = fts5DlidxI
26190 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
261a0 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  ;.    int pgno =
261b0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
261c0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
261d0 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64  assert( fts5Dlid
261e0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
261f0 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  )>iLeaf );.    c
26200 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20  ksum2 += iRowid 
26210 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32  + ((i64)pgno<<32
26220 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
26230 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
26240 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
26250 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
26260 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
26270 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  um1!=cksum2 ) p-
26280 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
26290 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  PT;.}..static in
262a0 74 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  t fts5QueryCksum
262b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
262c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
262d0 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64 65      /* Fts5 inde
262e0 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  x object */.  in
262f0 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20  t iIdx,.  const 
26300 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20  char *z,        
26310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
26320 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79 20  ex key to query 
26330 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  for */.  int n, 
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26360 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69 6e   of index key in
26370 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26380 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
26390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
263a0 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e 64  lags for Fts5Ind
263b0 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36 34  exQuery */.  u64
263c0 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20 20   *pCksum        
263d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
263e0 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d  IN/OUT: Checksum
263f0 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 75   value */.){.  u
26400 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b 73  64 cksum = *pCks
26410 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  um;.  Fts5IndexI
26420 74 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d 20  ter *pIdxIter = 
26430 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  0;.  int rc = sq
26440 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
26450 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c 61  ery(p, z, n, fla
26460 67 73 2c 20 30 2c 20 26 70 49 64 78 49 74 65 72  gs, 0, &pIdxIter
26470 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  );..  while( rc=
26480 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d  =SQLITE_OK && 0=
26490 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  =sqlite3Fts5Iter
264a0 45 6f 66 28 70 49 64 78 49 74 65 72 29 20 29 7b  Eof(pIdxIter) ){
264b0 0a 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a  .    i64 dummy;.
264c0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50      const u8 *pP
264d0 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73  os;.    int nPos
264e0 3b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64 20  ;.    i64 rowid 
264f0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  = sqlite3Fts5Ite
26500 72 52 6f 77 69 64 28 70 49 64 78 49 74 65 72 29  rRowid(pIdxIter)
26510 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
26520 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
26530 74 28 70 49 64 78 49 74 65 72 2c 20 30 2c 20 26  t(pIdxIter, 0, &
26540 70 50 6f 73 2c 20 26 6e 50 6f 73 2c 20 26 64 75  pPos, &nPos, &du
26550 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
26560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26570 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74       Fts5Poslist
26580 52 65 61 64 65 72 20 73 52 65 61 64 65 72 3b 0a  Reader sReader;.
26590 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74 65        for(sqlite
265a0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
265b0 65 72 49 6e 69 74 28 70 50 6f 73 2c 20 6e 50 6f  erInit(pPos, nPo
265c0 73 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20 20  s, &sReader);.  
265d0 20 20 20 20 20 20 20 20 73 52 65 61 64 65 72 2e          sReader.
265e0 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20 20  bEof==0;.       
265f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26600 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74 28  slistReaderNext(
26610 26 73 52 65 61 64 65 72 29 0a 20 20 20 20 20 20  &sReader).      
26620 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
26630 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
26640 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69 50  OLUMN(sReader.iP
26650 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  os);.        int
26660 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53   iOff = FTS5_POS
26670 32 4f 46 46 53 45 54 28 73 52 65 61 64 65 72 2e  2OFFSET(sReader.
26680 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 63  iPos);.        c
26690 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64 65  ksum ^= fts5Inde
266a0 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69  xEntryCksum(rowi
266b0 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69  d, iCol, iOff, i
266c0 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Idx, z, n);.    
266d0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
266e0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
266f0 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20  xt(pIdxIter);.  
26700 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
26710 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
26720 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43  IdxIter);..  *pC
26730 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20  ksum = cksum;.  
26740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
26750 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26760 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c  on is also purel
26770 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65  y an internal te
26780 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  st. It does not 
26790 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a  contribute to .*
267a0 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c  * FTS functional
267b0 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65  ity, or even the
267c0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
267d0 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f  , in any way..*/
267e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
267f0 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73  5TestTerm(.  Fts
26800 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
26810 73 35 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c  s5Buffer *pPrev,
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26830 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   Previous term *
26840 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26850 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  z, int n,       
26860 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
26870 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74  new term to test
26880 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74   */.  u64 expect
26890 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75  ed,.  u64 *pCksu
268a0 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  m.){.  int rc = 
268b0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72  p->rc;.  if( pPr
268c0 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ev->n==0 ){.    
268d0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  fts5BufferSet(&r
268e0 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f  c, pPrev, n, (co
268f0 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65  nst u8*)z);.  }e
26900 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  lse.  if( rc==SQ
26910 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65  LITE_OK && (pPre
26920 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d  v->n!=n || memcm
26930 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e  p(pPrev->p, z, n
26940 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b  )) ){.    u64 ck
26950 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a  sum3 = *pCksum;.
26960 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
26970 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zTerm = (const c
26980 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31  har*)&pPrev->p[1
26990 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73  ];  /* term sans
269a0 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a   prefix-byte */.
269b0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20      int nTerm = 
269c0 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20  pPrev->n-1;     
269d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
269e0 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
269f0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
26a00 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20   = (pPrev->p[0] 
26a10 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  - FTS5_MAIN_PREF
26a20 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  IX);.    int fla
26a30 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20  gs = (iIdx==0 ? 
26a40 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55  0 : FTS5INDEX_QU
26a50 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20  ERY_PREFIX);.   
26a60 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20   u64 ck1 = 0;.  
26a70 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a    u64 ck2 = 0;..
26a80 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
26a90 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65  t the results re
26aa0 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61  turned for ASC a
26ab0 6e 64 20 44 45 53 43 20 71 75 65 72 69 65 73 20  nd DESC queries 
26ac0 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  are.    ** the s
26ad0 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c  ame. If not, cal
26ae0 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f  l this corruptio
26af0 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n.  */.    rc = 
26b00 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
26b10 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
26b20 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b  Term, flags, &ck
26b30 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
26b40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26b50 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
26b60 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
26b70 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20  _DESC;.      rc 
26b80 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
26b90 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
26ba0 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
26bb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
26bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26bd0 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
26be0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
26bf0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
26c00 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79  s a prefix query
26c10 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
26c20 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
26c30 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d if the.    ** 
26c40 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73  the index is dis
26c50 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61  abled are the sa
26c60 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20  me. In both ASC 
26c70 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20  and DESC order. 
26c80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
26c90 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e  his check may on
26ca0 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
26cb0 69 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  if the hash tabl
26cc0 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73  e is empty. This
26cd0 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75  .    ** is becau
26ce0 73 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  se the hash tabl
26cf0 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20  e only supports 
26d00 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75  a single scan qu
26d10 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20  ery at.    ** a 
26d20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75  time, and the mu
26d30 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72  lti-iter loop fr
26d40 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 66 75  om which this fu
26d50 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
26d60 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  .    ** is alrea
26d70 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75  dy performing su
26d80 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  ch a scan. */.  
26d90 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e    if( p->nPendin
26da0 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  gData==0 ){.    
26db0 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20    if( iIdx>0 && 
26dc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26dd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d  .        int f =
26de0 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58   flags|FTS5INDEX
26df0 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
26e00 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d  X;.        ck2 =
26e10 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
26e20 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
26e30 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
26e40 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
26e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
26e60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
26e70 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
26e80 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
26e90 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49    }.      if( iI
26ea0 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  dx>0 && rc==SQLI
26eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
26ec0 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
26ed0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
26ee0 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e  EST_NOIDX|FTS5IN
26ef0 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a  DEX_QUERY_DESC;.
26f00 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b          ck2 = 0;
26f10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
26f20 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
26f30 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
26f40 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
26f50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
26f60 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
26f70 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
26f80 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
26f90 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75  .    }..    cksu
26fa0 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66  m3 ^= ck1;.    f
26fb0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
26fc0 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e  , pPrev, n, (con
26fd0 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20  st u8*)z);..    
26fe0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26ff0 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70  K && cksum3!=exp
27000 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ected ){.      r
27010 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27020 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b  ;.    }.    *pCk
27030 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20  sum = cksum3;.  
27040 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  }.  p->rc = rc;.
27050 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }. .#else.# defi
27060 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69 64 78  ne fts5TestDlidx
27070 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23  Reverse(x,y,z).#
27080 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74   define fts5Test
27090 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Term(u,v,w,x,y,z
270a0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
270b0 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a  Check that:.**.*
270c0 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65  *   1) All leave
270d0 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65  s of pSeg betwee
270e0 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61  n iFirst and iLa
270f0 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65  st (inclusive) e
27100 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20  xist and.**     
27110 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65   contain zero te
27120 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c  rms..**   2) All
27130 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20   leaves of pSeg 
27140 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64  between iNoRowid
27150 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c   and iLast (incl
27160 75 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64  usive) exist and
27170 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e  .**      contain
27180 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f   zero rowids..*/
27190 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
271a0 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
271b0 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73  heckEmpty(.  Fts
271c0 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
271d0 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
271e0 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
271f0 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b  Segment to check
27200 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73   internal consis
27210 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69  tency */.  int i
27220 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f  First,.  int iNo
27230 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61  Rowid,.  int iLa
27240 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  st.){.  int i;..
27250 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
27260 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
27270 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
27280 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
27290 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65   leaf.  ** (a) e
272a0 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  xist and (b) con
272b0 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a  tain no terms. *
272c0 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74  /.  for(i=iFirst
272d0 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
272e0 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20  OK && i<=iLast; 
272f0 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61  i++){.    Fts5Da
27300 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35  ta *pLeaf = fts5
27310 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
27320 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
27330 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29  Seg->iSegid, i))
27340 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20  ;.    if( pLeaf 
27350 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66 74  ){.      if( !ft
27360 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73  s5LeafIsTermless
27370 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20  (pLeaf) ) p->rc 
27380 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
27390 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f        if( i>=iNo
273a0 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73 35  Rowid && 0!=fts5
273b0 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
273c0 66 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63  f(pLeaf) ) p->rc
273d0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
273e0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
273f0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
27400 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
27410 20 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72   void fts5Integr
27420 69 74 79 43 68 65 63 6b 50 67 69 64 78 28 46 74  ityCheckPgidx(Ft
27430 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
27440 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20  Data *pLeaf){.  
27450 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
27460 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46  ;.  int ii;..  F
27470 74 73 35 42 75 66 66 65 72 20 62 75 66 31 20 3d  ts5Buffer buf1 =
27480 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35   {0,0,0};.  Fts5
27490 42 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30  Buffer buf2 = {0
274a0 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70  ,0,0};..  ii = p
274b0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
274c0 77 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d  while( ii<pLeaf-
274d0 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  >nn && p->rc==SQ
274e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
274f0 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
27500 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49  iOff;.    int nI
27510 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20  ncr;..    ii += 
27520 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
27530 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e  &pLeaf->p[ii], n
27540 49 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d  Incr);.    iTerm
27550 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20  Off += nIncr;.  
27560 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
27570 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66  f;..    if( iOff
27580 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
27590 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
275a0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
275b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65     }else if( iTe
275c0 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a  rmOff==nIncr ){.
275d0 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
275e0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
275f0 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
27600 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
27610 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
27620 28 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70  ( (iOff+nByte)>p
27630 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
27640 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
27650 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27670 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
27680 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20  (&p->rc, &buf1, 
27690 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70  nByte, &pLeaf->p
276a0 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d  [iOff]);.      }
276b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
276c0 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79    int nKeep, nBy
276d0 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  te;.      iOff +
276e0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
276f0 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
27700 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
27710 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
27720 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
27730 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  >p[iOff], nByte)
27740 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65  ;.      if( nKee
27750 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66  p>buf1.n || (iOf
27760 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e  f+nByte)>pLeaf->
27770 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
27780 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
27790 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
277a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66  lse{.        buf
277b0 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20  1.n = nKeep;.   
277c0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
277d0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
277e0 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20  , &buf1, nByte, 
277f0 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29  &pLeaf->p[iOff])
27800 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27810 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
27820 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27830 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
27840 72 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20  rCompare(&buf1, 
27850 26 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20  &buf2);.        
27860 69 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e  if( res<=0 ) p->
27870 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
27880 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
27890 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
278a0 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32  et(&p->rc, &buf2
278b0 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70  , buf1.n, buf1.p
278c0 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75  );.  }..  fts5Bu
278d0 66 66 65 72 46 72 65 65 28 26 62 75 66 31 29 3b  fferFree(&buf1);
278e0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
278f0 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61  e(&buf2);.}..sta
27900 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
27910 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
27920 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49  Segment(.  Fts5I
27930 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
27940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
27950 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
27960 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
27970 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
27980 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g      /* Segmen
27990 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
279a0 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
279b0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
279c0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
279d0 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69  >pConfig;.  sqli
279e0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
279f0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a  = 0;.  int rc2;.
27a00 20 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65    int iIdxPrevLe
27a10 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  af = pSeg->pgnoF
27a20 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44  irst-1;.  int iD
27a30 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  lidxPrevLeaf = p
27a40 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a  Seg->pgnoLast;..
27a50 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
27a60 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72  First==0 ) retur
27a70 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50  n;..  fts5IndexP
27a80 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
27a90 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70  Stmt, sqlite3_mp
27aa0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45  rintf(.      "SE
27ab0 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d  LECT segid, term
27ac0 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67  , (pgno>>1), (pg
27ad0 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25  no&1) FROM %Q.'%
27ae0 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67  q_idx' WHERE seg
27af0 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43  id=%d",.      pC
27b00 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e  onfig->zDb, pCon
27b10 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67  fig->zName, pSeg
27b20 2d 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a  ->iSegid.  ));..
27b30 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
27b40 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20  ough the b-tree 
27b50 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20  hierarchy.  */. 
27b60 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
27b70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
27b80 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
27b90 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
27ba0 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20     i64 iRow;    
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bc0 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68   /* Rowid for th
27bd0 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46  is leaf */.    F
27be0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
27bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27c00 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65  Data for this le
27c10 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e  af */..    int n
27c20 49 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65  IdxTerm = sqlite
27c30 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
27c40 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f  Stmt, 1);.    co
27c50 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65  nst char *zIdxTe
27c60 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rm = (const char
27c70 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
27c80 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
27c90 0a 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61  .    int iIdxLea
27ca0 66 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  f = sqlite3_colu
27cb0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29  mn_int(pStmt, 2)
27cc0 3b 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c  ;.    int bIdxDl
27cd0 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  idx = sqlite3_co
27ce0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
27cf0 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  3);..    /* If t
27d00 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74  he leaf in quest
27d10 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
27d20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f  been trimmed fro
27d30 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a  m the segment, .
27d40 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68      ** ignore th
27d50 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e  is b-tree entry.
27d60 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64   Otherwise, load
27d70 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e   it into memory.
27d80 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78   */.    if( iIdx
27d90 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46  Leaf<pSeg->pgnoF
27da0 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  irst ) continue;
27db0 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35  .    iRow = FTS5
27dc0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
27dd0 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64  Seg->iSegid, iId
27de0 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61  xLeaf);.    pLea
27df0 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
27e00 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69  (p, iRow);.    i
27e10 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  f( pLeaf==0 ) br
27e20 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  eak;..    /* Che
27e30 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
27e40 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
27e50 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64  st one term, and
27e60 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61   that it is equa
27e70 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c  l.    ** to or l
27e80 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
27e90 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78  plit-key in zIdx
27ea0 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63  Term.  Also chec
27eb0 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65 0a  k that if there.
27ec0 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61      ** is also a
27ed0 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77   rowid pointer w
27ee0 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70  ithin the leaf p
27ef0 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20 70  age header, it p
27f00 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a  oints to a.    *
27f10 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  * location befor
27f20 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a  e the term.  */.
27f30 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e      if( pLeaf->n
27f40 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  n<=pLeaf->szLeaf
27f50 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
27f60 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
27f70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27f80 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
27f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27fa0 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
27fb0 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  term on leaf */.
27fc0 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
27fd0 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
27fe0 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
27ff0 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65  irst rowid on le
28000 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  af */.      int 
28010 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
28020 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
28030 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20  of term on leaf 
28040 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
28050 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
28060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28070 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   Comparison of t
28080 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65  erm and split-ke
28090 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66  y */..      iOff
280a0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
280b0 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a  TermOff(pLeaf);.
280c0 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
280d0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
280e0 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
280f0 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
28100 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20  Off>=iOff ){.   
28110 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
28120 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
28130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28140 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
28150 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
28160 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b  p[iOff], nTerm);
28170 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d  .        res = m
28180 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b  emcmp(&pLeaf->p[
28190 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c  iOff], zIdxTerm,
281a0 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78   MIN(nTerm, nIdx
281b0 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
281c0 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
281d0 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54   = nTerm - nIdxT
281e0 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
281f0 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d   res<0 ) p->rc =
28200 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
28210 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
28220 73 35 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  s5IntegrityCheck
28230 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66 29 3b  Pgidx(p, pLeaf);
28240 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
28250 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
28260 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
28270 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
28280 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  * Now check that
28290 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79   the iter.nEmpty
282a0 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
282b0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  g the current le
282c0 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78  af.    ** (a) ex
282d0 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ist and (b) cont
282e0 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f  ain no terms. */
282f0 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e  .    fts5IndexIn
28300 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74  tegrityCheckEmpt
28310 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20 70 53  y(.        p, pS
28320 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65 61 66  eg, iIdxPrevLeaf
28330 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76 4c 65  +1, iDlidxPrevLe
28340 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d 31  af+1, iIdxLeaf-1
28350 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
28360 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
28370 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
28380 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
28390 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69  ex, check that i
283a0 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a  t looks right. *
283b0 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78 44 6c  /.    if( bIdxDl
283c0 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73  idx ){.      Fts
283d0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
283e0 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20  dx = 0;  /* For 
283f0 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
28400 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  h doclist index 
28410 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72  */.      int iPr
28420 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61  evLeaf = iIdxLea
28430 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  f;.      int iSe
28440 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67  gid = pSeg->iSeg
28450 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50  id;.      int iP
28460 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34  g = 0;.      i64
28470 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f   iKey;..      fo
28480 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
28490 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c  dxIterInit(p, 0,
284a0 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61   iSegid, iIdxLea
284b0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  f);.          ft
284c0 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
284d0 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
284e0 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
284f0 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
28500 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20  idx).      ){.. 
28510 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
28520 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70  any rowid-less p
28530 61 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ages that occur 
28540 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
28550 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20  nt leaf. */.    
28560 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65      for(iPg=iPre
28570 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73  vLeaf+1; iPg<fts
28580 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
28590 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a  Dlidx); iPg++){.
285a0 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
285b0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
285c0 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 67 29  WID(iSegid, iPg)
285d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
285e0 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
285f0 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  (p, iKey);.     
28600 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
28610 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
28620 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  ( fts5LeafFirstR
28630 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 21 3d  owidOff(pLeaf)!=
28640 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
28650 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
28660 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
28670 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
28680 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28690 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65    }.        iPre
286a0 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64  vLeaf = fts5Dlid
286b0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
286c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  );..        /* C
286d0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
286e0 61 66 20 70 61 67 65 20 69 6e 64 69 63 61 74 65  af page indicate
286f0 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
28700 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20  r really does.  
28710 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
28720 20 74 68 65 20 72 6f 77 69 64 20 73 75 67 67 65   the rowid sugge
28730 73 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  sted by the same
28740 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65  . */.        iKe
28750 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
28760 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
28770 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20  PrevLeaf);.     
28780 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
28790 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
287a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
287b0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
287c0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
287d0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
287e0 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  dOff = fts5LeafF
287f0 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
28800 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 41  af);.          A
28810 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
28820 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
28830 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
28840 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
28850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
28860 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
28870 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  PT;.          }e
28880 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28890 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
288a0 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f  pLeaf->p[iRowidO
288b0 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
288c0 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
288d0 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73   if( iRowid!=fts
288e0 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
288f0 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20  pDlidx) ) p->rc 
28900 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
28910 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28920 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
28930 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
28940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28950 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65  .      iDlidxPre
28960 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20 20 20  vLeaf = iPg;.   
28970 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
28980 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
28990 20 20 20 20 66 74 73 35 54 65 73 74 44 6c 69 64      fts5TestDlid
289a0 78 52 65 76 65 72 73 65 28 70 2c 20 69 53 65 67  xReverse(p, iSeg
289b0 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
289c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
289d0 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d  iDlidxPrevLeaf =
289e0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b   pSeg->pgnoLast;
289f0 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
28a00 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 20 6e  Check there is n
28a10 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  o doclist index 
28a20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 49  */.    }..    iI
28a30 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64  dxPrevLeaf = iId
28a40 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63  xLeaf;.  }..  rc
28a50 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
28a60 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
28a70 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
28a80 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
28a90 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69 74  2;..  /* Page it
28aa0 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f  er.iLeaf must no
28ab0 77 20 62 65 20 74 68 65 20 72 69 67 68 74 6d 6f  w be the rightmo
28ac0 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20  st leaf-page in 
28ad0 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23  the segment */.#
28ae0 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63  if 0.  if( p->rc
28af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
28b00 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
28b10 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
28b20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
28b30 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  RRUPT;.  }.#endi
28b40 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  f.}.../*.** Run 
28b50 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20  internal checks 
28b60 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
28b70 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61 29  he FTS index (a)
28b80 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a   is internally .
28b90 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e  ** consistent an
28ba0 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65  d (b) contains e
28bb0 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68  ntries for which
28bc0 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20   the XOR of the 
28bd0 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20  checksums.** as 
28be0 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66 74  calculated by ft
28bf0 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
28c00 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a  m() is cksum..**
28c10 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
28c20 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e 79  E_CORRUPT if any
28c30 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   of the internal
28c40 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f 72   checks fail, or
28c50 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   if the.** check
28c60 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  sum does not mat
28c70 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  ch. Return SQLIT
28c80 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65 63  E_OK if all chec
28c90 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74 0a  ks pass without.
28ca0 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f 6d  ** error, or som
28cb0 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20 65  e other SQLite e
28cc0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 6f  rror code if ano
28cd0 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67 2e  ther error (e.g.
28ce0 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73 2e   OOM).** occurs.
28cf0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
28d00 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
28d10 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65 78  yCheck(Fts5Index
28d20 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29 7b   *p, u64 cksum){
28d30 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
28d40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
28d50 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62     /* Checksum b
28d60 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73  ased on contents
28d70 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20   of indexes */. 
28d80 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
28d90 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  ist = {0,0,0};  
28da0 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
28db0 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69 73  to hold a poslis
28dc0 74 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  t */.  Fts5Index
28dd0 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20 20  Iter *pIter;    
28de0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
28df0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
28e00 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20 2a  h entire index *
28e10 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
28e20 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20  e *pStruct;     
28e30 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74 72      /* Index str
28e40 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 2f 2a 20  ucture */..  /* 
28e50 55 73 65 64 20 62 79 20 65 78 74 72 61 20 69 6e  Used by extra in
28e60 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c  ternal tests onl
28e70 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55 47 20  y run if NDEBUG 
28e80 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a  is not defined *
28e90 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33 20 3d  /.  u64 cksum3 =
28ea0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28eb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
28ec0 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
28ed0 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
28ee0 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
28ef0 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20  m = {0,0,0};    
28f00 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
28f10 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65   to hold most re
28f20 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20 20 0a  cent term */.  .
28f30 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46 54    /* Load the FT
28f40 53 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  S index structur
28f50 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d  e */.  pStruct =
28f60 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
28f70 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ad(p);..  /* Che
28f80 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74 65  ck that the inte
28f90 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65 61  rnal nodes of ea
28fa0 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63 68  ch segment match
28fb0 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a 20   the leaves */. 
28fc0 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
28fd0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
28fe0 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c  eg;.    for(iLvl
28ff0 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
29000 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
29010 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ){.      for(iSe
29020 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63  g=0; iSeg<pStruc
29030 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
29040 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
29050 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63         Fts5Struc
29060 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
29070 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
29080 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b  evel[iLvl].aSeg[
29090 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 66  iSeg];.        f
290a0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
290b0 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70 2c  yCheckSegment(p,
290c0 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d 0a   pSeg);.      }.
290d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
290e0 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d 65  The cksum argume
290f0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
29100 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
29110 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c 61  checksum calcula
29120 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20 6f  ted.  ** based o
29130 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20 65  n all expected e
29140 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46 54  ntries in the FT
29150 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64 69  S index (includi
29160 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65 78 0a  ng prefix index.
29170 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20 54    ** entries). T
29180 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b 73  his block checks
29190 20 74 68 61 74 20 61 20 63 68 65 63 6b 73 75 6d   that a checksum
291a0 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65   calculated base
291b0 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61 63  d on the.  ** ac
291c0 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f 66  tual contents of
291d0 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 69 64   FTS index is id
291e0 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20  entical..  **.  
291f0 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73 20  ** Two versions 
29200 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68 65 63  of the same chec
29210 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c 61  ksum are calcula
29220 74 65 64 2e 20 54 68 65 20 66 69 72 73 74 20 28  ted. The first (
29230 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69 61  stack.  ** varia
29240 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73 65  ble cksum2) base
29250 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78 74  d on entries ext
29260 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65 20  racted from the 
29270 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78 0a  full-text index.
29280 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e 67    ** while doing
29290 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 6f   a linear scan o
292a0 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  f each individua
292b0 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e 2e  l index in turn.
292c0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20 65   .  **.  ** As e
292d0 61 63 68 20 74 65 72 6d 20 76 69 73 69 74 65 64  ach term visited
292e0 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20 73   by the linear s
292f0 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74 65  cans, a separate
29300 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a 20   query for the. 
29310 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69 73   ** same term is
29320 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73 75   performed. cksu
29330 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  m3 is calculated
29340 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 6e   based on the en
29350 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72 61  tries.  ** extra
29360 63 74 65 64 20 62 79 20 74 68 65 73 65 20 71 75  cted by these qu
29370 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  eries..  */.  fo
29380 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
29390 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30  ew(p, pStruct, 0
293a0 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c 20 30  , 0, 0, 0, -1, 0
293b0 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
293c0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
293d0 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
293e0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
293f0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
29400 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
29410 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
29420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29430 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69 6e 20  Size of term in 
29440 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 36 34  bytes */.    i64
29450 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20 20 20   iPos = 0;      
29460 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69           /* Posi
29470 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d 20 70  tion read from p
29480 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 6e  oslist */.    in
29490 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20 20 20  t iOff = 0;     
294a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
294b0 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73 6c 69  set within posli
294c0 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 52  st */.    i64 iR
294d0 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
294e0 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29  IterRowid(pIter)
294f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  ;.    char *z = 
29500 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69  (char*)fts5Multi
29510 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
29520 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  &n);..    /* If 
29530 74 68 69 73 20 69 73 20 61 20 6e 65 77 20 74 65  this is a new te
29540 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20 69 74  rm, query for it
29550 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d 33 20  . Update cksum3 
29560 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74 73  with the results
29570 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 54 65 73  . */.    fts5Tes
29580 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20  tTerm(p, &term, 
29590 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20 26 63  z, n, cksum2, &c
295a0 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20 70 6f 73  ksum3);..    pos
295b0 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  list.n = 0;.    
295c0 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
295d0 73 74 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53  st(p, &pIter->aS
295e0 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
295f0 5b 31 5d 2e 69 46 69 72 73 74 5d 20 2c 20 30 2c  [1].iFirst] , 0,
29600 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   &poslist);.    
29610 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65  while( 0==sqlite
29620 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
29630 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f  64(poslist.p, po
29640 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20  slist.n, &iOff, 
29650 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  &iPos) ){.      
29660 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
29670 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29  POS2COLUMN(iPos)
29680 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b  ;.      int iTok
29690 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f  Off = FTS5_POS2O
296a0 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20  FFSET(iPos);.   
296b0 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73     cksum2 ^= fts
296c0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
296d0 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  (iRowid, iCol, i
296e0 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e  TokOff, -1, z, n
296f0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
29700 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26  ts5TestTerm(p, &
29710 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75  term, 0, 0, cksu
29720 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20  m2, &cksum3);.. 
29730 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
29740 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ee(p, pIter);.  
29750 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
29760 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
29770 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
29780 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
29790 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
297a0 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
297b0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
297c0 28 26 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  (&term);.  fts5B
297d0 75 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69  ufferFree(&posli
297e0 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  st);.  return ft
297f0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
29800 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63  ;.}.../*.** Calc
29810 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ulate and return
29820 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61 74   a checksum that
29830 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20 74   is the XOR of t
29840 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
29850 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c  * checksum of al
29860 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  l entries that w
29870 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65  ould be generate
29880 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20 73  d by the token s
29890 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
298a0 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75 6d  he final 5 argum
298b0 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  ents..*/.u64 sql
298c0 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73  ite3Fts5IndexCks
298d0 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  um(.  Fts5Config
298e0 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20   *pConfig,      
298f0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
29900 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ration object */
29910 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20  .  i64 iRowid,  
29920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29930 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74     /* Document t
29940 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
29950 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65      /* Column te
29980 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f  rm appears in */
29990 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
299a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
299b0 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74     /* Position t
299c0 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
299d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
299e0 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
299f0 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20 69      /* Term at i
29a00 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  Pos */.){.  u64 
29a10 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ret = 0;        
29a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29a30 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
29a40 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
29a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a60 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
29a70 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65  g through indexe
29a80 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66 74  s */..  ret = ft
29a90 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
29aa0 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  m(iRowid, iCol, 
29ab0 69 50 6f 73 2c 20 30 2c 20 70 54 65 72 6d 2c 20  iPos, 0, pTerm, 
29ac0 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69  nTerm);..  for(i
29ad0 49 64 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e  Idx=0; iIdx<pCon
29ae0 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
29af0 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  dx++){.    int n
29b00 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  Byte = fts5Index
29b10 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
29b20 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  (pTerm, nTerm, p
29b30 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
29b40 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20  iIdx]);.    if( 
29b50 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72  nByte ){.      r
29b60 65 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45  et ^= fts5IndexE
29b70 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64  ntryCksum(iRowid
29b80 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 69 49  , iCol, iPos, iI
29b90 64 78 2b 31 2c 20 70 54 65 72 6d 2c 20 6e 42 79  dx+1, pTerm, nBy
29ba0 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  te);.    }.  }..
29bb0 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
29bc0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
29bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
29c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29c20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29c50 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
29c60 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
29c70 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
29c80 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
29c90 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20  ode() scalar.** 
29ca0 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a  function only..*
29cb0 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  /../*.** Decode 
29cc0 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72  a segment-data r
29cd0 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  owid from the %_
29ce0 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73  data table. This
29cf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
29d00 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20  the opposite of 
29d10 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45  macro FTS5_SEGME
29d20 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73  NT_ROWID()..*/.s
29d30 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
29d40 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36  ecodeRowid(.  i6
29d50 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29d70 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61   Rowid from %_da
29d80 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
29d90 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
29da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29db0 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
29dc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69   */.  int *pbDli
29dd0 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
29de0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c        /* OUT: Dl
29df0 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e  idx flag */.  in
29e00 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20  t *piHeight,    
29e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29e20 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a   OUT: Height */.
29e30 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20    int *piPgno   
29e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e50 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e    /* OUT: Page n
29e60 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  umber */.){.  *p
29e70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52  iPgno = (int)(iR
29e80 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
29e90 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  << FTS5_DATA_PAG
29ea0 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  E_B) - 1));.  iR
29eb0 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
29ec0 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70  TA_PAGE_B;..  *p
29ed0 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28  iHeight = (int)(
29ee0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
29ef0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
29f00 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a  EIGHT_B) - 1));.
29f10 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
29f20 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b  5_DATA_HEIGHT_B;
29f30 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28  ..  *pbDlidx = (
29f40 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78  int)(iRowid & 0x
29f50 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20  0001);.  iRowid 
29f60 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c  >>= FTS5_DATA_DL
29f70 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64  I_B;..  *piSegid
29f80 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
29f90 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
29fa0 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20  S5_DATA_ID_B) - 
29fb0 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
29fc0 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
29fd0 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
29fe0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
29ff0 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
2a000 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
2a010 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20   iPgno, bDlidx; 
2a020 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63        /* Rowid c
2a030 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66  ompenents */.  f
2a040 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
2a050 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62  Key, &iSegid, &b
2a060 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c  Dlidx, &iHeight,
2a070 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28   &iPgno);..  if(
2a080 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
2a090 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35    if( iKey==FTS5
2a0a0 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
2a0b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2a0c0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2a0d0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2a0e0 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29  , "{averages} ")
2a0f0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2a100 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2a110 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2a120 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74  (pRc, pBuf, "{st
2a130 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20  ructure}");.    
2a140 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20  }.  }.  else{.  
2a150 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2a160 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2a170 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73  pRc, pBuf, "{%ss
2a180 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e  egid=%d h=%d pgn
2a190 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  o=%d}",.        
2a1a0 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20  bDlidx ? "dlidx 
2a1b0 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20  " : "", iSegid, 
2a1c0 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20  iHeight, iPgno. 
2a1d0 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61     );.  }.}..sta
2a1e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
2a1f0 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  ugStructure(.  i
2a200 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a220 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
2a230 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
2a240 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74  ffer *pBuf,.  Ft
2a250 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29  s5Structure *p.)
2a260 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53  {.  int iLvl, iS
2a270 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
2a280 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
2a290 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73  hrough levels, s
2a2a0 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f  egments */..  fo
2a2b0 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
2a2c0 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
2a2d0 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
2a2e0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
2a2f0 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  = &p->aLevel[iLv
2a300 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l];.    sqlite3F
2a310 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2a320 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2a330 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c   .        " {lvl
2a340 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53  =%d nMerge=%d nS
2a350 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c  eg=%d", iLvl, pL
2a360 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c  vl->nMerge, pLvl
2a370 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20  ->nSeg.    );.  
2a380 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
2a390 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
2a3a0 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
2a3b0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2a3c0 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
2a3d0 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
2a3e0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2a3f0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2a400 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b  f(pRc, pBuf, " {
2a410 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e  id=%d leaves=%d.
2a420 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20  .%d}", .        
2a430 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20    pSeg->iSegid, 
2a440 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c  pSeg->pgnoFirst,
2a450 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a   pSeg->pgnoLast.
2a460 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2a470 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2a480 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2a490 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29  (pRc, pBuf, "}")
2a4a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
2a4b0 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74  his is part of t
2a4c0 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
2a4d0 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a   debugging aid..
2a4e0 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  **.** Arguments 
2a4f0 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74  pBlob/nBlob cont
2a500 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64  ain a serialized
2a510 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
2a520 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  bject. This.** f
2a530 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
2a540 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
2a550 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
2a560 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65  of the same obje
2a570 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66  ct.** to the buf
2a580 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  fer passed as th
2a590 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a5a0 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
2a5b0 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72  id fts5DecodeStr
2a5c0 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
2a5d0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2a5e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2a5f0 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2a600 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2a610 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75  *pBuf,.  const u
2a620 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *pBlob, int nB
2a630 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lob.){.  int rc;
2a640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a650 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a660 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
2a670 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20  5Structure *p = 
2a680 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2a690 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72  Decoded structur
2a6a0 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72  e object */..  r
2a6b0 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
2a6c0 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e  eDecode(pBlob, n
2a6d0 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20  Blob, 0, &p);.  
2a6e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2a6f0 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  K ){.    *pRc = 
2a700 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
2a710 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67    }..  fts5Debug
2a720 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70  Structure(pRc, p
2a730 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53  Buf, p);.  fts5S
2a740 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
2a750 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
2a760 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
2a770 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2a780 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
2a790 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
2a7a0 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
2a7b0 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20  n an "averages" 
2a7c0 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e  record. This fun
2a7d0 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64  ction .** append
2a7e0 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
2a7f0 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
2a800 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74  n of record to t
2a810 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
2a820 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f   .** as the seco
2a830 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
2a840 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2a850 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28  5DecodeAverages(
2a860 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
2a870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a880 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
2a890 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
2a8a0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
2a8b0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
2a8c0 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
2a8d0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63    int i = 0;.  c
2a8e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63  onst char *zSpac
2a8f0 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65  e = "";..  while
2a900 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  ( i<nBlob ){.   
2a910 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   u64 iVal;.    i
2a920 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
2a930 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b  etVarint(&pBlob[
2a940 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
2a950 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2a960 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2a970 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c  c, pBuf, "%s%d",
2a980 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56   zSpace, (int)iV
2a990 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20  al);.    zSpace 
2a9a0 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = " ";.  }.}../*
2a9b0 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29  .** Buffer (a/n)
2a9c0 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
2a9d0 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66  ontain a list of
2a9e0 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69   serialized vari
2a9f0 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63  nts. Read.** eac
2aa00 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70  h varint and app
2aa10 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72  end its string r
2aa20 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f  epresentation to
2aa30 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65   buffer pBuf. Re
2aa40 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69  turn.** after ei
2aa50 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62  ther the input b
2aa60 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74  uffer is exhaust
2aa70 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20  ed or a 0 value 
2aa80 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  is read..**.** T
2aa90 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
2aaa0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
2aab0 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
2aac0 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
2aad0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
2aae0 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
2aaf0 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
2ab00 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
2ab10 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
2ab20 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  n){.  int iOff =
2ab30 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66   0;.  while( iOf
2ab40 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  f<n ){.    int i
2ab50 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Val;.    iOff +=
2ab60 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2ab70 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29  (&a[iOff], iVal)
2ab80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
2ab90 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2aba0 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
2abb0 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d   %d", iVal);.  }
2abc0 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
2abd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
2abe0 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
2abf0 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
2ac00 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
2ac10 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
2ac20 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
2ac30 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
2ac40 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
2ac50 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
2ac60 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
2ac70 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2ac80 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
2ac90 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
2aca0 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
2acb0 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
2acc0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
2acd0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
2ace0 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
2acf0 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
2ad00 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2ad10 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
2ad20 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
2ad30 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
2ad40 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
2ad50 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
2ad60 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  d = 0;.  int iOf
2ad70 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  f = 0;..  if( n>
2ad80 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20  0 ){.    iOff = 
2ad90 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
2ada0 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69  rint(a, (u64*)&i
2adb0 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Docid);.    sqli
2adc0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2add0 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2ade0 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c  Buf, " id=%lld",
2adf0 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20   iDocid);.  }.  
2ae00 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
2ae10 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
2ae20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
2ae30 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2ae40 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
2ae50 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
2ae60 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66  bDummy);.    iOf
2ae70 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50  f += fts5DecodeP
2ae80 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66  oslist(pRc, pBuf
2ae90 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28  , &a[iOff], MIN(
2aea0 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a  n-iOff, nPos));.
2aeb0 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
2aec0 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
2aed0 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ta;.      iOff +
2aee0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
2aef0 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
2af00 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
2af10 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d  .      iDocid +=
2af20 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73   iDelta;.      s
2af30 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2af40 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2af50 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c  , pBuf, " id=%ll
2af60 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20  d", iDocid);.   
2af70 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2af80 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
2af90 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
2afa0 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
2afb0 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
2afc0 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  on fts5_decode()
2afd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2afe0 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
2aff0 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
2b000 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
2b010 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2b020 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
2b030 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b060 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
2b070 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
2b080 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
2b090 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2b0a0 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
2b0b0 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
2b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b0d0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2b0e0 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  r record being d
2b0f0 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ecoded */.  int 
2b100 69 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69  iSegid,iHeight,i
2b110 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52  Pgno,bDlidx;/* R
2b120 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  owid components 
2b130 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
2b140 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20  Blob; int n;    
2b150 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
2b160 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38  o decode */.  u8
2b170 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42   *a = 0;.  Fts5B
2b180 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20  uffer s;        
2b190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
2b1a0 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72  ild up text to r
2b1b0 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20  eturn here */.  
2b1c0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b1d0 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2b1e0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2b1f0 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d  /.  int nSpace =
2b200 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   0;..  assert( n
2b210 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73  Arg==2 );.  mems
2b220 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
2b230 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
2b240 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
2b250 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
2b260 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d  Val[0]);..  /* M
2b270 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2b280 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2b290 74 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42  t (a blob) in aB
2b2a0 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62  lob[]. The aBlob
2b2b0 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20  [].  ** copy is 
2b2c0 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35  followed by FTS5
2b2d0 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
2b2e0 4e 47 20 30 78 30 30 20 62 79 74 65 73 2c 20 77  NG 0x00 bytes, w
2b2f0 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20  hich prevents.  
2b300 2a 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ** buffer overre
2b310 61 64 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  ads even if the 
2b320 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2b330 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c  t.  */.  n = sql
2b340 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2b350 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42  (apVal[1]);.  aB
2b360 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
2b370 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31  lue_blob(apVal[1
2b380 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e  ]);.  nSpace = n
2b390 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
2b3a0 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d  O_PADDING;.  a =
2b3b0 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73   (u8*)sqlite3Fts
2b3c0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
2b3d0 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
2b3e0 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f  a==0 ) goto deco
2b3f0 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79  de_out;.  memcpy
2b400 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a  (a, aBlob, n);..
2b410 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
2b420 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67  id(iRowid, &iSeg
2b430 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
2b440 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
2b450 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  .  fts5DebugRowi
2b460 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69  d(&rc, &s, iRowi
2b470 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78  d);.  if( bDlidx
2b480 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
2b490 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35   dlidx;.    Fts5
2b4a0 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20  DlidxLvl lvl;.. 
2b4b0 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a     dlidx.p = a;.
2b4c0 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e      dlidx.nn = n
2b4d0 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c  ;..    memset(&l
2b4e0 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
2b4f0 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
2b500 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64    lvl.pData = &d
2b510 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c  lidx;.    lvl.iL
2b520 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b  eafPgno = iPgno;
2b530 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c  ..    for(fts5Dl
2b540 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
2b550 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66  ; lvl.bEof==0; f
2b560 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
2b570 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71  &lvl)){.      sq
2b580 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2b590 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
2b5a0 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &s, .          
2b5b0 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c  " %d(%lld)", lvl
2b5c0 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e  .iLeafPgno, lvl.
2b5d0 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a  iRowid.      );.
2b5e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2b5f0 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2b600 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46     if( iRowid==F
2b610 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2b620 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ID ){.      fts5
2b630 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 26  DecodeAverages(&
2b640 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
2b650 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b660 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
2b670 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
2b680 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
2b690 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  e{.    Fts5Buffe
2b6a0 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
2b6b0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2b6c0 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
2b6d0 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
2b6e0 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  zLeaf;          
2b6f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2b700 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61  et of pgidx in a
2b710 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50  [] */.    int iP
2b720 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74  gidxOff;.    int
2b730 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b   iPgidxPrev = 0;
2b740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
2b750 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61  evious value rea
2b760 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a  d from pgidx */.
2b770 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
2b780 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52   = 0;.    int iR
2b790 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
2b7a0 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
2b7b0 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20  nt nDoclist;..  
2b7c0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
2b7d0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
2b7e0 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
2b7f0 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71   n<4 ){.      sq
2b800 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
2b810 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28  et(&rc, &s, 7, (
2b820 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75  const u8*)"corru
2b830 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pt");.      goto
2b840 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
2b850 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
2b860 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
2b870 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
2b880 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73     iPgidxOff = s
2b890 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
2b8a0 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20  16(&a[2]);.     
2b8b0 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
2b8c0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
2b8d0 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2b8e0 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
2b8f0 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Off);.      }.  
2b900 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
2b910 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  de the position 
2b920 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65  list tail at the
2b930 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
2b940 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52  ge */.    if( iR
2b950 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20  owidOff!=0 ){.  
2b960 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69      iOff = iRowi
2b970 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20  dOff;.    }else 
2b980 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20  if( iTermOff!=0 
2b990 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
2b9a0 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65  iTermOff;.    }e
2b9b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
2b9c0 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
2b9d0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
2b9e0 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
2b9f0 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
2ba00 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e      /* Decode an
2ba10 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64  y more doclist d
2ba20 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
2ba30 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65 66   on the page bef
2ba40 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66  ore the.    ** f
2ba50 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
2ba60 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54    nDoclist = (iT
2ba70 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66  ermOff ? iTermOf
2ba80 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f  f : szLeaf) - iO
2ba90 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f  ff;.    fts5Deco
2baa0 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
2bab0 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f  s, &a[iOff], nDo
2bac0 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69  clist);..    whi
2bad0 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  le( iPgidxOff<n 
2bae0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  ){.      int bFi
2baf0 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66  rst = (iPgidxOff
2bb00 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f  ==szLeaf);     /
2bb10 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
2bb20 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
2bb30 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
2bb40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bb50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bb60 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
2bb70 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b  .      int iEnd;
2bb80 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50  .      .      iP
2bb90 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
2bba0 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2bbb0 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
2bbc0 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72  ;.      iPgidxPr
2bbd0 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ev += nByte;.   
2bbe0 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78     iOff = iPgidx
2bbf0 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28  Prev;..      if(
2bc00 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
2bc10 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2bc20 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
2bc30 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
2bc40 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50         iEnd = iP
2bc50 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65  gidxPrev + nByte
2bc60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2bc70 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a         iEnd = sz
2bc80 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
2bc90 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
2bca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  =0 ){.        iO
2bcb0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2bcc0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2bcd0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
2bce0 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a  term.n = nByte;.
2bcf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
2bd00 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2bd10 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2bd20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74  nByte);.      ft
2bd30 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
2bd40 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
2bd50 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
2bd60 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
2bd70 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Byte;..      sql
2bd80 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2bd90 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
2bda0 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
2bdb0 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
2bdc0 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
2bdd0 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
2bde0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2bdf0 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2be00 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
2be10 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b  ff], iEnd-iOff);
2be20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
2be30 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
2be40 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64  );.  }.  . decod
2be50 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
2be60 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
2be70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2be80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2be90 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
2bea0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
2beb0 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
2bec0 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
2bed0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2bee0 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
2bef0 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
2bf00 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2bf10 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
2bf20 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2bf30 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
2bf40 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
2bf50 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
2bf60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2bf70 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
2bf80 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2bf90 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
2bfa0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
2bfb0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
2bfc0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
2bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bfe0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2bff0 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
2c000 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2c010 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
2c020 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
2c030 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2c040 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2c050 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
2c060 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2c070 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2c080 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
2c090 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
2c0a0 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
2c0b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
2c0c0 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
2c0d0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2c0e0 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
2c0f0 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
2c100 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
2c110 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
2c120 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
2c130 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c        int segid,
2c140 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
2c150 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
2c160 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2c170 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2c180 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
2c190 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2c1a0 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
2c1b0 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  gid, pgno))", -1
2c1c0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2c1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2c1e0 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
2c1f0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2c200 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [1]);.        pg
2c210 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
2c220 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
2c230 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
2c240 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2c250 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e  ROWID(segid, pgn
2c260 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2c270 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2c280 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
2c290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2c2a0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2c2b0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
2c2c0 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
2c2d0 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
2c2e0 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
2c2f0 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a  'segment'" , -1.
2c300 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2c310 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2c320 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
2c330 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
2c340 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
2c350 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
2c360 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
2c370 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
2c380 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
2c390 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
2c3a0 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
2c3b0 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
2c3c0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
2c3d0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2c3e0 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
2c3f0 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
2c400 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
2c410 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2c420 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
2c430 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2c440 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
2c450 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
2c460 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
2c470 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
2c480 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
2c490 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
2c4a0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
2c4b0 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
2c4c0 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  0.  );.  if( rc=
2c4d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c4e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
2c4f0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
2c500 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
2c510 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51  5_rowid", -1, SQ
2c520 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
2c530 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c  s5RowidFunction,
2c540 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
2c550 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c560 0a                                               .