/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact c34a64666c3b573aaed0fe103ce739ca2c0b88e5:


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 62 2d 74 72 65 65 20 68 65       + b-tree he
0c80: 69 67 68 74 20 28 31 20 2d 3e 20 72 6f 6f 74 20  ight (1 -> root 
0c90: 69 73 20 6c 65 61 66 2c 20 32 20 2d 3e 20 72 6f  is leaf, 2 -> ro
0ca0: 6f 74 20 69 73 20 70 61 72 65 6e 74 20 6f 66 20  ot is parent of 
0cb0: 6c 65 61 66 20 65 74 63 2e 29 0a 2a 2a 20 20 20  leaf etc.).**   
0cc0: 20 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65        + first le
0cd0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  af page number (
0ce0: 6f 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20  often 1, always 
0cf0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a  greater than 0).
0d00: 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e  **         + fin
0d10: 61 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  al leaf page num
0d20: 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65  ber.**.** 2. The
0d30: 20 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64   Averages Record
0d40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67  :.**.**   A sing
0d50: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0d60: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0d70: 65 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61  e. The data is a
0d80: 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
0d90: 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  ..**   The first
0da0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
0db0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0dc0: 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c  the index. Then,
0dd0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
0de0: 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20  .**   from left 
0df0: 74 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f  to right, the to
0e00: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
0e10: 6b 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  kens in the colu
0e20: 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20  mn for all .**  
0e30: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
0e40: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67  le..**.** 3. Seg
0e50: 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a  ment leaves:.**.
0e60: 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43 4c 49 53  **   TERM DOCLIS
0e70: 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20  T FORMAT:.**.** 
0e80: 20 20 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68      Most of each
0e90: 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73   segment leaf is
0ea0: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72   taken up by ter
0eb0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20  m/doclist data. 
0ec0: 54 68 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65  The .**     gene
0ed0: 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  ral format of th
0ee0: 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64  e term/doclist d
0ef0: 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ata is:.**.**   
0f00: 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73        varint : s
0f10: 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65 72  ize of first ter
0f20: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 6c 6f  m.**         blo
0f30: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
0f40: 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20   data.**        
0f50: 20 64 6f 63 6c 69 73 74 3a 20 66 69 72 73 74 20   doclist: first 
0f60: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
0f70: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
0f80: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
0f90: 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f  arint:  number o
0fa0: 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f  f bytes in commo
0fb0: 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  n with previous 
0fc0: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
0fd0: 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65    varint:  numbe
0fe0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
0ff0: 77 20 74 65 72 6d 20 64 61 74 61 20 28 6e 4e 65  w term data (nNe
1000: 77 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  w).**           
1010: 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62 79  blob:    nNew by
1020: 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20  tes of new term 
1030: 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  data.**         
1040: 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74 20    doclist: next 
1050: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
1060: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64     }.**.**     d
1070: 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a  oclist format:.*
1080: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72  *.**         var
1090: 69 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69  int:  first rowi
10a0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6f 73  d.**         pos
10b0: 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c  list: first posl
10c0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
10d0: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
10e0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
10f0: 74 3a 20 20 72 6f 77 69 64 20 64 65 6c 74 61 20  t:  rowid delta 
1100: 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20  (always > 0).** 
1110: 20 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73            poslis
1120: 74 3a 20 6e 65 78 74 20 70 6f 73 6c 69 73 74 0a  t: next poslist.
1130: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
1140: 20 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74          0x00 byt
1150: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c  e.**.**     posl
1160: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
1170: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
1180: 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73  : size of poslis
1190: 74 20 69 6e 20 62 79 74 65 73 20 6d 75 6c 74 69  t in bytes multi
11a0: 70 6c 69 65 64 20 62 79 20 32 2c 20 6e 6f 74 20  plied by 2, not 
11b0: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20  including.**    
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
11d0: 73 20 66 69 65 6c 64 2e 20 50 6c 75 73 20 31 20  s field. Plus 1 
11e0: 69 66 20 74 68 69 73 20 65 6e 74 72 79 20 63 61  if this entry ca
11f0: 72 72 69 65 73 20 74 68 65 20 22 64 65 6c 65 74  rries the "delet
1200: 65 22 20 66 6c 61 67 2e 0a 2a 2a 20 20 20 20 20  e" flag..**     
1210: 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c      collist: col
1220: 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
1230: 30 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  0.**         zer
1240: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
1250: 20 20 20 20 20 20 20 20 20 30 78 30 31 20 62 79           0x01 by
1260: 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
1270: 76 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e  varint: column n
1280: 75 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20 20 20  umber (I).**    
1290: 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20         collist: 
12a0: 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75  collist for colu
12b0: 6d 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20 20 20  mn I.**         
12c0: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c  }.**.**     coll
12d0: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
12e0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
12f0: 3a 20 66 69 72 73 74 20 6f 66 66 73 65 74 20 2b  : first offset +
1300: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65   2.**         ze
1310: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
1320: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1330: 3a 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20 2b  : offset delta +
1340: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   2.**         }.
1350: 2a 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54 49  **.**   PAGINATI
1360: 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65  ON.**.**     The
1370: 20 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62 65   format describe
1380: 64 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20  d above is only 
1390: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
13a0: 65 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c  entire term/docl
13b0: 69 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61 20  ist.**     data 
13c0: 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  fits on a single
13d0: 20 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74   leaf page. If t
13e0: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
13f0: 61 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a  ase, the format.
1400: 2a 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67 65  **     is change
1410: 64 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  d in two ways:.*
1420: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20  *.**       + if 
1430: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1440: 6f 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73  on a page occurs
1450: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
1460: 74 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20  t term, it.**   
1470: 20 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20        is stored 
1480: 61 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  as a literal val
1490: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ue:.**.**       
14a0: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66        varint:  f
14b0: 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  irst rowid.**.**
14c0: 20 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72         + the fir
14d0: 73 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20  st term on each 
14e0: 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
14f0: 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
1500: 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  s the.**        
1510: 20 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d   very first term
1520: 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a   of the segment:
1530: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1540: 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65     varint : size
1550: 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a   of first term.*
1560: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  *             bl
1570: 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72  ob:    first ter
1580: 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20  m data.**.**    
1590: 20 45 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   Each leaf page 
15a0: 62 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a  begins with:.**.
15b0: 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74  **       + 2-byt
15c0: 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61  e unsigned conta
15d0: 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20  ining offset to 
15e0: 66 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72 20  first rowid (or 
15f0: 30 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  0)..**       + 2
1600: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1610: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1620: 20 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20 28   to first term (
1630: 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46  or 0)..**.**   F
1640: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d 2f  ollowed by term/
1650: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a  doclist data..**
1660: 0a 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20 69  .** 4. Segment i
1670: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a  nterior nodes:.*
1680: 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65 72  *.**   The inter
1690: 69 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20 74  ior nodes turn t
16a0: 68 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76 65  he list of leave
16b0: 73 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e  s into a b+tree.
16c0: 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69   .**.**   Each i
16d0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65 67  nterior node beg
16e0: 69 6e 73 20 77 69 74 68 20 61 20 76 61 72 69 6e  ins with a varin
16f0: 74 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d  t - the page num
1700: 62 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 0a  ber of the left.
1710: 2a 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64 20  **   most child 
1720: 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  node. Following 
1730: 74 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20 6c  this, for each l
1740: 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
1750: 74 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20  the first,.**   
1760: 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
1770: 65 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a  es contain:.**.*
1780: 2a 20 20 20 20 20 61 29 20 49 66 20 74 68 65 20  *     a) If the 
1790: 6c 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61 69  leaf page contai
17a0: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
17b0: 74 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65 72  term, then a ter
17c0: 6d 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a 2a  m-prefix that.**
17d0: 20 20 20 20 20 20 20 20 69 73 20 67 72 65 61 74          is great
17e0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65 76  er than all prev
17f0: 69 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64 20  ious terms, and 
1800: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1810: 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  al to the.**    
1820: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 6f      first term o
1830: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
1840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49 66  .**.**     b) If
1850: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e   the leaf page n
1860: 6f 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f 72  o terms, a recor
1870: 64 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f 77  d indicating how
1880: 20 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69 76   many consecutiv
1890: 65 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 76  e.**        leav
18a0: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  es contain no te
18b0: 72 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65 72  rms, and whether
18c0: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73   or not there is
18d0: 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a   an associated.*
18e0: 2a 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77 69  *        by-rowi
18f0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a  d index record..
1900: 2a 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69 6e  **.**   By defin
1910: 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20  ition, there is 
1920: 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
1930: 6f 6e 65 20 74 79 70 65 20 28 62 29 20 72 65 63  one type (b) rec
1940: 6f 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a  ord in a row..**
1950: 20 20 20 54 79 70 65 20 28 62 29 20 72 65 63 6f     Type (b) reco
1960: 72 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61 70  rds only ever ap
1970: 70 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d 31  pear on height=1
1980: 20 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69 61   pages - immedia
1990: 74 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20  te parents.**   
19a0: 6f 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20  of leaves. Only 
19b0: 74 79 70 65 20 28 61 29 20 72 65 63 6f 72 64 73  type (a) records
19c0: 20 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 68   are pushed to h
19d0: 69 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a  igher levels..**
19e0: 0a 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d 61  .**   Term forma
19f0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e  t:.**.**     * N
1a00: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1a10: 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72  n common with pr
1a20: 65 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75 73  evious term plus
1a30: 20 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e   2, as a varint.
1a40: 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72  .**     * Number
1a50: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
1a60: 20 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20 61   term data, as a
1a70: 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20   varint..**     
1a80: 2a 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2e  * new term data.
1a90: 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d  .**.**   No-term
1aa0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1ab0: 20 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20 30     * either an 0
1ac0: 78 30 30 20 6f 72 20 30 78 30 31 20 62 79 74 65  x00 or 0x01 byte
1ad0: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 30  . If the value 0
1ae0: 78 30 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  x01 is used, the
1af0: 6e 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20 20  n there .**     
1b00: 20 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74    is an associat
1b10: 65 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69  ed index-by-rowi
1b20: 64 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20  d record..**    
1b30: 20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   * the number of
1b40: 20 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65   zero-term leave
1b50: 73 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  s as a varint..*
1b60: 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20  *.** 5. Segment 
1b70: 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 3a  doclist indexes:
1b80: 0a 2a 2a 0a 2a 2a 20 20 20 44 6f 63 6c 69 73 74  .**.**   Doclist
1b90: 20 69 6e 64 65 78 65 73 20 61 72 65 20 74 68 65   indexes are the
1ba0: 6d 73 65 6c 76 65 73 20 62 2d 74 72 65 65 73 2c  mselves b-trees,
1bb0: 20 68 6f 77 65 76 65 72 20 74 68 65 79 20 75 73   however they us
1bc0: 75 61 6c 6c 79 20 63 6f 6e 73 69 73 74 20 6f 66  ually consist of
1bd0: 0a 2a 2a 20 20 20 61 20 73 69 6e 67 6c 65 20 6c  .**   a single l
1be0: 65 61 66 20 72 65 63 6f 72 64 20 6f 6e 6c 79 2e  eaf record only.
1bf0: 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 65   The format of e
1c00: 61 63 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ach doclist inde
1c10: 78 20 6c 65 61 66 20 70 61 67 65 20 0a 2a 2a 20  x leaf page .** 
1c20: 20 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20    is:.**.**     
1c30: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1c40: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1c50: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 69     0x01: Clear i
1c60: 66 20 6c 65 61 66 20 69 73 20 61 6c 73 6f 20 74  f leaf is also t
1c70: 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  he root page, ot
1c80: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1c90: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1ca0: 6d 62 65 72 20 6f 66 20 66 74 73 20 69 6e 64 65  mber of fts inde
1cb0: 78 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73 20  x leaf page. As 
1cc0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
1cd0: 20 20 20 20 2a 20 46 69 72 73 74 20 72 6f 77 69      * First rowi
1ce0: 64 20 6f 6e 20 70 61 67 65 20 69 6e 64 69 63 61  d on page indica
1cf0: 74 65 64 20 62 79 20 70 72 65 76 69 6f 75 73 20  ted by previous 
1d00: 66 69 65 6c 64 2e 20 41 73 20 61 20 76 61 72 69  field. As a vari
1d10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  nt..**.**     * 
1d20: 41 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  A list of varint
1d30: 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  s, one for each 
1d40: 73 75 62 73 65 71 75 65 6e 74 20 74 65 72 6d 6c  subsequent terml
1d50: 65 73 73 20 70 61 67 65 2e 20 41 20 0a 2a 2a 20  ess page. A .** 
1d60: 20 20 20 20 20 20 70 6f 73 69 74 69 76 65 20 64        positive d
1d70: 65 6c 74 61 20 69 66 20 74 68 65 20 74 65 72 6d  elta if the term
1d80: 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61 69  less page contai
1d90: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
1da0: 72 6f 77 69 64 2c 20 0a 2a 2a 20 20 20 20 20 20  rowid, .**      
1db0: 20 6f 72 20 61 6e 20 30 78 30 30 20 62 79 74 65   or an 0x00 byte
1dc0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1dd0: 2a 20 20 20 49 6e 74 65 72 6e 61 6c 20 64 6f 63  *   Internal doc
1de0: 6c 69 73 74 20 69 6e 64 65 78 20 6e 6f 64 65 73  list index nodes
1df0: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   are:.**.**     
1e00: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1e10: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1e20: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 66     0x01: Clear f
1e30: 6f 72 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  or root page, ot
1e40: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1e50: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1e60: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 63 68  mber of first ch
1e70: 69 6c 64 20 70 61 67 65 2e 20 41 73 20 61 20 76  ild page. As a v
1e80: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  arint..**.**    
1e90: 20 2a 20 43 6f 70 79 20 6f 66 20 66 69 72 73 74   * Copy of first
1ea0: 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
1eb0: 6e 64 69 63 61 74 65 64 20 62 79 20 70 72 65 76  ndicated by prev
1ec0: 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73 20 61  ious field. As a
1ed0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20   varint..**.**  
1ee0: 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66 20 64     * A list of d
1ef0: 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 76 61 72  elta-encoded var
1f00: 69 6e 74 73 20 2d 20 74 68 65 20 66 69 72 73 74  ints - the first
1f10: 20 72 6f 77 69 64 20 6f 6e 20 65 61 63 68 20 73   rowid on each s
1f20: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 20 20 20  ubsequent.**    
1f30: 20 20 20 63 68 69 6c 64 20 70 61 67 65 2e 20 0a     child page. .
1f40: 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77  **.*/../*.** Row
1f50: 69 64 73 20 66 6f 72 20 74 68 65 20 61 76 65 72  ids for the aver
1f60: 61 67 65 73 20 61 6e 64 20 73 74 72 75 63 74 75  ages and structu
1f70: 72 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  re records in th
1f80: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
1f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1fa0: 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 20  AVERAGES_ROWID  
1fb0: 20 20 20 31 20 20 20 20 2f 2a 20 52 6f 77 69 64     1    /* Rowid
1fc0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 61 76   used for the av
1fd0: 65 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a 2f  erages record */
1fe0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
1ff0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 20 20 20  RUCTURE_ROWID   
2000: 31 30 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  10    /* The str
2010: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f  ucture record */
2020: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 64  ../*.** Macros d
2030: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 72  etermining the r
2040: 6f 77 69 64 73 20 75 73 65 64 20 62 79 20 73 65  owids used by se
2050: 67 6d 65 6e 74 20 6e 6f 64 65 73 2e 20 41 6c 6c  gment nodes. All
2060: 20 6e 6f 64 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a   nodes in all.**
2070: 20 73 65 67 6d 65 6e 74 73 20 66 6f 72 20 61 6c   segments for al
2080: 6c 20 69 6e 64 65 78 65 73 20 28 74 68 65 20 72  l indexes (the r
2090: 65 67 75 6c 61 72 20 46 54 53 20 69 6e 64 65 78  egular FTS index
20a0: 20 61 6e 64 20 61 6e 79 20 70 72 65 66 69 78 20   and any prefix 
20b0: 69 6e 64 65 78 65 73 29 0a 2a 2a 20 61 72 65 20  indexes).** are 
20c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f  stored in the %_
20d0: 64 61 74 61 20 74 61 62 6c 65 20 77 69 74 68 20  data table with 
20e0: 6c 61 72 67 65 20 70 6f 73 69 74 69 76 65 20 72  large positive r
20f0: 6f 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  owids..**.** The
2100: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 6d 61   %_data table ma
2110: 79 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20  y contain up to 
2120: 28 31 3c 3c 46 54 53 35 5f 53 45 47 4d 45 4e 54  (1<<FTS5_SEGMENT
2130: 5f 49 4e 44 45 58 5f 42 49 54 53 29 20 0a 2a 2a  _INDEX_BITS) .**
2140: 20 69 6e 64 65 78 65 73 20 2d 20 6f 6e 65 20 72   indexes - one r
2150: 65 67 75 6c 61 72 20 74 65 72 6d 20 69 6e 64 65  egular term inde
2160: 78 20 61 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f  x and zero or mo
2170: 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  re prefix indexe
2180: 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 73 65  s..**.** Each se
2190: 67 6d 65 6e 74 20 69 6e 20 61 6e 20 69 6e 64 65  gment in an inde
21a0: 78 20 68 61 73 20 61 20 75 6e 69 71 75 65 20 69  x has a unique i
21b0: 64 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  d greater than z
21c0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ero..**.** Each 
21d0: 6e 6f 64 65 20 69 6e 20 61 20 73 65 67 6d 65 6e  node in a segmen
21e0: 74 20 62 2d 74 72 65 65 20 69 73 20 61 73 73 69  t b-tree is assi
21f0: 67 6e 65 64 20 61 20 22 70 61 67 65 20 6e 75 6d  gned a "page num
2200: 62 65 72 22 20 74 68 61 74 20 69 73 20 75 6e 69  ber" that is uni
2210: 71 75 65 0a 2a 2a 20 77 69 74 68 69 6e 20 6e 6f  que.** within no
2220: 64 65 73 20 6f 66 20 69 74 73 20 68 65 69 67 68  des of its heigh
2230: 74 20 77 69 74 68 69 6e 20 74 68 65 20 73 65 67  t within the seg
2240: 6d 65 6e 74 20 28 6c 65 61 66 20 6e 6f 64 65 73  ment (leaf nodes
2250: 20 68 61 76 65 20 61 20 68 65 69 67 68 74 20 0a   have a height .
2260: 2a 2a 20 6f 66 20 30 2c 20 70 61 72 65 6e 74 73  ** of 0, parents
2270: 20 31 2c 20 65 74 63 2e 29 2e 20 50 61 67 65 20   1, etc.). Page 
2280: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 6c 6f  numbers are allo
2290: 63 61 74 65 64 20 73 65 71 75 65 6e 74 69 61 6c  cated sequential
22a0: 6c 79 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 20  ly so that.** a 
22b0: 6e 6f 64 65 73 20 70 61 67 65 20 6e 75 6d 62 65  nodes page numbe
22c0: 72 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  r is always one 
22d0: 6d 6f 72 65 20 74 68 61 6e 20 69 74 73 20 6c 65  more than its le
22e0: 66 74 20 73 69 62 6c 69 6e 67 2e 0a 2a 2a 0a 2a  ft sibling..**.*
22f0: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2300: 61 20 6e 6f 64 65 20 69 73 20 74 68 65 6e 20 66  a node is then f
2310: 6f 75 6e 64 20 75 73 69 6e 67 20 74 68 65 20 46  ound using the F
2320: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2330: 44 28 29 20 6d 61 63 72 6f 0a 2a 2a 20 62 65 6c  D() macro.** bel
2340: 6f 77 2e 20 54 68 65 20 46 54 53 35 5f 53 45 47  ow. The FTS5_SEG
2350: 4d 45 4e 54 5f 2a 5f 42 49 54 53 20 6d 61 63 72  MENT_*_BITS macr
2360: 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20 6e 75  os define the nu
2370: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 75 73 65  mber of bits use
2380: 64 0a 2a 2a 20 74 6f 20 65 6e 63 6f 64 65 20 74  d.** to encode t
2390: 68 65 20 74 68 72 65 65 20 46 54 53 35 5f 53 45  he three FTS5_SE
23a0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 61 72  GMENT_ROWID() ar
23b0: 67 75 6d 65 6e 74 73 2e 20 54 68 69 73 20 6d 6f  guments. This mo
23c0: 64 75 6c 65 20 72 65 74 75 72 6e 73 0a 2a 2a 20  dule returns.** 
23d0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
23e0: 66 61 69 6c 73 20 74 68 65 20 63 75 72 72 65 6e  fails the curren
23f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 66 20 74  t operation if t
2400: 68 65 79 20 65 76 65 72 20 70 72 6f 76 65 20 74  hey ever prove t
2410: 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a 2f 0a 23 64 65  oo small..*/.#de
2420: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 49  fine FTS5_DATA_I
2430: 44 5f 42 20 20 20 20 20 31 36 20 20 20 20 20 2f  D_B     16     /
2440: 2a 20 4d 61 78 20 73 65 67 20 69 64 20 6e 75 6d  * Max seg id num
2450: 62 65 72 20 36 35 35 33 35 20 2a 2f 0a 23 64 65  ber 65535 */.#de
2460: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 44  fine FTS5_DATA_D
2470: 4c 49 5f 42 20 20 20 20 20 31 20 20 20 20 20 2f  LI_B     1     /
2480: 2a 20 44 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * Doclist-index 
2490: 66 6c 61 67 20 28 31 20 62 69 74 29 20 2a 2f 0a  flag (1 bit) */.
24a0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24b0: 41 5f 48 45 49 47 48 54 5f 42 20 20 35 20 20 20  A_HEIGHT_B  5   
24c0: 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72 65 65 20    /* Max b-tree 
24d0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
24e0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24f0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2500: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2510: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2520: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2530: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2540: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2550: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2580: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2590: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
25a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
25b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
25c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
25d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
25e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
25f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2600: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2610: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2620: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2630: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2640: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2670: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
26c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
26d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
26e0: 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 66   height, pgno) f
26f0: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30  ts5_dri(segid, 0
2700: 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 0a  , height, pgno).
2710: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4c 49  #define FTS5_DLI
2720: 44 58 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  DX_ROWID(segid, 
2730: 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 20 20  height, pgno)   
2740: 66 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20  fts5_dri(segid, 
2750: 31 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  1, height, pgno)
2760: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
2770: 73 65 67 6d 65 6e 74 73 20 70 65 72 6d 69 74 74  segments permitt
2780: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 69  ed in a single i
2790: 6e 64 65 78 20 0a 2a 2f 0a 23 64 65 66 69 6e 65  ndex .*/.#define
27a0: 20 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e   FTS5_MAX_SEGMEN
27b0: 54 20 32 30 30 30 0a 0a 23 69 66 64 65 66 20 53  T 2000..#ifdef S
27c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
27d0: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 72 72 75  sqlite3Fts5Corru
27e0: 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20 53 51  pt() { return SQ
27f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
2800: 42 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  B; }.#endif.../*
2810: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 61 20  .** Each time a 
2820: 62 6c 6f 62 20 69 73 20 72 65 61 64 20 66 72 6f  blob is read fro
2830: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2840: 6c 65 2c 20 69 74 20 69 73 20 70 61 64 64 65 64  le, it is padded
2850: 20 77 69 74 68 20 74 68 69 73 0a 2a 2a 20 6d 61   with this.** ma
2860: 6e 79 20 7a 65 72 6f 20 62 79 74 65 73 2e 20 54  ny zero bytes. T
2870: 68 69 73 20 6d 61 6b 65 73 20 69 74 20 65 61 73  his makes it eas
2880: 69 65 72 20 74 6f 20 64 65 63 6f 64 65 20 74 68  ier to decode th
2890: 65 20 76 61 72 69 6f 75 73 20 72 65 63 6f 72 64  e various record
28a0: 20 66 6f 72 6d 61 74 73 0a 2a 2a 20 77 69 74 68   formats.** with
28b0: 6f 75 74 20 6f 76 65 72 72 65 61 64 69 6e 67 20  out overreading 
28c0: 69 66 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  if the records a
28d0: 72 65 20 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 23  re corrupt..*/.#
28e0: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41  define FTS5_DATA
28f0: 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 38 0a  _ZERO_PADDING 8.
2900: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
2910: 41 5f 50 41 44 44 49 4e 47 20 32 30 0a 0a 74 79  A_PADDING 20..ty
2920: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2930: 35 44 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a  5Data Fts5Data;.
2940: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2950: 74 73 35 44 6c 69 64 78 49 74 65 72 20 46 74 73  ts5DlidxIter Fts
2960: 35 44 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65  5DlidxIter;.type
2970: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2980: 6c 69 64 78 4c 76 6c 20 46 74 73 35 44 6c 69 64  lidxLvl Fts5Dlid
2990: 78 4c 76 6c 3b 0a 74 79 70 65 64 65 66 20 73 74  xLvl;.typedef st
29a0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 57 72  ruct Fts5DlidxWr
29b0: 69 74 65 72 20 46 74 73 35 44 6c 69 64 78 57 72  iter Fts5DlidxWr
29c0: 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
29d0: 72 75 63 74 20 46 74 73 35 50 61 67 65 57 72 69  ruct Fts5PageWri
29e0: 74 65 72 20 46 74 73 35 50 61 67 65 57 72 69 74  ter Fts5PageWrit
29f0: 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  er;.typedef stru
2a00: 63 74 20 46 74 73 35 53 65 67 49 74 65 72 20 46  ct Fts5SegIter F
2a10: 74 73 35 53 65 67 49 74 65 72 3b 0a 74 79 70 65  ts5SegIter;.type
2a20: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2a30: 6f 63 6c 69 73 74 49 74 65 72 20 46 74 73 35 44  oclistIter Fts5D
2a40: 6f 63 6c 69 73 74 49 74 65 72 3b 0a 74 79 70 65  oclistIter;.type
2a50: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53  def struct Fts5S
2a60: 65 67 57 72 69 74 65 72 20 46 74 73 35 53 65 67  egWriter Fts5Seg
2a70: 57 72 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20  Writer;.typedef 
2a80: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2a90: 74 75 72 65 20 46 74 73 35 53 74 72 75 63 74 75  ture Fts5Structu
2aa0: 72 65 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  re;.typedef stru
2ab0: 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ct Fts5Structure
2ac0: 4c 65 76 65 6c 20 46 74 73 35 53 74 72 75 63 74  Level Fts5Struct
2ad0: 75 72 65 4c 65 76 65 6c 3b 0a 74 79 70 65 64 65  ureLevel;.typede
2ae0: 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74 72  f struct Fts5Str
2af0: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 46 74  uctureSegment Ft
2b00: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2b10: 6e 74 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  nt;..struct Fts5
2b20: 44 61 74 61 20 7b 0a 20 20 75 38 20 2a 70 3b 20  Data {.  u8 *p; 
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
2b50: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
2b60: 6e 74 61 69 6e 69 6e 67 20 72 65 63 6f 72 64 20  ntaining record 
2b70: 2a 2f 0a 20 20 69 6e 74 20 6e 6e 3b 20 20 20 20  */.  int nn;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2ba0: 72 65 63 6f 72 64 20 69 6e 20 62 79 74 65 73 20  record in bytes 
2bb0: 2a 2f 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b  */.  int szLeaf;
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
2be0: 6c 65 61 66 20 77 69 74 68 6f 75 74 20 70 61 67  leaf without pag
2bf0: 65 2d 69 6e 64 65 78 20 2a 2f 0a 7d 3b 0a 0a 2f  e-index */.};../
2c00: 2a 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65 63 74 20  *.** One object 
2c10: 70 65 72 20 25 5f 64 61 74 61 20 74 61 62 6c 65  per %_data table
2c20: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
2c30: 49 6e 64 65 78 20 7b 0a 20 20 46 74 73 35 43 6f  Index {.  Fts5Co
2c40: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b 20 20  nfig *pConfig;  
2c50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 69 72            /* Vir
2c60: 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e 66 69  tual table confi
2c70: 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 63 68  guration */.  ch
2c80: 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20 20 20  ar *zDataTbl;   
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ca0: 20 4e 61 6d 65 20 6f 66 20 25 5f 64 61 74 61 20   Name of %_data 
2cb0: 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  table */.  int n
2cc0: 57 6f 72 6b 55 6e 69 74 3b 20 20 20 20 20 20 20  WorkUnit;       
2cd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
2ce0: 61 66 20 70 61 67 65 73 20 69 6e 20 61 20 22 75  af pages in a "u
2cf0: 6e 69 74 22 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a  nit" of work */.
2d00: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 72 69 61  .  /*.  ** Varia
2d10: 62 6c 65 73 20 72 65 6c 61 74 65 64 20 74 6f 20  bles related to 
2d20: 74 68 65 20 61 63 63 75 6d 75 6c 61 74 69 6f 6e  the accumulation
2d30: 20 6f 66 20 74 6f 6b 65 6e 73 20 61 6e 64 20 64   of tokens and d
2d40: 6f 63 6c 69 73 74 73 20 77 69 74 68 69 6e 20 74  oclists within t
2d50: 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d 6f 72  he.  ** in-memor
2d60: 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 62 65  y hash tables be
2d70: 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 66 6c  fore they are fl
2d80: 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 0a 20  ushed to disk.. 
2d90: 20 2a 2f 0a 20 20 46 74 73 35 48 61 73 68 20 2a   */.  Fts5Hash *
2da0: 70 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20  pHash;          
2db0: 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61        /* Hash ta
2dc0: 62 6c 65 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ble for in-memor
2dd0: 79 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  y data */.  int 
2de0: 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61 3b  nMaxPendingData;
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2e00: 61 78 20 70 65 6e 64 69 6e 67 20 64 61 74 61 20  ax pending data 
2e10: 62 65 66 6f 72 65 20 66 6c 75 73 68 20 74 6f 20  before flush to 
2e20: 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  disk */.  int nP
2e30: 65 6e 64 69 6e 67 44 61 74 61 3b 20 20 20 20 20  endingData;     
2e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2e50: 72 65 6e 74 20 62 79 74 65 73 20 6f 66 20 70 65  rent bytes of pe
2e60: 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  nding data */.  
2e70: 69 36 34 20 69 57 72 69 74 65 52 6f 77 69 64 3b  i64 iWriteRowid;
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 63 75 72  /* Rowid for cur
2ea0: 72 65 6e 74 20 64 6f 63 20 62 65 69 6e 67 20 77  rent doc being w
2eb0: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46 74 73 35  ritten */.  Fts5
2ec0: 42 75 66 66 65 72 20 73 63 72 61 74 63 68 3b 0a  Buffer scratch;.
2ed0: 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73 74 61 74  .  /* Error stat
2ee0: 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  e. */.  int rc; 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2f10: 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  nt error code */
2f20: 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 75 73 65  ..  /* State use
2f30: 64 20 62 79 20 74 68 65 20 66 74 73 35 44 61 74  d by the fts5Dat
2f40: 61 58 58 58 28 29 20 66 75 6e 63 74 69 6f 6e 73  aXXX() functions
2f50: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62  . */.  sqlite3_b
2f60: 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b 20 20 20  lob *pReader;   
2f70: 20 20 20 20 20 20 20 2f 2a 20 52 4f 20 69 6e 63         /* RO inc
2f80: 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f 6e 20 25  r-blob open on %
2f90: 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
2fa0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2fb0: 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 20 20  Writer;         
2fc0: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2fd0: 25 5f 64 61 74 61 20 56 41 4c 55 45 53 28 3f 2c  %_data VALUES(?,
2fe0: 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ?)" */.  sqlite3
2ff0: 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65 72 3b  _stmt *pDeleter;
3000: 20 20 20 20 20 20 20 20 20 2f 2a 20 22 44 45 4c           /* "DEL
3010: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
3020: 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ... id>=? AND id
3030: 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  <=?" */.  sqlite
3040: 33 5f 73 74 6d 74 20 2a 70 49 64 78 57 72 69 74  3_stmt *pIdxWrit
3050: 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 22 49 4e  er;       /* "IN
3060: 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64 78 20 56  SERT ... %_idx V
3070: 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 29 22 20  ALUES(?,?,?,?)" 
3080: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
3090: 74 20 2a 70 49 64 78 44 65 6c 65 74 65 72 3b 20  t *pIdxDeleter; 
30a0: 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54 45 20       /* "DELETE 
30b0: 46 52 4f 4d 20 25 5f 69 64 78 20 57 48 45 52 45  FROM %_idx WHERE
30c0: 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20 20 73 71   segid=? */.  sq
30d0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78  lite3_stmt *pIdx
30e0: 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 6e 52  Select;.  int nR
30f0: 65 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  ead;            
3100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3110: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 6c 6f  al number of blo
3120: 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d 3b 0a 0a  cks read */.};..
3130: 73 74 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69  struct Fts5Docli
3140: 73 74 49 74 65 72 20 7b 0a 20 20 75 38 20 2a 61  stIter {.  u8 *a
3150: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
3160: 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70 75 74   i;..  /* Output
3170: 20 76 61 72 69 61 62 6c 65 73 2e 20 61 50 6f 73   variables. aPos
3180: 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f 46 20 2a  list==0 at EOF *
3190: 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  /.  i64 iRowid;.
31a0: 20 20 75 38 20 2a 61 50 6f 73 6c 69 73 74 3b 0a    u8 *aPoslist;.
31b0: 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74 3b 0a    int nPoslist;.
31c0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f  };../*.** The co
31d0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 22 73  ntents of the "s
31e0: 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72 64  tructure" record
31f0: 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 20   for each index 
3200: 61 72 65 20 72 65 70 72 65 73 65 6e 74 65 64 0a  are represented.
3210: 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46 74 73 35  ** using an Fts5
3220: 53 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  Structure record
3230: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68 69 63   in memory. Whic
3240: 68 20 75 73 65 73 20 69 6e 73 74 61 6e 63 65 73  h uses instances
3250: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74 68 65   of the .** othe
3260: 72 20 46 74 73 35 53 74 72 75 63 74 75 72 65 58  r Fts5StructureX
3270: 58 58 20 74 79 70 65 73 20 61 73 20 63 6f 6d 70  XX types as comp
3280: 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72 75 63  onents..*/.struc
3290: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
32a0: 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74 20 69  egment {.  int i
32b0: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
32c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
32d0: 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
32e0: 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20 20 20  t nHeight;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3300: 20 48 65 69 67 68 74 20 6f 66 20 73 65 67 6d 65   Height of segme
3310: 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20 69  nt b-tree */.  i
3320: 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20 20 20  nt pgnoFirst;   
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3340: 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70 61 67  * First leaf pag
3350: 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d  e number in segm
3360: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70 67 6e  ent */.  int pgn
3370: 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20 20 20  oLast;          
3380: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
3390: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
33a0: 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  r in segment */.
33b0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  };.struct Fts5St
33c0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b 0a 20  ructureLevel {. 
33d0: 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20 20 20   int nMerge;    
33e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65   /* Number of se
3400: 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72 2d 6d  gments in incr-m
3410: 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  erge */.  int nS
3420: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
3430: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
3440: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
3450: 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 2a  ments on level *
3460: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
3470: 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67 3b 20  eSegment *aSeg; 
3480: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
3490: 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67 5b 30  segments. aSeg[0
34a0: 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a 2f 0a  ] is oldest. */.
34b0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 74  };.struct Fts5St
34c0: 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e 74 20  ructure {.  int 
34d0: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
34f0: 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63 65 20  bject reference 
3500: 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34 20 6e  count */.  u64 n
3510: 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20 20 20  WriteCounter;   
3520: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
3530: 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69 74 74  tal leaves writt
3540: 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20 2a 2f  en to level 0 */
3550: 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 3b  .  int nSegment;
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65 67 6d     /* Total segm
3580: 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73 74 72  ents in this str
3590: 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
35a0: 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20  nLevel;         
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35c0: 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73 20  umber of levels 
35d0: 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20 2a 2f  in this index */
35e0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
35f0: 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31 5d 3b  Level aLevel[1];
3600: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6e     /* Array of n
3610: 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62 6a 65  Level level obje
3620: 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  cts */.};../*.**
3630: 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20 74 79   An object of ty
3640: 70 65 20 46 74 73 35 53 65 67 57 72 69 74 65 72  pe Fts5SegWriter
3650: 20 69 73 20 75 73 65 64 20 74 6f 20 77 72 69 74   is used to writ
3660: 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e 0a 2a  e to segments..*
3670: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50 61 67  /.struct Fts5Pag
3680: 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  eWriter {.  int 
3690: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
36b0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
36c0: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 46 74  his page */.  Ft
36d0: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
36e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36f0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3700: 6e 67 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  ng leaf data */.
3710: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 67 69    Fts5Buffer pgi
3720: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
3730: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
3740: 61 69 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65  aining page-inde
3750: 78 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  x */.  Fts5Buffe
3760: 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
3770: 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
3780: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76   containing prev
3790: 69 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67  ious term on pag
37a0: 65 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  e */.};.struct F
37b0: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b  ts5DlidxWriter {
37c0: 0a 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20  .  int pgno;    
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37f0: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  r for this page 
3800: 2a 2f 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61  */.  int bPrevVa
3810: 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  lid;            
3820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
3830: 69 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a  iPrev is valid *
3840: 2f 0a 20 20 69 36 34 20 69 50 72 65 76 3b 20 20  /.  i64 iPrev;  
3850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3860: 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
3870: 72 6f 77 69 64 20 76 61 6c 75 65 20 77 72 69 74  rowid value writ
3880: 74 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20  ten to page */. 
3890: 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b   Fts5Buffer buf;
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38b0: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
38c0: 69 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20  ining page data 
38d0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
38e0: 35 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69  5SegWriter {.  i
38f0: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
3900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3910: 2a 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65  * Segid to write
3920: 20 74 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67   to */.  Fts5Pag
3930: 65 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  eWriter writer; 
3940: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
3950: 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f  Writer object */
3960: 0a 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69  .  i64 iPrevRowi
3970: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3980: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
3990: 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
39a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a  current leaf */.
39b0: 20 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64    u8 bFirstRowid
39c0: 49 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20  InDoclist;      
39d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
39e0: 74 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74  t rowid is first
39f0: 20 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20   in doclist */. 
3a00: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3a10: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
3a20: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3a30: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3a40: 69 6e 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20  in page */.  /* 
3a50: 54 4f 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28  TODO1: Can use (
3a60: 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
3a70: 30 29 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46  0) instead of bF
3a80: 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a  irstTermInPage *
3a90: 2f 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72  /.  u8 bFirstTer
3aa0: 6d 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  mInPage;        
3ab0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e      /* True if n
3ac0: 65 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65  ext term will be
3ad0: 20 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a   first in leaf *
3ae0: 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69  /.  int nLeafWri
3af0: 74 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  tten;           
3b00: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3b10: 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
3b20: 74 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d  ten */.  int nEm
3b30: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
3b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3b50: 65 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  er of contiguous
3b60: 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73   term-less nodes
3b70: 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64   */..  int nDlid
3b80: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
3b90: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61         /* Alloca
3ba0: 74 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69  ted size of aDli
3bb0: 64 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  dx[] array */.  
3bc0: 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20  Fts5DlidxWriter 
3bd0: 2a 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20  *aDlidx;        
3be0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35  /* Array of Fts5
3bf0: 44 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65  DlidxWriter obje
3c00: 63 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c  cts */..  /* Val
3c10: 75 65 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  ues to insert in
3c20: 74 6f 20 74 68 65 20 25 5f 69 64 78 20 74 61 62  to the %_idx tab
3c30: 6c 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  le */.  Fts5Buff
3c40: 65 72 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20  er btterm;      
3c50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
3c60: 74 65 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69  term to insert i
3c70: 6e 74 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20  nto %_idx table 
3c80: 2a 2f 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65  */.  int iBtPage
3c90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3ca0: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
3cb0: 62 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ber correspondin
3cc0: 67 20 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d  g to btterm */.}
3cd0: 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  ;../*.** Object 
3ce0: 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  for iterating th
3cf0: 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65 64  rough the merged
3d00: 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20   results of one 
3d10: 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73  or more segments
3d20: 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65 61  ,.** visiting ea
3d30: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 20 70 61  ch term/rowid pa
3d40: 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65 64  ir in the merged
3d50: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65   data..**.** nSe
3d60: 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 6f  g is always a po
3d70: 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61 74  wer of two great
3d80: 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
3d90: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
3da0: 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68  f.** segments th
3db0: 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  at this object i
3dc0: 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66  s merging data f
3dd0: 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61 53  rom. Both the aS
3de0: 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72  eg[] and.** aFir
3df0: 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20  st[] arrays are 
3e00: 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65 6e  sized at nSeg en
3e10: 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67 5b  tries. The aSeg[
3e20: 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64 65  ] array is padde
3e30: 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65 64  d.** with zeroed
3e40: 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73 65   objects - these
3e50: 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20   are handled as 
3e60: 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74 65  if they were ite
3e70: 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a  rators opened.**
3e80: 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65 6e   on empty segmen
3e90: 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ts..**.** The re
3ea0: 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69  sults of compari
3eb0: 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65 67  ng segments aSeg
3ec0: 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31  [N] and aSeg[N+1
3ed0: 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61 6e  ], where N is an
3ee0: 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c  .** even number,
3ef0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 46   is stored in aF
3f00: 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d  irst[(nSeg+N)/2]
3f10: 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20 6f  . The "result" o
3f20: 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72  f the .** compar
3f30: 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e  ison in this con
3f40: 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64 65  text is the inde
3f50: 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  x of the iterato
3f60: 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  r that currently
3f70: 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
3f80: 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72  e smaller term/r
3f90: 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  owid combination
3fa0: 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20 45  . Iterators at E
3fb0: 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64  OF are.** consid
3fc0: 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61 74  ered to be great
3fd0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65  er than all othe
3fe0: 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a  r iterators..**.
3ff0: 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e  ** aFirst[1] con
4000: 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 20  tains the index 
4010: 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68 65  in aSeg[] of the
4020: 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70   iterator that p
4030: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
4040: 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65  smallest key ove
4050: 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20  rall. aFirst[0] 
4060: 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a  is unused. .*/..
4070: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
4080: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
4090: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
40a0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
40b0: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
40d0: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
40e0: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
40f0: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
4100: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
4110: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4120: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
4130: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
4140: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
4150: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
4160: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
4170: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
4180: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
4190: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
41a0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
41b0: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
41c0: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
41d0: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
41e0: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
41f0: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
4200: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
4210: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
4220: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
4230: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
4240: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
4250: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
4260: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
4270: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
4280: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
4290: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
42a0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
42b0: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
42c0: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
42d0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
42e0: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
42f0: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
4300: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
4310: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
4320: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
4330: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
4340: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
4350: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
4360: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
4370: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
4380: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
4390: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
43a0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
43b0: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
43c0: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
43d0: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
43e0: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
43f0: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
4400: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
4410: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
4420: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
4430: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
4440: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
4450: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
4460: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
4470: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
4480: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
4490: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
44a0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
44b0: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
44c0: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
44d0: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
44e0: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
44f0: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
4500: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
4510: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
4520: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
4530: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
4540: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
4550: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
4560: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
4570: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
4580: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
4590: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
45a0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
45b0: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
45c0: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
45d0: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
45e0: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
45f0: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
4600: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
4610: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
4620: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
4630: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
4640: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
4650: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
4660: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
4670: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
4680: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
4690: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
46a0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
46b0: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
46c0: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
46d0: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
46e0: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
46f0: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
4700: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
4710: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4720: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
4730: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
4740: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
4750: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
4760: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
4770: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
4780: 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 72 75 63 74   page..*/.struct
4790: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
47a0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
47b0: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
47c0: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
47d0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
47e0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
4810: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
4820: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
4830: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4840: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4850: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4860: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4870: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4880: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4890: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
48a0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
48b0: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
48c0: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
48d0: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
48e0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
48f0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
4900: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
4910: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
4920: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
4930: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4940: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4950: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4960: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4970: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4980: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4990: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
49a0: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
49b0: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
49c0: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
49d0: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
49e0: 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c  t;..  /* The fol
49f0: 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79 20  lowing are only 
4a00: 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53 35  used if the FTS5
4a10: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
4a20: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a 2f   flag is set. */
4a30: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
4a40: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4a50: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65 6e     /* Current en
4a60: 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66 66  try in aRowidOff
4a70: 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  set[] */.  int n
4a80: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4a90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
4aa0: 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
4ab0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
4ac0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  rray */.  int *a
4ad0: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
4af0: 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f 20  ay of offset to 
4b00: 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f 0a  rowid fields */.
4b10: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
4b20: 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20 20   *pDlidx;       
4b30: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
4b40: 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  s a doclist-inde
4b50: 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69 61  x */..  /* Varia
4b60: 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20 62  bles populated b
4b70: 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74 20  ased on current 
4b80: 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73 35  entry. */.  Fts5
4b90: 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20  Buffer term;    
4ba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4bb0: 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  urrent term */. 
4bc0: 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20   i64 iRowid;    
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4be0: 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77 69   /* Current rowi
4bf0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73 3b  d */.  int nPos;
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4c20: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75 72   of bytes in cur
4c30: 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69  rent position li
4c40: 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c  st */.  int bDel
4c50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4c70: 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c  if the delete fl
4c80: 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b 0a  ag is set */.};.
4c90: 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
4ca0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4cb0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
4cc0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4cd0: 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20 70  ins a .** leaf p
4ce0: 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  age..*/.#define 
4cf0: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
4d00: 28 78 29 20 61 73 73 65 72 74 28 20 5c 0a 20 20  (x) assert( \.  
4d10: 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66    (x)->szLeaf==f
4d20: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4d30: 70 5b 32 5d 29 20 7c 7c 20 28 78 29 2d 3e 73 7a  p[2]) || (x)->sz
4d40: 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 5c 0a  Leaf==(x)->nn \.
4d50: 29 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  )..#define FTS5_
4d60: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
4d70: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54 53  0x01.#define FTS
4d80: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4d90: 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a 20  E 0x02.../* .** 
4da0: 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  Argument is a po
4db0: 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35  inter to an Fts5
4dc0: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74  Data structure t
4dd0: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  hat contains a l
4de0: 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68 69  eaf.** page. Thi
4df0: 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74 65  s macro evaluate
4e00: 73 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65  s to true if the
4e10: 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20 6e   leaf contains n
4e20: 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20 66  o terms, or.** f
4e30: 61 6c 73 65 20 69 66 20 69 74 20 63 6f 6e 74 61  alse if it conta
4e40: 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ins at least one
4e50: 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e   term..*/.#defin
4e60: 65 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  e fts5LeafIsTerm
4e70: 6c 65 73 73 28 78 29 20 28 28 78 29 2d 3e 73 7a  less(x) ((x)->sz
4e80: 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e 29  Leaf >= (x)->nn)
4e90: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65  ..#define fts5Le
4ea0: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 78  afFirstTermOff(x
4eb0: 29 20 28 66 74 73 35 47 65 74 55 31 36 28 26 78  ) (fts5GetU16(&x
4ec0: 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65 61 66 5d  ->p[(x)->szLeaf]
4ed0: 29 29 0a 0a 2f 2a 0a 2a 2a 20 70 6f 73 6c 69 73  ))../*.** poslis
4ee0: 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20  t:.**   Used by 
4ef0: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
4f00: 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68  oslist() when th
4f10: 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20  e poslist needs 
4f20: 74 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a  to be buffered..
4f30: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
4f40: 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20   way to tell if 
4f50: 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65  this is populate
4f60: 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72  d or not..*/.str
4f70: 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65  uct Fts5IndexIte
4f80: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
4f90: 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
4fa0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
4fb0: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 69 74  hat owns this it
4fc0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35  erator */.  Fts5
4fd0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
4fe0: 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ct;         /* D
4ff0: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
5000: 65 20 66 6f 72 20 74 68 69 73 20 69 74 65 72 61  e for this itera
5010: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  tor */.  Fts5Buf
5020: 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20  fer poslist;    
5030: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
5040: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75  er containing cu
5050: 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f  rrent poslist */
5060: 0a 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  ..  int nSeg;   
5070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5080: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
5090: 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Seg[] array */. 
50a0: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74 65 72   /* True to iter
50d0: 61 74 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  ate in reverse o
50e0: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 53  rder */.  int bS
50f0: 6b 69 70 45 6d 70 74 79 3b 20 20 20 20 20 20 20  kipEmpty;       
5100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
5110: 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65 74 65  e to skip delete
5120: 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 69  d entries */.  i
5130: 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  nt bEof;        
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5150: 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  * True at EOF */
5160: 0a 0a 20 20 69 36 34 20 69 53 77 69 74 63 68 52  ..  i64 iSwitchR
5170: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5180: 20 20 20 20 2f 2a 20 46 69 72 73 74 65 73 74 20      /* Firstest 
5190: 72 6f 77 69 64 20 6f 66 20 6f 74 68 65 72 20 74  rowid of other t
51a0: 68 61 6e 20 61 46 69 72 73 74 5b 31 5d 20 2a 2f  han aFirst[1] */
51b0: 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a  .  Fts5CResult *
51c0: 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  aFirst;         
51d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65     /* Current me
51e0: 72 67 65 20 73 74 61 74 65 20 28 73 65 65 20 61  rge state (see a
51f0: 62 6f 76 65 29 20 2a 2f 0a 20 20 46 74 73 35 53  bove) */.  Fts5S
5200: 65 67 49 74 65 72 20 61 53 65 67 5b 31 5d 3b 20  egIter aSeg[1]; 
5210: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
5220: 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 20 69  ray of segment i
5230: 74 65 72 61 74 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a  terators */.};..
5240: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
5250: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
5260: 69 6e 67 20 74 79 70 65 20 69 73 20 75 73 65 64  ing type is used
5270: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
5280: 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ugh the contents
5290: 0a 2a 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  .** of a doclist
52a0: 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a  -index record..*
52b0: 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20  *.** pData:.**  
52c0: 20 52 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69   Record containi
52d0: 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  ng the doclist-i
52e0: 6e 64 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  ndex data..**.**
52f0: 20 62 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20   bEof:.**   Set 
5300: 74 6f 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65  to true once ite
5310: 72 61 74 6f 72 20 68 61 73 20 72 65 61 63 68 65  rator has reache
5320: 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66  d EOF..**.** iOf
5330: 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74  f:.**   Set to t
5340: 68 65 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65  he current offse
5350: 74 20 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20  t within record 
5360: 70 44 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74  pData..*/.struct
5370: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 7b 0a   Fts5DlidxLvl {.
5380: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
5390: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
53a0: 2f 2a 20 44 61 74 61 20 66 6f 72 20 63 75 72 72  /* Data for curr
53b0: 65 6e 74 20 70 61 67 65 20 6f 66 20 74 68 69 73  ent page of this
53c0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
53d0: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
53e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
53f0: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f  rent offset into
5400: 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
5410: 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20  bEof;           
5420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
5430: 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a 20  EOF already */. 
5440: 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66 3b 20   int iFirstOff; 
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5460: 2a 20 55 73 65 64 20 62 79 20 72 65 76 65 72 73  * Used by revers
5470: 65 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 0a  e iterators */..
5480: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
5490: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ables */.  int i
54a0: 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20  LeafPgno;       
54b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
54c0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   number of curre
54d0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  nt leaf page */.
54e0: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
54f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5500: 2f 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f  /* First rowid o
5510: 6e 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f  n leaf iLeafPgno
5520: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
5530: 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a 20 20  s5DlidxIter {.  
5540: 69 6e 74 20 6e 4c 76 6c 3b 0a 20 20 69 6e 74 20  int nLvl;.  int 
5550: 69 53 65 67 69 64 3b 0a 20 20 46 74 73 35 44 6c  iSegid;.  Fts5Dl
5560: 69 64 78 4c 76 6c 20 61 4c 76 6c 5b 31 5d 3b 0a  idxLvl aLvl[1];.
5570: 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  };..static void 
5580: 66 74 73 35 50 75 74 55 31 36 28 75 38 20 2a 61  fts5PutU16(u8 *a
5590: 4f 75 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a  Out, u16 iVal){.
55a0: 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61    aOut[0] = (iVa
55b0: 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d  l>>8);.  aOut[1]
55c0: 20 3d 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a   = (iVal&0xFF);.
55d0: 7d 0a 0a 73 74 61 74 69 63 20 75 31 36 20 66 74  }..static u16 ft
55e0: 73 35 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75  s5GetU16(const u
55f0: 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72  8 *aIn){.  retur
5600: 6e 20 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c  n ((u16)aIn[0] <
5610: 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d  < 8) + aIn[1];.}
5620: 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74   ../*.** Allocat
5630: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62  e and return a b
5640: 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 6e  uffer at least n
5650: 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73 69  Byte bytes in si
5660: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
5670: 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
5680: 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e  ountered, return
5690: 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20 74 68   NULL and set th
56a0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a  e error code in.
56b0: 2a 2a 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  ** the Fts5Index
56c0: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
56d0: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
56e0: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
56f0: 76 6f 69 64 20 2a 66 74 73 35 49 64 78 4d 61 6c  void *fts5IdxMal
5700: 6c 6f 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70  loc(Fts5Index *p
5710: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
5720: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
5730: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
5740: 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a  >rc, nByte);.}..
5750: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5760: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5770: 65 20 70 4c 65 66 74 20 62 75 66 66 65 72 20 77  e pLeft buffer w
5780: 69 74 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e  ith the pRight/n
5790: 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a  Right blob..**.*
57a0: 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
57b0: 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72  pLeft is smaller
57c0: 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20   than pRight, 0 
57d0: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
57e0: 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70  l or.** +ve if p
57f0: 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72  Right is smaller
5800: 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20   than pLeft. In 
5810: 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a  other words:.**.
5820: 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c  **     res = *pL
5830: 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f  eft - *pRight.*/
5840: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5850: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5860: 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
5870: 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42 75 66  eBlob(.  Fts5Buf
5880: 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  fer *pLeft,     
5890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
58a0: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f   hand side of co
58b0: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f  mparison */.  co
58c0: 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20  nst u8 *pRight, 
58d0: 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20 2f 2a  int nRight    /*
58e0: 20 52 69 67 68 74 20 68 61 6e 64 20 73 69 64 65   Right hand side
58f0: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
5900: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
5910: 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20  = MIN(pLeft->n, 
5920: 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72  nRight);.  int r
5930: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
5940: 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e 43  t->p, pRight, nC
5950: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5960: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
5970: 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65  n - nRight) : re
5980: 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  s);.}.#endif../*
5990: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
59a0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
59b0: 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e  two buffers usin
59c0: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
59d0: 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20  ne buffer.** is 
59e0: 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
59f0: 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e  other, it is con
5a00: 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73  sidered the less
5a10: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
5a20: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
5a30: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
5a40: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
5a50: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
5a60: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
5a70: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
5a80: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
5a90: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
5aa0: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
5ab0: 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20  Right.*/.static 
5ac0: 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f  int fts5BufferCo
5ad0: 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72  mpare(Fts5Buffer
5ae0: 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66   *pLeft, Fts5Buf
5af0: 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  fer *pRight){.  
5b00: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
5b10: 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d  Left->n, pRight-
5b20: 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  >n);.  int res =
5b30: 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70   memcmp(pLeft->p
5b40: 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d  , pRight->p, nCm
5b50: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
5b60: 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e  s==0 ? (pLeft->n
5b70: 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20   - pRight->n) : 
5b80: 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  res);.}..#ifdef 
5b90: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
5ba0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62  tic int fts5Blob
5bb0: 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74  Compare(.  const
5bc0: 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20   u8 *pLeft, int 
5bd0: 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20  nLeft, .  const 
5be0: 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  u8 *pRight, int 
5bf0: 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  nRight.){.  int 
5c00: 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74  nCmp = MIN(nLeft
5c10: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
5c20: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
5c30: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d  eft, pRight, nCm
5c40: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
5c50: 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20  s==0 ? (nLeft - 
5c60: 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a  nRight) : res);.
5c70: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
5c80: 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d   Close the read-
5c90: 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65  only blob handle
5ca0: 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e  , if it is open.
5cb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5cc0: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
5cd0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
5ce0: 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20   if( p->pReader 
5cf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
5d00: 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70  lob *pReader = p
5d10: 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70  ->pReader;.    p
5d20: 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20  ->pReader = 0;. 
5d30: 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
5d40: 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a  close(pReader);.
5d50: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65    }.}.../*.** Re
5d60: 74 72 69 65 76 65 20 61 20 72 65 63 6f 72 64 20  trieve a record 
5d70: 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
5d80: 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  table..**.** If 
5d90: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
5da0: 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
5db0: 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c  d and an error l
5dc0: 65 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46  eft in the .** F
5dd0: 74 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e  ts5Index object.
5de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44  .*/.static Fts5D
5df0: 61 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61  ata *fts5DataRea
5e00: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
5e10: 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46  i64 iRowid){.  F
5e20: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
5e30: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  0;.  if( p->rc==
5e40: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5e50: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
5e60: 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d  _OK;..    if( p-
5e70: 3e 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20  >pReader ){.    
5e80: 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d    /* This call m
5e90: 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
5ea0: 5f 41 42 4f 52 54 20 69 66 20 74 68 65 72 65 20  _ABORT if there 
5eb0: 68 61 73 20 62 65 65 6e 20 61 20 73 61 76 65 70  has been a savep
5ec0: 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f  oint.      ** ro
5ed0: 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20  llback since it 
5ee0: 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49  was last used. I
5ef0: 6e 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 65  n this case a ne
5f00: 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20  w blob handle.  
5f10: 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72      ** is requir
5f20: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71  ed.  */.      sq
5f30: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
5f40: 62 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a  b = p->pReader;.
5f50: 20 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72        p->pReader
5f60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
5f70: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65   sqlite3_blob_re
5f80: 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77  open(pBlob, iRow
5f90: 69 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  id);.      asser
5fa0: 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  t( p->pReader==0
5fb0: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65   );.      p->pRe
5fc0: 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20  ader = pBlob;.  
5fd0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
5fe0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
5ff0: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
6000: 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (p);.      }.   
6010: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6020: 45 5f 41 42 4f 52 54 20 29 20 72 63 20 3d 20 53  E_ABORT ) rc = S
6030: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
6040: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62  .    /* If the b
6050: 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f  lob handle is no
6060: 74 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70  t open at this p
6070: 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20 61 6e  oint, open it an
6080: 64 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a 20 74  d seek .    ** t
6090: 6f 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  o the requested 
60a0: 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  entry.  */.    i
60b0: 66 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  f( p->pReader==0
60c0: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
60d0: 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  K ){.      Fts5C
60e0: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
60f0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6100: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6110: 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
6120: 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20  g->db, .        
6130: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6140: 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c  p->zDataTbl, "bl
6150: 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c  ock", iRowid, 0,
6160: 20 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20   &p->pReader.   
6170: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20     );.    }..   
6180: 20 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66   /* If either of
6190: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f   the sqlite3_blo
61a0: 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69  b_open() or sqli
61b0: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
61c0: 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61  ) calls.    ** a
61d0: 62 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51  bove returned SQ
61e0: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75  LITE_ERROR, retu
61f0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
6200: 54 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a  T_VTAB instead..
6210: 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72      ** All the r
6220: 65 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e  easons those fun
6230: 63 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74  ctions might ret
6240: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
6250: 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a   - missing.    *
6260: 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67  * table, missing
6270: 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74   row, non-blob/t
6280: 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c  ext in block col
6290: 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a  umn - indicate .
62a0: 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73      ** backing s
62b0: 74 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  tore corruption.
62c0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
62d0: 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20  =SQLITE_ERROR ) 
62e0: 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
62f0: 54 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  T;..    if( rc==
6300: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6310: 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b     u8 *aOut = 0;
6320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
6330: 2a 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61  * Read blob data
6340: 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65   into this buffe
6350: 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  r */.      int n
6360: 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62  Byte = sqlite3_b
6370: 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65  lob_bytes(p->pRe
6380: 61 64 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74  ader);.      int
6390: 20 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66   nAlloc = sizeof
63a0: 28 46 74 73 35 44 61 74 61 29 20 2b 20 6e 42 79  (Fts5Data) + nBy
63b0: 74 65 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  te + FTS5_DATA_P
63c0: 41 44 44 49 4e 47 3b 0a 20 20 20 20 20 20 70 52  ADDING;.      pR
63d0: 65 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29  et = (Fts5Data*)
63e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
63f0: 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66  Alloc);.      if
6400: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
6410: 20 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79    pRet->nn = nBy
6420: 74 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74  te;.        aOut
6430: 20 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38   = pRet->p = (u8
6440: 2a 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20  *)&pRet[1];.    
6450: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6460: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
6470: 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  EM;.      }..   
6480: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
6490: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
64a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
64b0: 62 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65  b_read(p->pReade
64c0: 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20  r, aOut, nByte, 
64d0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
64e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
64f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
6500: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74  qlite3_free(pRet
6510: 29 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20  );.        pRet 
6520: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
6530: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44  {.        /* TOD
6540: 4f 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a  O1: Fix this */.
6550: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a          pRet->sz
6560: 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31  Leaf = fts5GetU1
6570: 36 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a  6(&pRet->p[2]);.
6580: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
6590: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
65a0: 20 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20    p->nRead++;.  
65b0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 52  }..  assert( (pR
65c0: 65 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d  et==0)==(p->rc!=
65d0: 53 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20  SQLITE_OK) );.  
65e0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
65f0: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
6600: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74  reference to dat
6610: 61 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65  a record returne
6620: 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
6630: 63 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44  call to.** fts5D
6640: 61 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74  ataRead()..*/.st
6650: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61  atic void fts5Da
6660: 74 61 52 65 6c 65 61 73 65 28 46 74 73 35 44 61  taRelease(Fts5Da
6670: 74 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71  ta *pData){.  sq
6680: 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
6690: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  );.}..static int
66a0: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
66b0: 65 53 74 6d 74 28 0a 20 20 46 74 73 35 49 6e 64  eStmt(.  Fts5Ind
66c0: 65 78 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  ex *p,.  sqlite3
66d0: 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a  _stmt **ppStmt,.
66e0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a    char *zSql.){.
66f0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
6700: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
6710: 28 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ( zSql ){.      
6720: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
6730: 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 70 43  prepare_v2(p->pC
6740: 6f 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c  onfig->db, zSql,
6750: 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b   -1, ppStmt, 0);
6760: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6770: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
6780: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
6790: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
67a0: 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e  (zSql);.  return
67b0: 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a   p->rc;.}.../*.*
67c0: 2a 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c  * INSERT OR REPL
67d0: 41 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74  ACE a record int
67e0: 6f 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  o the %_data tab
67f0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6800: 69 64 20 66 74 73 35 44 61 74 61 57 72 69 74 65  id fts5DataWrite
6810: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
6820: 36 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74  64 iRowid, const
6830: 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20   u8 *pData, int 
6840: 6e 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d  nData){.  if( p-
6850: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6860: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
6870: 70 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b  p->pWriter==0 ){
6880: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51  .    int rc = SQ
6890: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 46 74 73  LITE_OK;.    Fts
68a0: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
68b0: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
68c0: 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
68d0: 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
68e0: 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f  Writer, sqlite3_
68f0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
6900: 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
6910: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28   '%q'.'%q_data'(
6920: 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45  id, block) VALUE
6930: 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20  S(?,?)", .      
6940: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
6950: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
6960: 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28  .    ));.    if(
6970: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
6980: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
6990: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57  bind_int64(p->pW
69a0: 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64  riter, 1, iRowid
69b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
69c0: 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65  d_blob(p->pWrite
69d0: 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61  r, 2, pData, nDa
69e0: 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  ta, SQLITE_STATI
69f0: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  C);.  sqlite3_st
6a00: 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ep(p->pWriter);.
6a10: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
6a20: 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74  3_reset(p->pWrit
6a30: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  er);.}../*.** Ex
6a40: 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77  ecute the follow
6a50: 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20  ing SQL:.**.**  
6a60: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25     DELETE FROM %
6a70: 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 20 42  _data WHERE id B
6a80: 45 54 57 45 45 4e 20 24 69 46 69 72 73 74 20 41  ETWEEN $iFirst A
6a90: 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61  ND $iLast.*/.sta
6aa0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6ab0: 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65  aDelete(Fts5Inde
6ac0: 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74  x *p, i64 iFirst
6ad0: 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20  , i64 iLast){.  
6ae0: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6af0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6b00: 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65    if( p->pDelete
6b10: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  r==0 ){.    int 
6b20: 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66  rc;.    Fts5Conf
6b30: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
6b40: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
6b50: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
6b60: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6b70: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6b80: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20   '%q'.'%q_data' 
6b90: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
6ba0: 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20  id<=?", .       
6bb0: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6bc0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6bd0: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a      );.    if( z
6be0: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
6bf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6c00: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
6c10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
6c20: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
6c30: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
6c40: 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c  1, &p->pDeleter,
6c50: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6c60: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
6c70: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
6c80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6c90: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
6ca0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6cb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
6cc0: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
6cd0: 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46  >pDeleter, 1, iF
6ce0: 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  irst);.  sqlite3
6cf0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6d00: 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73  Deleter, 2, iLas
6d10: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t);.  sqlite3_st
6d20: 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ep(p->pDeleter);
6d30: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
6d40: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c  e3_reset(p->pDel
6d50: 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eter);.}../*.** 
6d60: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72  Remove all recor
6d70: 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ds associated wi
6d80: 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69  th segment iSegi
6d90: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6da0: 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65  d fts5DataRemove
6db0: 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65  Segment(Fts5Inde
6dc0: 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64  x *p, int iSegid
6dd0: 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74 20  ){.  i64 iFirst 
6de0: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
6df0: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20  OWID(iSegid, 0, 
6e00: 30 29 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20  0);.  i64 iLast 
6e10: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
6e20: 4f 57 49 44 28 69 53 65 67 69 64 2b 31 2c 20 30  OWID(iSegid+1, 0
6e30: 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44 61  , 0)-1;.  fts5Da
6e40: 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69 72  taDelete(p, iFir
6e50: 73 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69 66  st, iLast);.  if
6e60: 28 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  ( p->pIdxDeleter
6e70: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6e80: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
6e90: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
6ea0: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
6eb0: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
6ec0: 78 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74 65  xDeleter, sqlite
6ed0: 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
6ee0: 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f       "DELETE FRO
6ef0: 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20  M '%q'.'%q_idx' 
6f00: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c 0a  WHERE segid=?",.
6f10: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
6f20: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
6f30: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20  >zName.    ));. 
6f40: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d   }.  if( p->rc==
6f50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6f60: 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
6f70: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6f80: 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20  , 1, iSegid);.  
6f90: 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
6fa0: 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b 0a  ->pIdxDeleter);.
6fb0: 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
6fc0: 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64  te3_reset(p->pId
6fd0: 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a 7d  xDeleter);.  }.}
6fe0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
6ff0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  a reference to a
7000: 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  n Fts5Structure 
7010: 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64 20  object returned 
7020: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a 2a  by an earlier .*
7030: 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53 74  * call to fts5St
7040: 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f 72  ructureRead() or
7050: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65   fts5StructureDe
7060: 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  code()..*/.stati
7070: 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63  c void fts5Struc
7080: 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73 35  tureRelease(Fts5
7090: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
70a0: 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72 75  ct){.  if( pStru
70b0: 63 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74 72  ct && 0>=(--pStr
70c0: 75 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20 20  uct->nRef) ){.  
70d0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
70e0: 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 52  ert( pStruct->nR
70f0: 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  ef==0 );.    for
7100: 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74 2d  (i=0; i<pStruct-
7110: 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20  >nLevel; i++){. 
7120: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
7130: 65 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  e(pStruct->aLeve
7140: 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20 20  l[i].aSeg);.    
7150: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
7160: 65 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  ee(pStruct);.  }
7170: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7180: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 66  fts5StructureRef
7190: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a  (Fts5Structure *
71a0: 70 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74 72  pStruct){.  pStr
71b0: 75 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 0a  uct->nRef++;.}..
71c0: 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a  /*.** Deserializ
71d0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
71e0: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
71f0: 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  d currently stor
7200: 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65 64  ed in serialized
7210: 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e 20  .** form within 
7220: 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44 61  buffer pData/nDa
7230: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74  ta..**.** The Ft
7240: 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76  s5Structure.aLev
7250: 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74  el[] and each Ft
7260: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7270: 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a  .aSeg[] array.**
7280: 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61   are over-alloca
7290: 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74 2e  ted by one slot.
72a0: 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
72b0: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 65   structure conte
72c0: 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f 72  nts.** to be mor
72d0: 65 20 65 61 73 69 6c 79 20 65 64 69 74 65 64 2e  e easily edited.
72e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
72f0: 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f 75  or occurs, *ppOu
7300: 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  t is set to NULL
7310: 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20 65   and an SQLite e
7320: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65 74  rror code.** ret
7330: 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
7340: 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74 20  , *ppOut is set 
7350: 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
7360: 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a 2a  new object and.*
7370: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
7380: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
7390: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
73a0: 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73 74  eDecode(.  const
73b0: 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20 20   u8 *pData,     
73c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
73d0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
73e0: 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75 63  serialized struc
73f0: 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ture */.  int nD
7400: 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  ata,            
7410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
7420: 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61 74  e of buffer pDat
7430: 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  a in bytes */.  
7440: 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20 20  int *piCookie,  
7450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7460: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
7470: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
7480: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
7490: 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
74a0: 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65 72     /* OUT: Deser
74b0: 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20 2a  ialized object *
74c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
74d0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
74e0: 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4c   i = 0;.  int iL
74f0: 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65 6c  vl;.  int nLevel
7500: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67   = 0;.  int nSeg
7510: 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ment = 0;.  int 
7520: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
7530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7540: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
7550: 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52 65   allocate at pRe
7560: 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
7570: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
7580: 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74         /* Struct
7590: 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72 65  ure object to re
75a0: 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47 72  turn */..  /* Gr
75b0: 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76 61  ab the cookie va
75c0: 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69 43  lue */.  if( piC
75d0: 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b 69  ookie ) *piCooki
75e0: 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47  e = sqlite3Fts5G
75f0: 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20 69  et32(pData);.  i
7600: 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61 64   = 4;..  /* Read
7610: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
7620: 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64 20  r of levels and 
7630: 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
7640: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a 20  e start of the. 
7650: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72 65   ** structure re
7660: 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b 3d  cord.  */.  i +=
7670: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7680: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65 76  (&pData[i], nLev
7690: 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73 35  el);.  i += fts5
76a0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
76b0: 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74 29  ta[i], nSegment)
76c0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20 20  ;.  nByte = (.  
76d0: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
76e0: 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20  tructure) +     
76f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7700: 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65  * Main structure
7710: 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66   */.      sizeof
7720: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
7730: 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d 31  vel) * (nLevel-1
7740: 29 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d  )    /* aLevel[]
7750: 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a 20   array */.  );. 
7760: 20 70 52 65 74 20 3d 20 28 46 74 73 35 53 74 72   pRet = (Fts5Str
7770: 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46  ucture*)sqlite3F
7780: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7790: 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69 66  c, nByte);..  if
77a0: 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70 52  ( pRet ){.    pR
77b0: 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  et->nRef = 1;.  
77c0: 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20 3d    pRet->nLevel =
77d0: 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52 65   nLevel;.    pRe
77e0: 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e 53  t->nSegment = nS
77f0: 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b 3d  egment;.    i +=
7800: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
7810: 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d 2c  arint(&pData[i],
7820: 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43 6f   &pRet->nWriteCo
7830: 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72  unter);..    for
7840: 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51 4c  (iLvl=0; rc==SQL
7850: 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c 6e  ITE_OK && iLvl<n
7860: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
7870: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
7880: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
7890: 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b 69   &pRet->aLevel[i
78a0: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  Lvl];.      int 
78b0: 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69 6e  nTotal;.      in
78c0: 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20 69  t iSeg;..      i
78d0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
78e0: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
78f0: 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20 20  Lvl->nMerge);.  
7900: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
7910: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7920: 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20 20  i], nTotal);.   
7930: 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74 61     assert( nTota
7940: 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  l>=pLvl->nMerge 
7950: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61  );.      pLvl->a
7960: 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
7970: 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
7980: 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
7990: 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20 20  ro(&rc, .       
79a0: 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65     nTotal * size
79b0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
79c0: 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20 29  Segment).      )
79d0: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ;..      if( rc=
79e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
79f0: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67        pLvl->nSeg
7a00: 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20   = nTotal;.     
7a10: 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
7a20: 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65 67  Seg<nTotal; iSeg
7a30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
7a40: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7a50: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7a60: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
7a70: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
7a80: 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56     i += fts5GetV
7a90: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69  arint32(&pData[i
7aa0: 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  ], pLvl->aSeg[iS
7ab0: 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a 20 20  eg].nHeight);.  
7ac0: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73          i += fts
7ad0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7ae0: 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53  ata[i], pLvl->aS
7af0: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72  eg[iSeg].pgnoFir
7b00: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  st);.          i
7b10: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7b20: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70  t32(&pData[i], p
7b30: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
7b40: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
7b50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
7b60: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74  {.        fts5St
7b70: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
7b80: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
7b90: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
7ba0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70      }.  }..  *pp
7bb0: 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65  Out = pRet;.  re
7bc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7bd0: 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  *.*/.static void
7be0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64   fts5StructureAd
7bf0: 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c  dLevel(int *pRc,
7c00: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7c10: 2a 70 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66  *ppStruct){.  if
7c20: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
7c30: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
7c40: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
7c50: 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20  = *ppStruct;.   
7c60: 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53   int nLevel = pS
7c70: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20  truct->nLevel;. 
7c80: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
7c90: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
7ca0: 46 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b  Fts5Structure) +
7cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cc0: 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74    /* Main struct
7cd0: 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  ure */.        s
7ce0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7cf0: 75 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65  ureLevel) * (nLe
7d00: 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c 65 76 65  vel+1)  /* aLeve
7d10: 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  l[] array */.   
7d20: 20 29 3b 0a 0a 20 20 20 20 70 53 74 72 75 63 74   );..    pStruct
7d30: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
7d40: 6f 63 28 70 53 74 72 75 63 74 2c 20 6e 42 79 74  oc(pStruct, nByt
7d50: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 53 74 72  e);.    if( pStr
7d60: 75 63 74 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  uct ){.      mem
7d70: 73 65 74 28 26 70 53 74 72 75 63 74 2d 3e 61 4c  set(&pStruct->aL
7d80: 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c  evel[nLevel], 0,
7d90: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7da0: 63 74 75 72 65 4c 65 76 65 6c 29 29 3b 0a 20 20  ctureLevel));.  
7db0: 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65      pStruct->nLe
7dc0: 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20 2a 70 70  vel++;.      *pp
7dd0: 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
7de0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7df0: 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
7e00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
7e10: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e  }.}../*.** Exten
7e20: 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20 73 6f 20  d level iLvl so 
7e30: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 72 6f  that there is ro
7e40: 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20  om for at least 
7e50: 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a 2a 20 73  nExtra more.** s
7e60: 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  egments..*/.stat
7e70: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
7e80: 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
7e90: 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
7ea0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7eb0: 70 53 74 72 75 63 74 2c 20 0a 20 20 69 6e 74 20  pStruct, .  int 
7ec0: 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20 6e 45 78  iLvl, .  int nEx
7ed0: 74 72 61 2c 20 0a 20 20 69 6e 74 20 62 49 6e 73  tra, .  int bIns
7ee0: 65 72 74 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52  ert.){.  if( *pR
7ef0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7f00: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
7f10: 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
7f20: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
7f30: 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74 73 35 53  iLvl];.    Fts5S
7f40: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
7f50: 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e 74 20 6e  *aNew;.    int n
7f60: 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42 79 74 65  Byte;..    nByte
7f70: 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b   = (pLvl->nSeg +
7f80: 20 6e 45 78 74 72 61 29 20 2a 20 73 69 7a 65 6f   nExtra) * sizeo
7f90: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
7fa0: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 61 4e 65  egment);.    aNe
7fb0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
7fc0: 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20  loc(pLvl->aSeg, 
7fd0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
7fe0: 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66  aNew ){.      if
7ff0: 28 20 62 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a  ( bInsert==0 ){.
8000: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
8010: 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d  aNew[pLvl->nSeg]
8020: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
8030: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8040: 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20  ) * nExtra);.   
8050: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8060: 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 70 4c    int nMove = pL
8070: 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69 7a 65 6f  vl->nSeg * sizeo
8080: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8090: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  egment);.       
80a0: 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65 77 5b 6e   memmove(&aNew[n
80b0: 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d  Extra], aNew, nM
80c0: 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65  ove);.        me
80d0: 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c 20 73 69  mset(aNew, 0, si
80e0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
80f0: 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78  reSegment) * nEx
8100: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
8110: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
8120: 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65 6c 73 65   aNew;.    }else
8130: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
8140: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
8150: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
8160: 52 65 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a  Read, deserializ
8170: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  e and return the
8180: 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72   structure recor
8190: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73  d..**.** The Fts
81a0: 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65  5Structure.aLeve
81b0: 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73  l[] and each Fts
81c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e  5StructureLevel.
81d0: 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20  aSeg[] array.** 
81e0: 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74  are over-allocat
81f0: 65 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20  ed as described 
8200: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  for function fts
8210: 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
8220: 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a  () .** above..**
8230: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
8240: 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
8250: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20  returned and an 
8260: 65 72 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20  error code left 
8270: 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e  in the.** Fts5In
8280: 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61  dex handle. If a
8290: 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
82a0: 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
82b0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  n this function.
82c0: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ** is called, it
82d0: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
82e0: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
82f0: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
8300: 75 72 65 52 65 61 64 28 46 74 73 35 49 6e 64 65  ureRead(Fts5Inde
8310: 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 43 6f 6e  x *p){.  Fts5Con
8320: 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
8330: 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
8340: 35 53 74 72 75 63 74 75 72 65 20 2a 70 52 65 74  5Structure *pRet
8350: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20   = 0;        /* 
8360: 4f 62 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e  Object to return
8370: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69   */.  int iCooki
8380: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
8390: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
83a0: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f  ration cookie */
83b0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
83c0: 74 61 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  ta;.  Fts5Buffer
83d0: 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d   buf = {0, 0, 0}
83e0: 3b 0a 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73  ;..  pData = fts
83f0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
8400: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
8410: 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20  D);.  if( p->rc 
8420: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 2f 2a  ) return 0;.  /*
8430: 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65   TODO: Do we nee
8440: 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65  d this if the le
8450: 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65  af-index is appe
8460: 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e  nded? Probably..
8470: 2e 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70  . */.  memset(&p
8480: 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e  Data->p[pData->n
8490: 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41  n], 0, FTS5_DATA
84a0: 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 70 2d 3e  _PADDING);.  p->
84b0: 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  rc = fts5Structu
84c0: 72 65 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e  reDecode(pData->
84d0: 70 2c 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69  p, pData->nn, &i
84e0: 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a  Cookie, &pRet);.
84f0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8500: 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69  ITE_OK && pConfi
8510: 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f  g->iCookie!=iCoo
8520: 6b 69 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  kie ){.    p->rc
8530: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f   = sqlite3Fts5Co
8540: 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67  nfigLoad(pConfig
8550: 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a  , iCookie);.  }.
8560: 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
8570: 73 65 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28  se(pData);.  if(
8580: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
8590: 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72  K ){.    fts5Str
85a0: 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52  uctureRelease(pR
85b0: 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20  et);.    pRet = 
85c0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
85d0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
85e0: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
85f0: 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e  number of segmen
8600: 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75  ts in index stru
8610: 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54  cture pStruct. T
8620: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
8630: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65  is only ever use
8640: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
8650: 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73  ert() conditions
8660: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
8670: 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20  TE_DEBUG.static 
8680: 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75 72  int fts5Structur
8690: 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46  eCountSegments(F
86a0: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
86b0: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53  truct){.  int nS
86c0: 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  egment = 0;     
86d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
86e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67  al number of seg
86f0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70  ments */.  if( p
8700: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e  Struct ){.    in
8710: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
8720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
8730: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
8740: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
8750: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
8760: 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
8770: 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
8780: 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b        nSegment +
8790: 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
87a0: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20  l[iLvl].nSeg;.  
87b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
87c0: 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65  n nSegment;.}.#e
87d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69  ndif../*.** Seri
87e0: 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20  alize and store 
87f0: 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20  the "structure" 
8800: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
8810: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
8820: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
8830: 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73   code in the Fts
8840: 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49  5Index object. I
8850: 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61  f an.** error ha
8860: 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
8870: 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
8880: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
8890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
88a0: 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
88b0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
88c0: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
88d0: 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  ruct){.  if( p->
88e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
88f0: 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
8900: 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  buf;            
8910: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
8920: 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64  serialize record
8930: 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74   into */.    int
8940: 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20   iLvl;          
8950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
8960: 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
8970: 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
8980: 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b      int iCookie;
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75    /* Cookie valu
89b0: 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20  e to store */.. 
89c0: 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
89d0: 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74  ct->nSegment==ft
89e0: 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74  s5StructureCount
89f0: 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74  Segments(pStruct
8a00: 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ) );.    memset(
8a10: 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &buf, 0, sizeof(
8a20: 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20  Fts5Buffer));.. 
8a30: 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
8a40: 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75   current configu
8a50: 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f  ration cookie */
8a60: 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70  .    iCookie = p
8a70: 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b  ->pConfig->iCook
8a80: 69 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f  ie;.    if( iCoo
8a90: 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20  kie<0 ) iCookie 
8aa0: 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66  = 0;.    fts5Buf
8ab0: 66 65 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e  ferAppend32(&p->
8ac0: 72 63 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69  rc, &buf, iCooki
8ad0: 65 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66  e);..    fts5Buf
8ae0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8af0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53  &p->rc, &buf, pS
8b00: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a  truct->nLevel);.
8b10: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
8b20: 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
8b30: 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63 74  c, &buf, pStruct
8b40: 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ->nSegment);.   
8b50: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
8b60: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
8b70: 26 62 75 66 2c 20 28 69 36 34 29 70 53 74 72 75  &buf, (i64)pStru
8b80: 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
8b90: 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76  r);..    for(iLv
8ba0: 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
8bb0: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
8bc0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  +){.      int iS
8bd0: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
8be0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
8bf0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
8c00: 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
8c10: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
8c20: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
8c30: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
8c40: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74  [iLvl];.      ft
8c50: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8c60: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
8c70: 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29  f, pLvl->nMerge)
8c80: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
8c90: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
8ca0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8cb0: 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20  l->nSeg);.      
8cc0: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d  assert( pLvl->nM
8cd0: 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67  erge<=pLvl->nSeg
8ce0: 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   );..      for(i
8cf0: 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
8d00: 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
8d10: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
8d20: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8d30: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
8d40: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl->aSeg[iSeg].i
8d50: 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
8d60: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8d70: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8d80: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
8d90: 69 53 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b 0a  iSeg].nHeight);.
8da0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
8db0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
8dc0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8dd0: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
8de0: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
8df0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8e00: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8e10: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8e20: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74  g[iSeg].pgnoLast
8e30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
8e40: 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57 72  ..    fts5DataWr
8e50: 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52 55  ite(p, FTS5_STRU
8e60: 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75 66  CTURE_ROWID, buf
8e70: 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  .p, buf.n);.    
8e80: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
8e90: 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  buf);.  }.}..#if
8ea0: 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66   0.static void f
8eb0: 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
8ec0: 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66 65  e(int*,Fts5Buffe
8ed0: 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72 65  r*,Fts5Structure
8ee0: 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  *);.static void 
8ef0: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
8f00: 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  re(const char *z
8f10: 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74 72  Caption, Fts5Str
8f20: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
8f30: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
8f40: 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42 75  ITE_OK;.  Fts5Bu
8f50: 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73  ffer buf;.  mems
8f60: 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65  et(&buf, 0, size
8f70: 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73 35  of(buf));.  fts5
8f80: 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 26  DebugStructure(&
8f90: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
8fa0: 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74  t);.  fprintf(st
8fb0: 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e 22  dout, "%s: %s\n"
8fc0: 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66 2e  , zCaption, buf.
8fd0: 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74 64  p);.  fflush(std
8fe0: 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66  out);.  fts5Buff
8ff0: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
9000: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66  #else.# define f
9010: 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75 72  ts5PrintStructur
9020: 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 73  e(x,y).#endif..s
9030: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 65  tatic int fts5Se
9040: 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53 74  gmentSize(Fts5St
9050: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
9060: 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  pSeg){.  return 
9070: 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  1 + pSeg->pgnoLa
9080: 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  st - pSeg->pgnoF
9090: 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irst;.}../*.** R
90a0: 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66 20  eturn a copy of 
90b0: 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
90c0: 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74 2c  pStruct. Except,
90d0: 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e 79   promote as many
90e0: 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61 73   .** segments as
90f0: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65 76   possible to lev
9100: 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66 20  el iPromote. If 
9110: 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 4e  an OOM occurs, N
9120: 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75 72  ULL is .** retur
9130: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ned..*/.static v
9140: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
9150: 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46 74  ePromoteTo(.  Ft
9160: 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 6e  s5Index *p,.  in
9170: 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69 6e  t iPromote,.  in
9180: 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20 46  t szPromote,.  F
9190: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
91a0: 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20 69  truct.){.  int i
91b0: 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74 72  l, is;.  Fts5Str
91c0: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f 75  uctureLevel *pOu
91d0: 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  t = &pStruct->aL
91e0: 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b 0a  evel[iPromote];.
91f0: 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d 65  .  if( pOut->nMe
9200: 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f  rge==0 ){.    fo
9210: 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31 3b  r(il=iPromote+1;
9220: 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65   il<pStruct->nLe
9230: 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20 20  vel; il++){.    
9240: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9250: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9260: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 6c  truct->aLevel[il
9270: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76  ];.      if( pLv
9280: 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74 75  l->nMerge ) retu
9290: 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 73  rn;.      for(is
92a0: 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69  =pLvl->nSeg-1; i
92b0: 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20 20  s>=0; is--){.   
92c0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66 74       int sz = ft
92d0: 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26 70  s5SegmentSize(&p
92e0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b 0a  Lvl->aSeg[is]);.
92f0: 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e 73          if( sz>s
9300: 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75 72  zPromote ) retur
9310: 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  n;.        fts5S
9320: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
9330: 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
9340: 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 31  uct, iPromote, 1
9350: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
9360: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
9370: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
9380: 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70 4c  (pOut->aSeg, &pL
9390: 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73 69  vl->aSeg[is], si
93a0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
93b0: 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20 20  reSegment));.   
93c0: 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67 2b       pOut->nSeg+
93d0: 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  +;.        pLvl-
93e0: 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 7d  >nSeg--;.      }
93f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
9400: 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65 6e  .** A new segmen
9410: 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  t has just been 
9420: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
9430: 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20 73   iLvl of index s
9440: 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74 72  tructure.** pStr
9450: 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  uct. This functi
9460: 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  on determines if
9470: 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73 68   any segments sh
9480: 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65 64  ould be promoted
9490: 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74 2e  .** as a result.
94a0: 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   Segments are pr
94b0: 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73 63  omoted in two sc
94c0: 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20  enarios:.**.**  
94d0: 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d 65   a) If the segme
94e0: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
94f0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
9500: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d  one or more segm
9510: 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69 74  ents.**      wit
9520: 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73  hin the previous
9530: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
9540: 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65 64  , it is promoted
9550: 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73   to the previous
9560: 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61 74  .**      populat
9570: 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20  ed level..**.** 
9580: 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67 6d    b) If the segm
9590: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
95a0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
95b0: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
95c0: 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74 68  nt on.**      th
95d0: 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65 64  e next populated
95e0: 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68 61   level, then tha
95f0: 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20 61  t segment, and a
9600: 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65 6e  ny other adjacen
9610: 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65 6e  t.**      segmen
9620: 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73 6f  ts that are also
9630: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
9640: 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74 74  e one just writt
9650: 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20 20  en, are .**     
9660: 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a 2a   promoted. .**.*
9670: 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  * If one or more
9680: 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70 72   segments are pr
9690: 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72 75  omoted, the stru
96a0: 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73 20  cture object is 
96b0: 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72 65  updated.** to re
96c0: 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a 73  flect this..*/.s
96d0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
96e0: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
96f0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9710: 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
9720: 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  nd object */.  i
9730: 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20 20  nt iLvl,        
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9750: 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a 75  * Index level ju
9760: 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20 20  st updated */.  
9770: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
9780: 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20 20  Struct          
9790: 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
97a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  re */.){.  if( p
97b0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
97c0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74 3b  ){.    int iTst;
97d0: 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74  .    int iPromot
97e0: 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  e = -1;.    int 
97f0: 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20 20  szPromote = 0;  
9800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f            /* Pro
9810: 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74 68  mote anything th
9820: 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c 6c  is size or small
9830: 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53 74  er */.    Fts5St
9840: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
9850: 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d 65  pSeg;   /* Segme
9860: 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  nt just written 
9870: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65 67  */.    int szSeg
9880: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9890: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
98a0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
98b0: 74 74 65 6e 20 2a 2f 0a 0a 0a 20 20 20 20 70 53  tten */...    pS
98c0: 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
98d0: 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
98e0: 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  [pStruct->aLevel
98f0: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a  [iLvl].nSeg-1];.
9900: 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b      szSeg = (1 +
9910: 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20   pSeg->pgnoLast 
9920: 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  - pSeg->pgnoFirs
9930: 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  t);..    /* Chec
9940: 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20  k for condition 
9950: 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  (a) */.    for(i
9960: 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74  Tst=iLvl-1; iTst
9970: 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e  >=0 && pStruct->
9980: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65  aLevel[iTst].nSe
9990: 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20  g==0; iTst--);. 
99a0: 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29     if( iTst>=0 )
99b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
99c0: 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d       int szMax =
99d0: 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74   0;.      Fts5St
99e0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54  ructureLevel *pT
99f0: 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  st = &pStruct->a
9a00: 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20  Level[iTst];.   
9a10: 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74 2d     assert( pTst-
9a20: 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20  >nMerge==0 );.  
9a30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9a40: 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  Tst->nSeg; i++){
9a50: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20  .        int sz 
9a60: 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e  = pTst->aSeg[i].
9a70: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d  pgnoLast - pTst-
9a80: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72  >aSeg[i].pgnoFir
9a90: 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  st + 1;.        
9aa0: 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73  if( sz>szMax ) s
9ab0: 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20  zMax = sz;.     
9ac0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d   }.      if( szM
9ad0: 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20  ax>=szSeg ){.   
9ae0: 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f       /* Conditio
9af0: 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20 50  n (a) is true. P
9b00: 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73  romote the newes
9b10: 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76  t segment on lev
9b20: 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  el .        ** i
9b30: 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73  Lvl to level iTs
9b40: 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  t.  */.        i
9b50: 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a  Promote = iTst;.
9b60: 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74          szPromot
9b70: 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20  e = szMax;.     
9b80: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
9b90: 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61   If condition (a
9ba0: 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73  ) is not met, as
9bb0: 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75 65  sume (b) is true
9bc0: 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  . StructurePromo
9bd0: 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73  teTo().    ** is
9be0: 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69   a no-op if it i
9bf0: 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69  s not.  */.    i
9c00: 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b  f( iPromote<0 ){
9c10: 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20  .      iPromote 
9c20: 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a  = iLvl;.      sz
9c30: 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b  Promote = szSeg;
9c40: 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
9c50: 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54  tructurePromoteT
9c60: 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73  o(p, iPromote, s
9c70: 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63  zPromote, pStruc
9c80: 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  t);.  }.}.../*.*
9c90: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
9ca0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
9cb0: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
9cc0: 6e 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f  nt. If the end o
9cd0: 66 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73  f the .** doclis
9ce0: 74 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20  t-index page is 
9cf0: 72 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20  reached, return 
9d00: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  non-zero..*/.sta
9d10: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
9d20: 78 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69  xLvlNext(Fts5Dli
9d30: 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20  dxLvl *pLvl){.  
9d40: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20  Fts5Data *pData 
9d50: 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a  = pLvl->pData;..
9d60: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66    if( pLvl->iOff
9d70: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
9d80: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
9d90: 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   );.    pLvl->iO
9da0: 66 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c  ff = 1;.    pLvl
9db0: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
9dc0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
9dd0: 2d 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c  ->p[1], pLvl->iL
9de0: 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c  eafPgno);.    pL
9df0: 76 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35  vl->iOff += fts5
9e00: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
9e10: 2d 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c  ->p[pLvl->iOff],
9e20: 20 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52   (u64*)&pLvl->iR
9e30: 6f 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  owid);.    pLvl-
9e40: 3e 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76  >iFirstOff = pLv
9e50: 6c 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65  l->iOff;.  }else
9e60: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a  {.    int iOff;.
9e70: 20 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76      for(iOff=pLv
9e80: 6c 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44  l->iOff; iOff<pD
9e90: 61 74 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29  ata->nn; iOff++)
9ea0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  {.      if( pDat
9eb0: 61 2d 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65  a->p[iOff] ) bre
9ec0: 61 6b 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ak; .    }..    
9ed0: 69 66 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e  if( iOff<pData->
9ee0: 6e 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  nn ){.      i64 
9ef0: 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c  iVal;.      pLvl
9f00: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28  ->iLeafPgno += (
9f10: 69 4f 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66  iOff - pLvl->iOf
9f20: 66 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f  f) + 1;.      iO
9f30: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
9f40: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f  int(&pData->p[iO
9f50: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
9f60: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  );.      pLvl->i
9f70: 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20  Rowid += iVal;. 
9f80: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20       pLvl->iOff 
9f90: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  = iOff;.    }els
9fa0: 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62  e{.      pLvl->b
9fb0: 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
9fc0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
9fd0: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  l->bEof;.}../*.*
9fe0: 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74  * Advance the it
9ff0: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
a000: 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65   the only argume
a010: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
a020: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
a030: 65 78 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a  extR(Fts5Index *
a040: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a050: 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76   *pIter, int iLv
a060: 6c 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c  l){.  Fts5DlidxL
a070: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65  vl *pLvl = &pIte
a080: 72 2d 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a  r->aLvl[iLvl];..
a090: 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70    assert( iLvl<p
a0a0: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20  Iter->nLvl );.  
a0b0: 69 66 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  if( fts5DlidxLvl
a0c0: 4e 65 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20  Next(pLvl) ){.  
a0d0: 20 20 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c    if( (iLvl+1) <
a0e0: 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a   pIter->nLvl ){.
a0f0: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
a100: 74 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65  terNextR(p, pIte
a110: 72 2c 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20  r, iLvl+1);.    
a120: 20 20 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45    if( pLvl[1].bE
a130: 6f 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  of==0 ){.       
a140: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
a150: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20  (pLvl->pData);. 
a160: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c         memset(pL
a170: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
a180: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
a190: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74        pLvl->pDat
a1a0: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
a1b0: 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  (p, .           
a1c0: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
a1d0: 44 28 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c  D(pIter->iSegid,
a1e0: 20 69 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69   iLvl, pLvl[1].i
a1f0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
a200: 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
a210: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66   pLvl->pData ) f
a220: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
a230: 70 4c 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pLvl);.      }. 
a240: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
a250: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
a260: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
a270: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
a280: 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
a290: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
a2a0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
a2b0: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
a2c0: 65 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72  erNextR(p, pIter
a2d0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , 0);.}../*.** T
a2e0: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
a2f0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
a300: 61 72 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65  argument has the
a310: 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64   following field
a320: 73 20 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c  s set.** as foll
a330: 6f 77 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ows. This functi
a340: 6f 6e 20 73 65 74 73 20 75 70 20 74 68 65 20 72  on sets up the r
a350: 65 73 74 20 6f 66 20 74 68 65 20 69 74 65 72 61  est of the itera
a360: 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a  tor so that it.*
a370: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
a380: 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74  first rowid in t
a390: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
a3a0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a  ..**.**   pData:
a3b0: 0a 2a 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20  .**     pointer 
a3c0: 74 6f 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  to doclist-index
a3d0: 20 72 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20   record, .**.** 
a3e0: 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
a3f0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74  on is called pIt
a400: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73  er->iLeafPgno is
a410: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
a420: 20 74 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20   the.** doclist 
a430: 69 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  is associated wi
a440: 74 68 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74  th (the one feat
a450: 75 72 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e  uring the term).
a460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a470: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
a480: 74 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  t(Fts5DlidxIter 
a490: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
a4a0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
a4b0: 49 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29  Iter->nLvl; i++)
a4c0: 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c  {.    fts5DlidxL
a4d0: 76 6c 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61  vlNext(&pIter->a
a4e0: 4c 76 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72  Lvl[i]);.  }.  r
a4f0: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
a500: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73  l[0].bEof;.}...s
a510: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a520: 69 64 78 49 74 65 72 45 6f 66 28 46 74 73 35 49  idxIterEof(Fts5I
a530: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
a540: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
a550: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d    return p->rc!=
a560: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74  SQLITE_OK || pIt
a570: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
a580: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
a590: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
a5a0: 73 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  st(Fts5Index *p,
a5b0: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
a5c0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pIter){.  int i;
a5d0: 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65  ..  /* Advance e
a5e0: 61 63 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65  ach level to the
a5f0: 20 6c 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74   last entry on t
a600: 68 65 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a  he last page */.
a610: 20 20 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e    for(i=pIter->n
a620: 4c 76 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51  Lvl-1; p->rc==SQ
a630: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b  LITE_OK && i>=0;
a640: 20 69 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44   i--){.    Fts5D
a650: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
a660: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b  &pIter->aLvl[i];
a670: 0a 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35  .    while( fts5
a680: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
a690: 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76  l)==0 );.    pLv
a6a0: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20  l->bEof = 0;..  
a6b0: 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20    if( i>0 ){.   
a6c0: 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20     Fts5DlidxLvl 
a6d0: 2a 70 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b  *pChild = &pLvl[
a6e0: 2d 31 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44  -1];.      fts5D
a6f0: 61 74 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c  ataRelease(pChil
a700: 64 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  d->pData);.     
a710: 20 6d 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20   memset(pChild, 
a720: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
a730: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
a740: 70 43 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20  pChild->pData = 
a750: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
a760: 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
a770: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
a780: 72 2d 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20  r->iSegid, i-1, 
a790: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  pLvl->iLeafPgno)
a7a0: 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
a7b0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76    }.}../*.** Mov
a7c0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  e the iterator p
a7d0: 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c  assed as the onl
a7e0: 79 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  y argument to th
a7f0: 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
a800: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a810: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
a820: 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70  (Fts5DlidxLvl *p
a830: 4c 76 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66  Lvl){.  int iOff
a840: 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a   = pLvl->iOff;..
a850: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
a860: 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28  bEof==0 );.  if(
a870: 20 69 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69   iOff<=pLvl->iFi
a880: 72 73 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c  rstOff ){.    pL
a890: 76 6c 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20  vl->bEof = 1;.  
a8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61  }else{.    u8 *a
a8b0: 20 3d 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e   = pLvl->pData->
a8c0: 70 3b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b  p;.    i64 iVal;
a8d0: 0a 20 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b  .    int iLimit;
a8e0: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20  .    int ii;.   
a8f0: 20 69 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a   int nZero = 0;.
a900: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
a910: 79 20 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f  y iOff points to
a920: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
a930: 6f 66 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69  of a varint. Thi
a940: 73 20 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20  s block .    ** 
a950: 64 65 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20  decrements iOff 
a960: 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
a970: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
a980: 65 20 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75  e of the previou
a990: 73 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74  s .    ** varint
a9a0: 2e 20 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f  . Taking care no
a9b0: 74 20 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65  t to read any me
a9c0: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74  mory locations t
a9d0: 68 61 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a  hat occur.    **
a9e0: 20 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66   before the buff
a9f0: 65 72 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a  er in memory.  *
aa00: 2f 0a 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28  /.    iLimit = (
aa10: 69 4f 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20  iOff>9 ? iOff-9 
aa20: 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f  : 0);.    for(iO
aa30: 66 66 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69  ff--; iOff>iLimi
aa40: 74 3b 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20  t; iOff--){.    
aa50: 20 20 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d    if( (a[iOff-1]
aa60: 20 26 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72   & 0x80)==0 ) br
aa70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
aa80: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
aa90: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
aaa0: 56 61 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  Val);.    pLvl->
aab0: 69 52 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a  iRowid -= iVal;.
aac0: 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50      pLvl->iLeafP
aad0: 67 6e 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53  gno--;..    /* S
aae0: 6b 69 70 20 62 61 63 6b 77 61 72 64 73 20 70 61  kip backwards pa
aaf0: 73 74 20 61 6e 79 20 30 78 30 30 20 76 61 72 69  st any 0x00 vari
ab00: 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  nts. */.    for(
ab10: 69 69 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70  ii=iOff-1; ii>=p
ab20: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26  Lvl->iFirstOff &
ab30: 26 20 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69  & a[ii]==0x00; i
ab40: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72  i--){.      nZer
ab50: 6f 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  o++;.    }.    i
ab60: 66 28 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69  f( ii>=pLvl->iFi
ab70: 72 73 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d  rstOff && (a[ii]
ab80: 20 26 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20   & 0x80) ){.    
ab90: 20 20 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d    /* The byte im
aba0: 6d 65 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65  mediately before
abb0: 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 62   the last 0x00 b
abc0: 79 74 65 20 68 61 73 20 74 68 65 20 30 78 38 30  yte has the 0x80
abd0: 20 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65   bit.      ** se
abe0: 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30  t. So the last 0
abf0: 78 30 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61  x00 is only a va
ac00: 72 69 6e 74 20 30 20 69 66 20 74 68 65 72 65 20  rint 0 if there 
ac10: 61 72 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a  are 8 more 0x80.
ac20: 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62        ** bytes b
ac30: 65 66 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a  efore a[ii]. */.
ac40: 20 20 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20        int bZero 
ac50: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ac60: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73    /* True if las
ac70: 74 20 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f  t 0x00 counts */
ac80: 0a 20 20 20 20 20 20 69 66 28 20 28 69 69 2d 38  .      if( (ii-8
ac90: 29 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  )>=pLvl->iFirstO
aca0: 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ff ){.        in
acb0: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t j;.        for
acc0: 28 6a 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61  (j=1; j<=8 && (a
acd0: 5b 69 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20  [ii-j] & 0x80); 
ace0: 6a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a  j++);.        bZ
acf0: 65 72 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20  ero = (j>8);.   
ad00: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62     }.      if( b
ad10: 5a 65 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d  Zero==0 ) nZero-
ad20: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76  -;.    }.    pLv
ad30: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20  l->iLeafPgno -= 
ad40: 6e 5a 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d  nZero;.    pLvl-
ad50: 3e 69 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e  >iOff = iOff - n
ad60: 5a 65 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Zero;.  }..  ret
ad70: 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a  urn pLvl->bEof;.
ad80: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  }..static int ft
ad90: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
ada0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
adb0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
adc0: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
add0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
ade0: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
adf0: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
ae00: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
ae10: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
ae20: 66 74 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76  fts5DlidxLvlPrev
ae30: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
ae40: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
ae50: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
ae60: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
ae70: 72 65 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69  revR(p, pIter, i
ae80: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
ae90: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
aea0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
aeb0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
aec0: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
aed0: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
aee0: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
aef0: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
af00: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
af10: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
af20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
af30: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
af40: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
af50: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
af60: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
af70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
af80: 6c 2d 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20  l->pData ){.    
af90: 20 20 20 20 20 20 77 68 69 6c 65 28 20 66 74 73        while( fts
afa0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
afb0: 76 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  vl)==0 );.      
afc0: 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d      pLvl->bEof =
afd0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
afe0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
aff0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b000: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
b010: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
b020: 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 46 74  DlidxIterPrev(Ft
b030: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b040: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b050: 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  ){.  return fts5
b060: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
b070: 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a  , pIter, 0);.}..
b080: 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63  /*.** Free a doc
b090: 6c 69 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61  list-index itera
b0a0: 74 6f 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63  tor object alloc
b0b0: 61 74 65 64 20 62 79 20 66 74 73 35 44 6c 69 64  ated by fts5Dlid
b0c0: 78 49 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a  xIterInit()..*/.
b0d0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
b0e0: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 46 74  DlidxIterFree(Ft
b0f0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
b100: 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
b110: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
b120: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
b130: 74 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b  ter->nLvl; i++){
b140: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
b150: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c  elease(pIter->aL
b160: 76 6c 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20  vl[i].pData);.  
b170: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b180: 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
b190: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
b1a0: 6c 69 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c  lidxIter *fts5Dl
b1b0: 69 64 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46  idxIterInit(.  F
b1c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b1e0: 2a 20 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74  * Fts5 Backend t
b1f0: 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
b200: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20   */.  int bRev, 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
b230: 72 20 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a  r ORDER BY ASC *
b240: 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  /.  int iSegid, 
b250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b260: 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69      /* Segment i
b270: 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  d */.  int iLeaf
b280: 50 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg              
b290: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
b2a0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f  age number to lo
b2b0: 61 64 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a  ad dlidx for */.
b2c0: 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
b2d0: 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20  er *pIter = 0;. 
b2e0: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44   int i;.  int bD
b2f0: 6f 6e 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  one = 0;..  for(
b300: 69 3d 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  i=0; p->rc==SQLI
b310: 54 45 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d  TE_OK && bDone==
b320: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  0; i++){.    int
b330: 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
b340: 46 74 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b  Fts5DlidxIter) +
b350: 20 69 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35   i * sizeof(Fts5
b360: 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46  DlidxLvl);.    F
b370: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e  ts5DlidxIter *pN
b380: 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20  ew;..    pNew = 
b390: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29  (Fts5DlidxIter*)
b3a0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
b3b0: 70 49 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20  pIter, nByte);. 
b3c0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
b3d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
b3e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
b3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
b400: 36 34 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35  64 iRowid = FTS5
b410: 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65  _DLIDX_ROWID(iSe
b420: 67 69 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29  gid, i, iLeafPg)
b430: 3b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  ;.      Fts5Dlid
b440: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e  xLvl *pLvl = &pN
b450: 65 77 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  ew->aLvl[i];.   
b460: 20 20 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b     pIter = pNew;
b470: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c  .      memset(pL
b480: 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
b490: 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
b4a0: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
b4b0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
b4c0: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
b4d0: 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61   if( pLvl->pData
b4e0: 20 26 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61   && (pLvl->pData
b4f0: 2d 3e 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29  ->p[0] & 0x0001)
b500: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
b510: 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  Done = 1;.      
b520: 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  }.      pIter->n
b530: 4c 76 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d  Lvl = i+1;.    }
b540: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
b550: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b560: 20 20 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69      pIter->iSegi
b570: 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
b580: 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
b590: 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
b5a0: 65 72 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a  erFirst(pIter);.
b5b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b5c0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61   fts5DlidxIterLa
b5d0: 73 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  st(p, pIter);.  
b5e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
b5f0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
b600: 29 7b 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78  ){.    fts5Dlidx
b610: 49 74 65 72 46 72 65 65 28 70 49 74 65 72 29 3b  IterFree(pIter);
b620: 0a 20 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a  .    pIter = 0;.
b630: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49    }..  return pI
b640: 74 65 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ter;.}..static i
b650: 36 34 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  64 fts5DlidxIter
b660: 52 6f 77 69 64 28 46 74 73 35 44 6c 69 64 78 49  Rowid(Fts5DlidxI
b670: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
b680: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
b690: 6c 5b 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73  l[0].iRowid;.}.s
b6a0: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
b6b0: 69 64 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35  idxIterPgno(Fts5
b6c0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b6d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  ){.  return pIte
b6e0: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66  r->aLvl[0].iLeaf
b6f0: 50 67 6e 6f 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  Pgno;.}..static 
b700: 76 6f 69 64 20 66 74 73 35 4c 65 61 66 48 65 61  void fts5LeafHea
b710: 64 65 72 28 46 74 73 35 44 61 74 61 20 2a 70 4c  der(Fts5Data *pL
b720: 65 61 66 2c 20 69 6e 74 20 2a 70 69 52 6f 77 69  eaf, int *piRowi
b730: 64 2c 20 69 6e 74 20 2a 70 69 54 65 72 6d 29 7b  d, int *piTerm){
b740: 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 28 69  .  *piRowid = (i
b750: 6e 74 29 66 74 73 35 47 65 74 55 31 36 28 26 70  nt)fts5GetU16(&p
b760: 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a  Leaf->p[0]);.  *
b770: 70 69 54 65 72 6d 20 3d 20 28 69 6e 74 29 66 74  piTerm = (int)ft
b780: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
b790: 3e 70 5b 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >p[2]);.}../*.**
b7a0: 20 4c 6f 61 64 20 74 68 65 20 6e 65 78 74 20 6c   Load the next l
b7b0: 65 61 66 20 70 61 67 65 20 69 6e 74 6f 20 74 68  eaf page into th
b7c0: 65 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74  e segment iterat
b7d0: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
b7e0: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
b7f0: 78 74 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  xtPage(.  Fts5In
b800: 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
b810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
b820: 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
b830: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
b840: 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
b850: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
b860: 72 20 74 6f 20 61 64 76 61 6e 63 65 20 74 6f 20  r to advance to 
b870: 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a  next page */.){.
b880: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
b890: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
b8a0: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74  Iter->pSeg;.  ft
b8b0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
b8c0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
b8d0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b  Iter->iLeafPgno+
b8e0: 2b 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  +;.  if( pIter->
b8f0: 70 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20  pNextLeaf ){.   
b900: 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
b910: 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d  iLeafPgno<=pSeg-
b920: 3e 70 67 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20  >pgnoLast );.   
b930: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
b940: 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
b950: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65  ;.    pIter->pNe
b960: 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65  xtLeaf = 0;.  }e
b970: 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69  lse if( pIter->i
b980: 4c 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e  LeafPgno<=pSeg->
b990: 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20  pgnoLast ){.    
b9a0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66  pIter->pLeaf = f
b9b0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a  ts5DataRead(p, .
b9c0: 20 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47          FTS5_SEG
b9d0: 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d  MENT_ROWID(pSeg-
b9e0: 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65  >iSegid, 0, pIte
b9f0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  r->iLeafPgno).  
ba00: 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    );.  }else{.  
ba10: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
ba20: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
ba30: 20 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e   Argument p poin
ba40: 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
ba50: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 76 61 72 69  ontaining a vari
ba60: 6e 74 20 74 6f 20 62 65 20 69 6e 74 65 72 70 72  nt to be interpr
ba70: 65 74 65 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73  eted as a.** pos
ba80: 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20  ition list size 
ba90: 66 69 65 6c 64 2e 20 52 65 61 64 20 74 68 65 20  field. Read the 
baa0: 76 61 72 69 6e 74 20 61 6e 64 20 72 65 74 75 72  varint and retur
bab0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
bac0: 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42  bytes.** read. B
bad0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c  efore returning,
bae0: 20 73 65 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68   set *pnSz to th
baf0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
bb00: 73 20 69 6e 20 74 68 65 20 70 6f 73 69 74 69 6f  s in the positio
bb10: 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a  n.** list, and *
bb20: 70 62 44 65 6c 20 74 6f 20 74 72 75 65 20 69 66  pbDel to true if
bb30: 20 74 68 65 20 64 65 6c 65 74 65 20 66 6c 61 67   the delete flag
bb40: 20 69 73 20 73 65 74 2c 20 6f 72 20 66 61 6c 73   is set, or fals
bb50: 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
bb60: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 47  static int fts5G
bb70: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f  etPoslistSize(co
bb80: 6e 73 74 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a  nst u8 *p, int *
bb90: 70 6e 53 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c  pnSz, int *pbDel
bba0: 29 7b 0a 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20  ){.  int nSz;.  
bbb0: 69 6e 74 20 6e 20 3d 20 66 74 73 35 47 65 74 56  int n = fts5GetV
bbc0: 61 72 69 6e 74 33 32 28 70 2c 20 6e 53 7a 29 3b  arint32(p, nSz);
bbd0: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
bbe0: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
bbf0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
bc00: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
bc10: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
bc20: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
bc30: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
bc40: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
bc50: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
bc60: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
bc70: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
bc80: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
bc90: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
bca0: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
bcb0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
bcc0: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
bcd0: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
bce0: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
bcf0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
bd00: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
bd10: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
bd20: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
bd30: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
bd40: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
bd50: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
bd60: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
bd70: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
bd80: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
bd90: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
bda0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
bdb0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bdc0: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
bdd0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
bde0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
bdf0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
be00: 0a 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  .    ASSERT_SZLE
be10: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
be20: 61 66 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66  af);.    if( iOf
be30: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
be40: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
be50: 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
be60: 52 52 55 50 54 3b 0a 20 20 20 20 7d 65 6c 73 65  RRUPT;.    }else
be70: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
be80: 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c   *a = &pIter->pL
be90: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 3b 0a 20 20  eaf->p[iOff];.  
bea0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
beb0: 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65  Offset += fts5Ge
bec0: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 61 2c 20  tPoslistSize(a, 
bed0: 26 70 49 74 65 72 2d 3e 6e 50 6f 73 2c 20 26 70  &pIter->nPos, &p
bee0: 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20 20 20  Iter->bDel);.   
bef0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
bf00: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
bf10: 72 4c 6f 61 64 52 6f 77 69 64 28 46 74 73 35 49  rLoadRowid(Fts5I
bf20: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
bf30: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
bf40: 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
bf50: 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20  Leaf->p;        
bf60: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61  /* Buffer to rea
bf70: 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20  d data from */. 
bf80: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
bf90: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
bfa0: 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  .  ASSERT_SZLEAF
bfb0: 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  _OK(pIter->pLeaf
bfc0: 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3e 3d 70  );.  if( iOff>=p
bfd0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
bfe0: 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 53  eaf ){.    fts5S
bff0: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
c000: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  , pIter);.    if
c010: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
c020: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
c030: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c040: 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
c050: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 72 65  ORRUPT;.      re
c060: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
c070: 69 4f 66 66 20 3d 20 34 3b 0a 20 20 20 20 61 20  iOff = 4;.    a 
c080: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c090: 70 3b 0a 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d  p;.  }.  iOff +=
c0a0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
c0b0: 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
c0c0: 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
c0d0: 6f 77 69 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e  owid);.  pIter->
c0e0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
c0f0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73  ff;.}../*.** Fts
c100: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
c110: 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20 70  fset currently p
c120: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
c130: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
c140: 2a 2a 20 22 6e 53 75 66 66 69 78 22 20 66 69 65  ** "nSuffix" fie
c150: 6c 64 20 6f 66 20 61 20 74 65 72 6d 2e 20 46 75  ld of a term. Fu
c160: 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72  nction parameter
c170: 20 6e 4b 65 65 70 20 63 6f 6e 74 61 69 6e 73 20   nKeep contains 
c180: 74 68 65 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20  the value.** of 
c190: 74 68 65 20 22 6e 50 72 65 66 69 78 22 20 66 69  the "nPrefix" fi
c1a0: 65 6c 64 20 28 69 66 20 74 68 65 72 65 20 77 61  eld (if there wa
c1b0: 73 20 6f 6e 65 20 2d 20 69 74 20 69 73 20 70 61  s one - it is pa
c1c0: 73 73 65 64 20 30 20 69 66 20 74 68 69 73 20 69  ssed 0 if this i
c1d0: 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74  s.** the first t
c1e0: 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65  erm in the segme
c1f0: 6e 74 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nt)..**.** This 
c200: 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
c210: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35  es:.**.**   Fts5
c220: 53 65 67 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20  SegIter.term.** 
c230: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f    Fts5SegIter.ro
c240: 77 69 64 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64  wid.**.** accord
c250: 69 6e 67 6c 79 20 61 6e 64 20 6c 65 61 76 65 73  ingly and leaves
c260: 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c   (Fts5SegIter.iL
c270: 65 61 66 4f 66 66 73 65 74 29 20 73 65 74 20 74  eafOffset) set t
c280: 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  o the content of
c290: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 70 6f  .** the first po
c2a0: 73 69 74 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65  sition list. The
c2b0: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 62   position list b
c2c0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75  elonging to docu
c2d0: 6d 65 6e 74 20 0a 2a 2a 20 28 46 74 73 35 53 65  ment .** (Fts5Se
c2e0: 67 49 74 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a  gIter.iRowid)..*
c2f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
c300: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
c310: 6d 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  m(Fts5Index *p, 
c320: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
c330: 65 72 2c 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a  er, int nKeep){.
c340: 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
c350: 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20 20 20  >pLeaf->p;      
c360: 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 72    /* Buffer to r
c370: 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f  ead data from */
c380: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49  .  int iOff = pI
c390: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c3a0: 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20  ;  /* Offset to 
c3b0: 72 65 61 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74  read at */.  int
c3c0: 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20   nNew;          
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c3e0: 42 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74  Bytes of new dat
c3f0: 61 20 2a 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20  a */..  iOff += 
c400: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
c410: 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b  &a[iOff], nNew);
c420: 0a 20 20 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e  .  pIter->term.n
c430: 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35   = nKeep;.  fts5
c440: 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
c450: 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
c460: 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b  >term, nNew, &a[
c470: 69 4f 66 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b  iOff]);.  iOff +
c480: 3d 20 6e 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d  = nNew;.  pIter-
c490: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
c4a0: 20 3d 20 69 4f 66 66 3b 0a 20 20 70 49 74 65 72   = iOff;.  pIter
c4b0: 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
c4c0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  = pIter->iLeafPg
c4d0: 6e 6f 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  no;.  pIter->iLe
c4e0: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
c4f0: 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ..  fts5SegIterL
c500: 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65  oadRowid(p, pIte
c510: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69  r);.}../*.** Ini
c520: 74 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72  tialize the iter
c530: 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65  ator object pIte
c540: 72 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  r to iterate thr
c550: 6f 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73  ough the entries
c560: 20 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70   in.** segment p
c570: 53 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f  Seg. The iterato
c580: 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
c590: 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ng to the first 
c5a0: 65 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74  entry when .** t
c5b0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
c5c0: 75 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  urns..**.** If a
c5d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
c5e0: 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20  Fts5Index.rc is 
c5f0: 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70  set to an approp
c600: 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
c610: 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
c620: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
c630: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
c640: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
c650: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
c660: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
c670: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e  id fts5SegIterIn
c680: 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
c690: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
c6a0: 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64        /* FTS ind
c6b0: 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  ex object */.  F
c6c0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
c6d0: 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
c6e0: 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
c6f0: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
c700: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c720: 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
c730: 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ate */.){.  if( 
c740: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
c750: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
c760: 73 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65  s happens if the
c770: 20 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e   segment is bein
c780: 67 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70  g used as an inp
c790: 75 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65  ut to an increme
c7a0: 6e 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67  ntal.    ** merg
c7b0: 65 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68  e and all data h
c7c0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
c7d0: 22 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66  "trimmed". See f
c7e0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66  unction.    ** f
c7f0: 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
c800: 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49  ) for details. I
c810: 6e 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76  n this case leav
c820: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65  e the iterator e
c830: 6d 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65  mpty..    ** The
c840: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65   caller will see
c850: 20 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65   the (pIter->pLe
c860: 61 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d  af==0) and assum
c870: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  e the iterator i
c880: 73 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20  s.    ** at EOF 
c890: 61 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20  already. */.    
c8a0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
c8b0: 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Leaf==0 );.    r
c8c0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
c8d0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
c8e0: 4f 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  OK ){.    memset
c8f0: 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
c900: 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20  f(*pIter));.    
c910: 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
c920: 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  eg;.    pIter->i
c930: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d  LeafPgno = pSeg-
c940: 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20  >pgnoFirst-1;.  
c950: 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
c960: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
c970: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
c980: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c990: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65      u8 *a = pIte
c9a0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20  r->pLeaf->p;.   
c9b0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c9c0: 73 65 74 20 3d 20 66 74 73 35 47 65 74 55 31 36  set = fts5GetU16
c9d0: 28 26 61 5b 70 49 74 65 72 2d 3e 70 4c 65 61 66  (&a[pIter->pLeaf
c9e0: 2d 3e 73 7a 4c 65 61 66 5d 29 3b 0a 20 20 20 20  ->szLeaf]);.    
c9f0: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69  assert( pIter->i
ca00: 4c 65 61 66 4f 66 66 73 65 74 3d 3d 34 20 29 3b  LeafOffset==4 );
ca10: 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
ca20: 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65  LoadTerm(p, pIte
ca30: 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53  r, 0);.    fts5S
ca40: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
ca50: 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  , pIter);.  }.}.
ca60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
ca70: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
ca80: 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72  r called on iter
ca90: 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62 79  ators created by
caa0: 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73   calls to.** Fts
cab0: 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77 69  5IndexQuery() wi
cac0: 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45 58  th the FTS5INDEX
cad0: 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67  _QUERY_DESC flag
cae0: 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   set..**.** The 
caf0: 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61  iterator is in a
cb00: 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20  n unusual state 
cb10: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
cb20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68  on is called: th
cb30: 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72  e.** Fts5SegIter
cb40: 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72  .iLeafOffset var
cb50: 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  iable is set to 
cb60: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
cb70: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68  e start of.** th
cb80: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
cb90: 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74  size field for t
cba0: 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e  he first relevan
cbb0: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
cbc0: 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49  age..** Fts5SegI
cbd0: 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74  ter.rowid is set
cbe0: 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62  , but nPos and b
cbf0: 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a  Del are not..**.
cc00: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
cc10: 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69 74   advances the it
cc20: 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69  erator so that i
cc30: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
cc40: 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e  last .** relevan
cc50: 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  t rowid on the p
cc60: 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  age and, if nece
cc70: 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a  ssary, initializ
cc80: 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69  es the .** aRowi
cc90: 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52  dOffset[] and iR
cca0: 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69 61  owidOffset varia
ccb0: 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f  bles. At this po
ccc0: 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  int the iterator
ccd0: 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65  .** is in its re
cce0: 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74  gular state - Ft
ccf0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
cd00: 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20  ffset points to 
cd10: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74  the first.** byt
cd20: 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  e of the positio
cd30: 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61  n list content a
cd40: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 73  ssociated with s
cd50: 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74  aid rowid..*/.st
cd60: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
cd70: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
cd80: 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Page(Fts5Index *
cd90: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
cda0: 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  pIter){.  int n 
cdb0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
cdc0: 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20  szLeaf;.  int i 
cdd0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
cde0: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
cdf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
ce00: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
ce10: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 41 53 53 45  set = 0;..  ASSE
ce20: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
ce30: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68  er->pLeaf);.  wh
ce40: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
ce50: 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20  4 iDelta = 0;.  
ce60: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
ce70: 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20  int bDummy;..   
ce80: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73   i += fts5GetPos
ce90: 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20  listSize(&a[i], 
cea0: 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b  &nPos, &bDummy);
ceb0: 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a  .    i += nPos;.
cec0: 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62      if( i>=n ) b
ced0: 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66  reak;.    i += f
cee0: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b  ts5GetVarint(&a[
cef0: 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  i], (u64*)&iDelt
cf00: 61 29 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c  a);.    if( iDel
cf10: 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
cf20: 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64     pIter->iRowid
cf30: 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20   += iDelta;..   
cf40: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65   if( iRowidOffse
cf50: 74 3e 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64  t>=pIter->nRowid
cf60: 4f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20  Offset ){.      
cf70: 69 6e 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72  int nNew = pIter
cf80: 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b  ->nRowidOffset +
cf90: 20 38 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61   8;.      int *a
cfa0: 4e 65 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69  New = (int*)sqli
cfb0: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
cfc0: 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c  r->aRowidOffset,
cfd0: 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74   nNew*sizeof(int
cfe0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e  ));.      if( aN
cff0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ew==0 ){.       
d000: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
d010: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62  NOMEM;.        b
d020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
d030: 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69      pIter->aRowi
d040: 64 4f 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a  dOffset = aNew;.
d050: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f        pIter->nRo
d060: 77 69 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77  widOffset = nNew
d070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
d080: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
d090: 5b 69 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d  [iRowidOffset++]
d0a0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
d0b0: 66 66 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72  ffset;.    pIter
d0c0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d0d0: 69 3b 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e  i;.  }.  pIter->
d0e0: 69 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69  iRowidOffset = i
d0f0: 52 6f 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66  RowidOffset;.  f
d100: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
d110: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  os(p, pIter);.}.
d120: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
d130: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
d140: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
d150: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d160: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d170: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
d180: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
d190: 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
d1a0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
d1b0: 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  ter->flags & FTS
d1c0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
d1d0: 4d 20 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61  M );..  fts5Data
d1e0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
d1f0: 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e  Leaf);.  pIter->
d200: 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69  pLeaf = 0;.  whi
d210: 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
d220: 45 5f 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69  E_OK && pIter->i
d230: 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
d240: 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b  iTermLeafPgno ){
d250: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
d260: 4e 65 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  New;.    pIter->
d270: 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20  iLeafPgno--;.   
d280: 20 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61   pNew = fts5Data
d290: 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47  Read(p, FTS5_SEG
d2a0: 4d 45 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20  MENT_ROWID(.    
d2b0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65        pIter->pSe
d2c0: 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49  g->iSegid, 0, pI
d2d0: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20  ter->iLeafPgno. 
d2e0: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
d2f0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28  New ){.      if(
d300: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
d310: 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  o==pIter->iTermL
d320: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
d330: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54     if( pIter->iT
d340: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e  ermLeafOffset<pN
d350: 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  ew->szLeaf ){.  
d360: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
d370: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
d380: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d390: 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65  eafOffset = pIte
d3a0: 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  r->iTermLeafOffs
d3b0: 65 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  et;.        }.  
d3c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d3d0: 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
d3e0: 2c 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20  , dummy;.       
d3f0: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
d400: 70 4e 65 77 2c 20 26 69 52 6f 77 69 64 4f 66 66  pNew, &iRowidOff
d410: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  , &dummy);.     
d420: 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
d430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
d440: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
d450: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
d460: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d470: 3d 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20  = iRowidOff;.   
d480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
d490: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
d4a0: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  >pLeaf ){.      
d4b0: 20 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72    u8 *a = &pIter
d4c0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72  ->pLeaf->p[pIter
d4d0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a  ->iLeafOffset];.
d4e0: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
d4f0: 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74  LeafOffset += ft
d500: 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28  s5GetVarint(a, (
d510: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
d520: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  wid);.        br
d530: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
d540: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
d550: 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b  taRelease(pNew);
d560: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d570: 20 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d   }..  if( pIter-
d580: 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74  >pLeaf ){.    ft
d590: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
d5a0: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
d5b0: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
d5c0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
d5d0: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
d5e0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
d5f0: 64 20 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65  d argument curre
d600: 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  ntly.** points t
d610: 6f 20 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65  o a delete marke
d620: 72 2e 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b  r. A delete mark
d630: 65 72 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77  er is an entry w
d640: 69 74 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20  ith a 0 byte.** 
d650: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a  position-list..*
d660: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
d670: 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
d680: 79 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  y(Fts5Index *p, 
d690: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
d6a0: 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
d6b0: 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
d6c0: 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
d6d0: 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
d6e0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d  t];.  return (p-
d6f0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
d700: 26 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26  & pSeg->pLeaf &&
d710: 20 70 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b   pSeg->nPos==0);
d720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63  .}../*.** Advanc
d730: 65 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72  e iterator pIter
d740: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74   to the next ent
d750: 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ry. .**.** If an
d760: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d770: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d780: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d790: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d7a0: 20 49 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63   It .** is not c
d7b0: 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72  onsidered an err
d7c0: 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74  or if the iterat
d7d0: 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20  or reaches EOF. 
d7e0: 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
d7f0: 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
d800: 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66  rred when this f
d810: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d820: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
d830: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d840: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
d850: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
d860: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d870: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
d880: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
d890: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
d8a0: 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
d8b0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
d8c0: 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20  dvance */.  int 
d8d0: 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20  *pbNewTerm      
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
d8f0: 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20  UT: Set for new 
d900: 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  term */.){.  ass
d910: 65 72 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d  ert( pbNewTerm==
d920: 30 20 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d  0 || *pbNewTerm=
d930: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  =0 );.  if( p->r
d940: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d950: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66      if( pIter->f
d960: 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49  lags & FTS5_SEGI
d970: 54 45 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20  TER_REVERSE ){. 
d980: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74       assert( pIt
d990: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  er->pNextLeaf==0
d9a0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49   );.      if( pI
d9b0: 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65  ter->iRowidOffse
d9c0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  t>0 ){.        u
d9d0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
d9e0: 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20  eaf->p;.        
d9f0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
da00: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
da10: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
da20: 20 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c          i64 iDel
da30: 74 61 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74  ta;..        pIt
da40: 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74  er->iRowidOffset
da50: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  --;.        pIte
da60: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
da70: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61   iOff = pIter->a
da80: 52 6f 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65  RowidOffset[pIte
da90: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d  r->iRowidOffset]
daa0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
dab0: 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
dac0: 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26  Size(&a[iOff], &
dad0: 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
dae0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
daf0: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 66 74  nPos;.        ft
db00: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
db10: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  Off], (u64*)&iDe
db20: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49  lta);.        pI
db30: 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69  ter->iRowid -= i
db40: 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 66  Delta;.        f
db50: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
db60: 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
db70: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
db80: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
db90: 76 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20  verseNewPage(p, 
dba0: 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
dbb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
dbc0: 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
dbd0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b   = pIter->pLeaf;
dbe0: 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
dbf0: 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54  .      int bNewT
dc00: 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  erm = 0;.      i
dc10: 6e 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20  nt nKeep = 0;.. 
dc20: 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66       /* Search f
dc30: 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  or the end of th
dc40: 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
dc50: 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72 65  within the curre
dc60: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
dc70: 20 20 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d    u8 *a = pLeaf-
dc80: 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
dc90: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b  = pLeaf->szLeaf;
dca0: 0a 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53  ..      ASSERT_S
dcb0: 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b  ZLEAF_OK(pLeaf);
dcc0: 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49  .      iOff = pI
dcd0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dce0: 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a   + pIter->nPos;.
dcf0: 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c  .      if( iOff<
dd00: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  n ){.        /* 
dd10: 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69  The next entry i
dd20: 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s on the current
dd30: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
dd40: 20 75 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20   u64 iDelta;.   
dd50: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
dd60: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
dd70: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 26 69 44 65  t(&a[iOff], &iDe
dd80: 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49  lta);.        pI
dd90: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
dda0: 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
ddb0: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
ddc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65 77  {.          bNew
ddd0: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
dde0: 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 6e 20      if( iOff>=n 
ddf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  ){.            f
de00: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
de10: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
de20: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
de30: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 34  >iLeafOffset = 4
de40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
de50: 65 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35  e if( iOff!=fts5
de60: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
de70: 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  (pLeaf) ){.     
de80: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
de90: 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73  eafOffset += fts
dea0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
deb0: 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20  iOff], nKeep);. 
dec0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ded0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
dee0: 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
def0: 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
df00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
df10: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70 53  se if( pIter->pS
df20: 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  eg==0 ){.       
df30: 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74   const u8 *pList
df40: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 6f   = 0;.        co
df50: 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20  nst char *zTerm 
df60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
df70: 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20   nList = 0;.    
df80: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65      if( 0==(pIte
df90: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
dfa0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
dfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
dfc0: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
dfd0: 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b  nNext(p->pHash);
dfe0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
dff0: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
e000: 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a  try(p->pHash, &z
e010: 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
e020: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
e030: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69  .        if( pLi
e040: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
e050: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
e060: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
e070: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e080: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
e090: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e0a0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e0b0: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
e0c0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ist;.          p
e0d0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
e0e0: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = nList;.       
e0f0: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e100: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
e110: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e120: 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28  e3Fts5BufferSet(
e130: 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
e140: 74 65 72 6d 2c 20 73 74 72 6c 65 6e 28 7a 54 65  term, strlen(zTe
e150: 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72 6d 29  rm), (u8*)zTerm)
e160: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e170: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
e180: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
e190: 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74  List, (u64*)&pIt
e1a0: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
e1b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
e1c0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66  se{.        iOff
e1d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
e1e0: 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e   Next entry is n
e1f0: 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  ot on the curren
e200: 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  t page */.      
e210: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
e220: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
e230: 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
e240: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
e250: 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70         pLeaf = p
e260: 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20  Iter->pLeaf;.   
e270: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
e280: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
e290: 20 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a         ASSERT_SZ
e2a0: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
e2b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 69            if( (i
e2c0: 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
e2d0: 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20  (&pLeaf->p[0])) 
e2e0: 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73  && iOff<pLeaf->s
e2f0: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
e300: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
e310: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
e320: 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  t(&pLeaf->p[iOff
e330: 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  ], (u64*)&pIter-
e340: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
e350: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
e360: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
e370: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e380: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20         else if( 
e390: 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d  pLeaf->nn>pLeaf-
e3a0: 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
e3b0: 20 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74         iOff = ft
e3c0: 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
e3d0: 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  >p[pLeaf->szLeaf
e3e0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
e3f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
e400: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
e410: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
e420: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
e430: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
e440: 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
e450: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
e460: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
e470: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
e480: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
e490: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e4a0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e4b0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
e4c0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77   iterator is now
e4d0: 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20   at EOF. If so, 
e4e0: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
e4f0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e500: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
e510: 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
e520: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e530: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
e540: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
e550: 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  TERM ){.        
e560: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
e570: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
e580: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e590: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e5a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e5b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
e5c0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
e5d0: 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65  m(p, pIter, nKee
e5e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
e5f0: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e600: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
e610: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
e620: 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65  bNewTerm ) *pbNe
e630: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
e640: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e660: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e670: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
e680: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e690: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64  .    }.  }.}..#d
e6a0: 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c  efine SWAPVAL(T,
e6b0: 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20   a, b) { T tmp; 
e6c0: 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d  tmp=a; a=b; b=tm
e6d0: 70 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  p; }../*.** Iter
e6e0: 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
e6f0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
e700: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
e710: 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69  n a doclist. Thi
e720: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65  s.** function se
e730: 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ts the iterator 
e740: 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61  up so that itera
e750: 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  tes in reverse o
e760: 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rder through.** 
e770: 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  the doclist..*/.
e780: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e790: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46  SegIterReverse(F
e7a0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
e7b0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
e7c0: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
e7d0: 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
e7e0: 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73  r->pDlidx;.  Fts
e7f0: 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30  5Data *pLast = 0
e800: 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
e810: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c   = 0;..  if( pDl
e820: 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  idx ){.    int i
e830: 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70  Segid = pIter->p
e840: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
e850: 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35   pgnoLast = fts5
e860: 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
e870: 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74  lidx);.    pLast
e880: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
e890: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
e8a0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c  ROWID(iSegid, 0,
e8b0: 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d   pgnoLast));.  }
e8c0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 4f  else{.    int iO
e8d0: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
e8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8f0: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
e900: 20 77 69 74 68 69 6e 20 70 4c 65 61 66 20 2a 2f   within pLeaf */
e910: 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
e920: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
e930: 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eaf;         /* 
e940: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
e950: 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72  a */..    /* Cur
e960: 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49  rently, Fts5SegI
e970: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
e980: 28 61 6e 64 20 69 4f 66 66 29 20 70 6f 69 6e 74  (and iOff) point
e990: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 0a  s to the first .
e9a0: 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 66 20 70      ** byte of p
e9b0: 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63 6f 6e  osition-list con
e9c0: 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63 75 72  tent for the cur
e9d0: 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61 63 6b  rent rowid. Back
e9e0: 20 69 74 20 75 70 0a 20 20 20 20 2a 2a 20 73 6f   it up.    ** so
e9f0: 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
ea00: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
ea10: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
ea20: 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 2a 2f  t size field. */
ea30: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
ea40: 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c 69 74  fOffset -= sqlit
ea50: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 4c  e3Fts5GetVarintL
ea60: 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73 2a 32  en(pIter->nPos*2
ea70: 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b 0a 20  +pIter->bDel);. 
ea80: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
ea90: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
eaa0: 20 20 61 73 73 65 72 74 28 20 69 4f 66 66 3e 3d    assert( iOff>=
eab0: 34 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 61  4 );..    /* Sea
eac0: 72 63 68 20 66 6f 72 20 61 20 6e 65 77 20 74 65  rch for a new te
ead0: 72 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 75  rm within the cu
eae0: 72 72 65 6e 74 20 6c 65 61 66 2e 20 49 66 20 6f  rrent leaf. If o
eaf0: 6e 65 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c  ne can be found,
eb00: 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 69  .    ** then thi
eb10: 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  s page contains 
eb20: 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69  the largest rowi
eb30: 64 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  d for the curren
eb40: 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 77  t term. */.    w
eb50: 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c 65 61 66  hile( iOff<pLeaf
eb60: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
eb70: 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
eb80: 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20 20    i64 iDelta;.  
eb90: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
eba0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74  .      /* Read t
ebb0: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
ebc0: 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 20   size field */. 
ebd0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
ebe0: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
ebf0: 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
ec00: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
ec10: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
ec20: 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 66 28 20  nPos;.      if( 
ec30: 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c  iOff>=pLeaf->szL
ec40: 65 61 66 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  eaf ) break;..  
ec50: 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 64 65 6c      /* Rowid del
ec60: 74 61 2e 20 4f 72 2c 20 69 66 20 30 78 30 30 2c  ta. Or, if 0x00,
ec70: 20 74 68 65 20 65 6e 64 20 6f 66 20 64 6f 63 6c   the end of docl
ec80: 69 73 74 20 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20  ist marker. */. 
ec90: 20 20 20 20 20 6e 50 6f 73 20 3d 20 66 74 73 35       nPos = fts5
eca0: 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
ecb0: 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a  ->p[iOff], (u64*
ecc0: 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  )&iDelta);.     
ecd0: 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30 20 29   if( iDelta==0 )
ece0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 4f   break;.      iO
ecf0: 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20  ff += nPos;.    
ed00: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  }..    /* If thi
ed10: 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74  s condition is t
ed20: 72 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72  rue then the lar
ed30: 67 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74  gest rowid for t
ed40: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a  he current.    *
ed50: 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62  * term may not b
ed60: 65 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20  e stored on the 
ed70: 63 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f  current page. So
ed80: 20 73 65 61 72 63 68 20 66 6f 72 77 61 72 64 20   search forward 
ed90: 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68  to.    ** see wh
eda0: 65 72 65 20 73 61 69 64 20 72 6f 77 69 64 20 72  ere said rowid r
edb0: 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20  eally is.  */.  
edc0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61    if( iOff>=pLea
edd0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
ede0: 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20     int pgno;.   
edf0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
ee00: 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
ee10: 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20  pIter->pSeg;..  
ee20: 20 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20      /* The last 
ee30: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
ee40: 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20  list may not be 
ee50: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
ee60: 61 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20  age. Search.    
ee70: 20 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20    ** forward to 
ee80: 66 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f  find the page co
ee90: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73  ntaining the las
eea0: 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20  t rowid.  */.   
eeb0: 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65     for(pgno=pIte
eec0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20  r->iLeafPgno+1; 
eed0: 21 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d  !p->rc && pgno<=
eee0: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20  pSeg->pgnoLast; 
eef0: 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pgno++){.       
ef00: 20 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35   i64 iAbs = FTS5
ef10: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
ef20: 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20  Seg->iSegid, 0, 
ef30: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46  pgno);.        F
ef40: 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20  ts5Data *pNew = 
ef50: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
ef60: 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iAbs);.        i
ef70: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
ef80: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c       int iRowid,
ef90: 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20   bTermless;.    
efa0: 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66        iRowid = f
efb0: 74 73 35 47 65 74 55 31 36 28 70 4e 65 77 2d 3e  ts5GetU16(pNew->
efc0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 54  p);.          bT
efd0: 65 72 6d 6c 65 73 73 20 3d 20 66 74 73 35 4c 65  ermless = fts5Le
efe0: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4e 65  afIsTermless(pNe
eff0: 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  w);.          if
f000: 28 20 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ( iRowid ){.    
f010: 20 20 20 20 20 20 20 20 53 57 41 50 56 41 4c 28          SWAPVAL(
f020: 46 74 73 35 44 61 74 61 2a 2c 20 70 4e 65 77 2c  Fts5Data*, pNew,
f030: 20 70 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20   pLast);.       
f040: 20 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20       pgnoLast = 
f050: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20  pgno;.          
f060: 7d 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  }.          fts5
f070: 44 61 74 61 52 65 6c 65 61 73 65 28 70 4e 65 77  DataRelease(pNew
f080: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
f090: 20 62 54 65 72 6d 6c 65 73 73 3d 3d 30 20 29 20   bTermless==0 ) 
f0a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f0b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f0c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4c 61 73   }..  /* If pLas
f0d0: 74 20 69 73 20 4e 55 4c 4c 20 61 74 20 74 68 69  t is NULL at thi
f0e0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68  s point, then th
f0f0: 65 20 6c 61 73 74 20 72 6f 77 69 64 20 66 6f 72  e last rowid for
f100: 20 74 68 69 73 20 64 6f 63 6c 69 73 74 0a 20 20   this doclist.  
f110: 2a 2a 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  ** lies on the p
f120: 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  age currently in
f130: 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20 69  dicated by the i
f140: 74 65 72 61 74 6f 72 2e 20 49 6e 20 74 68 69 73  terator. In this
f150: 20 63 61 73 65 20 0a 20 20 2a 2a 20 70 49 74 65   case .  ** pIte
f160: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 69  r->iLeafOffset i
f170: 73 20 61 6c 72 65 61 64 79 20 73 65 74 20 74 6f  s already set to
f180: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 6f   point to the po
f190: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
f1a0: 0a 20 20 2a 2a 20 66 69 65 6c 64 20 61 73 73 6f  .  ** field asso
f1b0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
f1c0: 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20 72  first relevant r
f1d0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
f1e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4f 72 2c 20  ..  **.  ** Or, 
f1f0: 69 66 20 70 4c 61 73 74 20 69 73 20 6e 6f 6e 2d  if pLast is non-
f200: 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69 73  NULL, then it is
f210: 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 63   the page that c
f220: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 61 73 74  ontains the last
f230: 0a 20 20 2a 2a 20 72 6f 77 69 64 2e 20 49 6e 20  .  ** rowid. In 
f240: 74 68 69 73 20 63 61 73 65 20 63 6f 6e 66 69 67  this case config
f250: 75 72 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ure the iterator
f260: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
f270: 74 73 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66  ts to the.  ** f
f280: 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68  irst rowid on th
f290: 69 73 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  is page..  */.  
f2a0: 69 66 28 20 70 4c 61 73 74 20 29 7b 0a 20 20 20  if( pLast ){.   
f2b0: 20 69 6e 74 20 64 75 6d 6d 79 3b 0a 20 20 20 20   int dummy;.    
f2c0: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 74  int iOff;.    ft
f2d0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
f2e0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
f2f0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
f300: 70 4c 61 73 74 3b 0a 20 20 20 20 70 49 74 65 72  pLast;.    pIter
f310: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 67  ->iLeafPgno = pg
f320: 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 66 74 73 35  noLast;.    fts5
f330: 4c 65 61 66 48 65 61 64 65 72 28 70 4c 61 73 74  LeafHeader(pLast
f340: 2c 20 26 69 4f 66 66 2c 20 26 64 75 6d 6d 79 29  , &iOff, &dummy)
f350: 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
f360: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 61  s5GetVarint(&pLa
f370: 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  st->p[iOff], (u6
f380: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
f390: 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  d);.    pIter->i
f3a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
f3b0: 66 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65  f;.  }..  fts5Se
f3c0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
f3d0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
f3e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
f3f0: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
f400: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
f410: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61  first rowid of a
f420: 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65   doclist..** The
f430: 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
f440: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
f450: 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
f460: 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72  term on the curr
f470: 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66  ent .** page. If
f480: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
f490: 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65  m is the last te
f4a0: 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  rm on the page, 
f4b0: 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63  load the .** doc
f4c0: 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20  list-index from 
f4d0: 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c  disk and initial
f4e0: 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ize an iterator 
f4f0: 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64  at (pIter->pDlid
f500: 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x)..*/.static vo
f510: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
f520: 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  adDlidx(Fts5Inde
f530: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
f540: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
f550: 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70   iSeg = pIter->p
f560: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69  Seg->iSegid;.  i
f570: 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
f580: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f590: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
f5a0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
f5b0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
f5c0: 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65  f; /* Current le
f5d0: 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73  af data */..  as
f5e0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
f5f0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f600: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
f610: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
f620: 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lidx==0 );..  /*
f630: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75   Check if the cu
f640: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e  rrent doclist en
f650: 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ds on this page.
f660: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74   If it does, ret
f670: 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77  urn.  ** early w
f680: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74  ithout loading t
f690: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
f6a0: 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20   (as it belongs 
f6b0: 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20  to a different. 
f6c0: 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69   ** term. */.  i
f6d0: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
f6e0: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
f6f0: 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
f700: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65   int iOff = pIte
f710: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
f720: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20   pIter->nPos;.  
f730: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 70 4c    while( iOff<pL
f740: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
f750: 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
f760: 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  .      int nPos;
f770: 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
f780: 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 4f 66  a;..      /* iOf
f790: 66 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  f is currently t
f7a0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
f7b0: 20 73 74 61 72 74 20 6f 66 20 70 6f 73 69 74 69   start of positi
f7c0: 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  on list data */.
f7d0: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
f7e0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
f7f0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
f800: 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
f810: 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
f820: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
f830: 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66   assert_nc( iOff
f840: 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  <pLeaf->szLeaf )
f850: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
f860: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
f870: 7a 65 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  ze(&pLeaf->p[iOf
f880: 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
f890: 6d 79 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  my);.      iOff 
f8a0: 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 20  += nPos;.    }. 
f8b0: 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c   }..  pIter->pDl
f8c0: 69 64 78 20 3d 20 66 74 73 35 44 6c 69 64 78 49  idx = fts5DlidxI
f8d0: 74 65 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c  terInit(p, bRev,
f8e0: 20 69 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54   iSeg, pIter->iT
f8f0: 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a  ermLeafPgno);.}.
f900: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e 64  .#define fts5Ind
f910: 65 78 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c  exGetVarint32(a,
f920: 20 69 4f 66 66 2c 20 6e 56 61 6c 29 20 7b 20 20   iOff, nVal) {  
f930: 20 20 20 5c 0a 20 20 6e 56 61 6c 20 3d 20 61 5b     \.  nVal = a[
f940: 69 4f 66 66 2b 2b 5d 3b 20 20 20 20 20 20 20 20  iOff++];        
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f960: 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 6e         \.  if( n
f970: 56 61 6c 20 26 20 30 78 38 30 20 29 7b 20 20 20  Val & 0x80 ){   
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
f9a0: 20 69 4f 66 66 2d 2d 3b 20 20 20 20 20 20 20 20   iOff--;        
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
f9d0: 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  .    iOff += fts
f9e0: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
f9f0: 69 4f 66 66 5d 2c 20 6e 56 61 6c 29 3b 20 20 20  iOff], nVal);   
fa00: 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20 20     \.  }        
fa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa30: 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65 66         \.}..#def
fa40: 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b 69  ine fts5IndexSki
fa50: 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66 29  pVarint(a, iOff)
fa60: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a   {            \.
fa70: 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f 66    int iEnd = iOf
fa80: 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20 20  f+9;            
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
faa0: 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61 5b    \.  while( (a[
fab0: 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29 20  iOff++] & 0x80) 
fac0: 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b 20  && iOff<iEnd ); 
fad0: 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
fae0: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   The iterator ob
faf0: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
fb00: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
fb10: 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  nt currently con
fb20: 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69  tains.** no vali
fb30: 64 20 76 61 6c 75 65 73 20 65 78 63 65 70 74 20  d values except 
fb40: 66 6f 72 20 74 68 65 20 46 74 73 35 53 65 67 49  for the Fts5SegI
fb50: 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65 72  ter.pLeaf member
fb60: 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73 0a   variable. This.
fb70: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61 72  ** function sear
fb80: 63 68 65 73 20 74 68 65 20 6c 65 61 66 20 70 61  ches the leaf pa
fb90: 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d 61  ge for a term ma
fba0: 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e 54  tching (pTerm/nT
fbb0: 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  erm)..**.** If t
fbc0: 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
fbd0: 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74 68  m is found on th
fbe0: 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  e page, then the
fbf0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66   iterator is lef
fc00: 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f  t.** pointing to
fc10: 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e 74   it. If argument
fc20: 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e 64   bGe is zero and
fc30: 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f 74   the term is not
fc40: 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20 69   found,.** the i
fc50: 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20  terator is left 
fc60: 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46 2e  pointing at EOF.
fc70: 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69 73  .**.** If bGe is
fc80: 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
fc90: 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72 6d  e specified term
fca0: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
fcb0: 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72 61  hen the.** itera
fcc0: 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
fcd0: 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61 6c  ting to the smal
fce0: 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  lest term in the
fcf0: 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a 2a   segment that.**
fd00: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
fd10: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
fd20: 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69 73  rm, even if this
fd30: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e 20   term is not on 
fd40: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
fd50: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
fd60: 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65 65 6b  oid fts5LeafSeek
fd70: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
fd80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fd90: 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e 79      /* Leave any
fda0: 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72 65   error code here
fdb0: 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20 20   */.  int bGe,  
fdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdd0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
fde0: 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a 2f  r a >= search */
fdf0: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
fe00: 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
fe10: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
fe20: 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73  o seek */.  cons
fe30: 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
fe40: 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 54   nTerm      /* T
fe50: 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66 6f  erm to search fo
fe60: 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 4f  r */.){.  int iO
fe70: 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ff;.  const u8 *
fe80: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
fe90: 2d 3e 70 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ->p;.  int n = p
fea0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
feb0: 65 61 66 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74  eaf;..  int nMat
fec0: 63 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b  ch = 0;.  int nK
fed0: 65 65 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  eep = 0;.  int n
fee0: 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  New = 0;.  int i
fef0: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Term = 0;.  int 
ff00: 6e 50 67 54 65 72 6d 20 3d 20 28 70 49 74 65 72  nPgTerm = (pIter
ff10: 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 2d 20 70 49  ->pLeaf->nn - pI
ff20: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
ff30: 61 66 29 20 3e 3e 20 31 3b 0a 0a 20 20 61 73 73  af) >> 1;..  ass
ff40: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
ff50: 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72  TE_OK );.  asser
ff60: 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  t( pIter->pLeaf 
ff70: 29 3b 0a 0a 20 20 69 4f 66 66 20 3d 20 66 74 73  );..  iOff = fts
ff80: 35 47 65 74 55 31 36 28 26 61 5b 6e 5d 29 3b 0a  5GetU16(&a[n]);.
ff90: 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20    if( iOff<4 || 
ffa0: 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 70  iOff>=n ){.    p
ffb0: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
ffc0: 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  UPT;.    return;
ffd0: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31  .  }..  while( 1
ffe0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
fff0: 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 0a 20 20     int nCmp;..  
10000 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
10010 68 6f 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74  how many new byt
10020 65 73 20 61 72 65 20 69 6e 20 74 68 69 73 20 74  es are in this t
10030 65 72 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 49  erm */.    fts5I
10040 6e 64 65 78 47 65 74 56 61 72 69 6e 74 33 32 28  ndexGetVarint32(
10050 61 2c 20 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a  a, iOff, nNew);.
10060 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3c 6e  .    if( nKeep<n
10070 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 67  Match ){.      g
10080 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
10090 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  d;.    }..    as
100a0 73 65 72 74 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61  sert( nKeep>=nMa
100b0 74 63 68 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  tch );.    if( n
100c0 4b 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a  Keep==nMatch ){.
100d0 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e        nCmp = MIN
100e0 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e 4d 61  (nNew, nTerm-nMa
100f0 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tch);.      for(
10100 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69 2b 2b  i=0; i<nCmp; i++
10110 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
10120 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72 6d 5b  [iOff+i]!=pTerm[
10130 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72 65 61  nMatch+i] ) brea
10140 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
10150 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a 0a 20   nMatch += i;.. 
10160 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3d 3d       if( nTerm==
10170 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  nMatch ){.      
10180 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b    if( i==nNew ){
10190 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
101a0 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3b 0a  search_success;.
101b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
101c0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65           goto se
101d0 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20  arch_failed;.   
101e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
101f0 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26  se if( i<nNew &&
10200 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d   a[iOff+i]>pTerm
10210 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20 20 20  [nMatch] ){.    
10220 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
10230 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a  failed;.      }.
10240 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 2b      }.    iOff +
10250 3d 20 6e 4e 65 77 3b 0a 0a 23 69 66 20 30 0a 20  = nNew;..#if 0. 
10260 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 73 74 20     /* Skip past 
10270 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 49 66 20  the doclist. If 
10280 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
10290 61 67 65 20 69 73 20 72 65 61 63 68 65 64 2c 20  age is reached, 
102a0 62 61 69 6c 20 6f 75 74 2e 20 2a 2f 0a 20 20 20  bail out. */.   
102b0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
102c0 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 0a 20 20     int nPos;..  
102d0 20 20 20 20 2f 2a 20 53 6b 69 70 20 70 61 73 74      /* Skip past
102e0 20 72 6f 77 69 64 20 64 65 6c 74 61 20 2a 2f 0a   rowid delta */.
102f0 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 53        fts5IndexS
10300 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66  kipVarint(a, iOf
10310 66 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 6b  f);..      /* Sk
10320 69 70 20 70 61 73 74 20 70 6f 73 69 74 69 6f 6e  ip past position
10330 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 66   list */.      f
10340 74 73 35 49 6e 64 65 78 47 65 74 56 61 72 69 6e  ts5IndexGetVarin
10350 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 50 6f  t32(a, iOff, nPo
10360 73 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  s);.      iOff +
10370 3d 20 28 6e 50 6f 73 20 3e 3e 20 31 29 3b 0a 20  = (nPos >> 1);. 
10380 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 28       if( iOff>=(
10390 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-1) ){.        
103a0 69 4f 66 66 20 3d 20 6e 3b 0a 20 20 20 20 20 20  iOff = n;.      
103b0 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
103c0 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  iled;.      }.. 
103d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
103e0 69 73 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  is the end of th
103f0 65 20 64 6f 63 6c 69 73 74 2c 20 62 72 65 61 6b  e doclist, break
10400 20 6f 75 74 20 6f 66 20 74 68 65 20 6c 6f 6f 70   out of the loop
10410 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 61 5b   */.      if( a[
10420 69 4f 66 66 5d 3d 3d 30 78 30 30 20 29 7b 0a 20  iOff]==0x00 ){. 
10430 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
10440 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
10450 20 20 20 20 7d 0a 20 20 20 20 7d 3b 0a 0a 20 20      }.    };..  
10460 20 20 69 54 65 72 6d 2b 2b 3b 0a 20 20 20 20 61    iTerm++;.    a
10470 73 73 65 72 74 28 20 69 54 65 72 6d 3c 6e 50 67  ssert( iTerm<nPg
10480 54 65 72 6d 20 29 3b 0a 20 20 20 20 61 73 73 65  Term );.    asse
10490 72 74 28 20 69 4f 66 66 3d 3d 66 74 73 35 47 65  rt( iOff==fts5Ge
104a0 74 55 31 36 28 26 61 5b 6e 20 2b 20 69 54 65 72  tU16(&a[n + iTer
104b0 6d 2a 32 5d 29 20 29 3b 0a 0a 23 65 6c 73 65 0a  m*2]) );..#else.
104c0 20 20 20 20 69 54 65 72 6d 2b 2b 3b 0a 20 20 20      iTerm++;.   
104d0 20 69 66 28 20 69 54 65 72 6d 3e 3d 6e 50 67 54   if( iTerm>=nPgT
104e0 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  erm ){.      iOf
104f0 66 20 3d 20 6e 3b 0a 20 20 20 20 20 20 62 72 65  f = n;.      bre
10500 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  ak;.    }.    iO
10510 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
10520 26 61 5b 6e 20 2b 20 69 54 65 72 6d 2a 32 5d 29  &a[n + iTerm*2])
10530 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
10540 20 52 65 61 64 20 74 68 65 20 6e 4b 65 65 70 20   Read the nKeep 
10550 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6e 65 78  field of the nex
10560 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66  t term. */.    f
10570 74 73 35 49 6e 64 65 78 47 65 74 56 61 72 69 6e  ts5IndexGetVarin
10580 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65  t32(a, iOff, nKe
10590 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63  ep);.  }.. searc
105a0 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20  h_failed:.  if( 
105b0 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  bGe==0 ){.    ft
105c0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
105d0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
105e0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
105f0 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  0;.    return;. 
10600 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66 66 3e   }else if( iOff>
10610 3d 6e 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  =n ){.    do {. 
10620 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10630 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
10640 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  r);.      if( pI
10650 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
10660 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20  return;.      a 
10670 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
10680 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  p;.      if( fts
10690 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
106a0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30  pIter->pLeaf)==0
106b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
106c0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
106d0 54 65 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70  TermOff(pIter->p
106e0 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 69  Leaf);.        i
106f0 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66  f( iOff<4 || iOf
10700 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
10710 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
10720 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
10730 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
10740 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10750 20 20 20 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20      nKeep = 0;. 
10760 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
10770 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
10780 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77 29  (&a[iOff], nNew)
10790 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
107a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
107b0 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
107c0 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61 72   1 );.  }.. sear
107d0 63 68 5f 73 75 63 63 65 73 73 3a 0a 20 20 70 49  ch_success:.  pI
107e0 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
107f0 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77 3b 0a   = iOff + nNew;.
10800 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65    pIter->iTermLe
10810 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72  afOffset = pIter
10820 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20  ->iLeafOffset;. 
10830 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
10840 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
10850 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66 74 73  LeafPgno;..  fts
10860 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72  5BufferSet(&p->r
10870 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
10880 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29 3b 0a   nKeep, pTerm);.
10890 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
108a0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
108b0 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
108c0 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 0a 20  w, &a[iOff]);.. 
108d0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
108e0 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
108f0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
10900 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
10910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
10920 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
10930 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
10940 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
10950 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
10960 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74  nt.** pSeg. If t
10970 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
10980 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
10990 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  x, the iterator 
109a0 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
109b0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
109c0 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
109d0 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
109e0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
109f0 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
10a00 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
10a10 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
10a20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
10a30 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
10a40 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
10a50 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10a60 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
10a70 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
10aa0 6e 64 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  nd */.  Fts5Buff
10ab0 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
10ac0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
10ad0 72 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 61  r to use for loa
10ae0 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
10af0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
10b00 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
10b10 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
10b20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
10b30 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
10b40 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
10b50 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
10b60 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
10b70 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
10b80 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
10b90 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
10ba0 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
10bb0 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
10bc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
10bd0 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
10be0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67   */.){.  int iPg
10bf0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20   = 1;.  int bGe 
10c00 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
10c10 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
10c20 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
10c30 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10c40 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
10c50 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
10c60 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74  t-index */..  st
10c70 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d  atic int nCall =
10c80 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a   0;.  nCall++;..
10c90 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
10ca0 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
10cb0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
10cc0 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
10cd0 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
10ce0 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
10cf0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
10d00 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
10d10 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
10d20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
10d30 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
10d40 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
10d50 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
10d60 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
10d70 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
10d80 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
10d90 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
10da0 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
10db0 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  if( p->pIdxSelec
10dc0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  t==0 ){.    Fts5
10dd0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
10de0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
10df0 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
10e00 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
10e10 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65  dxSelect, sqlite
10e20 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
10e30 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e       "SELECT pgn
10e40 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  o FROM '%q'.'%q_
10e50 69 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20  idx' WHERE ".   
10e60 20 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20         "segid=? 
10e70 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45  AND term<=? ORDE
10e80 52 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c  R BY term DESC L
10e90 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20  IMIT 1",.       
10ea0 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
10eb0 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
10ec0 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66      ));.  }.  if
10ed0 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
10ee0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
10ef0 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  _int(p->pIdxSele
10f00 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65  ct, 1, pSeg->iSe
10f10 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  gid);.  sqlite3_
10f20 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64  bind_blob(p->pId
10f30 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72  xSelect, 2, pTer
10f40 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45  m, nTerm, SQLITE
10f50 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
10f60 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
10f70 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
10f80 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
10f90 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33  64 val = sqlite3
10fa0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70  _column_int(p->p
10fb0 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
10fc0 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
10fd0 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
10fe0 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
10ff0 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
11000 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
11010 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b  (p->pIdxSelect);
11020 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67  ..  if( iPg<pSeg
11030 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20  ->pgnoFirst ){. 
11040 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70     iPg = pSeg->p
11050 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44  gnoFirst;.    bD
11060 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lidx = 0;.  }.. 
11070 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
11080 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66  o = iPg - 1;.  f
11090 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
110a0 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  ge(p, pIter);.. 
110b0 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
110c0 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61  f ){.    fts5Lea
110d0 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49  fSeek(p, bGe, pI
110e0 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  ter, pTerm, nTer
110f0 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  m);.  }..  if( p
11100 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
11110 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  && bGe==0 ){.   
11120 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11130 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
11140 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
11150 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
11160 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
11170 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
11180 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
11190 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
111a0 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
111b0 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  VERSE;.      }. 
111c0 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20       if( bDlidx 
111d0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
111e0 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
111f0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11200 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61   }.      if( fla
11210 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11220 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
11230 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11240 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72  Reverse(p, pIter
11250 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11260 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
11270 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  r:.  **.  **   1
11280 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  ) an error has o
11290 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a  ccurred, or.  **
112a0 20 20 20 32 29 20 74 68 65 20 69 74 65 72 61 74     2) the iterat
112b0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
112c0 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20 74  , or.  **   3) t
112d0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
112e0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77  ts to an entry w
112f0 69 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ith term (pTerm/
11300 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20  nTerm), or.  ** 
11310 20 20 34 29 20 74 68 65 20 46 54 53 35 49 4e 44    4) the FTS5IND
11320 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66 6c  EX_QUERY_SCAN fl
11330 61 67 20 77 61 73 20 73 65 74 20 61 6e 64 20 74  ag was set and t
11340 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
11350 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  ts.  **      to 
11360 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
11370 74 65 72 6d 20 67 72 65 61 74 65 72 20 74 68 61  term greater tha
11380 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28 70  n or equal to (p
11390 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a  Term/nTerm)..  *
113a0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  /.  assert( p->r
113b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  c!=SQLITE_OK    
113c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
113e0 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20        /* 1 */.  
113f0 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   || pIter->pLeaf
11400 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20    /* 2 */.   || 
11440 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
11450 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65  eBlob(&pIter->te
11460 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, pTerm, nTerm
11470 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f 2a  )==0          /*
11480 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65   3 */.   || (bGe
11490 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
114a0 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
114b0 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
114c0 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a  Term)>0)  /* 4 *
114d0 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  /.  );.}../*.** 
114e0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
114f0 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
11500 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
11510 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
11520 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
11530 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
11540 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
11550 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73   term in the has
11560 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a  h-table, the .**
11570 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74   iterator is set
11580 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   to EOF..**.** I
11590 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
115a0 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
115b0 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
115c0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
115d0 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
115e0 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
115f0 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
11600 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11610 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
11620 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11630 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
11640 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73  rHashInit(.  Fts
11650 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11670 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  FTS5 backend */.
11680 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
11690 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
116a0 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
116b0 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
116c0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
116d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
116e0 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
116f0 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
11700 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
11710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11720 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
11730 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ate */.){.  cons
11740 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
11750 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30  .  int nList = 0
11760 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20  ;.  const u8 *z 
11770 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  = 0;.  int n = 0
11780 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
11790 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72  pHash );.  asser
117a0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
117b0 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  _OK );..  if( pT
117c0 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  erm==0 || (flags
117d0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
117e0 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20  RY_SCAN) ){.    
117f0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
11800 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
11810 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
11820 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
11830 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  erm);.    sqlite
11840 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
11850 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  ry(p->pHash, (co
11860 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26  nst char**)&z, &
11870 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
11880 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 73 74 72      n = (z ? str
11890 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a  len((const char*
118a0 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73  )z) : 0);.  }els
118b0 65 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  e{.    pIter->fl
118c0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
118d0 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20  TER_ONETERM;.   
118e0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
118f0 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Query(p->pHash, 
11900 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65  (const char*)pTe
11910 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73  rm, nTerm, &pLis
11920 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
11930 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e  z = pTerm;.    n
11940 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20   = nTerm;.  }.. 
11950 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
11960 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
11970 66 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  f;.    sqlite3Ft
11980 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
11990 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
119a0 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65  , n, z);.    pLe
119b0 61 66 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  af = fts5IdxMall
119c0 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
119d0 35 44 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28  5Data));.    if(
119e0 20 70 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75   pLeaf==0 ) retu
119f0 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70  rn;.    pLeaf->p
11a00 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20   = (u8*)pList;. 
11a10 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70     pLeaf->nn = p
11a20 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e  Leaf->szLeaf = n
11a30 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d  List;.    pIter-
11a40 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a  >pLeaf = pLeaf;.
11a50 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
11a60 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65 74  Offset = fts5Get
11a70 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c  Varint(pLeaf->p,
11a80 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
11a90 52 6f 77 69 64 29 3b 0a 0a 20 20 20 20 69 66 28  Rowid);..    if(
11aa0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
11ab0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
11ac0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c  .      pIter->fl
11ad0 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49  ags |= FTS5_SEGI
11ae0 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20  TER_REVERSE;.   
11af0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65     fts5SegIterRe
11b00 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c  verseInitPage(p,
11b10 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c   pIter);.    }el
11b20 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  se{.      fts5Se
11b30 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
11b40 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20   pIter);.    }. 
11b50 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f   }.}../*.** Zero
11b60 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
11b70 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
11b80 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
11b90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
11ba0 67 49 74 65 72 43 6c 65 61 72 28 46 74 73 35 53  gIterClear(Fts5S
11bb0 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
11bc0 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
11bd0 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a  (&pIter->term);.
11be0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
11bf0 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
11c00 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61  .  fts5DataRelea
11c10 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c  se(pIter->pNextL
11c20 65 61 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64  eaf);.  fts5Dlid
11c30 78 49 74 65 72 46 72 65 65 28 70 49 74 65 72 2d  xIterFree(pIter-
11c40 3e 70 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69  >pDlidx);.  sqli
11c50 74 65 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e  te3_free(pIter->
11c60 61 52 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20  aRowidOffset);. 
11c70 20 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30   memset(pIter, 0
11c80 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
11c90 49 74 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65  Iter));.}..#ifde
11ca0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a  f SQLITE_DEBUG..
11cb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
11cc0 69 6f 6e 20 69 73 20 75 73 65 64 20 61 73 20 70  ion is used as p
11cd0 61 72 74 20 6f 66 20 74 68 65 20 62 69 67 20 61  art of the big a
11ce0 73 73 65 72 74 28 29 20 70 72 6f 63 65 64 75 72  ssert() procedur
11cf0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  e implemented by
11d00 0a 2a 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75  .** fts5AssertMu
11d10 6c 74 69 49 74 65 72 53 65 74 75 70 28 29 2e 20  ltiIterSetup(). 
11d20 49 74 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  It ensures that 
11d30 74 68 65 20 72 65 73 75 6c 74 20 63 75 72 72 65  the result curre
11d40 6e 74 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69  ntly stored.** i
11d50 6e 20 2a 70 52 65 73 20 69 73 20 74 68 65 20 63  n *pRes is the c
11d60 6f 72 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66  orrect result of
11d70 20 63 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63   comparing the c
11d80 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73  urrent positions
11d90 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69   of the.** two i
11da0 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61  terators..*/.sta
11db0 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73  tic void fts5Ass
11dc0 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73  ertComparisonRes
11dd0 75 6c 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ult(.  Fts5Index
11de0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
11df0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 2c  Fts5SegIter *p1,
11e00 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
11e10 70 32 2c 0a 20 20 46 74 73 35 43 52 65 73 75 6c  p2,.  Fts5CResul
11e20 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74  t *pRes.){.  int
11e30 20 69 31 20 3d 20 70 31 20 2d 20 70 49 74 65 72   i1 = p1 - pIter
11e40 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74 20 69 32  ->aSeg;.  int i2
11e50 20 3d 20 70 32 20 2d 20 70 49 74 65 72 2d 3e 61   = p2 - pIter->a
11e60 53 65 67 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e  Seg;..  if( p1->
11e70 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65  pLeaf || p2->pLe
11e80 61 66 20 29 7b 0a 20 20 20 20 69 66 28 20 70 31  af ){.    if( p1
11e90 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
11ea0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
11eb0 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a  ->iFirst==i2 );.
11ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32      }else if( p2
11ed0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
11ee0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
11ef0 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a  ->iFirst==i1 );.
11f00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11f10 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28   int nMin = MIN(
11f20 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e  p1->term.n, p2->
11f30 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69  term.n);.      i
11f40 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28  nt res = memcmp(
11f50 70 31 2d 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e  p1->term.p, p2->
11f60 74 65 72 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20  term.p, nMin);. 
11f70 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
11f80 29 20 72 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d  ) res = p1->term
11f90 2e 6e 20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b  .n - p2->term.n;
11fa0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d  ..      if( res=
11fb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =0 ){.        as
11fc0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
11fd0 6d 45 71 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  mEq==1 );.      
11fe0 20 20 61 73 73 65 72 74 28 20 70 31 2d 3e 69 52    assert( p1->iR
11ff0 6f 77 69 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64  owid!=p2->iRowid
12000 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20   );.        res 
12010 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e  = ((p1->iRowid >
12020 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49   p2->iRowid)==pI
12030 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20  ter->bRev) ? -1 
12040 3a 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 1;.      }else
12050 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
12060 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
12070 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
12080 20 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29       if( res<0 )
12090 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
120a0 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
120b0 69 31 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  i1 );.      }els
120c0 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
120d0 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
120e0 3d 69 32 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  =i2 );.      }. 
120f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
12100 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12110 69 73 20 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73  is a no-op unles
12120 73 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 69  s SQLITE_DEBUG i
12130 73 20 64 65 66 69 6e 65 64 20 77 68 65 6e 20 74  s defined when t
12140 68 69 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73  his module.** is
12150 20 63 6f 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68   compiled. In th
12160 61 74 20 63 61 73 65 2c 20 74 68 69 73 20 66 75  at case, this fu
12170 6e 63 74 69 6f 6e 20 69 73 20 65 73 73 65 6e 74  nction is essent
12180 69 61 6c 6c 79 20 61 6e 20 61 73 73 65 72 74 28  ially an assert(
12190 29 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  ) .** statement 
121a0 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 74  used to verify t
121b0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
121c0 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
121d0 46 69 72 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a  First[] array.**
121e0 20 61 72 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f   are correct..*/
121f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
12200 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72  5AssertMultiIter
12210 53 65 74 75 70 28 46 74 73 35 49 6e 64 65 78 20  Setup(Fts5Index 
12220 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65  *p, Fts5IndexIte
12230 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
12240 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12250 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
12260 49 74 65 72 20 2a 70 46 69 72 73 74 20 3d 20 26  Iter *pFirst = &
12270 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
12280 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
12290 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20  irst ];.    int 
122a0 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  i;..    assert( 
122b0 28 70 46 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d  (pFirst->pLeaf==
122c0 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20  0)==pIter->bEof 
122d0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
122e0 20 74 68 61 74 20 70 49 74 65 72 2d 3e 69 53 77   that pIter->iSw
122f0 69 74 63 68 52 6f 77 69 64 20 69 73 20 73 65 74  itchRowid is set
12300 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20   correctly. */. 
12310 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
12320 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
12330 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
12340 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
12350 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20  >aSeg[i];.      
12360 61 73 73 65 72 74 28 20 70 31 3d 3d 70 46 69 72  assert( p1==pFir
12370 73 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c  st .           |
12380 7c 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a  | p1->pLeaf==0 .
12390 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 66 74             || ft
123a0 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28  s5BufferCompare(
123b0 26 70 46 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26  &pFirst->term, &
123c0 70 31 2d 3e 74 65 72 6d 29 20 0a 20 20 20 20 20  p1->term) .     
123d0 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f        || p1->iRo
123e0 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
123f0 74 63 68 52 6f 77 69 64 0a 20 20 20 20 20 20 20  tchRowid.       
12400 20 20 20 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77      || (p1->iRow
12410 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63  id<pIter->iSwitc
12420 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  hRowid)==pIter->
12430 62 52 65 76 0a 20 20 20 20 20 20 29 3b 0a 20 20  bRev.      );.  
12440 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30    }..    for(i=0
12450 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
12460 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20 46 74   i+=2){.      Ft
12470 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
12480 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
12490 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
124a0 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72 2d  er *p2 = &pIter-
124b0 3e 61 53 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  >aSeg[i+1];.    
124c0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
124d0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
124e0 69 72 73 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65  irst[(pIter->nSe
124f0 67 20 2b 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20  g + i) / 2];.   
12500 20 20 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d     fts5AssertCom
12510 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 70 49  parisonResult(pI
12520 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70 52 65  ter, p1, p2, pRe
12530 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  s);.    }..    f
12540 6f 72 28 69 3d 31 3b 20 69 3c 28 70 49 74 65 72  or(i=1; i<(pIter
12550 2d 3e 6e 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d  ->nSeg / 2); i+=
12560 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65  2){.      Fts5Se
12570 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74  gIter *p1 = &pIt
12580 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
12590 3e 61 46 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69  >aFirst[i*2].iFi
125a0 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
125b0 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
125c0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
125d0 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31  er->aFirst[i*2+1
125e0 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20  ].iFirst ];.    
125f0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
12600 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
12610 69 72 73 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66  irst[i];.      f
12620 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
12630 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c  sonResult(pIter,
12640 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a   p1, p2, pRes);.
12650 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
12660 65 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 41  e.# define fts5A
12670 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
12680 74 75 70 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a  tup(x,y).#endif.
12690 0a 2f 2a 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f  ./*.** Do the co
126a0 6d 70 61 72 69 73 6f 6e 20 6e 65 63 65 73 73 61  mparison necessa
126b0 72 79 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 70  ry to populate p
126c0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
126d0 74 5d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  t]..**.** If the
126e0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
126f0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
12700 6e 20 69 74 20 69 73 20 74 68 65 20 69 6e 64 65  n it is the inde
12710 78 20 6f 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a  x of an entry.**
12720 20 69 6e 20 74 68 65 20 70 49 74 65 72 2d 3e 61   in the pIter->a
12730 53 65 67 5b 5d 20 61 72 72 61 79 20 74 68 61 74  Seg[] array that
12740 20 69 73 20 28 61 29 20 6e 6f 74 20 61 74 20 45   is (a) not at E
12750 4f 46 2c 20 61 6e 64 20 28 62 29 20 70 6f 69 6e  OF, and (b) poin
12760 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79  ting.** to a key
12770 20 74 68 61 74 20 69 73 20 61 20 64 75 70 6c 69   that is a dupli
12780 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c  cate of another,
12790 20 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79   higher priority
127a0 2c 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74  , .** segment-it
127b0 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 70 53  erator in the pS
127c0 65 67 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61 79  eg->aSeg[] array
127d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
127e0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43  fts5MultiIterDoC
127f0 6f 6d 70 61 72 65 28 46 74 73 35 49 6e 64 65 78  ompare(Fts5Index
12800 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
12810 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 31   iOut){.  int i1
12820 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
12840 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20  ex of left-hand 
12850 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
12860 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20 20 20   int i2;        
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12880 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67   /* Index of rig
12890 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
128a0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65  ter */.  int iRe
128b0 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  s;.  Fts5SegIter
128c0 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20 20 20   *p1;           
128d0 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e       /* Left-han
128e0 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
128f0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
12900 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
12910 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64     /* Right-hand
12920 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a   Fts5SegIter */.
12930 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
12940 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
12950 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61  irst[iOut];..  a
12960 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49 74 65  ssert( iOut<pIte
12970 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75 74 3e  r->nSeg && iOut>
12980 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
12990 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c  Iter->bRev==0 ||
129a0 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20   pIter->bRev==1 
129b0 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d  );..  if( iOut>=
129c0 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20  (pIter->nSeg/2) 
129d0 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69 4f 75  ){.    i1 = (iOu
129e0 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f  t - pIter->nSeg/
129f0 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d  2) * 2;.    i2 =
12a00 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65   i1 + 1;.  }else
12a10 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74 65 72  {.    i1 = pIter
12a20 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d  ->aFirst[iOut*2]
12a30 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69 32 20  .iFirst;.    i2 
12a40 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
12a50 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74  iOut*2+1].iFirst
12a60 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26 70 49  ;.  }.  p1 = &pI
12a70 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20  ter->aSeg[i1];. 
12a80 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53   p2 = &pIter->aS
12a90 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d  eg[i2];..  pRes-
12aa0 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20  >bTermEq = 0;.  
12ab0 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30  if( p1->pLeaf==0
12ac0 20 29 7b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   ){           /*
12ad0 20 49 66 20 70 31 20 69 73 20 61 74 20 45 4f 46   If p1 is at EOF
12ae0 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
12af0 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  2;.  }else if( p
12b00 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  2->pLeaf==0 ){  
12b10 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73 20 61     /* If p2 is a
12b20 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65  t EOF */.    iRe
12b30 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b  s = i1;.  }else{
12b40 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 66  .    int res = f
12b50 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65  ts5BufferCompare
12b60 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d  (&p1->term, &p2-
12b70 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66 28 20  >term);.    if( 
12b80 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
12b90 61 73 73 65 72 74 28 20 69 32 3e 69 31 20 29 3b  assert( i2>i1 );
12ba0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
12bb0 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 52  2!=0 );.      pR
12bc0 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b  es->bTermEq = 1;
12bd0 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e 69  .      if( p1->i
12be0 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69  Rowid==p2->iRowi
12bf0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 31 2d  d ){.        p1-
12c00 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c  >bDel = p2->bDel
12c10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
12c20 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i2;.      }.   
12c30 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
12c40 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77  Rowid > p2->iRow
12c50 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
12c60 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20  ) ? -1 : +1;.   
12c70 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
12c80 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  es!=0 );.    if(
12c90 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20   res<0 ){.      
12ca0 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d  iRes = i1;.    }
12cb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52 65 73  else{.      iRes
12cc0 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   = i2;.    }.  }
12cd0 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74  ..  pRes->iFirst
12ce0 20 3d 20 69 52 65 73 3b 0a 20 20 72 65 74 75 72   = iRes;.  retur
12cf0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  n 0;.}../*.** Mo
12d00 76 65 20 74 68 65 20 73 65 67 2d 69 74 65 72 20  ve the seg-iter 
12d10 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
12d20 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
12d30 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69 4c 65  owid on page iLe
12d40 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73  afPgno..** It is
12d50 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c 65 61   an error if lea
12d60 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73  f iLeafPgno does
12d70 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
12d80 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73  ntains no rowids
12d90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12da0 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74 6f   fts5SegIterGoto
12db0 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  Page(.  Fts5Inde
12dc0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
12dd0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
12de0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
12df0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
12e00 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
12e10 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
12e20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20  to advance */.  
12e30 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b  int iLeafPgno.){
12e40 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65 61 66  .  assert( iLeaf
12e50 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61  Pgno>pIter->iLea
12e60 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20  fPgno );..  if( 
12e70 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d  iLeafPgno>pIter-
12e80 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
12e90 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46  ){.    p->rc = F
12ea0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  TS5_CORRUPT;.  }
12eb0 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 44 61  else{.    fts5Da
12ec0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
12ed0 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 20  >pNextLeaf);.   
12ee0 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
12ef0 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74 65 72  f = 0;.    pIter
12f00 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c  ->iLeafPgno = iL
12f10 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66  eafPgno-1;.    f
12f20 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
12f30 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
12f40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
12f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49  =SQLITE_OK || pI
12f60 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d  ter->iLeafPgno==
12f70 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
12f80 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
12f90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12fa0 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
12fb0 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70  u8 *a = pIter->p
12fc0 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
12fd0 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
12fe0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20  eaf->szLeaf;..  
12ff0 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47      iOff = fts5G
13000 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20  etU16(&a[0]);.  
13010 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c      if( iOff<4 |
13020 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20  | iOff>=n ){.   
13030 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
13040 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
13050 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13060 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
13070 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20  arint(&a[iOff], 
13080 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52  (u64*)&pIter->iR
13090 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70  owid);.        p
130a0 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
130b0 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
130c0 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61    fts5SegIterLoa
130d0 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b  dNPos(p, pIter);
130e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
130f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61   }.}../*.** Adva
13100 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
13110 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
13120 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75  econd argument u
13130 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72  ntil it is at or
13140 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20   .** past rowid 
13150 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73  iFrom. Regardles
13160 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f  s of the value o
13170 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65  f iFrom, the ite
13180 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61  rator is.** alwa
13190 79 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c  ys advanced at l
131a0 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74  east once..*/.st
131b0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
131c0 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20  gIterNextFrom(. 
131d0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131f0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
13200 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
13210 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
13220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13230 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
13240 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61  nce */.  i64 iMa
13250 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20  tch             
13260 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
13270 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20  nce iterator at 
13280 6c 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a  least this far *
13290 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20  /.){.  int bRev 
132a0 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  = (pIter->flags 
132b0 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
132c0 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44  EVERSE);.  Fts5D
132d0 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
132e0 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78   = pIter->pDlidx
132f0 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  ;.  int iLeafPgn
13300 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  o = pIter->iLeaf
13310 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76  Pgno;.  int bMov
13320 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  e = 1;..  assert
13330 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26  ( pIter->flags &
13340 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
13350 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72  ETERM );.  asser
13360 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  t( pIter->pDlidx
13370 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
13380 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  ter->pLeaf );.. 
13390 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a   if( bRev==0 ){.
133a0 20 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35      while( !fts5
133b0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
133c0 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63  pDlidx) && iMatc
133d0 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52  h>fts5DlidxIterR
133e0 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a  owid(pDlidx) ){.
133f0 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20        iLeafPgno 
13400 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
13410 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
13420 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
13430 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b  Next(p, pDlidx);
13440 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
13450 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e  t_nc( iLeafPgno>
13460 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
13470 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20  o || p->rc );.  
13480 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
13490 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
134a0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
134b0 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c  gIterGotoPage(p,
134c0 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e   pIter, iLeafPgn
134d0 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20  o);.      bMove 
134e0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
134f0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
13500 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
13510 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
13520 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d  t( iMatch<pIter-
13530 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77  >iRowid );.    w
13540 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78  hile( !fts5Dlidx
13550 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
13560 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73  x) && iMatch<fts
13570 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
13580 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20  pDlidx) ){.     
13590 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72   fts5DlidxIterPr
135a0 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20  ev(p, pDlidx);. 
135b0 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67     }.    iLeafPg
135c0 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
135d0 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
135e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73  .    assert( fts
135f0 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
13600 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61   pDlidx) || iLea
13610 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c  fPgno<=pIter->iL
13620 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20  eafPgno );..    
13630 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49  if( iLeafPgno<pI
13640 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
13650 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
13660 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
13670 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74  Pgno+1;.      ft
13680 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
13690 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
136a0 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
136b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
136c0 20 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f   do{.    if( bMo
136d0 76 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72  ve ) fts5SegIter
136e0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
136f0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
13700 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ->pLeaf==0 ) bre
13710 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
13720 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  ==0 && pIter->iR
13730 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
13740 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
13750 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev!=0 && pIter->
13760 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
13770 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76   break;.    bMov
13780 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28  e = 1;.  }while(
13790 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
137a0 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  K );.}.../*.** F
137b0 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ree the iterator
137c0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
137d0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
137e0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
137f0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
13800 74 65 72 46 72 65 65 28 46 74 73 35 49 6e 64 65  terFree(Fts5Inde
13810 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49  x *p, Fts5IndexI
13820 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
13830 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20  f( pIter ){.    
13840 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
13850 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65  =0; i<pIter->nSe
13860 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66  g; i++){.      f
13870 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28  ts5SegIterClear(
13880 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29  &pIter->aSeg[i])
13890 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
138a0 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
138b0 28 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29  (pIter->pStruct)
138c0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
138d0 46 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73  Free(&pIter->pos
138e0 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  list);.    sqlit
138f0 65 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a  e3_free(pIter);.
13900 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
13910 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
13920 41 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35  Advanced(.  Fts5
13930 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
13940 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13950 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
13960 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
13970 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
13980 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
13990 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
139a0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
139b0 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
139c0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20   int iChanged,  
139d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139e0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
139f0 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
13a00 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74  dvanced */.  int
13a10 20 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20   iMinset        
13a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13a30 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e  Minimum entry in
13a40 20 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74   aFirst[] to set
13a50 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
13a60 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
13a70 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
13a80 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20  ; i>=iMinset && 
13a90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13aa0 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e  ; i=i/2){.    in
13ab0 74 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28  t iEq;.    if( (
13ac0 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  iEq = fts5MultiI
13ad0 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74  terDoCompare(pIt
13ae0 65 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20  er, i)) ){.     
13af0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
13b00 28 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67  (p, &pIter->aSeg
13b10 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20  [iEq], 0);.     
13b20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67   i = pIter->nSeg
13b30 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20   + iEq;.    }.  
13b40 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69  }.}../*.** Sub-i
13b50 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64  terator iChanged
13b60 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74   of iterator pIt
13b70 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  er has just been
13b80 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74   advanced. It st
13b90 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  ill.** points to
13ba0 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74   the same term t
13bb0 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64  hough - just a d
13bc0 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20  ifferent rowid. 
13bd0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  This function.**
13be0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64   attempts to upd
13bf0 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ate the contents
13c00 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61   of the pIter->a
13c10 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e  First[] accordin
13c20 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f  gly..** If it do
13c30 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c  es so successful
13c40 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65  ly, 0 is returne
13c50 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a  d. Otherwise 1..
13c60 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72  **.** If non-zer
13c70 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74  o is returned, t
13c80 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64  he caller should
13c90 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49   call fts5MultiI
13ca0 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a  terAdvanced().**
13cb0 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72   on the iterator
13cc0 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66   instead. That f
13cd0 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
13ce0 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e   same as this on
13cf0 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  e, except.** tha
13d00 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20  t it deals with 
13d10 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64  more complicated
13d20 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a   cases as well..
13d30 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66  */ .static int f
13d40 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
13d50 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35  nceRowid(.  Fts5
13d60 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
13d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
13d80 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
13d90 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
13da0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
13db0 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
13dc0 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
13dd0 6f 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b  o update aFirst[
13de0 5d 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20  ] array for */. 
13df0 20 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20   int iChanged   
13e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e10 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62   /* Index of sub
13e20 2d 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61  -iterator just a
13e30 64 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20  dvanced */.){.  
13e40 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65  Fts5SegIter *pNe
13e50 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  w = &pIter->aSeg
13e60 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69  [iChanged];..  i
13e70 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d  f( pNew->iRowid=
13e80 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  =pIter->iSwitchR
13e90 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77  owid.   || (pNew
13ea0 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e  ->iRowid<pIter->
13eb0 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70  iSwitchRowid)==p
13ec0 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a  Iter->bRev.  ){.
13ed0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46      int i;.    F
13ee0 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68  ts5SegIter *pOth
13ef0 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
13f00 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30  g[iChanged ^ 0x0
13f10 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d  001];.    pIter-
13f20 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20  >iSwitchRowid = 
13f30 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d  pIter->bRev ? SM
13f40 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c  ALLEST_INT64 : L
13f50 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20  ARGEST_INT64;.  
13f60 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e    for(i=(pIter->
13f70 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32  nSeg+iChanged)/2
13f80 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  ; 1; i=i/2){.   
13f90 20 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a     Fts5CResult *
13fa0 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61  pRes = &pIter->a
13fb0 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20  First[i];..     
13fc0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
13fd0 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73  Leaf );.      as
13fe0 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72  sert( pRes->bTer
13ff0 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72  mEq==0 || pOther
14000 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20  ->pLeaf );..    
14010 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72    if( pRes->bTer
14020 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69  mEq ){.        i
14030 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d  f( pNew->iRowid=
14040 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20  =pOther->iRowid 
14050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
14060 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
14070 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72  else if( (pOther
14080 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69  ->iRowid>pNew->i
14090 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
140a0 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
140b0 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
140c0 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69  owid = pOther->i
140d0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20  Rowid;.         
140e0 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a   pNew = pOther;.
140f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
14100 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  ( (pOther->iRowi
14110 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  d>pIter->iSwitch
14120 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62  Rowid)==pIter->b
14130 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Rev ){.         
14140 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
14150 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69  owid = pOther->i
14160 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d  Rowid;.        }
14170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14180 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70  Res->iFirst = (p
14190 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65  New - pIter->aSe
141a0 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d  g);.      if( i=
141b0 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  =1 ) break;..   
141c0 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74     pOther = &pIt
141d0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
141e0 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30  >aFirst[i ^ 0x00
141f0 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  01].iFirst ];.  
14200 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
14210 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
14220 74 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f  t the pIter->bEo
14230 66 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64  f variable based
14240 20 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66   on the state of
14250 20 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f   the sub-iterato
14260 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
14270 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
14280 53 65 74 45 6f 66 28 46 74 73 35 49 6e 64 65 78  SetEof(Fts5Index
14290 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
142a0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
142b0 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  g = &pIter->aSeg
142c0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
142d0 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70  1].iFirst ];.  p
142e0 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65  Iter->bEof = pSe
142f0 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70  g->pLeaf==0;.  p
14300 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
14310 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
14320 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  d;.}../*.** Move
14330 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f   the iterator to
14340 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
14350 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
14360 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
14370 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
14380 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72  t in Fts5Index.r
14390 63 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a  c. It is not .**
143a0 20 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65   considered an e
143b0 72 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72  rror if the iter
143c0 61 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46  ator reaches EOF
143d0 2c 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c  , or if it is al
143e0 72 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46  ready at .** EOF
143f0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
14400 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
14410 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14420 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
14430 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14440 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65   .  Fts5IndexIte
14450 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20  r *pIter,.  int 
14460 62 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20  bFrom,          
14470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
14480 72 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20  rue if argument 
14490 69 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a  iFrom is valid *
144a0 2f 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20  /.  i64 iFrom   
144b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144c0 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61      /* Advance a
144d0 74 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61  t least as far a
144e0 73 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69  s this */.){.  i
144f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14500 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62  _OK ){.    int b
14510 55 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b  UseFrom = bFrom;
14520 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
14530 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
14540 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14550 69 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  irst;.      int 
14560 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
14570 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
14580 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
14590 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20  aSeg[iFirst];.  
145a0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
145b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
145c0 20 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72        if( bUseFr
145d0 6f 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69  om && pSeg->pDli
145e0 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
145f0 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
14600 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d  m(p, pSeg, iFrom
14610 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14620 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
14630 74 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  terNext(p, pSeg,
14640 20 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20   &bNewTerm);.   
14650 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
14660 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c  pSeg->pLeaf==0 |
14670 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20  | bNewTerm .    
14680 20 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49     || fts5MultiI
14690 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28  terAdvanceRowid(
146a0 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74  p, pIter, iFirst
146b0 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  ).      ){.     
146c0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
146d0 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65  Advanced(p, pIte
146e0 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20  r, iFirst, 1);. 
146f0 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
14700 49 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72  IterSetEof(pIter
14710 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14720 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
14730 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
14740 65 72 29 3b 0a 0a 20 20 20 20 20 20 62 55 73 65  er);..      bUse
14750 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77  From = 0;.    }w
14760 68 69 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b  hile( pIter->bSk
14770 69 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d  ipEmpty && fts5M
14780 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
14790 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d  p, pIter) );.  }
147a0 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49  .}..static Fts5I
147b0 6e 64 65 78 49 74 65 72 20 2a 66 74 73 35 4d 75  ndexIter *fts5Mu
147c0 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20  ltiIterAlloc(.  
147d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
14800 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
14810 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a  n */.  int nSeg.
14820 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  ){.  Fts5IndexIt
14830 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  er *pNew;.  int 
14840 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20  nSlot;          
14850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
14860 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e  ower of two >= n
14870 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53  Seg */..  for(nS
14880 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65  lot=2; nSlot<nSe
14890 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32  g; nSlot=nSlot*2
148a0 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  );.  pNew = fts5
148b0 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20  IdxMalloc(p, .  
148c0 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49      sizeof(Fts5I
148d0 6e 64 65 78 49 74 65 72 29 20 2b 20 20 20 20 20  ndexIter) +     
148e0 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20          /* pNew 
148f0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14900 46 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28  Fts5SegIter) * (
14910 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20  nSlot-1) +   /* 
14920 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a  pNew->aSeg[] */.
14930 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
14940 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f  5CResult) * nSlo
14950 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65  t         /* pNe
14960 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20  w->aFirst[] */. 
14970 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29   );.  if( pNew )
14980 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67  {.    pNew->nSeg
14990 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e   = nSlot;.    pN
149a0 65 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74  ew->aFirst = (Ft
149b0 73 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77  s5CResult*)&pNew
149c0 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20  ->aSeg[nSlot];. 
149d0 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20     pNew->pIndex 
149e0 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = p;.  }.  retur
149f0 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
14a00 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
14a10 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 6f 62  Fts5IndexIter ob
14a20 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ject..**.** The 
14a30 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20  new object will 
14a40 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  be used to itera
14a50 74 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20  te through data 
14a60 69 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74  in structure pSt
14a70 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76  ruct..** If iLev
14a80 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20  el is -ve, then 
14a90 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20  all data in all 
14aa0 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67  segments is merg
14ab0 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65  ed. Or, if iLeve
14ac0 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20  l.** is zero or 
14ad0 67 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72  greater, data fr
14ae0 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65  om the first nSe
14af0 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f  gment segments o
14b00 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a  n level iLevel.*
14b10 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a  * is merged..**.
14b20 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20  ** The iterator 
14b30 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73  initially points
14b40 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65   to the first te
14b50 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69  rm/rowid entry i
14b60 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  n the .** iterat
14b70 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
14b80 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
14b90 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35  iIterNew(.  Fts5
14ba0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
14bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14bc0 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
14bd0 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
14be0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
14bf0 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20   *pStruct,      
14c00 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20     /* Structure 
14c10 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65  of specific inde
14c20 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  x */.  int bSkip
14c30 45 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20 20  Empty,          
14c40 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
14c50 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d  o ignore delete-
14c60 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  keys */.  int fl
14c70 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
14c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14c90 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58  5INDEX_QUERY_XXX
14ca0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
14cb0 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74  t u8 *pTerm, int
14cc0 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54   nTerm,     /* T
14cd0 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28  erm to seek to (
14ce0 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20  or NULL/0) */.  
14cf0 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20  int iLevel,     
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72  /* Level to iter
14d20 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29  ate (-1 for all)
14d30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
14d40 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
14d50 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
14d60 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d  of segments to m
14d70 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29  erge (iLevel>=0)
14d80 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
14d90 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
14da0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
14db0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ect */.){.  int 
14dc0 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20  nSeg = 0;       
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14de0 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
14df0 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f  -iters in use */
14e00 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30  .  int iIter = 0
14e10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
14e20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69     /* */.  int i
14e30 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
14e40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
14e50 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
14e60 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a  rough segments *
14e70 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
14e80 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20  uf = {0,0,0};   
14e90 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
14ea0 65 64 20 62 79 20 66 74 73 35 53 65 67 49 74 65  ed by fts5SegIte
14eb0 72 53 65 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20  rSeekInit() */. 
14ec0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
14ed0 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73  vel *pLvl;.  Fts
14ee0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77  5IndexIter *pNew
14ef0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54  ;..  assert( (pT
14f00 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d  erm==0 && nTerm=
14f10 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20  =0) || iLevel<0 
14f20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
14f30 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
14f40 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74  new multi-seg-it
14f50 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28  erator. */.  if(
14f60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14f70 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65  K ){.    if( iLe
14f80 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61  vel<0 ){.      a
14f90 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
14fa0 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
14fb0 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
14fc0 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
14fd0 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53  .      nSeg = pS
14fe0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
14ff0 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28  .      nSeg += (
15000 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30  p->pHash ? 1 : 0
15010 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
15020 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70      nSeg = MIN(p
15030 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
15040 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65  Level].nSeg, nSe
15050 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20  gment);.    }.  
15060 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65  }.  *ppOut = pNe
15070 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
15080 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b  rAlloc(p, nSeg);
15090 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
150a0 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d   return;.  pNew-
150b0 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61  >bRev = (0!=(fla
150c0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
150d0 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70  UERY_DESC));.  p
150e0 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  New->bSkipEmpty 
150f0 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a 20 20  = bSkipEmpty;.  
15100 70 4e 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20  pNew->pStruct = 
15110 70 53 74 72 75 63 74 3b 0a 20 20 66 74 73 35 53  pStruct;.  fts5S
15120 74 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72  tructureRef(pStr
15130 75 63 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  uct);..  /* Init
15140 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74  ialize each of t
15150 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67  he component seg
15160 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20  ment iterators. 
15170 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c  */.  if( iLevel<
15180 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  0 ){.    Fts5Str
15190 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e  uctureLevel *pEn
151a0 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  d = &pStruct->aL
151b0 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c  evel[pStruct->nL
151c0 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70  evel];.    if( p
151d0 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->pHash ){.     
151e0 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e   /* Add a segmen
151f0 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74  t iterator for t
15200 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
15210 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20  nts of the hash 
15220 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20  table. */.      
15230 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
15240 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
15250 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
15260 20 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68   fts5SegIterHash
15270 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e  Init(p, pTerm, n
15280 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74  Term, flags, pIt
15290 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
152a0 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74  or(pLvl=&pStruct
152b0 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76  ->aLevel[0]; pLv
152c0 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b  l<pEnd; pLvl++){
152d0 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d  .      for(iSeg=
152e0 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53  pLvl->nSeg-1; iS
152f0 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a  eg>=0; iSeg--){.
15300 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
15310 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
15320 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67  eg = &pLvl->aSeg
15330 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
15340 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
15350 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
15360 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20  [iIter++];.     
15370 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20     if( pTerm==0 
15380 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
15390 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
153a0 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
153b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
153c0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
153d0 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 26 62  erSeekInit(p, &b
153e0 75 66 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  uf, pTerm, nTerm
153f0 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70  , flags, pSeg, p
15400 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
15410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c   }else{.    pLvl
15430 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
15440 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20  vel[iLevel];.   
15450 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31   for(iSeg=nSeg-1
15460 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d  ; iSeg>=0; iSeg-
15470 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65  -){.      fts5Se
15480 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c  gIterInit(p, &pL
15490 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20  vl->aSeg[iSeg], 
154a0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65  &pNew->aSeg[iIte
154b0 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  r++]);.    }.  }
154c0 0a 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72  .  assert( iIter
154d0 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20  ==nSeg );..  /* 
154e0 49 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73  If the above was
154f0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63   successful, eac
15500 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72  h component iter
15510 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73  ators now points
15520 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69   .  ** to the fi
15530 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73  rst entry in its
15540 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69   segment. In thi
15550 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a  s case initializ
15560 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72  e the .  ** aFir
15570 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20  st[] array. Or, 
15580 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
15590 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74  occurred, free t
155a0 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a  he iterator.  **
155b0 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20   object and set 
155c0 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
155d0 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f  ble to NULL.  */
155e0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
155f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66  LITE_OK ){.    f
15600 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e  or(iIter=pNew->n
15610 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20  Seg-1; iIter>0; 
15620 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20  iIter--){.      
15630 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69  int iEq;.      i
15640 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
15650 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
15660 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29  (pNew, iIter)) )
15670 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
15680 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e  gIterNext(p, &pN
15690 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30  ew->aSeg[iEq], 0
156a0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
156b0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
156c0 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69  (p, pNew, iEq, i
156d0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Iter);.      }. 
156e0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c     }.    fts5Mul
156f0 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65  tiIterSetEof(pNe
15700 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65  w);.    fts5Asse
15710 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
15720 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20  (p, pNew);..    
15730 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45  if( pNew->bSkipE
15740 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74  mpty && fts5Mult
15750 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
15760 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66  pNew) ){.      f
15770 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
15780 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b  (p, pNew, 0, 0);
15790 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
157a0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
157b0 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a  rFree(p, pNew);.
157c0 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a      *ppOut = 0;.
157d0 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
157e0 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f  Free(&buf);.}../
157f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46  *.** Create an F
15800 74 73 35 49 6e 64 65 78 49 74 65 72 20 74 68 61  ts5IndexIter tha
15810 74 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75  t iterates throu
15820 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70  gh the doclist p
15830 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68  rovided.** as th
15840 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
15850 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
15860 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
15870 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ew2(.  Fts5Index
15880 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
15890 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
158a0 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74  ackend to iterat
158b0 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74  e within */.  Ft
158c0 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20  s5Data *pData,  
158d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
158e0 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72   Doclist to iter
158f0 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20  ate through */. 
15900 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20   int bDesc,     
15910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15920 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73   /* True for des
15930 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72  cending rowid or
15940 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  der */.  Fts5Ind
15950 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  exIter **ppOut  
15960 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
15970 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
15980 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e  ts5IndexIter *pN
15990 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73  ew;.  pNew = fts
159a0 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
159b0 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65  p, 2);.  if( pNe
159c0 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  w ){.    Fts5Seg
159d0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
159e0 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20  New->aSeg[1];.. 
159f0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
15a00 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
15a10 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
15a20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20  pData->szLeaf>0 
15a30 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
15a40 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  pLeaf = pData;. 
15a50 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
15a60 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
15a70 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70  tVarint(pData->p
15a80 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
15a90 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70  iRowid);.      p
15aa0 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  New->aFirst[1].i
15ab0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
15ac0 20 69 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20   if( bDesc ){.  
15ad0 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76        pNew->bRev
15ae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49   = 1;.        pI
15af0 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
15b00 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
15b10 53 45 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  SE;.        fts5
15b20 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
15b30 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
15b40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15b50 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
15b60 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
15b70 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
15b80 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20      pData = 0;. 
15b90 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15ba0 70 4e 65 77 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a  pNew->bEof = 1;.
15bb0 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 70 4f 75      }..    *ppOu
15bc0 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20  t = pNew;.  }.. 
15bd0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
15be0 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pData);.}../*.*
15bf0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
15c00 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
15c10 20 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e   at EOF or if an
15c20 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
15c30 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f  red. .** False o
15c40 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
15c50 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
15c60 69 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  iIterEof(Fts5Ind
15c70 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78  ex *p, Fts5Index
15c80 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
15c90 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20  assert( p->rc . 
15ca0 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
15cb0 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
15cc0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
15cd0 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
15ce0 2d 3e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72  ->bEof .  );.  r
15cf0 65 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20  eturn (p->rc || 
15d00 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b 0a 7d 0a  pIter->bEof);.}.
15d10 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
15d20 65 20 72 6f 77 69 64 20 6f 66 20 74 68 65 20 65  e rowid of the e
15d30 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
15d40 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
15d50 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 2e 20 49   points.** to. I
15d60 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  f the iterator p
15d70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20 77 68 65  oints to EOF whe
15d80 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
15d90 69 73 20 63 61 6c 6c 65 64 20 74 68 65 0a 2a 2a  is called the.**
15da0 20 72 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64   results are und
15db0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
15dc0 63 20 69 36 34 20 66 74 73 35 4d 75 6c 74 69 49  c i64 fts5MultiI
15dd0 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64  terRowid(Fts5Ind
15de0 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
15df0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
15e00 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15e10 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
15e20 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75  .pLeaf );.  retu
15e30 72 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  rn pIter->aSeg[ 
15e40 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
15e50 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64  .iFirst ].iRowid
15e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
15e70 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
15e80 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61  the next entry a
15e90 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69  t or following i
15ea0 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  Match..*/.static
15eb0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
15ec0 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46  terNextFrom(.  F
15ed0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
15ee0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
15ef0 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61  Iter, .  i64 iMa
15f00 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20  tch.){.  while( 
15f10 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  1 ){.    i64 iRo
15f20 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  wid;.    fts5Mul
15f30 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
15f40 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b  ter, 1, iMatch);
15f50 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c  .    if( fts5Mul
15f60 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
15f70 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  er) ) break;.   
15f80 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
15f90 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
15fa0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
15fb0 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69  er->bRev==0 && i
15fc0 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
15fd0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
15fe0 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26  Iter->bRev!=0 &&
15ff0 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
16000 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
16010 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
16020 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
16030 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
16040 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65  e term associate
16050 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65  d with the .** e
16060 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
16070 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
16080 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
16090 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a  tatic const u8 *
160a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
160b0 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  m(Fts5IndexIter 
160c0 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
160d0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
160e0 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  *p = &pIter->aSe
160f0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
16100 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
16110 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d 2e 6e 3b  *pn = p->term.n;
16120 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 74 65 72  .  return p->ter
16130 6d 2e 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  m.p;.}..static v
16140 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49 74 65  oid fts5ChunkIte
16150 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  rate(.  Fts5Inde
16160 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
16170 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
16180 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
16190 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c 20  5SegIter *pSeg, 
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
161b0 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69 73 20  Poslist of this 
161c0 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 76 6f  iterator */.  vo
161d0 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  id *pCtx,       
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
161f0 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74 65 72   Context pointer
16200 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61 6c 6c   for xChunk call
16210 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64 20 28  back */.  void (
16220 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49 6e 64  *xChunk)(Fts5Ind
16230 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f 6e 73  ex*, void*, cons
16240 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20  t u8*, int).){. 
16250 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53 65 67   int nRem = pSeg
16260 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20  ->nPos;         
16270 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
16280 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63 6f 6d  tes still to com
16290 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  e */.  Fts5Data 
162a0 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 75 38  *pData = 0;.  u8
162b0 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53 65 67   *pChunk = &pSeg
162c0 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d  ->pLeaf->p[pSeg-
162d0 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
162e0 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20 4d 49   int nChunk = MI
162f0 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e 70 4c  N(nRem, pSeg->pL
16300 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53  eaf->szLeaf - pS
16310 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 29  eg->iLeafOffset)
16320 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 70  ;.  int pgno = p
16330 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a  Seg->iLeafPgno;.
16340 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65 20 3d    int pgnoSave =
16350 20 30 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67   0;..  if( (pSeg
16360 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
16370 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d  EGITER_REVERSE)=
16380 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61  =0 ){.    pgnoSa
16390 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d  ve = pgno+1;.  }
163a0 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
163b0 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43      xChunk(p, pC
163c0 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  tx, pChunk, nChu
163d0 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d  nk);.    nRem -=
163e0 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73   nChunk;.    fts
163f0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
16400 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ta);.    if( nRe
16410 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  m<=0 ){.      br
16420 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
16430 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20        pgno++;.  
16440 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
16450 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
16460 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
16470 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
16480 64 2c 20 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  d, 0, pgno));.  
16490 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30      if( pData==0
164a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
164b0 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d  pChunk = &pData-
164c0 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68  >p[4];.      nCh
164d0 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
164e0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20  pData->szLeaf - 
164f0 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  4);.      if( pg
16500 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a  no==pgnoSave ){.
16510 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16520 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  pSeg->pNextLeaf=
16530 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
16540 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  eg->pNextLeaf = 
16550 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70  pData;.        p
16560 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  Data = 0;.      
16570 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
16580 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
16590 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
165a0 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
165b0 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20  re pStruct. The 
165c0 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69  new segment.** i
165d0 64 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  d must be betwee
165e0 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e  n 1 and 65335 in
165f0 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73  clusive, and mus
16600 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79  t not be used by
16610 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74   .** any current
16620 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  ly existing segm
16630 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73  ent. If a free s
16640 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74  egment id cannot
16650 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51   be found,.** SQ
16660 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74  LITE_FULL is ret
16670 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
16680 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
16690 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
166a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
166b0 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a  a no-op. 0 is .*
166c0 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
166d0 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
166e0 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63  ic int fts5Alloc
166f0 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64  ateSegid(Fts5Ind
16700 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
16710 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
16720 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30    int iSegid = 0
16730 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
16740 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16750 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53   if( pStruct->nS
16760 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58  egment>=FTS5_MAX
16770 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
16780 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
16790 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _FULL;.    }else
167a0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
167b0 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
167c0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
167d0 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
167e0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
167f0 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76 6f 69  izeof(u32), (voi
16800 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20  d*)&iSegid);.   
16810 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 69 53       iSegid = iS
16820 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54  egid & ((1 << FT
16830 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29  S5_DATA_ID_B)-1)
16840 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c  ;.        for(iL
16850 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
16860 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
16870 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
16880 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
16890 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
168a0 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
168b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
168c0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53 74   if( iSegid==pSt
168d0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
168e0 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
168f0 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  egid ){.        
16900 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 30        iSegid = 0
16910 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
16920 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16930 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16940 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
16950 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a  n iSegid;.}../*.
16960 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64  ** Discard all d
16970 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ata currently ca
16980 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68  ched in the hash
16990 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  -tables..*/.stat
169a0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
169b0 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73  xDiscardData(Fts
169c0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
169d0 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c  sert( p->pHash |
169e0 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  | p->nPendingDat
169f0 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  a==0 );.  if( p-
16a00 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71  >pHash ){.    sq
16a10 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65  lite3Fts5HashCle
16a20 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  ar(p->pHash);.  
16a30 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
16a40 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  a = 0;.  }.}../*
16a50 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
16a60 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69  ize of the prefi
16a70 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61  x, in bytes, tha
16a80 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70  t buffer (nNew/p
16a90 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77  New) shares.** w
16aa0 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64  ith buffer (nOld
16ab0 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /pOld)..*/.stati
16ac0 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
16ad0 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20  Compress(.  int 
16ae0 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
16af0 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77  pOld,.  int nNew
16b00 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
16b10 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  .){.  int i;.  a
16b20 73 73 65 72 74 28 20 66 74 73 35 42 6c 6f 62 43  ssert( fts5BlobC
16b30 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20 6e 4f 6c  ompare(pOld, nOl
16b40 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 29 3c 30  d, pNew, nNew)<0
16b50 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
16b60 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
16b70 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e   if( pOld[i]!=pN
16b80 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ew[i] ) break;. 
16b90 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
16ba0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16bb0 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
16bc0 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
16bd0 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
16be0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
16bf0 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20  int bFlush      
16c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c10 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74  /* If true, writ
16c20 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20  e dlidx to disk 
16c30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
16c40 20 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d   assert( bFlush=
16c50 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e  =0 || (pWriter->
16c60 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69  nDlidx>0 && pWri
16c70 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
16c80 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72  uf.n>0) );.  for
16c90 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d  (i=0; i<pWriter-
16ca0 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20  >nDlidx; i++){. 
16cb0 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
16cc0 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
16cd0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
16ce0 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ;.    if( pDlidx
16cf0 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65  ->buf.n==0 ) bre
16d00 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75  ak;.    if( bFlu
16d10 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
16d20 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  rt( pDlidx->pgno
16d30 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  !=0 );.      fts
16d40 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
16d50 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
16d60 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65  IDX_ROWID(pWrite
16d70 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44  r->iSegid, i, pD
16d80 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20  lidx->pgno),.   
16d90 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62         pDlidx->b
16da0 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75  uf.p, pDlidx->bu
16db0 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f.n.      );.   
16dc0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
16dd0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44  s5BufferZero(&pD
16de0 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20  lidx->buf);.    
16df0 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
16e00 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
16e10 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57  *.** Grow the pW
16e20 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20  riter->aDlidx[] 
16e30 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73  array to at leas
16e40 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20  t nLvl elements 
16e50 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20  in size..** Any 
16e60 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e  new array elemen
16e70 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65  ts are zeroed be
16e80 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
16e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
16ea0 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
16eb0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16ec0 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ,.  Fts5SegWrite
16ed0 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
16ee0 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20  t nLvl.){.  if( 
16ef0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16f00 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65   && nLvl>=pWrite
16f10 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20  r->nDlidx ){.   
16f20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
16f30 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35   *aDlidx = (Fts5
16f40 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c  DlidxWriter*)sql
16f50 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
16f60 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
16f70 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74  Dlidx, sizeof(Ft
16f80 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
16f90 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20   nLvl.    );.   
16fa0 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29   if( aDlidx==0 )
16fb0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
16fc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
16fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
16fe0 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
16ff0 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f(Fts5DlidxWrite
17000 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72  r) * (nLvl - pWr
17010 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20  iter->nDlidx);. 
17020 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c       memset(&aDl
17030 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c  idx[pWriter->nDl
17040 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b  idx], 0, nByte);
17050 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
17060 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b  aDlidx = aDlidx;
17070 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
17080 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20  nDlidx = nLvl;. 
17090 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
170a0 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  n p->rc;.}../*.*
170b0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
170c0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61   doclist-index a
170d0 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70  ccumulating in p
170e0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d  Writer->aDlidx[]
170f0 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   is large.** eno
17100 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74 6f  ugh, flush it to
17110 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72 6e   disk and return
17120 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64 69   1. Otherwise di
17130 73 63 61 72 64 20 69 74 20 61 6e 64 20 72 65 74  scard it and ret
17140 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a  urn.** zero..*/.
17150 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57  static int fts5W
17160 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 46  riteFlushDlidx(F
17170 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
17180 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
17190 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61  ter){.  int bFla
171a0 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  g = 0;..  /* If 
171b0 74 68 65 72 65 20 77 65 72 65 20 46 54 53 35 5f  there were FTS5_
171c0 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f  MIN_DLIDX_SIZE o
171d0 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61  r more empty lea
171e0 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  f pages written.
171f0 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
17200 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65  base, also write
17210 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
17220 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a  ex to disk.  */.
17230 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61    if( pWriter->a
17240 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
17250 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   && pWriter->nEm
17260 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
17270 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
17280 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20  bFlag = 1;.  }. 
17290 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43   fts5WriteDlidxC
172a0 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c  lear(p, pWriter,
172b0 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69 74   bFlag);.  pWrit
172c0 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
172d0 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a    return bFlag;.
172e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
172f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17300 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65 73   whenever proces
17310 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 6c  sing of the docl
17320 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ist for the .** 
17330 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61  last term on lea
17340 66 20 70 61 67 65 20 28 70 57 72 69 74 65 72 2d  f page (pWriter-
17350 3e 69 42 74 50 61 67 65 29 20 69 73 20 63 6f 6d  >iBtPage) is com
17360 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  pleted. .**.** T
17370 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
17380 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20 69   for that term i
17390 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
173a0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74  ed in-memory wit
173b0 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 53  hin the.** Fts5S
173c0 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78 5b  egWriter.aDlidx[
173d0 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74 20 69  ] array. If it i
173e0 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20  s large enough, 
173f0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
17400 20 77 72 69 74 65 73 20 69 74 20 6f 75 74 20 74   writes it out t
17410 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69  o disk. Or, if i
17420 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74  t is too small t
17430 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20 64  o bother with, d
17440 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a  iscards.** it..*
17450 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74  *.** Fts5SegWrit
17460 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65 6e  er.btterm curren
17470 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  tly contains the
17480 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70   first term on p
17490 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a  age iBtPage..*/.
174a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
174b0 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28  WriteFlushBtree(
174c0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
174d0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
174e0 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c  iter){.  int bFl
174f0 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ag;..  assert( p
17500 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
17510 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  || pWriter->nEmp
17520 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ty==0 );.  if( p
17530 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3d  Writer->iBtPage=
17540 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62  =0 ) return;.  b
17550 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74 65  Flag = fts5Write
17560 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70 57  FlushDlidx(p, pW
17570 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  riter);..  if( p
17580 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
17590 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
175a0 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72 2d  r *z = (pWriter-
175b0 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e  >btterm.n>0?(con
175c0 73 74 20 63 68 61 72 2a 29 70 57 72 69 74 65 72  st char*)pWriter
175d0 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a  ->btterm.p:"");.
175e0 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
175f0 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64 79  wing was already
17600 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72 69   done in fts5Wri
17610 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20  teInit(): */.   
17620 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   /* sqlite3_bind
17630 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
17640 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
17650 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20  iSegid); */.    
17660 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
17670 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  b(p->pIdxWriter,
17680 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e   2, z, pWriter->
17690 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45  btterm.n, SQLITE
176a0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
176b0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
176c0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
176d0 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36 34  3, bFlag + ((i64
176e0 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67  )pWriter->iBtPag
176f0 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  e<<1));.    sqli
17700 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
17710 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  Writer);.    p->
17720 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
17730 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  et(p->pIdxWriter
17740 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72  );.  }.  pWriter
17750 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d  ->iBtPage = 0;.}
17760 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
17770 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
17780 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65  each leaf page e
17790 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20  xcept the first 
177a0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
177b0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
177c0 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54  rm. Argument (nT
177d0 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68  erm/pTerm) is th
177e0 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20  e split-key - a 
177f0 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20  term that.** is 
17800 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
17810 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f  terms written to
17820 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c   earlier leaves,
17830 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72   and equal to or
17840 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  .** smaller than
17850 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
17860 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e  on the new leaf.
17870 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
17880 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
17890 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
178a0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
178b0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  . If an error.**
178c0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
178d0 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
178e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
178f0 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
17900 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
17910 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
17920 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
17930 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17940 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
17950 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
17960 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
17970 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
17980 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
17990 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ject */.  int nT
179a0 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
179b0 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72  Term      /* Fir
179c0 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70  st term on new p
179d0 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35  age */.){.  fts5
179e0 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28  WriteFlushBtree(
179f0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 66  p, pWriter);.  f
17a00 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
17a10 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62  >rc, &pWriter->b
17a20 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  tterm, nTerm, pT
17a30 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
17a40 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72 69 74  >iBtPage = pWrit
17a50 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b  er->writer.pgno;
17a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17a70 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17a80 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20  d when flushing 
17a90 61 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74  a leaf page that
17aa0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
17ab0 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20  terms at all to 
17ac0 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
17ad0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
17ae0 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
17af0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
17b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17b10 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
17b20 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
17b30 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
17b40 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17b50 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
17b60 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65    /* If there we
17b70 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20  re no rowids on 
17b80 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69  the leaf page ei
17b90 74 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63  ther and the doc
17ba0 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20  list-index.  ** 
17bb0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17bc0 20 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64   started, append
17bd0 20 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f   an 0x00 byte to
17be0 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70   it.  */.  if( p
17bf0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
17c00 77 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72  widInPage && pWr
17c10 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
17c20 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46  buf.n>0 ){.    F
17c30 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
17c40 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
17c50 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20  r->aDlidx[0];.  
17c60 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
17c70 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a  ->bPrevValid );.
17c80 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
17c90 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17ca0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
17cb0 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  x->buf, 0);.  }.
17cc0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
17cd0 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73  the "number of s
17ce0 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73  equential leaves
17cf0 20 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22   without a term"
17d00 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70   counter. */.  p
17d10 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b  Writer->nEmpty++
17d20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20  ;.}..static i64 
17d30 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74  fts5DlidxExtract
17d40 46 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42  FirstRowid(Fts5B
17d50 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
17d60 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e  i64 iRowid;.  in
17d70 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20  t iOff;..  iOff 
17d80 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72  = 1 + fts5GetVar
17d90 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c  int(&pBuf->p[1],
17da0 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
17db0 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  .  fts5GetVarint
17dc0 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c  (&pBuf->p[iOff],
17dd0 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
17de0 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64  .  return iRowid
17df0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64  ;.}../*.** Rowid
17e00 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74   iRowid has just
17e10 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74   been appended t
17e20 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  o the current le
17e30 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74  af page. It is t
17e40 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74  he.** first on t
17e50 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  he page. This fu
17e60 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
17e70 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  n appropriate en
17e80 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65  try to the curre
17e90 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  nt.** doclist-in
17ea0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
17eb0 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
17ec0 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35  dxAppend(.  Fts5
17ed0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
17ee0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
17ef0 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  ter, .  i64 iRow
17f00 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  id.){.  int i;. 
17f10 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
17f20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
17f30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17f40 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  bDone==0; i++){.
17f50 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
17f60 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
17f70 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
17f80 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
17f90 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ..    if( pDlidx
17fa0 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
17fb0 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
17fc0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
17fd0 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  t doclist-index 
17fe0 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72  page is full. Wr
17ff0 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61  ite it to disk a
18000 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a  nd push.      **
18010 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69   a copy of iRowi
18020 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  d (which will be
18030 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72  come the first r
18040 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  owid on the next
18050 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73  .      ** doclis
18060 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67  t-index leaf pag
18070 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e  e) up into the n
18080 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ext level of the
18090 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a   b-tree .      *
180a0 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20  * hierarchy. If 
180b0 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66  the node being f
180c0 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e  lushed is curren
180d0 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  tly the root nod
180e0 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f  e,.      ** also
180f0 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20   push its first 
18100 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a  rowid upwards. *
18110 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  /.      pDlidx->
18120 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b  buf.p[0] = 0x01;
18130 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72      /* Not the r
18140 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20  oot node */.    
18150 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
18160 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
18170 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
18180 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
18190 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  i, pDlidx->pgno)
181a0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69  ,.          pDli
181b0 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64  dx->buf.p, pDlid
181c0 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29  x->buf.n.      )
181d0 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
181e0 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57  eDlidxGrow(p, pW
181f0 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20  riter, i+2);.   
18200 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72     pDlidx = &pWr
18210 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
18220 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
18230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
18240 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d  Dlidx[1].buf.n==
18250 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  0 ){.        i64
18260 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c   iFirst = fts5Dl
18270 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52  idxExtractFirstR
18280 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75  owid(&pDlidx->bu
18290 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  f);..        /* 
182a0 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f  This was the roo
182b0 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73  t node. Push its
182c0 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20   first rowid up 
182d0 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e  to the new root.
182e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69   */.        pDli
182f0 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c  dx[1].pgno = pDl
18300 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  idx->pgno;.     
18310 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18320 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18330 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
18340 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  [1].buf, 0);.   
18350 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
18360 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
18370 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
18380 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64  dx[1].buf, pDlid
18390 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  x->pgno);.      
183a0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
183b0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
183c0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
183d0 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b  1].buf, iFirst);
183e0 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
183f0 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  1].bPrevValid = 
18400 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  1;.        pDlid
18410 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69  x[1].iPrev = iFi
18420 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rst;.      }..  
18430 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
18440 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64  ufferZero(&pDlid
18450 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70  x->buf);.      p
18460 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
18470 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c  d = 0;.      pDl
18480 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20  idx->pgno++;.   
18490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44   }else{.      bD
184a0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  one = 1;.    }..
184b0 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
184c0 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  bPrevValid ){.  
184d0 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
184e0 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65  d - pDlidx->iPre
184f0 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
18500 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20      i64 iPgno = 
18510 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d  (i==0 ? pWriter-
18520 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70  >writer.pgno : p
18530 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b  Dlidx[-1].pgno);
18540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18550 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20  Dlidx->buf.n==0 
18560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18570 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
18580 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
18590 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44  pDlidx->buf, !bD
185a0 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  one);.      sqli
185b0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
185c0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
185d0 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
185e0 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56  iPgno);.      iV
185f0 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  al = iRowid;.   
18600 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
18610 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18620 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18630 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c  Dlidx->buf, iVal
18640 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  );.    pDlidx->b
18650 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
18660 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76     pDlidx->iPrev
18670 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d   = iRowid;.  }.}
18680 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
18690 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
186a0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
186b0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
186c0 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63  riter){.  static
186d0 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d   const u8 zero[]
186e0 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c   = { 0x00, 0x00,
186f0 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20   0x00, 0x00 };. 
18700 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
18710 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
18720 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34  r->writer;.  i64
18730 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65   iRowid;..  asse
18740 72 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64  rt( (pPage->pgid
18750 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65  x.n==0)==(pWrite
18760 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
18770 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  age) );..  /* Se
18780 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61  t the szLeaf hea
18790 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  der field. */.  
187a0 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
187b0 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
187c0 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73  f.p[2]) );.  fts
187d0 35 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5PutU16(&pPage->
187e0 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d  buf.p[2], pPage-
187f0 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20  >buf.n);..  if( 
18800 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
18810 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  ermInPage ){.   
18820 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20   /* No term was 
18830 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
18840 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
18850 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64  ert( pPage->pgid
18860 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74  x.n==0 );.    ft
18870 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
18880 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  rm(p, pWriter);.
18890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
188a0 41 70 70 65 6e 64 20 74 68 65 20 70 67 69 64 78  Append the pgidx
188b0 20 74 6f 20 74 68 65 20 70 61 67 65 20 62 75 66   to the page buf
188c0 66 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c  fer. Set the szL
188d0 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64  eaf header field
188e0 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66  . */.    fts5Buf
188f0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
18900 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
18910 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  f, pPage->pgidx.
18920 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  n, pPage->pgidx.
18930 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  p);.  }..  /* Wr
18940 69 74 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ite the page out
18950 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52   to disk */.  iR
18960 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
18970 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65  ENT_ROWID(pWrite
18980 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 50  r->iSegid, 0, pP
18990 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74  age->pgno);.  ft
189a0 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69  s5DataWrite(p, i
189b0 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75  Rowid, pPage->bu
189c0 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  f.p, pPage->buf.
189d0 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  n);..  /* Initia
189e0 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61  lize the next pa
189f0 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
18a00 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
18a10 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66  buf);.  fts5Buff
18a20 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70  erZero(&pPage->p
18a30 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66  gidx);.  fts5Buf
18a40 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
18a50 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
18a60 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70  f, 4, zero);.  p
18a70 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
18a80 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
18a90 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
18aa0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
18ab0 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
18ac0 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en++;..  /* The 
18ad0 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e  new leaf holds n
18ae0 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64  o terms or rowid
18af0 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  s */.  pWriter->
18b00 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18b10 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
18b20 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
18b30 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 1;.}../*.**
18b40 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
18b50 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
18b60 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
18b70 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
18b80 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
18b90 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
18ba0 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
18bb0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
18bc0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
18bd0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
18be0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
18bf0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
18c00 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
18c10 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18c20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18c30 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
18c40 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
18c50 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
18c60 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
18c70 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
18c80 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
18c90 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cb0 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
18cc0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
18cd0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
18ce0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
18cf0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
18d00 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35  ->writer;.  Fts5
18d10 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d  Buffer *pPgidx =
18d20 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
18d30 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73 65  r.pgidx;..  asse
18d40 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  rt( pPage->buf.n
18d50 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 62 75  ==0 || pPage->bu
18d60 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66 28 20 70  f.n>4 );.  if( p
18d70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  Page->buf.n==0 )
18d80 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74 68  {.    /* Zero th
18d90 65 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e 64  e first term and
18da0 20 66 69 72 73 74 20 72 6f 77 69 64 20 66 69 65   first rowid fie
18db0 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  lds */.    stati
18dc0 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b  c const u8 zero[
18dd0 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30  ] = { 0x00, 0x00
18de0 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a  , 0x00, 0x00 };.
18df0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
18e00 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
18e10 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34 2c   &pPage->buf, 4,
18e20 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73 65   zero);.    asse
18e30 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  rt( pWriter->bFi
18e40 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b  rstTermInPage );
18e50 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
18e60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20 20   ) return;.  .  
18e70 2f 2a 20 54 4f 44 4f 31 3a 20 43 61 6e 20 74 68  /* TODO1: Can th
18e80 69 73 20 62 65 20 63 6f 6e 73 6f 6c 69 64 61 74  is be consolidat
18e90 65 64 20 77 69 74 68 20 46 6c 75 73 68 4f 6e 65  ed with FlushOne
18ea0 48 61 73 68 20 76 65 72 73 69 6f 6e 3f 20 2a 2f  Hash version? */
18eb0 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70  .  fts5PutU16(&p
18ec0 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d  Pgidx->p[pPgidx-
18ed0 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  >n], pPage->buf.
18ee0 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20  n);.  pPgidx->n 
18ef0 2b 3d 20 32 3b 0a 0a 20 20 69 66 28 20 70 57 72  += 2;..  if( pWr
18f00 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
18f10 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a  InPage ){.    /*
18f20 20 55 70 64 61 74 65 20 74 68 65 20 22 66 69 72   Update the "fir
18f30 73 74 20 74 65 72 6d 22 20 66 69 65 6c 64 20 6f  st term" field o
18f40 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64 65  f the page heade
18f50 72 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20  r. */.#if 0.    
18f60 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62  assert( pPage->b
18f70 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20 70 50  uf.p[2]==0 && pP
18f80 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d 3d 30  age->buf.p[3]==0
18f90 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75 74 55   );.    fts5PutU
18fa0 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
18fb0 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e  [2], pPage->buf.
18fc0 6e 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e  n);.#endif.    n
18fd0 50 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20  Prefix = 0;.    
18fe0 69 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21  if( pPage->pgno!
18ff0 3d 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =1 ){.      /* T
19000 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
19010 20 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20   term on a leaf 
19020 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20  that is not the 
19030 6c 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e  leftmost leaf in
19040 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65  .      ** the se
19050 67 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e  gment b-tree. In
19060 20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73   this case it is
19070 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 64   necessary to ad
19080 64 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20  d a term to.    
19090 20 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20    ** the b-tree 
190a0 68 69 65 72 61 72 63 68 79 20 74 68 61 74 20 69  hierarchy that i
190b0 73 20 28 61 29 20 6c 61 72 67 65 72 20 74 68 61  s (a) larger tha
190c0 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65  n the largest te
190d0 72 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72  rm .      ** alr
190e0 65 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20  eady written to 
190f0 74 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20  the segment and 
19100 28 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  (b) smaller than
19110 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20   or equal to.   
19120 20 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e     ** this term.
19130 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
19140 20 61 20 70 72 65 66 69 78 20 6f 66 20 28 70 54   a prefix of (pT
19150 65 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20  erm/nTerm) that 
19160 69 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20  is one.      ** 
19170 62 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e  byte longer than
19180 20 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65   the longest pre
19190 66 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  fix (pTerm/nTerm
191a0 29 20 73 68 61 72 65 73 20 77 69 74 68 20 74 68  ) shares with th
191b0 65 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69  e.      ** previ
191c0 6f 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20  ous term. .     
191d0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75   **.      ** Usu
191e0 61 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f  ally, the previo
191f0 75 73 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c  us term is avail
19200 61 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74  able in pPage->t
19210 65 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69  erm. The excepti
19220 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69  on.      ** is i
19230 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
19240 72 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e  rst term written
19250 20 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74   in an increment
19260 61 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20  al-merge step.. 
19270 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20       ** In this 
19280 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
19290 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76  s term is not av
192a0 61 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74  ailable, so just
192b0 20 77 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a   write a.      *
192c0 2a 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d  * copy of (pTerm
192d0 2f 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65  /nTerm) into the
192e0 20 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68   parent node. Th
192f0 69 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20  is is slightly. 
19300 20 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69       ** ineffici
19310 65 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63  ent, but still c
19320 6f 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20  orrect.  */.    
19330 20 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b    int n = nTerm;
19340 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
19350 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20  ->term.n ){.    
19360 20 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35      n = 1 + fts5
19370 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
19380 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
19390 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
193a0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
193b0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72    }.      fts5Wr
193c0 69 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20  iteBtreeTerm(p, 
193d0 70 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72  pWriter, n, pTer
193e0 6d 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20  m);.      pPage 
193f0 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
19400 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  er;.    }.  }els
19410 65 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d  e{.    nPrefix =
19420 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
19430 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  ess(pPage->term.
19440 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
19450 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b  , nTerm, pTerm);
19460 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
19470 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
19480 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19490 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a   nPrefix);.  }..
194a0 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
194b0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
194c0 6f 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65  of new data, the
194d0 6e 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  n the term data 
194e0 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74  itself.  ** to t
194f0 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74  he page. */.  ft
19500 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
19510 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
19520 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20  age->buf, nTerm 
19530 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74  - nPrefix);.  ft
19540 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
19550 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
19560 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20  e->buf, nTerm - 
19570 6e 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b  nPrefix, &pTerm[
19580 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a  nPrefix]);..  /*
19590 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35   Update the Fts5
195a0 50 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20  PageWriter.term 
195b0 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35  field. */.  fts5
195c0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
195d0 2c 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20  , &pPage->term, 
195e0 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
195f0 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
19600 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a  TermInPage = 0;.
19610 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
19620 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
19630 30 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  0;.  pWriter->bF
19640 69 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69  irstRowidInDocli
19650 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72  st = 1;..  asser
19660 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72  t( p->rc || (pWr
19670 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26  iter->nDlidx>0 &
19680 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
19690 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29  x[0].buf.n==0) )
196a0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c  ;.  pWriter->aDl
196b0 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50  idx[0].pgno = pP
196c0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 2f 2a  age->pgno;..  /*
196d0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
196e0 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c  leaf page is ful
196f0 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64  l, flush it to d
19700 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70  isk. */.  if( (p
19710 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50  Page->buf.n + pP
19720 61 67 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70  age->pgidx.n)>=p
19730 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
19740 29 7b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  ){.    fts5Write
19750 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
19760 69 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  iter);.  }.}../*
19770 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77  .** Append a row
19780 69 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d  id and position-
19790 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
197a0 74 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f  to the writers o
197b0 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  utput. .*/.stati
197c0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
197d0 41 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46  AppendRowid(.  F
197e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
197f0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
19800 57 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52  Writer,.  i64 iR
19810 6f 77 69 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73  owid,.  int nPos
19820 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  .){.  if( p->rc=
19830 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19840 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
19850 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
19860 65 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20  er->writer;..   
19870 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
19880 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20 72  o be the first r
19890 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20  owid written to 
198a0 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74 68  the page, set th
198b0 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d  e .    ** rowid-
198c0 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70  pointer in the p
198d0 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f  age-header. Also
198e0 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20   append a value 
198f0 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20  to the dlidx.   
19900 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63   ** buffer, in c
19910 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ase a doclist-in
19920 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64 2e  dex is required.
19930 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72    */.    if( pWr
19940 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
19950 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
19960 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61 67   fts5PutU16(pPag
19970 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d  e->buf.p, pPage-
19980 3e 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66  >buf.n);.      f
19990 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
199a0 65 6e 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20  end(p, pWriter, 
199b0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a  iRowid);.    }..
199c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
199d0 20 72 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69   rowid. */.    i
199e0 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  f( pWriter->bFir
199f0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
19a00 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69   || pWriter->bFi
19a10 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
19a20 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
19a30 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
19a40 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
19a50 75 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  uf, iRowid);.   
19a60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
19a70 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69  sert( p->rc || i
19a80 52 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69  Rowid>pWriter->i
19a90 50 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20  PrevRowid );.   
19aa0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19ab0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
19ac0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69  , &pPage->buf, i
19ad0 52 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d  Rowid - pWriter-
19ae0 3e 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20  >iPrevRowid);.  
19af0 20 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d    }.    pWriter-
19b00 3e 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52  >iPrevRowid = iR
19b10 6f 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65  owid;.    pWrite
19b20 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19b30 44 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20  Doclist = 0;.   
19b40 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
19b50 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b  RowidInPage = 0;
19b60 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
19b70 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
19b80 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
19b90 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 69 66  , nPos);..    if
19ba0 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
19bb0 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
19bc0 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
19bd0 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
19be0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
19bf0 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
19c00 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63   }.  }.}..static
19c10 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
19c20 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61  ppendPoslistData
19c30 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
19c40 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
19c50 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20  er *pWriter, .  
19c60 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c  const u8 *aData,
19c70 20 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b   .  int nData.){
19c80 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
19c90 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
19ca0 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63  ter->writer;.  c
19cb0 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61  onst u8 *a = aDa
19cc0 74 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44  ta;.  int n = nD
19cd0 61 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ata;.  .  assert
19ce0 28 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  ( p->pConfig->pg
19cf0 73 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  sz>0 );.  while(
19d00 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19d10 4b 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67  K .     && (pPag
19d20 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65  e->buf.n + pPage
19d30 2d 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d  ->pgidx.n + n)>=
19d40 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
19d50 20 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e   .  ){.    int n
19d60 52 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  Req = p->pConfig
19d70 2d 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e  ->pgsz - pPage->
19d80 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70  buf.n - pPage->p
19d90 67 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20  gidx.n;.    int 
19da0 6e 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77  nCopy = 0;.    w
19db0 68 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71  hile( nCopy<nReq
19dc0 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75   ){.      i64 du
19dd0 6d 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79  mmy;.      nCopy
19de0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
19df0 74 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36  t(&a[nCopy], (u6
19e00 34 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  4*)&dummy);.    
19e10 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
19e20 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
19e30 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
19e40 6e 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61  nCopy, a);.    a
19e50 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e   += nCopy;.    n
19e60 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66   -= nCopy;.    f
19e70 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
19e80 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
19e90 20 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a   }.  if( n>0 ){.
19ea0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
19eb0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
19ec0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c   &pPage->buf, n,
19ed0 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74   a);.  }.}..stat
19ee0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
19ef0 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74 65 28  eAppendZerobyte(
19f00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
19f10 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
19f20 69 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66  iter){.  fts5Buf
19f30 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19f40 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72  &p->rc, &pWriter
19f50 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20 30 29  ->writer.buf, 0)
19f60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
19f70 20 61 6e 79 20 64 61 74 61 20 63 61 63 68 65 64   any data cached
19f80 20 62 79 20 74 68 65 20 77 72 69 74 65 72 20 6f   by the writer o
19f90 62 6a 65 63 74 20 74 6f 20 74 68 65 20 64 61 74  bject to the dat
19fa0 61 62 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a  abase. Free any.
19fb0 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61  ** allocations a
19fc0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
19fd0 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74  he writer..*/.st
19fe0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
19ff0 69 74 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73  iteFinish(.  Fts
1a000 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1a010 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1a020 69 74 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  iter,         /*
1a030 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1a040 2f 0a 20 20 69 6e 74 20 2a 70 6e 48 65 69 67 68  /.  int *pnHeigh
1a050 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
1a060 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67      /* OUT: Heig
1a070 68 74 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65  ht of the b-tree
1a080 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65 61   */.  int *pnLea
1a090 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1a0a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 75        /* OUT: Nu
1a0b0 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67  mber of leaf pag
1a0c0 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f 0a  es in b-tree */.
1a0d0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
1a0e0 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 4c  s5PageWriter *pL
1a0f0 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  eaf = &pWriter->
1a100 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70 2d  writer;.  if( p-
1a110 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a120 7b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  {.    if( pLeaf-
1a130 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 4c 65 61  >pgno==1 && pLea
1a140 66 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20  f->buf.n==0 ){. 
1a150 20 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 30       *pnLeaf = 0
1a160 3b 0a 20 20 20 20 20 20 2a 70 6e 48 65 69 67 68  ;.      *pnHeigh
1a170 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
1a180 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 61  {.      if( pLea
1a190 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
1a1a0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1a1b0 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1a1c0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
1a1d0 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c      *pnLeaf = pL
1a1e0 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 0a 20 20  eaf->pgno-1;..  
1a1f0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1a200 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
1a210 65 72 29 3b 0a 20 20 20 20 20 20 2a 70 6e 48 65  er);.      *pnHe
1a220 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ight = 0;.    }.
1a230 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72    }.  fts5Buffer
1a240 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65 72  Free(&pLeaf->ter
1a250 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
1a260 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75 66  Free(&pLeaf->buf
1a270 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
1a280 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69 64  ree(&pLeaf->pgid
1a290 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
1a2a0 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e 62  Free(&pWriter->b
1a2b0 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69  tterm);..  for(i
1a2c0 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e 6e  =0; i<pWriter->n
1a2d0 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20 20  Dlidx; i++){.   
1a2e0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1a2f0 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d  erFree(&pWriter-
1a300 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29 3b  >aDlidx[i].buf);
1a310 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1a320 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44 6c  ree(pWriter->aDl
1a330 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  idx);.}..static 
1a340 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49 6e  void fts5WriteIn
1a350 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
1a360 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
1a370 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 0a  iter *pWriter, .
1a380 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b 0a    int iSegid.){.
1a390 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72    memset(pWriter
1a3a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1a3b0 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70  SegWriter));.  p
1a3c0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d  Writer->iSegid =
1a3d0 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74 73 35   iSegid;..  fts5
1a3e0 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70  WriteDlidxGrow(p
1a3f0 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b 0a 20  , pWriter, 1);. 
1a400 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1a410 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72  .pgno = 1;.  pWr
1a420 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
1a430 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57  InPage = 1;.  pW
1a440 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
1a450 20 31 3b 0a 0a 20 20 66 74 73 35 42 75 66 66 65   1;..  fts5Buffe
1a460 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70  rGrow(&p->rc, &p
1a470 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1a480 67 69 64 78 2c 20 70 2d 3e 70 43 6f 6e 66 69 67  gidx, p->pConfig
1a490 2d 3e 70 67 73 7a 20 2b 20 32 30 29 3b 0a 20 20  ->pgsz + 20);.  
1a4a0 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65  if( p->pIdxWrite
1a4b0 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
1a4c0 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
1a4d0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
1a4e0 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
1a4f0 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
1a500 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65  dxWriter, sqlite
1a510 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1a520 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1a530 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28  O '%q'.'%q_idx'(
1a540 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29  segid,term,pgno)
1a550 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c   VALUES(?,?,?)",
1a560 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
1a570 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
1a580 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
1a590 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
1a5a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a5b0 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1a5c0 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
1a5d0 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
1a5e0 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  iSegid);.  }.}..
1a5f0 2f 2a 0a 2a 2a 20 54 68 65 20 62 75 66 66 65 72  /*.** The buffer
1a600 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
1a610 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
1a620 6f 6e 74 61 69 6e 73 20 61 20 6c 65 61 66 20 70  ontains a leaf p
1a630 61 67 65 20 74 68 61 74 20 69 73 0a 2a 2a 20 6d  age that is.** m
1a640 69 73 73 69 6e 67 20 69 74 73 20 70 61 67 65 2d  issing its page-
1a650 69 64 78 20 61 72 72 61 79 2e 20 54 68 65 20 66  idx array. The f
1a660 69 72 73 74 20 74 65 72 6d 20 69 73 20 67 75 61  irst term is gua
1a670 72 61 6e 74 65 65 64 20 74 6f 20 73 74 61 72 74  ranteed to start
1a680 20 61 74 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73   at.** byte offs
1a690 65 74 20 34 20 6f 66 20 74 68 65 20 62 75 66 66  et 4 of the buff
1a6a0 65 72 2e 20 54 68 65 20 73 7a 4c 65 61 66 20 66  er. The szLeaf f
1a6b0 69 65 6c 64 20 6f 66 20 74 68 65 20 6c 65 61 66  ield of the leaf
1a6c0 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20   page header.** 
1a6d0 69 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  is already popul
1a6e0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ated..**.** This
1a6f0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1a700 73 20 61 20 70 61 67 65 2d 69 6e 64 65 78 20 74  s a page-index t
1a710 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20 54 68  o the buffer. Th
1a720 65 20 62 75 66 66 65 72 20 69 73 20 0a 2a 2a 20  e buffer is .** 
1a730 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65  guaranteed to be
1a740 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1a750 20 66 69 74 20 74 68 65 20 70 61 67 65 2d 69 6e   fit the page-in
1a760 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
1a770 6f 69 64 20 66 74 73 35 4d 61 6b 65 50 61 67 65  oid fts5MakePage
1a780 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
1a790 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
1a7a0 75 66 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  uf){.  if( p->rc
1a7b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a7c0 20 20 20 75 38 20 2a 61 20 3d 20 70 42 75 66 2d     u8 *a = pBuf-
1a7d0 3e 70 3b 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65  >p;.    int szLe
1a7e0 61 66 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20  af = pBuf->n;.  
1a7f0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 34 3b 0a    int iOff = 4;.
1a800 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 0a      int nTerm;..
1a810 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26      fts5PutU16(&
1a820 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1a830 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 70 42 75  , iOff);.    pBu
1a840 66 2d 3e 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66  f->n += 2;.    f
1a850 74 73 35 49 6e 64 65 78 47 65 74 56 61 72 69 6e  ts5IndexGetVarin
1a860 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 54 65  t32(a, iOff, nTe
1a870 72 6d 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  rm);.    iOff +=
1a880 20 6e 54 65 72 6d 3b 0a 0a 20 20 20 20 77 68 69   nTerm;..    whi
1a890 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20  le( iOff<szLeaf 
1a8a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ){.      /* Skip
1a8b0 20 74 68 65 20 72 6f 77 69 64 20 64 65 6c 74 61   the rowid delta
1a8c0 20 72 6f 77 69 64 20 64 65 6c 74 61 2e 20 2a 2f   rowid delta. */
1a8d0 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
1a8e0 53 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f  SkipVarint(a, iO
1a8f0 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ff);.      if( i
1a900 4f 66 66 3e 3d 73 7a 4c 65 61 66 20 29 20 62 72  Off>=szLeaf ) br
1a910 65 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53  eak;..      /* S
1a920 6b 69 70 20 70 61 73 74 20 70 6f 73 69 74 69 6f  kip past positio
1a930 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  n list */.      
1a940 66 74 73 35 49 6e 64 65 78 47 65 74 56 61 72 69  fts5IndexGetVari
1a950 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e 54  nt32(a, iOff, nT
1a960 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  erm);.      iOff
1a970 20 2b 3d 20 28 6e 54 65 72 6d 20 3e 3e 20 31 29   += (nTerm >> 1)
1a980 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  ;..      if( iOf
1a990 66 3e 3d 28 73 7a 4c 65 61 66 2d 32 29 20 29 20  f>=(szLeaf-2) ) 
1a9a0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 2f 2a  break;..      /*
1a9b0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1a9c0 65 6e 64 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  end of the docli
1a9d0 73 74 2c 20 62 72 65 61 6b 20 6f 75 74 20 6f 66  st, break out of
1a9e0 20 74 68 65 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20   the loop */.   
1a9f0 20 20 20 69 66 28 20 61 5b 69 4f 66 66 5d 3d 3d     if( a[iOff]==
1aa00 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x00 ){.        
1aa10 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  iOff++;.        
1aa20 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66  fts5PutU16(&pBuf
1aa30 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 4f  ->p[pBuf->n], iO
1aa40 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75  ff);.        pBu
1aa50 66 2d 3e 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 20  f->n += 2;.     
1aa60 20 20 20 66 74 73 35 49 6e 64 65 78 47 65 74 56     fts5IndexGetV
1aa70 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c  arint32(a, iOff,
1aa80 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
1aa90 20 66 74 73 35 49 6e 64 65 78 47 65 74 56 61 72   fts5IndexGetVar
1aaa0 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
1aab0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 69  Term);.        i
1aac0 4f 66 66 20 2b 3d 20 6e 54 65 72 6d 3b 0a 20 20  Off += nTerm;.  
1aad0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
1aae0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
1aaf0 72 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64  r pIter was used
1ab00 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
1ab10 75 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65  ugh the input se
1ab20 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a  gments of on an.
1ab30 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ** incremental m
1ab40 65 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20  erge operation. 
1ab50 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ab60 20 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69   called if the i
1ab70 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65  ncremental.** me
1ab80 72 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e  rge step has fin
1ab90 69 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e  ished but the in
1aba0 70 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  put has not been
1abb0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61   completely exha
1abc0 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  usted..*/.static
1abd0 20 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65   void fts5TrimSe
1abe0 67 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78  gments(Fts5Index
1abf0 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74   *p, Fts5IndexIt
1ac00 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e  er *pIter){.  in
1ac10 74 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65  t i;.  Fts5Buffe
1ac20 72 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28  r buf;.  memset(
1ac30 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &buf, 0, sizeof(
1ac40 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
1ac50 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
1ac60 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
1ac70 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1ac80 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
1ac90 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  eg[i];.    if( p
1aca0 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  Seg->pSeg==0 ){.
1acb0 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
1acc0 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  /.    }else if( 
1acd0 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  pSeg->pLeaf==0 )
1ace0 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b  {.      /* All k
1acf0 65 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e  eys from this in
1ad00 70 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65  put segment have
1ad10 20 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64   been transfered
1ad20 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a   to the output..
1ad30 20 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74        ** Set bot
1ad40 68 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20  h the first and 
1ad50 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72  last page-number
1ad60 73 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  s to 0 to indica
1ad70 74 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  te that the.    
1ad80 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20    ** segment is 
1ad90 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20  now empty. */.  
1ada0 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
1adb0 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20  pgnoLast = 0;.  
1adc0 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
1add0 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20  pgnoFirst = 0;. 
1ade0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1adf0 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d  int iOff = pSeg-
1ae00 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
1ae10 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  ;     /* Offset 
1ae20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61  on new first lea
1ae30 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  f page */.      
1ae40 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a  i64 iLeafRowid;.
1ae50 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
1ae60 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74  pData;.      int
1ae70 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65   iId = pSeg->pSe
1ae80 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20  g->iSegid;.     
1ae90 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30   u8 aHdr[4] = {0
1aea0 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c  x00, 0x00, 0x00,
1aeb0 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69   0x00};..      i
1aec0 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35  LeafRowid = FTS5
1aed0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
1aee0 49 64 2c 20 30 2c 20 70 53 65 67 2d 3e 69 54 65  Id, 0, pSeg->iTe
1aef0 72 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20  rmLeafPgno);.   
1af00 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44     pData = fts5D
1af10 61 74 61 52 65 61 64 28 70 2c 20 69 4c 65 61 66  ataRead(p, iLeaf
1af20 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
1af30 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
1af40 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
1af50 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  o(&buf);.       
1af60 20 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28   fts5BufferGrow(
1af70 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
1af80 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20 20 20  ata->nn);.      
1af90 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1afa0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1afb0 62 75 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72  buf, sizeof(aHdr
1afc0 29 2c 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20  ), aHdr);.      
1afd0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1afe0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1aff0 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1b000 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  m.n);.        ft
1b010 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1b020 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1b030 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70   pSeg->term.n, p
1b040 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a 20 20  Seg->term.p);.  
1b050 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1b060 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1b070 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e  c, &buf, pData->
1b080 73 7a 4c 65 61 66 2d 69 4f 66 66 2c 20 26 70 44  szLeaf-iOff, &pD
1b090 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20  ata->p[iOff]);. 
1b0a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1b0b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b0c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
1b0d0 74 68 65 20 73 7a 4c 65 61 66 20 66 69 65 6c 64  the szLeaf field
1b0e0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 74   */.          ft
1b0f0 73 35 50 75 74 55 31 36 28 26 62 75 66 2e 70 5b  s5PutU16(&buf.p[
1b100 32 5d 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20 20  2], buf.n);.    
1b110 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
1b120 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e 65 77  * Set up the new
1b130 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72 72 61   page-index arra
1b140 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  y */.        fts
1b150 35 4d 61 6b 65 50 61 67 65 69 64 78 28 70 2c 20  5MakePageidx(p, 
1b160 26 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20  &buf);..        
1b170 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1b180 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
1b190 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
1b1a0 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
1b1b0 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
1b1c0 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
1b1d0 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
1b1e0 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 30  ENT_ROWID(iId, 0
1b1f0 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64  , 1), iLeafRowid
1b200 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1b210 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61  ataWrite(p, iLea
1b220 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62  fRowid, buf.p, b
1b230 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uf.n);.      }. 
1b240 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
1b250 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
1b260 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1b270 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61  fts5MergeChunkCa
1b280 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
1b290 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20  dex *p, .  void 
1b2a0 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20  *pCtx, .  const 
1b2b0 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
1b2c0 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35  nChunk.){.  Fts5
1b2d0 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1b2e0 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69  er = (Fts5SegWri
1b2f0 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73  ter*)pCtx;.  fts
1b300 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1b310 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74  istData(p, pWrit
1b320 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  er, pChunk, nChu
1b330 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  nk);.}../*.**.*/
1b340 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1b350 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1b360 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1b370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1b380 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1b390 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1b3a0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
1b3b0 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
1b3c0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74  /* IN/OUT: Stuct
1b3d0 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
1b3e0 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65    /* Level to re
1b410 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f  ad input from */
1b420 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74     /* Write up t
1b450 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70  o this many outp
1b460 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a  ut leaves */.){.
1b470 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1b480 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1b490 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1b4a0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1b4b0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1b4c0 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
1b4d0 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1b4e0 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35  *pLvlOut;.  Fts5
1b4f0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1b500 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 0;       /* I
1b510 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
1b520 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
1b530 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
1b540 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
1b550 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
1b560 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
1b570 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
1b580 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1b590 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b5a0 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
1b5b0 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
1b5c0 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
1b5d0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1b5e0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
1b5f0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1b600 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
1b610 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
1b620 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
1b630 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65   term;.  int bRe
1b640 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
1b650 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63 6c   = 0;    /* Docl
1b660 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 28  ist terminator (
1b670 30 78 30 30 29 20 72 65 71 75 69 72 65 64 20 2a  0x00) required *
1b680 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  /.  int bOldest;
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1b6b0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1b6c0 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
1b6d0 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
1b6e0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1b6f0 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1b700 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1b710 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1b720 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1b730 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1b740 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1b750 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1b760 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1b770 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
1b780 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
1b790 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1b7a0 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1b7b0 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
1b7c0 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
1b7d0 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
1b7e0 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53  ->nMerge;.    pS
1b7f0 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1b800 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1b810 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  g-1];..    fts5W
1b820 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1b830 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  ter, pSeg->iSegi
1b840 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77  d);.    writer.w
1b850 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65  riter.pgno = pSe
1b860 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20  g->pgnoLast+1;. 
1b870 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67     writer.iBtPag
1b880 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1b890 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
1b8a0 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1b8b0 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1b8c0 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74  .    /* Extend t
1b8d0 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1b8e0 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69   object as requi
1b8f0 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  red to ensure th
1b900 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
1b910 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20  segment exists. 
1b920 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d  */.    if( iLvl=
1b930 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
1b940 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  -1 ){.      fts5
1b950 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1b960 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75  l(&p->rc, ppStru
1b970 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  ct);.      pStru
1b980 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1b990 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1b9a0 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
1b9b0 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
1b9c0 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30  ct, iLvl+1, 1, 0
1b9d0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1b9e0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
1b9f0 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1ba00 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1ba10 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1ba20 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1ba30 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  l+1];..    fts5W
1ba40 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1ba50 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1ba60 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
1ba70 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  w segment to the
1ba80 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f   output level */
1ba90 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
1baa0 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
1bab0 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70  ut->nSeg];.    p
1bac0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a  LvlOut->nSeg++;.
1bad0 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
1bae0 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65  rst = 1;.    pSe
1baf0 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1bb00 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  id;.    pStruct-
1bb10 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20  >nSegment++;..  
1bb20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20    /* Read input 
1bb30 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74  from all segment
1bb40 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
1bb50 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70  evel */.    nInp
1bb60 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  ut = pLvl->nSeg;
1bb70 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d  .  }.  bOldest =
1bb80 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d   (pLvlOut->nSeg=
1bb90 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e  =1 && pStruct->n
1bba0 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a  Level==iLvl+2);.
1bbb0 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e  .  assert( iLvl>
1bbc0 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35  =0 );.  for(fts5
1bbd0 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1bbe0 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30  pStruct, 0, 0, 0
1bbf0 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
1bc00 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
1bc10 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
1bc20 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
1bc30 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1bc40 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
1bc50 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
1bc60 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1bc70 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
1bc80 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1bc90 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1bca0 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
1bcd0 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
1bce0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
1bcf0 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
1bd00 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
1bd10 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
1bd20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e  key annihilation
1bd30 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  . */.    if( pSe
1bd40 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26  gIter->nPos==0 &
1bd50 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53  & (bOldest || pS
1bd60 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29  egIter->bDel==0)
1bd70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1bd80 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75    pTerm = fts5Mu
1bd90 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
1bda0 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  r, &nTerm);.    
1bdb0 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
1bdc0 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
1bdd0 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
1bde0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1bdf0 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e  nRem && writer.n
1be00 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d  LeafWritten>nRem
1be10 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1be20 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1be30 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1be40 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
1be50 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
1be60 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
1be70 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 71 75  .      if( bRequ
1be80 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 29  ireDoclistTerm )
1be90 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  {.        fts5Wr
1bea0 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74  iteAppendZerobyt
1beb0 65 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20  e(p, &writer);. 
1bec0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
1bed0 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
1bee0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65  (p, &writer, nTe
1bef0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1bf00 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
1bf10 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
1bf20 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1bf30 20 20 20 20 62 52 65 71 75 69 72 65 44 6f 63 6c      bRequireDocl
1bf40 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  istTerm = 1;.   
1bf50 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e   }..    /* Appen
1bf60 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74  d the rowid to t
1bf70 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
1bf80 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
1bf90 53 49 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73  SIZE */.    nPos
1bfa0 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f   = pSegIter->nPo
1bfb0 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e  s*2 + pSegIter->
1bfc0 62 44 65 6c 3b 0a 20 20 20 20 66 74 73 35 57 72  bDel;.    fts5Wr
1bfd0 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
1bfe0 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d  , &writer, fts5M
1bff0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
1c000 74 65 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20  ter), nPos);..  
1c010 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1c020 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61  position-list da
1c030 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ta to the output
1c040 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e   */.    fts5Chun
1c050 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
1c060 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72  Iter, (void*)&wr
1c070 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43  iter, fts5MergeC
1c080 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  hunkCallback);. 
1c090 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
1c0a0 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  he last leaf pag
1c0b0 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74  e to disk. Set t
1c0c0 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1c0d0 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a  t b-tree height.
1c0e0 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65    ** and last le
1c0f0 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  af page number a
1c100 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1c110 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65    */.  fts5Write
1c120 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
1c130 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68  r, &pSeg->nHeigh
1c140 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  t, &pSeg->pgnoLa
1c150 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35  st);..  if( fts5
1c160 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1c170 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e  pIter) ){.    in
1c180 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  t i;..    /* Rem
1c190 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
1c1a0 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
1c1b0 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
1c1c0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1c1d0 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b   i<nInput; i++){
1c1e0 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
1c1f0 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20  emoveSegment(p, 
1c200 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53  pLvl->aSeg[i].iS
1c210 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  egid);.    }..  
1c220 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1c230 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
1c240 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ts from the inpu
1c250 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
1c260 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e  f( pLvl->nSeg!=n
1c270 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69  Input ){.      i
1c280 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c  nt nMove = (pLvl
1c290 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29  ->nSeg - nInput)
1c2a0 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
1c2b0 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
1c2c0 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  .      memmove(p
1c2d0 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Lvl->aSeg, &pLvl
1c2e0 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20  ->aSeg[nInput], 
1c2f0 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMove);.    }.  
1c300 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
1c310 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20  ent -= nInput;. 
1c320 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d     pLvl->nSeg -=
1c330 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
1c340 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20  l->nMerge = 0;. 
1c350 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e     if( pSeg->pgn
1c360 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oLast==0 ){.    
1c370 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d    pLvlOut->nSeg-
1c380 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  -;.      pStruct
1c390 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20  ->nSegment--;.  
1c3a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c3b0 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70   assert( pSeg->p
1c3c0 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20  gnoLast>0 );.   
1c3d0 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1c3e0 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
1c3f0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
1c400 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  nInput;.  }..  f
1c410 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1c420 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
1c430 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
1c440 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
1c450 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
1c460 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
1c470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
1c480 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
1c490 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
1c4a0 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  on the index..*/
1c4b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1c4c0 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46  5IndexMerge(.  F
1c4d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c4f0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1c500 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1c510 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1c520 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1c530 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
1c540 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
1c550 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20   */.  int nPg   
1c560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c570 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f        /* Pages o
1c580 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a  f work to do */.
1c590 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  ){.  int nRem = 
1c5a0 6e 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  nPg;.  Fts5Struc
1c5b0 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
1c5c0 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69  *ppStruct;.  whi
1c5d0 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d  le( nRem>0 && p-
1c5e0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1c5f0 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
1c600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c610 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
1c620 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
1c630 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c  /.    int iBestL
1c640 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  vl = 0;         
1c650 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72    /* Level offer
1c660 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70  ing the most inp
1c670 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
1c680 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30     int nBest = 0
1c690 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1c6a0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
1c6b0 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65  t segments on be
1c6c0 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20  st level */..   
1c6d0 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c   /* Set iBestLvl
1c6e0 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f   to the level to
1c6f0 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d   read input segm
1c700 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20  ents from. */.  
1c710 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1c720 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20  t->nLevel>0 );. 
1c730 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
1c740 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1c750 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1c760 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1c770 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
1c780 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1c790 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iLvl];.      if(
1c7a0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
1c7b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
1c7c0 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20  l->nMerge>nBest 
1c7d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65  ){.          iBe
1c7e0 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
1c7f0 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
1c800 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
1c810 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1c820 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1c830 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
1c840 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  Seg>nBest ){.   
1c850 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
1c860 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20  l->nSeg;.       
1c870 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1c880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c890 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74  .    /* If nBest
1c8a0 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65   is still 0, the
1c8b0 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  n the index must
1c8c0 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69   be empty. */.#i
1c8d0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1c8e0 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  G.    for(iLvl=0
1c8f0 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c  ; nBest==0 && iL
1c900 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1c910 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1c920 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
1c930 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1c940 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20  .nSeg==0 );.    
1c950 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
1c960 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66  ( nBest<p->pConf
1c970 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a  ig->nAutomerge .
1c980 20 20 20 20 20 20 20 20 26 26 20 70 53 74 72 75          && pStru
1c990 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
1c9a0 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a  Lvl].nMerge==0 .
1c9b0 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62        ){.      b
1c9c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1c9d0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1c9e0 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
1c9f0 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
1ca00 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1ca10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ca20 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1ca30 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
1ca40 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1ca50 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
1ca60 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
1ca70 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
1ca80 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
1ca90 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a  = pStruct;.}../*
1caa0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e  .** A total of n
1cab0 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20  Leaf leaf pages 
1cac0 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74  of data has just
1cad0 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
1cae0 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65   a level-0.** se
1caf0 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  gment. This func
1cb00 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65  tion updates the
1cb10 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
1cb20 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
1cb30 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c  if.** necessary,
1cb40 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d   performs increm
1cb50 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b  ental merge work
1cb60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1cb70 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1cb80 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
1cb90 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
1cba0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
1cbb0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1cbc0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1cbd0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1cbe0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1cbf0 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a  IndexAutomerge(.
1cc00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1cc30 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1cc40 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1cc50 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1cc60 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1cc70 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1cc80 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  dex */.  int nLe
1cc90 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1cca0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1ccb0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61  er of output lea
1ccc0 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ves just written
1ccd0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
1cce0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ccf0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75   p->pConfig->nAu
1cd00 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20  tomerge>0 ){.   
1cd10 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1cd20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1cd30 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72  uct;.    u64 nWr
1cd40 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1cd50 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
1cd60 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65  l value of write
1cd70 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20  -counter */.    
1cd80 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20  int nWork;      
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1cda0 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d   Number of work-
1cdb0 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72  quanta to perfor
1cdc0 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  m */.    int nRe
1cdd0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1cde0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1cdf0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c   of leaf pages l
1ce00 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
1ce10 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1ce20 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  he write-counter
1ce30 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  . While doing so
1ce40 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a  , set nWork. */.
1ce50 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74      nWrite = pSt
1ce60 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
1ce70 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d  ter;.    nWork =
1ce80 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20   (int)(((nWrite 
1ce90 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57  + nLeaf) / p->nW
1cea0 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69  orkUnit) - (nWri
1ceb0 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  te / p->nWorkUni
1cec0 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74  t));.    pStruct
1ced0 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
1cee0 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52  += nLeaf;.    nR
1cef0 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57  em = (int)(p->nW
1cf00 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20  orkUnit * nWork 
1cf10 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  * pStruct->nLeve
1cf20 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64  l);..    fts5Ind
1cf30 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72  exMerge(p, ppStr
1cf40 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a  uct, nRem);.  }.
1cf50 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1cf60 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
1cf70 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
1cf80 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1cf90 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1cfa0 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1cfb0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1cfc0 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20   **ppStruct     
1cfd0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
1cfe0 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
1cff0 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  of index */.){. 
1d000 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73   const int nCris
1d010 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  is = p->pConfig-
1d020 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20  >nCrisisMerge;. 
1d030 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1d040 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1d050 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20  uct;.  int iLvl 
1d060 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1d070 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1d080 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
1d090 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vel>0 );.  while
1d0a0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d0b0 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
1d0c0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1d0d0 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20  >=nCrisis ){.   
1d0e0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1d0f0 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
1d100 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20  , iLvl, 0);.    
1d110 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1d120 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20  mote(p, iLvl+1, 
1d130 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c  pStruct);.    iL
1d140 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53  vl++;.  }.  *ppS
1d150 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
1d160 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
1d170 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46  ts5IndexReturn(F
1d180 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1d190 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
1d1a0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1d1b0 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  _OK;.  return rc
1d1c0 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
1d1d0 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
1d1e0 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73   Fts5FlushCtx;.s
1d1f0 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
1d200 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  tx {.  Fts5Index
1d210 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65   *pIdx;.  Fts5Se
1d220 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
1d230 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .};../*.** Buffe
1d240 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e  r aBuf[] contain
1d250 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
1d260 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65  nts, all small e
1d270 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20  nough to fit.** 
1d280 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
1d290 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ger. Return the 
1d2a0 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67  size of the larg
1d2b0 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68  est prefix of th
1d2c0 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78  is .** list nMax
1d2d0 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69   bytes or less i
1d2e0 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
1d2f0 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73  c int fts5Poslis
1d300 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38  tPrefix(const u8
1d310 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78   *aBuf, int nMax
1d320 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
1d330 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74  u32 dummy;.  ret
1d340 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
1d350 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b  32(aBuf, dummy);
1d360 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
1d370 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47     int i = fts5G
1d380 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75 66  etVarint32(&aBuf
1d390 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20  [ret], dummy);. 
1d3a0 20 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29     if( (ret + i)
1d3b0 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b   > nMax ) break;
1d3c0 0a 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20  .    ret += i;. 
1d3d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
1d3e0 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
1d3f0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1d400 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62  Blob(pBuf, pBlob
1d410 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a 20 20 61  , nBlob) { \.  a
1d420 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 53 70  ssert( pBuf->nSp
1d430 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e 2b 6e 42  ace>=(pBuf->n+nB
1d440 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20 20  lob) );         
1d450 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26      \.  memcpy(&
1d460 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1d470 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1d490 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f   pBuf->n += nBlo
1d4a0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d4c0 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
1d4d0 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
1d4e0 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  nts of in-memory
1d4f0 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73   hash table iHas
1d500 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c  h to a new level
1d510 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f  -0 .** segment o
1d520 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64  n disk. Also upd
1d530 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ate the correspo
1d540 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  nding structure 
1d550 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
1d560 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1d570 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
1d580 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
1d590 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
1d5a0 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
1d5b0 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
1d5c0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1d5d0 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1d5e0 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61  d fts5FlushOneHa
1d5f0 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  sh(Fts5Index *p)
1d600 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48  {.  Fts5Hash *pH
1d610 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
1d620 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1d630 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  *pStruct;.  int 
1d640 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67  iSegid;.  int pg
1d650 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20  noLast = 0;     
1d660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1d670 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
1d680 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
1d690 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
1d6a0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1d6b0 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
1d6c0 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  re and allocate 
1d6d0 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
1d6e0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
1d6f0 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  w level-0 segmen
1d700 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  t.  */.  pStruct
1d710 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1d720 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69  Read(p);.  iSegi
1d730 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
1d740 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
1d750 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64  );..  if( iSegid
1d760 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
1d770 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e  t pgsz = p->pCon
1d780 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20 20 20 20  fig->pgsz;..    
1d790 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1d7a0 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
1d7b0 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
1d7c0 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
1d7d0 20 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20     int nHeight; 
1d7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7f0 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65   /* Height of ne
1d800 77 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  w segment b-tree
1d810 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
1d820 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
1d830 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1d840 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
1d850 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a  mble leaf page *
1d860 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1d870 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20 20   *pPgidx;       
1d880 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1d890 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1d8a0 6c 65 20 70 67 69 64 78 20 2a 2f 0a 20 20 20 20  le pgidx */.    
1d8b0 63 6f 6e 73 74 20 75 38 20 2a 7a 50 72 65 76 20  const u8 *zPrev 
1d8c0 3d 20 30 3b 0a 0a 20 20 20 20 46 74 73 35 53 65  = 0;..    Fts5Se
1d8d0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 0a  gWriter writer;.
1d8e0 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
1d8f0 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53  t(p, &writer, iS
1d900 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 50  egid);..    /* P
1d910 72 65 2d 61 6c 6c 6f 63 61 74 65 20 74 68 65 20  re-allocate the 
1d920 62 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 61  buffer used to a
1d930 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67  ssemble leaf pag
1d940 65 73 20 74 6f 20 74 68 65 20 74 61 72 67 65 74  es to the target
1d950 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 73 69 7a  .    ** page siz
1d960 65 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  e.  */.    asser
1d970 74 28 20 70 67 73 7a 3e 30 20 29 3b 0a 20 20 20  t( pgsz>0 );.   
1d980 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
1d990 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20  writer.buf;.    
1d9a0 70 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72  pPgidx = &writer
1d9b0 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 20  .writer.pgidx;. 
1d9c0 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f     fts5BufferGro
1d9d0 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  w(&p->rc, pBuf, 
1d9e0 70 67 73 7a 20 2b 20 32 30 29 3b 0a 0a 20 20 20  pgsz + 20);..   
1d9f0 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69   /* Begin scanni
1da00 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20  ng through hash 
1da10 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54  table entries. T
1da20 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  his loop runs on
1da30 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  ce for each.    
1da40 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  ** term/doclist 
1da50 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1da60 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68   within the hash
1da70 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
1da80 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1da90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
1daa0 73 65 74 28 70 42 75 66 2d 3e 70 2c 20 30 2c 20  set(pBuf->p, 0, 
1dab0 34 29 3b 0a 20 20 20 20 20 20 70 42 75 66 2d 3e  4);.      pBuf->
1dac0 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 70 2d 3e  n = 4;.      p->
1dad0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
1dae0 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61  HashScanInit(pHa
1daf0 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  sh, 0, 0);.    }
1db00 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
1db10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1db20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61  0==sqlite3Fts5Ha
1db30 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29  shScanEof(pHash)
1db40 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1db50 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
1db60 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1db70 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
1db80 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  */.      int nTe
1db90 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
1dba0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1dbb0 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73 20 2a  zTerm in bytes *
1dbc0 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  /.      const u8
1dbd0 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20 20   *pDoclist;     
1dbe0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
1dbf0 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68  o doclist for th
1dc00 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20  is term */.     
1dc10 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20   int nDoclist;  
1dc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc30 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20  Size of doclist 
1dc40 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
1dc50 20 20 69 6e 74 20 6e 53 75 66 66 69 78 3b 20 20    int nSuffix;  
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dc70 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 73 75   Size of term su
1dc80 66 66 69 78 20 2a 2f 0a 0a 20 20 20 20 20 20 73  ffix */..      s
1dc90 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1dca0 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26  anEntry(pHash, &
1dcb0 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74  zTerm, &pDoclist
1dcc0 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  , &nDoclist);.  
1dcd0 20 20 20 20 6e 54 65 72 6d 20 3d 20 73 74 72 6c      nTerm = strl
1dce0 65 6e 28 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20  en(zTerm);..    
1dcf0 20 20 2f 2a 20 44 65 63 69 64 65 20 69 66 20 74    /* Decide if t
1dd00 68 65 20 74 65 72 6d 20 77 69 6c 6c 20 66 69 74  he term will fit
1dd10 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
1dd20 6c 65 61 66 2e 20 49 66 20 69 74 20 77 69 6c 6c  leaf. If it will
1dd30 20 6e 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 66   not,.      ** f
1dd40 6c 75 73 68 20 74 68 65 20 6c 65 61 66 20 74 6f  lush the leaf to
1dd50 20 64 69 73 6b 20 68 65 72 65 2e 20 20 0a 20 20   disk here.  .  
1dd60 20 20 20 20 2a 2a 20 54 4f 44 4f 31 3a 20 49 73      ** TODO1: Is
1dd70 20 74 68 69 73 20 63 61 6c 63 75 6c 61 74 69 6f   this calculatio
1dd80 6e 20 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 3f  n still correct?
1dd90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
1dda0 42 75 66 2d 3e 6e 3e 34 20 26 26 20 28 70 42 75  Buf->n>4 && (pBu
1ddb0 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32  f->n + nTerm + 2
1ddc0 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 32   + pPgidx->n + 2
1ddd0 29 20 3e 20 70 67 73 7a 20 29 7b 0a 20 20 20 20  ) > pgsz ){.    
1dde0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1ddf0 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65  shLeaf(p, &write
1de00 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
1de10 28 6e 54 65 72 6d 20 2b 20 33 32 29 20 3e 20 70  (nTerm + 32) > p
1de20 42 75 66 2d 3e 6e 53 70 61 63 65 20 29 7b 0a 20  Buf->nSpace ){. 
1de30 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1de40 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
1de50 70 42 75 66 2c 20 6e 54 65 72 6d 20 2b 20 33 32  pBuf, nTerm + 32
1de60 20 2d 20 70 42 75 66 2d 3e 6e 29 3b 0a 20 20 20   - pBuf->n);.   
1de70 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1de80 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1de90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
1dea0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1deb0 74 65 72 6d 20 74 6f 20 74 68 65 20 6c 65 61 66  term to the leaf
1dec0 2e 20 41 6e 64 20 69 66 20 69 74 20 69 73 20 74  . And if it is t
1ded0 68 65 20 66 69 72 73 74 20 6f 6e 20 74 68 65 20  he first on the 
1dee0 6c 65 61 66 2c 20 61 6e 64 0a 20 20 20 20 20 20  leaf, and.      
1def0 2a 2a 20 74 68 65 20 6c 65 61 66 20 69 73 20 6e  ** the leaf is n
1df00 6f 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 31  ot page number 1
1df10 2c 20 70 75 73 68 20 69 74 20 75 70 20 69 6e 74  , push it up int
1df20 6f 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  o the b-tree hie
1df30 72 61 72 63 68 79 20 0a 20 20 20 20 20 20 2a 2a  rarchy .      **
1df40 20 61 73 20 77 65 6c 6c 2e 20 20 2a 2f 0a 0a 20   as well.  */.. 
1df50 20 20 20 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 57       /* TODO1: W
1df60 72 69 74 69 6e 67 20 70 67 69 64 78 20 68 65 72  riting pgidx her
1df70 65 21 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35  e! */.      fts5
1df80 50 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e  PutU16(&pPgidx->
1df90 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 42  p[pPgidx->n], pB
1dfa0 75 66 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 70 50  uf->n);.      pP
1dfb0 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 20 20  gidx->n += 2;.  
1dfc0 20 20 20 20 69 66 28 20 77 72 69 74 65 72 2e 62      if( writer.b
1dfd0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 3d  FirstTermInPage=
1dfe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
1dff0 74 20 6e 50 72 65 20 3d 20 66 74 73 35 50 72 65  t nPre = fts5Pre
1e000 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 54 65 72  fixCompress(nTer
1e010 6d 2c 20 7a 50 72 65 76 2c 20 6e 54 65 72 6d 2c  m, zPrev, nTerm,
1e020 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
1e030 6d 29 3b 0a 20 20 20 20 20 20 20 20 70 42 75 66  m);.        pBuf
1e040 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1e050 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
1e060 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 6e  f->p[pBuf->n], n
1e070 50 72 65 29 3b 0a 20 20 20 20 20 20 20 20 6e 53  Pre);.        nS
1e080 75 66 66 69 78 20 3d 20 6e 54 65 72 6d 20 2d 20  uffix = nTerm - 
1e090 6e 50 72 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nPre;.      }els
1e0a0 65 7b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65  e{.        write
1e0b0 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  r.bFirstTermInPa
1e0c0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
1e0d0 69 66 28 20 77 72 69 74 65 72 2e 77 72 69 74 65  if( writer.write
1e0e0 72 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  r.pgno!=1 ){.   
1e0f0 20 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20         int nPre 
1e100 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70  = fts5PrefixComp
1e110 72 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65  ress(nTerm, zPre
1e120 76 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74  v, nTerm, (const
1e130 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20   u8*)zTerm);.   
1e140 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65         fts5Write
1e150 42 74 72 65 65 54 65 72 6d 28 70 2c 20 26 77 72  BtreeTerm(p, &wr
1e160 69 74 65 72 2c 20 6e 50 72 65 2b 31 2c 20 28 63  iter, nPre+1, (c
1e170 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b  onst u8*)zTerm);
1e180 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20  .          pBuf 
1e190 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  = &writer.writer
1e1a0 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20  .buf;.          
1e1b0 61 73 73 65 72 74 28 20 6e 50 72 65 3c 6e 54 65  assert( nPre<nTe
1e1c0 72 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rm );.        }.
1e1d0 20 20 20 20 20 20 20 20 6e 53 75 66 66 69 78 20          nSuffix 
1e1e0 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d  = nTerm;.      }
1e1f0 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b  .      pBuf->n +
1e200 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74  = sqlite3Fts5Put
1e210 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
1e220 70 42 75 66 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69  pBuf->n], nSuffi
1e230 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  x);.      fts5Bu
1e240 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1e250 6f 62 28 70 42 75 66 2c 20 28 63 6f 6e 73 74 20  ob(pBuf, (const 
1e260 75 38 2a 29 26 7a 54 65 72 6d 5b 6e 54 65 72 6d  u8*)&zTerm[nTerm
1e270 2d 6e 53 75 66 66 69 78 5d 2c 20 6e 53 75 66 66  -nSuffix], nSuff
1e280 69 78 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57  ix);..      /* W
1e290 65 20 6a 75 73 74 20 77 72 6f 74 65 20 61 20 74  e just wrote a t
1e2a0 65 72 6d 20 69 6e 74 6f 20 70 61 67 65 20 77 72  erm into page wr
1e2b0 69 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e  iter.aWriter[0].
1e2c0 70 67 6e 6f 2e 20 49 66 20 61 20 0a 20 20 20 20  pgno. If a .    
1e2d0 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64    ** doclist-ind
1e2e0 65 78 20 69 73 20 74 6f 20 62 65 20 67 65 6e 65  ex is to be gene
1e2f0 72 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 64  rated for this d
1e300 6f 63 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20  oclist, it will 
1e310 62 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 73 6f  be.      ** asso
1e320 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
1e330 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
1e340 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 6e  assert( writer.n
1e350 44 6c 69 64 78 3e 30 20 26 26 20 77 72 69 74 65  Dlidx>0 && write
1e360 72 2e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  r.aDlidx[0].buf.
1e370 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 77 72  n==0 );.      wr
1e380 69 74 65 72 2e 61 44 6c 69 64 78 5b 30 5d 2e 70  iter.aDlidx[0].p
1e390 67 6e 6f 20 3d 20 77 72 69 74 65 72 2e 77 72 69  gno = writer.wri
1e3a0 74 65 72 2e 70 67 6e 6f 3b 0a 0a 20 20 20 20 20  ter.pgno;..     
1e3b0 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
1e3c0 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  ->n + pPgidx->n 
1e3d0 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20  + nDoclist + 1) 
1e3e0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1e3f0 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1e400 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1e410 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
1e420 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
1e430 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1e440 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73  ob(pBuf, pDoclis
1e450 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
1e460 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e470 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1e480 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
1e490 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  Delta = 0;.     
1e4a0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
1e4b0 0a 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 72  ..        writer
1e4c0 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
1e4d0 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  ge = 0;..       
1e4e0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 64   /* The entire d
1e4f0 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20  oclist will not 
1e500 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66  fit on this leaf
1e510 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
1e520 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  .        ** loop
1e530 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67   iterates throug
1e540 68 20 74 68 65 20 70 6f 73 6c 69 73 74 73 20 74  h the poslists t
1e550 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
1e560 63 75 72 72 65 6e 74 20 0a 20 20 20 20 20 20 20  current .       
1e570 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20 20 2a 2f   ** doclist.  */
1e580 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
1e590 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e5a0 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63 6c 69 73   && iOff<nDoclis
1e5b0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  t ){.          i
1e5c0 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
1e5d0 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 20 20     int nCopy;.  
1e5e0 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
1e5f0 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  my;.          iO
1e600 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
1e610 69 6e 74 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  int(&pDoclist[iO
1e620 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
1e630 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  ta);.          n
1e640 43 6f 70 79 20 3d 20 66 74 73 35 47 65 74 50 6f  Copy = fts5GetPo
1e650 73 6c 69 73 74 53 69 7a 65 28 26 70 44 6f 63 6c  slistSize(&pDocl
1e660 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73  ist[iOff], &nPos
1e670 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20  , &bDummy);.    
1e680 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e        nCopy += n
1e690 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Pos;.          i
1e6a0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
1e6b0 0a 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20  .          .    
1e6c0 20 20 20 20 20 20 69 66 28 20 77 72 69 74 65 72        if( writer
1e6d0 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  .bFirstRowidInPa
1e6e0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
1e6f0 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 42    fts5PutU16(&pB
1e700 75 66 2d 3e 70 5b 30 5d 2c 20 70 42 75 66 2d 3e  uf->p[0], pBuf->
1e710 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72  n);   /* first r
1e720 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a  owid on page */.
1e730 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
1e740 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1e750 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42 75  s5PutVarint(&pBu
1e760 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69  f->p[pBuf->n], i
1e770 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
1e780 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72 73      writer.bFirs
1e790 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
1e7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
1e7b0 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65  s5WriteDlidxAppe
1e7c0 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  nd(p, &writer, i
1e7d0 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
1e7e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e7f0 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20       pBuf->n += 
1e800 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
1e810 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  rint(&pBuf->p[pB
1e820 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b  uf->n], iDelta);
1e830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e840 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e850 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53  Buf->n<=pBuf->nS
1e860 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20  pace );..       
1e870 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20     if( (pBuf->n 
1e880 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43  + pPgidx->n + nC
1e890 6f 70 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a  opy) <= pgsz ){.
1e8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1e8b0 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73  he entire poslis
1e8c0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1e8d0 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1e8e0 53 6f 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20  So copy.        
1e8f0 20 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65      ** it in one
1e900 20 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20   go. */.        
1e910 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1e920 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
1e930 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  f, &pDoclist[iOf
1e940 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  f], nCopy);.    
1e950 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e960 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1e970 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
1e980 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74  ill not fit on t
1e990 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20  his leaf. So it 
1e9a0 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20 20 20  needs.          
1e9b0 20 20 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65    ** to be broke
1e9c0 6e 20 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e  n into sections.
1e9d0 20 54 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66   The only qualif
1e9e0 69 63 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20  ication being.  
1e9f0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
1ea00 74 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75  t each varint mu
1ea10 73 74 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e  st be stored con
1ea20 74 69 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20  tiguously.  */. 
1ea30 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74             const
1ea40 20 75 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20   u8 *pPoslist = 
1ea50 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b  &pDoclist[iOff];
1ea60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1ea70 20 69 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20   iPos = 0;.     
1ea80 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
1ea90 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1eaa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1eab0 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73  int nSpace = pgs
1eac0 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50  z - pBuf->n - pP
1ead0 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  gidx->n;.       
1eae0 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
1eaf0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1eb00 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f  if( (nCopy - iPo
1eb10 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20  s)<=nSpace ){.  
1eb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20                n 
1eb30 3d 20 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a  = nCopy - iPos;.
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
1eb50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1eb60 20 20 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73       n = fts5Pos
1eb70 6c 69 73 74 50 72 65 66 69 78 28 26 70 50 6f 73  listPrefix(&pPos
1eb80 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61  list[iPos], nSpa
1eb90 63 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ce);.           
1eba0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1ebb0 20 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29     assert( n>0 )
1ebc0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1ebd0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
1ebe0 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26  pendBlob(pBuf, &
1ebf0 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20  pPoslist[iPos], 
1ec00 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
1ec10 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20    iPos += n;.   
1ec20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1ec30 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78  pBuf->n + pPgidx
1ec40 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20  ->n)>=pgsz ){.  
1ec50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
1ec60 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
1ec70 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20  (p, &writer);.  
1ec80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1eca0 69 50 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72  iPos>=nCopy ) br
1ecb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
1ecc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
1ecd0 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
1ece0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   nCopy;.        
1ecf0 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
1ed00 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e   pBuf->p[pBuf->n
1ed10 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
1ed20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
1ed30 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20  n<=pBuf->nSpace 
1ed40 29 3b 0a 20 20 20 20 20 20 7a 50 72 65 76 20 3d  );.      zPrev =
1ed50 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
1ed60 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  m;.      sqlite3
1ed70 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
1ed80 28 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20  (pHash);.    }. 
1ed90 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
1eda0 73 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a  shClear(pHash);.
1edb0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 69 6e      fts5WriteFin
1edc0 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20  ish(p, &writer, 
1edd0 26 6e 48 65 69 67 68 74 2c 20 26 70 67 6e 6f 4c  &nHeight, &pgnoL
1ede0 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ast);..    /* Up
1edf0 64 61 74 65 20 74 68 65 20 46 74 73 35 53 74 72  date the Fts5Str
1ee00 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 77 72  ucture. It is wr
1ee10 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1ee20 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68  e database by th
1ee30 65 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72  e.    ** fts5Str
1ee40 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 29 20  uctureRelease() 
1ee50 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  call below.  */.
1ee60 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d      if( pStruct-
1ee70 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20  >nLevel==0 ){.  
1ee80 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
1ee90 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  eAddLevel(&p->rc
1eea0 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20  , &pStruct);.   
1eeb0 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1eec0 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28  tureExtendLevel(
1eed0 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c  &p->rc, pStruct,
1eee0 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69   0, 1, 0);.    i
1eef0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1ef00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65  _OK ){.      pSe
1ef10 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  g = &pStruct->aL
1ef20 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53  evel[0].aSeg[ pS
1ef30 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d  truct->aLevel[0]
1ef40 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20  .nSeg++ ];.     
1ef50 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
1ef60 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53  iSegid;.      pS
1ef70 65 67 2d 3e 6e 48 65 69 67 68 74 20 3d 20 6e 48  eg->nHeight = nH
1ef80 65 69 67 68 74 3b 0a 20 20 20 20 20 20 70 53 65  eight;.      pSe
1ef90 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
1efa0 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
1efb0 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73  noLast = pgnoLas
1efc0 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  t;.      pStruct
1efd0 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20  ->nSegment++;.  
1efe0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
1eff0 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20  cturePromote(p, 
1f000 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  0, pStruct);.  }
1f010 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74  ..  fts5IndexAut
1f020 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75  omerge(p, &pStru
1f030 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20  ct, pgnoLast);. 
1f040 20 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73   fts5IndexCrisis
1f050 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1f060 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  t);.  fts5Struct
1f070 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72  ureWrite(p, pStr
1f080 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
1f090 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
1f0a0 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ruct);.}../*.** 
1f0b0 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73  Flush any data s
1f0c0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d  tored in the in-
1f0d0 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1f0e0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1f0f0 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  se..*/.static vo
1f100 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73  id fts5IndexFlus
1f110 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
1f120 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20  .  /* Unless it 
1f130 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20  is empty, flush 
1f140 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
1f150 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20  o disk */.  if( 
1f160 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1f170 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1f180 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70  ->pHash );.    p
1f190 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d  ->nPendingData =
1f1a0 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73   0;.    fts5Flus
1f1b0 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d  hOneHash(p);.  }
1f1c0 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
1f1d0 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a  Fts5IndexOptimiz
1f1e0 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  e(Fts5Index *p){
1f1f0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1f200 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
1f210 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77  5Structure *pNew
1f220 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67   = 0;.  int nSeg
1f230 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1f240 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1f250 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  K );.  fts5Index
1f260 46 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72  Flush(p);.  pStr
1f270 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1f280 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
1f290 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  f( pStruct ){.  
1f2a0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1f2b0 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
1f2c0 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
1f2d0 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
1f2e0 20 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20 70   );.    nSeg = p
1f2f0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1f300 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e 31  ;.    if( nSeg>1
1f310 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   ){.      int nB
1f320 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
1f330 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20  5Structure);.   
1f340 20 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74     nByte += (pSt
1f350 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20  ruct->nLevel+1) 
1f360 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1f370 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20  uctureLevel);.  
1f380 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35      pNew = (Fts5
1f390 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74  Structure*)sqlit
1f3a0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1f3b0 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1f3c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1f3d0 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73   pNew ){.    Fts
1f3e0 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1f3f0 2a 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e  *pLvl;.    int n
1f400 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69  Byte = nSeg * si
1f410 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1f420 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
1f430 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70  pNew->nLevel = p
1f440 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31  Struct->nLevel+1
1f450 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66  ;.    pNew->nRef
1f460 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e   = 1;.    pNew->
1f470 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20  nWriteCounter = 
1f480 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43  pStruct->nWriteC
1f490 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c  ounter;.    pLvl
1f4a0 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c   = &pNew->aLevel
1f4b0 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  [pStruct->nLevel
1f4c0 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  ];.    pLvl->aSe
1f4d0 67 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75  g = (Fts5Structu
1f4e0 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74  reSegment*)sqlit
1f4f0 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f  e3Fts5MallocZero
1f500 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b  (&p->rc, nByte);
1f510 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61  .    if( pLvl->a
1f520 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
1f530 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20   iLvl, iSeg;.   
1f540 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d     int iSegOut =
1f550 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c   0;.      for(iL
1f560 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
1f570 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
1f580 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  ++){.        for
1f590 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
1f5a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1f5b0 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
1f5c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  ){.          pLv
1f5d0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d  l->aSeg[iSegOut]
1f5e0 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76   = pStruct->aLev
1f5f0 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53  el[iLvl].aSeg[iS
1f600 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  eg];.          i
1f610 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20  SegOut++;.      
1f620 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f630 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74    pNew->nSegment
1f640 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20   = pLvl->nSeg = 
1f650 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  nSeg;.    }else{
1f660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1f670 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
1f680 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d   pNew = 0;.    }
1f690 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
1f6a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
1f6b0 20 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d   = pNew->nLevel-
1f6c0 31 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  1;.    while( p-
1f6d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1f6e0 26 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69  & pNew->aLevel[i
1f6f0 4c 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20  Lvl].nSeg>0 ){. 
1f700 20 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20       int nRem = 
1f710 46 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e  FTS5_OPT_WORK_UN
1f720 49 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e  IT;.      fts5In
1f730 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1f740 20 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e   &pNew, iLvl, &n
1f750 52 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Rem);.    }..   
1f760 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1f770 69 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20  ite(p, pNew);.  
1f780 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1f790 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
1f7a0 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
1f7b0 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1f7c0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  t);.  return fts
1f7d0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
1f7e0 20 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33   .}..int sqlite3
1f7f0 46 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46  Fts5IndexMerge(F
1f800 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
1f810 20 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35   nMerge){.  Fts5
1f820 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1f830 63 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20 3d  ct;..  pStruct =
1f840 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1f850 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
1f860 72 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d  ruct && pStruct-
1f870 3e 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 66  >nLevel ){.    f
1f880 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
1f890 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
1f8a0 65 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  e);.    fts5Stru
1f8b0 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53  ctureWrite(p, pS
1f8c0 74 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74  truct);.  }.  ft
1f8d0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1f8e0 73 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  se(pStruct);..  
1f8f0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
1f900 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74  Return(p);.}..st
1f910 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
1f920 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20  slistCallback(. 
1f930 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1f940 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20    void *pCtx, . 
1f950 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
1f960 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
1f970 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
1f980 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1f990 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 74  (Fts5Buffer*)pCt
1f9a0 78 2c 20 6e 43 68 75 6e 6b 2c 20 70 43 68 75 6e  x, nChunk, pChun
1f9b0 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  k);.}../*.** Ite
1f9c0 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
1f9d0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
1f9e0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e  a valid entry (n
1f9f0 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a  ot EOF). This.**
1fa00 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
1fa10 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
1fa20 69 73 74 20 64 61 74 61 20 66 6f 72 20 74 68 65  ist data for the
1fa30 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74   current entry t
1fa40 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
1fa50 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61  . It does not ma
1fa60 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
1fa70 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
1fa80 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f  ize.** field..*/
1fa90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1faa0 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
1fab0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1fac0 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
1fad0 70 53 65 67 2c 0a 20 20 46 74 73 35 42 75 66 66  pSeg,.  Fts5Buff
1fae0 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 66 74  er *pBuf.){.  ft
1faf0 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
1fb00 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70  , pSeg, (void*)p
1fb10 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Buf, fts5Poslist
1fb20 43 61 6c 6c 62 61 63 6b 29 3b 0a 7d 0a 0a 2f 2a  Callback);.}../*
1fb30 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75  .** Iterator pMu
1fb40 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  lti currently po
1fb50 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
1fb60 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e  entry (not EOF).
1fb70 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
1fb80 6e 20 61 70 70 65 6e 64 73 20 61 20 63 6f 70 79  n appends a copy
1fb90 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
1fba0 2d 6c 69 73 74 20 6f 66 20 74 68 65 20 65 6e 74  -list of the ent
1fbb0 72 79 20 70 4d 75 6c 74 69 20 0a 2a 2a 20 63 75  ry pMulti .** cu
1fbc0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
1fbd0 6f 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66  o to buffer pBuf
1fbe0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1fbf0 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
1fc00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
1fc10 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 74 20 69  t in p->rc. It i
1fc20 73 20 61 73 73 75 6d 65 64 0a 2a 2a 20 6e 6f 20  s assumed.** no 
1fc30 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
1fc40 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
1fc50 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
1fc60 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
1fc70 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
1fc80 69 49 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20  iIterPoslist(.  
1fc90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
1fca0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
1fcb0 4d 75 6c 74 69 2c 0a 20 20 69 6e 74 20 62 53 7a  Multi,.  int bSz
1fcc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1fcd0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65           /* Appe
1fce0 6e 64 20 61 20 73 69 7a 65 20 66 69 65 6c 64 20  nd a size field 
1fcf0 62 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 20  before the data 
1fd00 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
1fd10 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70  *pBuf.){.  if( p
1fd20 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1fd30 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
1fd40 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c  er *pSeg = &pMul
1fd50 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69  ti->aSeg[ pMulti
1fd60 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1fd70 73 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  st ];.    assert
1fd80 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  ( fts5MultiIterE
1fd90 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30  of(p, pMulti)==0
1fda0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 62 53 7a   );..    if( bSz
1fdb0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 52 49   ){.      /* WRI
1fdc0 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
1fdd0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
1fde0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1fdf0 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67  ->rc, pBuf, pSeg
1fe00 2d 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 7d  ->nPos*2);.    }
1fe10 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72  .    fts5Segiter
1fe20 50 6f 73 6c 69 73 74 28 70 2c 20 70 53 65 67 2c  Poslist(p, pSeg,
1fe30 20 70 42 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pBuf);.  }.}..s
1fe40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
1fe50 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 46  oclistIterNext(F
1fe60 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 2a  ts5DoclistIter *
1fe70 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49  pIter){.  if( pI
1fe80 74 65 72 2d 3e 69 3c 70 49 74 65 72 2d 3e 6e 20  ter->i<pIter->n 
1fe90 29 7b 0a 20 20 20 20 69 6e 74 20 62 44 75 6d 6d  ){.    int bDumm
1fea0 79 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  y;.    if( pIter
1feb0 2d 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 36 34  ->i ){.      i64
1fec0 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 70   iDelta;.      p
1fed0 49 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35 47  Iter->i += fts5G
1fee0 65 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d  etVarint(&pIter-
1fef0 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75  >a[pIter->i], (u
1ff00 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
1ff10 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69      pIter->iRowi
1ff20 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
1ff30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
1ff40 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35 47 65  ter->i += fts5Ge
1ff50 74 56 61 72 69 6e 74 28 26 70 49 74 65 72 2d 3e  tVarint(&pIter->
1ff60 61 5b 70 49 74 65 72 2d 3e 69 5d 2c 20 28 75 36  a[pIter->i], (u6
1ff70 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
1ff80 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  d);.    }.    pI
1ff90 74 65 72 2d 3e 69 20 2b 3d 20 66 74 73 35 47 65  ter->i += fts5Ge
1ffa0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 0a 20 20  tPoslistSize(.  
1ffb0 20 20 20 20 20 20 26 70 49 74 65 72 2d 3e 61 5b        &pIter->a[
1ffc0 70 49 74 65 72 2d 3e 69 5d 2c 20 26 70 49 74 65  pIter->i], &pIte
1ffd0 72 2d 3e 6e 50 6f 73 6c 69 73 74 2c 20 26 62 44  r->nPoslist, &bD
1ffe0 75 6d 6d 79 0a 20 20 20 20 29 3b 0a 20 20 20 20  ummy.    );.    
1fff0 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
20000 3d 20 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65  = &pIter->a[pIte
20010 72 2d 3e 69 5d 3b 0a 20 20 20 20 70 49 74 65 72  r->i];.    pIter
20020 2d 3e 69 20 2b 3d 20 70 49 74 65 72 2d 3e 6e 50  ->i += pIter->nP
20030 6f 73 6c 69 73 74 3b 0a 20 20 7d 65 6c 73 65 7b  oslist;.  }else{
20040 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
20050 6c 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  list = 0;.  }.}.
20060 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20070 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
20080 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
20090 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44 6f 63  pBuf, .  Fts5Doc
200a0 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a  listIter *pIter.
200b0 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ){.  memset(pIte
200c0 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
200d0 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
200e0 61 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70  a = pBuf->p;.  p
200f0 49 74 65 72 2d 3e 6e 20 3d 20 70 42 75 66 2d 3e  Iter->n = pBuf->
20100 6e 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74  n;.  fts5Doclist
20110 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b  IterNext(pIter);
20120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64  .}../*.** Append
20130 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62 75   a doclist to bu
20140 66 66 65 72 20 70 42 75 66 2e 0a 2a 2f 0a 73 74  ffer pBuf..*/.st
20150 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
20160 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 0a  rgeAppendDocid(.
20170 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
20180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20190 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 45 72 72    /* IN/OUT: Err
201a0 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
201b0 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20  5Buffer *pBuf,  
201c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
201d0 42 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20  Buffer to write 
201e0 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c  to */.  i64 *piL
201f0 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20  astRowid,       
20200 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
20210 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  T: Previous rowi
20220 64 20 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e  d written (if an
20230 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  y) */.  i64 iRow
20240 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
20250 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
20260 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b   to append */.){
20270 0a 20 20 69 66 28 20 70 42 75 66 2d 3e 6e 3d 3d  .  if( pBuf->n==
20280 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66  0 ){.    fts5Buf
20290 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
202a0 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
202b0 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  d);.  }else{.   
202c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
202d0 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75  dVarint(pRc, pBu
202e0 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c  f, iRowid - *piL
202f0 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 7d 0a 20  astRowid);.  }. 
20300 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d 20   *piLastRowid = 
20310 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iRowid;.}../*.**
20320 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20   Buffers p1 and 
20330 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69  p2 contain docli
20340 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69  sts. This functi
20350 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f  on merges the co
20360 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20  ntent.** of the 
20370 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67  two doclists tog
20380 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62  ether and sets b
20390 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20  uffer p1 to the 
203a0 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a  result before.**
203b0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
203c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
203d0 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
203e0 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  ode is left in p
203f0 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f  ->rc. If an erro
20400 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79  r has.** already
20410 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
20420 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
20430 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
20440 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65  oid fts5MergePre
20450 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35  fixLists(.  Fts5
20460 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
20470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
20480 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
20490 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  ct */.  Fts5Buff
204a0 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20  er *p1,         
204b0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
204c0 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a   list to merge *
204d0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
204e0 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p2              
204f0 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69      /* Second li
20500 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29  st to merge */.)
20510 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b  {.  if( p2->n ){
20520 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
20530 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
20540 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b  5DoclistIter i1;
20550 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
20560 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73  Iter i2;.    Fts
20570 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 20  5Buffer out;.   
20580 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 3b   Fts5Buffer tmp;
20590 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75 74  .    memset(&out
205a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29  , 0, sizeof(out)
205b0 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74  );.    memset(&t
205c0 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 6d  mp, 0, sizeof(tm
205d0 70 29 29 3b 0a 0a 20 20 20 20 66 74 73 35 44 6f  p));..    fts5Do
205e0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 31  clistIterInit(p1
205f0 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35  , &i1);.    fts5
20600 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28  DoclistIterInit(
20610 70 32 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68  p2, &i2);.    wh
20620 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
20630 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50 6f  TE_OK && (i1.aPo
20640 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61  slist!=0 || i2.a
20650 50 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a 20  Poslist!=0) ){. 
20660 20 20 20 20 20 69 66 28 20 69 32 2e 61 50 6f 73       if( i2.aPos
20670 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61  list==0 || (i1.a
20680 50 6f 73 6c 69 73 74 20 26 26 20 69 31 2e 69 52  Poslist && i1.iR
20690 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20  owid<i2.iRowid) 
206a0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ){.        /* Co
206b0 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31  py entry from i1
206c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
206d0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
206e0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 26  (&p->rc, &out, &
206f0 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69  iLastRowid, i1.i
20700 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
20710 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
20720 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  IZE */.        f
20730 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
20740 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f  arint(&p->rc, &o
20750 75 74 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20  ut, i1.nPoslist 
20760 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
20770 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
20780 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c  ob(&p->rc, &out,
20790 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 69 31   i1.nPoslist, i1
207a0 2e 61 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20  .aPoslist);.    
207b0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
207c0 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
207d0 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
207e0 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74   if( i1.aPoslist
207f0 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69 64  ==0 || i2.iRowid
20800 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a 20  !=i1.iRowid ){. 
20810 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
20820 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f 0a  ntry from i2 */.
20830 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
20840 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d  eAppendDocid(&p-
20850 3e 72 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73  >rc, &out, &iLas
20860 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69  tRowid, i2.iRowi
20870 64 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  d);.        /* W
20880 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
20890 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
208a0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
208b0 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20  t(&p->rc, &out, 
208c0 69 32 2e 6e 50 6f 73 6c 69 73 74 20 2a 20 32 29  i2.nPoslist * 2)
208d0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
208e0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
208f0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 32 2e  p->rc, &out, i2.
20900 6e 50 6f 73 6c 69 73 74 2c 20 69 32 2e 61 50 6f  nPoslist, i2.aPo
20910 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
20920 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
20930 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
20940 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20  }.      else{.  
20950 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
20960 74 52 65 61 64 65 72 20 72 31 3b 0a 20 20 20 20  tReader r1;.    
20970 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 52      Fts5PoslistR
20980 65 61 64 65 72 20 72 32 3b 0a 20 20 20 20 20 20  eader r2;.      
20990 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69    Fts5PoslistWri
209a0 74 65 72 20 77 72 69 74 65 72 3b 0a 0a 20 20 20  ter writer;..   
209b0 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69       memset(&wri
209c0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ter, 0, sizeof(w
209d0 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20  riter));..      
209e0 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74    /* Merge the t
209f0 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  wo position list
20a00 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 66  s. */ .        f
20a10 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
20a20 63 69 64 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  cid(&p->rc, &out
20a30 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  , &iLastRowid, i
20a40 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
20a50 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
20a60 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20 20 20 20  o(&tmp);.       
20a70 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
20a80 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31  istReaderInit(-1
20a90 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
20aa0 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 31 29  1.nPoslist, &r1)
20ab0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
20ac0 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
20ad0 65 72 49 6e 69 74 28 2d 31 2c 20 69 32 2e 61 50  erInit(-1, i2.aP
20ae0 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c  oslist, i2.nPosl
20af0 69 73 74 2c 20 26 72 32 29 3b 0a 20 20 20 20 20  ist, &r2);.     
20b00 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
20b10 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 72  =SQLITE_OK && (r
20b20 31 2e 62 45 6f 66 3d 3d 30 20 7c 7c 20 72 32 2e  1.bEof==0 || r2.
20b30 62 45 6f 66 3d 3d 30 29 20 29 7b 0a 20 20 20 20  bEof==0) ){.    
20b40 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a        i64 iNew;.
20b50 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 32            if( r2
20b60 2e 62 45 6f 66 20 7c 7c 20 28 72 31 2e 62 45 6f  .bEof || (r1.bEo
20b70 66 3d 3d 30 20 26 26 20 72 31 2e 69 50 6f 73 3c  f==0 && r1.iPos<
20b80 72 32 2e 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  r2.iPos) ){.    
20b90 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 72          iNew = r
20ba0 31 2e 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  1.iPos;.        
20bb0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
20bc0 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
20bd0 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20 20 20  (&r1);.         
20be0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20bf0 20 20 20 20 69 4e 65 77 20 3d 20 72 32 2e 69 50      iNew = r2.iP
20c00 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
20c10 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
20c20 73 74 52 65 61 64 65 72 4e 65 78 74 28 26 72 32  stReaderNext(&r2
20c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
20c40 66 28 20 72 31 2e 69 50 6f 73 3d 3d 72 32 2e 69  f( r1.iPos==r2.i
20c50 50 6f 73 20 29 20 73 71 6c 69 74 65 33 46 74 73  Pos ) sqlite3Fts
20c60 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65  5PoslistReaderNe
20c70 78 74 28 26 72 31 29 3b 0a 20 20 20 20 20 20 20  xt(&r1);.       
20c80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
20c90 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  ->rc = sqlite3Ft
20ca0 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 41  s5PoslistWriterA
20cb0 70 70 65 6e 64 28 26 74 6d 70 2c 20 26 77 72 69  ppend(&tmp, &wri
20cc0 74 65 72 2c 20 69 4e 65 77 29 3b 0a 20 20 20 20  ter, iNew);.    
20cd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
20ce0 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
20cf0 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  ZE */.        ft
20d00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
20d10 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 6f 75  rint(&p->rc, &ou
20d20 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20  t, tmp.n * 2);. 
20d30 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20d40 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
20d50 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e 6e 2c  rc, &out, tmp.n,
20d60 20 74 6d 70 2e 70 29 3b 0a 20 20 20 20 20 20 20   tmp.p);.       
20d70 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
20d80 4e 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20  Next(&i1);.     
20d90 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
20da0 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
20db0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
20dc0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
20dd0 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c  ->rc, p1, out.n,
20de0 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20 66 74 73   out.p);.    fts
20df0 35 42 75 66 66 65 72 46 72 65 65 28 26 74 6d 70  5BufferFree(&tmp
20e00 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  );.    fts5Buffe
20e10 72 46 72 65 65 28 26 6f 75 74 29 3b 0a 20 20 7d  rFree(&out);.  }
20e20 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
20e30 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28 46  fts5BufferSwap(F
20e40 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 46  ts5Buffer *p1, F
20e50 74 73 35 42 75 66 66 65 72 20 2a 70 32 29 7b 0a  ts5Buffer *p2){.
20e60 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70    Fts5Buffer tmp
20e70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31 20 3d 20   = *p1;.  *p1 = 
20e80 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20 74 6d 70  *p2;.  *p2 = tmp
20e90 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
20ea0 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
20eb0 49 74 65 72 28 0a 20 20 46 74 73 35 49 6e 64 65  Iter(.  Fts5Inde
20ec0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
20ed0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
20ee0 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f   to read from */
20ef0 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
20f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20f10 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 22     /* True for "
20f20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
20f30 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ESC" */.  const 
20f40 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 20  u8 *pToken,     
20f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
20f60 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  fer containing p
20f70 72 65 66 69 78 20 74 6f 20 6d 61 74 63 68 20 2a  refix to match *
20f80 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20  /.  int nToken, 
20f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fa0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
20fb0 75 66 66 65 72 20 70 54 6f 6b 65 6e 20 69 6e 20  uffer pToken in 
20fc0 62 79 74 65 73 20 2a 2f 0a 20 20 46 74 73 35 49  bytes */.  Fts5I
20fd0 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
20fe0 72 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20  r       /* OUT: 
20ff0 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  New iterator */.
21000 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
21010 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
21020 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
21030 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
21040 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20  f = 32;..  aBuf 
21050 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29 66  = (Fts5Buffer*)f
21060 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
21070 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
21080 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72  r)*nBuf);.  pStr
21090 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
210a0 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
210b0 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
210c0 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ct ){.    const 
210d0 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
210e0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
210f0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
21100 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
21110 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 49 6e 64  = 0;.    Fts5Ind
21120 65 78 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20  exIter *p1 = 0; 
21130 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
21140 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64  used to gather d
21150 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a  ata from index *
21160 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
21170 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42  pData;.    Fts5B
21180 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 0a  uffer doclist;..
21190 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c      memset(&docl
211a0 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64  ist, 0, sizeof(d
211b0 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 6f  oclist));.    fo
211c0 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
211d0 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31  ew(p, pStruct, 1
211e0 2c 20 66 6c 61 67 73 2c 20 70 54 6f 6b 65 6e 2c  , flags, pToken,
211f0 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20   nToken, -1, 0, 
21200 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &p1);.        ft
21210 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
21220 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20  , p1)==0;.      
21230 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
21240 65 78 74 28 70 2c 20 70 31 2c 20 30 2c 20 30 29  ext(p, p1, 0, 0)
21250 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36  .    ){.      i6
21260 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
21270 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 31  ultiIterRowid(p1
21280 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  );.      int nTe
21290 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  rm;.      const 
212a0 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35  u8 *pTerm = fts5
212b0 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31  MultiIterTerm(p1
212c0 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &nTerm);.     
212d0 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70 28   assert( memcmp(
212e0 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d  pToken, pTerm, M
212f0 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d  IN(nToken, nTerm
21300 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ))<=0 );.      i
21310 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20  f( nTerm<nToken 
21320 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  || memcmp(pToken
21330 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29  , pTerm, nToken)
21340 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
21350 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30   if( doclist.n>0
21360 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73   && iRowid<=iLas
21370 74 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  tRowid ){.      
21380 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
21390 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
213a0 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a  oclist.n; i++){.
213b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
213c0 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20  ( i<nBuf );.    
213d0 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69        if( aBuf[i
213e0 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ].n==0 ){.      
213f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21400 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26  Swap(&doclist, &
21410 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
21420 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21430 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a  Zero(&doclist);.
21440 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
21450 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
21460 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74  5MergePrefixList
21470 73 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26  s(p, &doclist, &
21480 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
21490 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
214a0 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a  Zero(&aBuf[i]);.
214b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
214c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
214d0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
214e0 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63  pendDocid(&p->rc
214f0 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 69 4c 61  , &doclist, &iLa
21500 73 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29  stRowid, iRowid)
21510 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
21520 69 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  iIterPoslist(p, 
21530 70 31 2c 20 31 2c 20 26 64 6f 63 6c 69 73 74 29  p1, 1, &doclist)
21540 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72  ;.    }..    for
21550 28 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b  (i=0; i<nBuf; i+
21560 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65  +){.      fts5Me
21570 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 70  rgePrefixLists(p
21580 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75  , &doclist, &aBu
21590 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 66 74 73  f[i]);.      fts
215a0 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42 75  5BufferFree(&aBu
215b0 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  f[i]);.    }.   
215c0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
215d0 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20  ee(p, p1);..    
215e0 70 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d  pData = fts5IdxM
215f0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
21600 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c  Fts5Data) + docl
21610 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20  ist.n);.    if( 
21620 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70  pData ){.      p
21630 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26  Data->p = (u8*)&
21640 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20  pData[1];.      
21650 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74  pData->nn = pDat
21660 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c  a->szLeaf = docl
21670 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d  ist.n;.      mem
21680 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f  cpy(pData->p, do
21690 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74  clist.p, doclist
216a0 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  .n);.      fts5M
216b0 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20  ultiIterNew2(p, 
216c0 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70  pData, bDesc, pp
216d0 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
216e0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
216f0 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a  &doclist);.  }..
21700 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
21710 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
21720 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
21730 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  aBuf);.}.../*.**
21740 20 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 61   Indicate that a
21750 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 63 61  ll subsequent ca
21760 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lls to sqlite3Ft
21770 73 35 49 6e 64 65 78 57 72 69 74 65 28 29 20 70  s5IndexWrite() p
21780 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65  ertain.** to the
21790 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72   document with r
217a0 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a  owid iRowid..*/.
217b0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
217c0 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65 28 46  ndexBeginWrite(F
217d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
217e0 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65   iRowid){.  asse
217f0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
21800 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  E_OK );..  /* Al
21810 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20  locate the hash 
21820 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20  table if it has 
21830 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
21840 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
21850 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20  if( p->pHash==0 
21860 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
21870 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65  qlite3Fts5HashNe
21880 77 28 26 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d  w(&p->pHash, &p-
21890 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a  >nPendingData);.
218a0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20    }..  /* Flush 
218b0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74  the hash table t
218c0 6f 20 64 69 73 6b 20 69 66 20 72 65 71 75 69 72  o disk if requir
218d0 65 64 20 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77  ed */.  if( iRow
218e0 69 64 3c 3d 70 2d 3e 69 57 72 69 74 65 52 6f 77  id<=p->iWriteRow
218f0 69 64 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69  id || (p->nPendi
21900 6e 67 44 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78  ngData > p->nMax
21910 50 65 6e 64 69 6e 67 44 61 74 61 29 20 29 7b 0a  PendingData) ){.
21920 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
21930 73 68 28 70 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  sh(p);.  }.  p->
21940 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69 52  iWriteRowid = iR
21950 6f 77 69 64 3b 0a 20 20 72 65 74 75 72 6e 20 66  owid;.  return f
21960 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
21970 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  );.}../*.** Comm
21980 69 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e  it data to disk.
21990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
219a0 74 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73  ts5IndexSync(Fts
219b0 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
219c0 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73 73 65 72  Commit){.  asser
219d0 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
219e0 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64  _OK );.  fts5Ind
219f0 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 69 66  exFlush(p);.  if
21a00 28 20 62 43 6f 6d 6d 69 74 20 29 20 66 74 73 35  ( bCommit ) fts5
21a10 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
21a20 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
21a30 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
21a40 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6e  /*.** Discard an
21a50 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
21a60 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
21a70 61 73 68 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e  ash tables. Do n
21a80 6f 74 20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74  ot write it.** t
21a90 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
21aa0 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73  Additionally, as
21ab0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 63 6f  sume that the co
21ac0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 25 5f  ntents of the %_
21ad0 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61  data.** table ma
21ae0 79 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 6f  y have changed o
21af0 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69  n disk. So any i
21b00 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 73 20  n-memory caches 
21b10 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65  of %_data .** re
21b20 63 6f 72 64 73 20 6d 75 73 74 20 62 65 20 69 6e  cords must be in
21b30 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e  validated..*/.in
21b40 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
21b50 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49  exRollback(Fts5I
21b60 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66 74 73 35  ndex *p){.  fts5
21b70 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29 3b 0a  CloseReader(p);.
21b80 20 20 66 74 73 35 49 6e 64 65 78 44 69 73 63 61    fts5IndexDisca
21b90 72 64 44 61 74 61 28 70 29 3b 0a 20 20 61 73 73  rdData(p);.  ass
21ba0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
21bb0 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
21bc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21bd0 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61  /*.** The %_data
21be0 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
21bf0 74 65 6c 79 20 65 6d 70 74 79 20 77 68 65 6e 20  tely empty when 
21c00 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
21c10 20 63 61 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a   called. This.**
21c20 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
21c30 74 65 73 20 69 74 20 77 69 74 68 20 74 68 65 20  tes it with the 
21c40 69 6e 69 74 69 61 6c 20 73 74 72 75 63 74 75 72  initial structur
21c50 65 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61  e objects for ea
21c60 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64  ch index,.** and
21c70 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 65 72   the initial ver
21c80 73 69 6f 6e 20 6f 66 20 74 68 65 20 22 61 76 65  sion of the "ave
21c90 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 28 61  rages" record (a
21ca0 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29   zero-byte blob)
21cb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21cc0 46 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28  Fts5IndexReinit(
21cd0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
21ce0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 73   Fts5Structure s
21cf0 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c 20 30  ;.  memset(&s, 0
21d00 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  , sizeof(Fts5Str
21d10 75 63 74 75 72 65 29 29 3b 0a 20 20 66 74 73 35  ucture));.  fts5
21d20 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
21d30 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
21d40 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c  , (const u8*)"",
21d50 20 30 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63   0);.  fts5Struc
21d60 74 75 72 65 57 72 69 74 65 28 70 2c 20 26 73 29  tureWrite(p, &s)
21d70 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
21d80 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
21d90 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
21da0 65 77 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e  ew Fts5Index han
21db0 64 6c 65 2e 20 49 66 20 74 68 65 20 62 43 72 65  dle. If the bCre
21dc0 61 74 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ate argument is 
21dd0 74 72 75 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20  true, create.** 
21de0 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  and initialize t
21df0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f  he underlying %_
21e00 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
21e10 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
21e20 20 73 65 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e   set *pp to poin
21e30 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a  t to the new obj
21e40 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
21e50 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68  QLITE_OK..** Oth
21e60 65 72 77 69 73 65 2c 20 73 65 74 20 2a 70 70 20  erwise, set *pp 
21e70 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75  to NULL and retu
21e80 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rn an SQLite err
21e90 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20  or code..*/.int 
21ea0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
21eb0 4f 70 65 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66  Open(.  Fts5Conf
21ec0 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20  ig *pConfig, .  
21ed0 69 6e 74 20 62 43 72 65 61 74 65 2c 20 0a 20 20  int bCreate, .  
21ee0 46 74 73 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a  Fts5Index **pp,.
21ef0 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29    char **pzErr.)
21f00 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
21f10 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e  ITE_OK;.  Fts5In
21f20 64 65 78 20 2a 70 3b 20 20 20 20 20 20 20 20 20  dex *p;         
21f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
21f40 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70   object */..  *p
21f50 70 20 3d 20 70 20 3d 20 28 46 74 73 35 49 6e 64  p = p = (Fts5Ind
21f60 65 78 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d  ex*)sqlite3Fts5M
21f70 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73  allocZero(&rc, s
21f80 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65 78 29  izeof(Fts5Index)
21f90 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
21fa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d  ITE_OK ){.    p-
21fb0 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66  >pConfig = pConf
21fc0 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b  ig;.    p->nWork
21fd0 55 6e 69 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b  Unit = FTS5_WORK
21fe0 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d 3e 6e 4d  _UNIT;.    p->nM
21ff0 61 78 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  axPendingData = 
22000 31 30 32 34 2a 31 30 32 34 3b 0a 20 20 20 20 70  1024*1024;.    p
22010 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71 6c  ->zDataTbl = sql
22020 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66 28  ite3Fts5Mprintf(
22030 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c 20  &rc, "%s_data", 
22040 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29 3b  pConfig->zName);
22050 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61 74  .    if( p->zDat
22060 61 54 62 6c 20 26 26 20 62 43 72 65 61 74 65 20  aTbl && bCreate 
22070 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
22080 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65 54  lite3Fts5CreateT
22090 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20 20  able(.          
220a0 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22 2c  pConfig, "data",
220b0 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   "id INTEGER PRI
220c0 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20  MARY KEY, block 
220d0 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72 0a  BLOB", 0, pzErr.
220e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69        );.      i
220f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22100 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
22110 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61   sqlite3Fts5Crea
22120 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67 2c  teTable(pConfig,
22130 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20 20   "idx", .       
22140 20 20 20 20 20 22 73 65 67 69 64 2c 20 74 65 72       "segid, ter
22150 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59  m, pgno, PRIMARY
22160 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d   KEY(segid, term
22170 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  )", .           
22180 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20   1, pzErr.      
22190 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
221a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
221b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
221c0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
221d0 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b 0a  IndexReinit(p);.
221e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
221f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  }..  assert( rc!
22200 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
22210 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
22220 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
22230 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64    sqlite3Fts5Ind
22240 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20 20  exClose(p);.    
22250 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  *pp = 0;.  }.  r
22260 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22270 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64 6c  ** Close a handl
22280 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65  e opened by an e
22290 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73  arlier call to s
222a0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
222b0 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pen()..*/.int sq
222c0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6c  lite3Fts5IndexCl
222d0 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ose(Fts5Index *p
222e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
222f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
22300 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
22310 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29 3b  p->pReader==0 );
22320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
22330 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65 72  alize(p->pWriter
22340 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
22350 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c 65  inalize(p->pDele
22360 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
22370 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49  3_finalize(p->pI
22380 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 73  dxWriter);.    s
22390 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
223a0 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
223b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
223c0 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65 6c  alize(p->pIdxSel
223d0 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ect);.    sqlite
223e0 33 46 74 73 35 48 61 73 68 46 72 65 65 28 70 2d  3Fts5HashFree(p-
223f0 3e 70 48 61 73 68 29 3b 0a 20 20 20 20 73 71 6c  >pHash);.    sql
22400 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
22410 65 65 28 26 70 2d 3e 73 63 72 61 74 63 68 29 3b  ee(&p->scratch);
22420 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22430 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a  e(p->zDataTbl);.
22440 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
22450 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
22460 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
22470 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73  rgument p points
22480 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
22490 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65  taining utf-8 te
224a0 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79 74  xt that is n byt
224b0 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20  es in .** size. 
224c0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
224d0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
224e0 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  e nChar characte
224f0 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a  r prefix of the.
22500 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20  ** buffer, or 0 
22510 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  if there are les
22520 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  s than nChar cha
22530 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c  racters in total
22540 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22550 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
22560 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74 20  ToBytelen(const 
22570 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42 79  char *p, int nBy
22580 74 65 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b 0a  te, int nChar){.
22590 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69    int n = 0;.  i
225a0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
225b0 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b 0a   i<nChar; i++){.
225c0 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74 65      if( n>=nByte
225d0 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
225e0 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74 61    /* Input conta
225f0 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20 6e  ins fewer than n
22600 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20 20  Char chars */.  
22610 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20    if( (unsigned 
22620 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78 63  char)p[n++]>=0xc
22630 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  0 ){.      while
22640 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29 3d  ( (p[n] & 0xc0)=
22650 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20 20  =0x80 ) n++;.   
22660 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22670 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e 20  n;.}../*.** pIn 
22680 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f 64  is a UTF-8 encod
22690 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20 62  ed string, nIn b
226a0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52 65  ytes in size. Re
226b0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
226c0 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63 68  of.** unicode ch
226d0 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
226e0 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
226f0 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43  c int fts5IndexC
22700 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61  harlen(const cha
22710 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e 29  r *pIn, int nIn)
22720 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20  {.  int nChar = 
22730 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  0;            . 
22740 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77 68   int i = 0;.  wh
22750 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20 20  ile( i<nIn ){.  
22760 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64 20    if( (unsigned 
22770 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d 30  char)pIn[i++]>=0
22780 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69  xc0 ){.      whi
22790 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70 49  le( i<nIn && (pI
227a0 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30 78  n[i] & 0xc0)==0x
227b0 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d 0a  80 ) i++;.    }.
227c0 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20 7d      nChar++;.  }
227d0 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72 3b  .  return nChar;
227e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74  .}../*.** Insert
227f0 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61 20   or remove data 
22800 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 69  to or from the i
22810 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65 20  ndex. Each time 
22820 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a 2a  a document is .*
22830 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72 65  * added to or re
22840 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69  moved from the i
22850 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63 74  ndex, this funct
22860 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  ion is called on
22870 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69 6d  e or more.** tim
22880 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e  es..**.** For an
22890 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73 74   insert, it must
228a0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
228b0 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20 69  for each token i
228c0 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d 65  n the new docume
228d0 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70  nt..** If the op
228e0 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65 6c  eration is a del
228f0 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65 20  ete, it must be 
22900 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73 74  called (at least
22910 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a  ) once for each.
22920 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e 20  ** unique token 
22930 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20  in the document 
22940 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61 6c  with an iCol val
22950 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  ue less than zer
22960 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20 61  o. The iPos.** a
22970 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f 72  rgument is ignor
22980 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65 2e  ed for a delete.
22990 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
229a0 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a 20  ts5IndexWrite(. 
229b0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
229c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
229d0 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72 69   /* Index to wri
229e0 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 69  te to */.  int i
229f0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
22a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
22a10 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65 61  lumn token appea
22a20 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64 65  rs in (-ve -> de
22a30 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20 69  lete) */.  int i
22a40 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  Pos,            
22a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
22a60 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e 20  sition of token 
22a70 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a 2f  within column */
22a80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
22a90 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65  Token, int nToke
22aa0 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20 61  n  /* Token to a
22ab0 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f 20  dd or remove to 
22ac0 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f  or from index */
22ad0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
22ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22af0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
22b00 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
22b10 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69 6e   indexes */.  in
22b20 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22b30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
22b40 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22b50 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
22b60 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
22b70 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ig;..  assert( p
22b80 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22b90 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  );..  /* Add the
22ba0 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 6d 61   entry to the ma
22bb0 69 6e 20 74 65 72 6d 73 20 69 6e 64 65 78 2e 20  in terms index. 
22bc0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
22bd0 33 46 74 73 35 48 61 73 68 57 72 69 74 65 28 0a  3Fts5HashWrite(.
22be0 20 20 20 20 20 20 70 2d 3e 70 48 61 73 68 2c 20        p->pHash, 
22bf0 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20  p->iWriteRowid, 
22c00 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35  iCol, iPos, FTS5
22c10 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c 20 70 54  _MAIN_PREFIX, pT
22c20 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29  oken, nToken.  )
22c30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
22c40 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78  pConfig->nPrefix
22c50 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
22c60 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  K; i++){.    int
22c70 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64   nByte = fts5Ind
22c80 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
22c90 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  en(pToken, nToke
22ca0 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65  n, pConfig->aPre
22cb0 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  fix[i]);.    if(
22cc0 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
22cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
22ce0 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48 61  HashWrite(p->pHa
22cf0 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  sh, .          p
22d00 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69  ->iWriteRowid, i
22d10 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f  Col, iPos, FTS5_
22d20 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 2c  MAIN_PREFIX+i+1,
22d30 20 70 54 6f 6b 65 6e 2c 20 6e 42 79 74 65 0a 20   pToken, nByte. 
22d40 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
22d50 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
22d60 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
22d70 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f 20  new iterator to 
22d80 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20 61  iterate though a
22d90 6c 6c 20 72 6f 77 69 64 20 74 68 61 74 20 6d 61  ll rowid that ma
22da0 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65 63  tch the .** spec
22db0 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74  ified token or t
22dc0 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a  oken prefix..*/.
22dd0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
22de0 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46 74 73  ndexQuery(.  Fts
22df0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
22e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22e10 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75 65  FTS index to que
22e20 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ry */.  const ch
22e30 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20  ar *pToken, int 
22e40 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e  nToken, /* Token
22e50 20 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f 20   (or prefix) to 
22e60 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69  query for */.  i
22e70 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
22e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e90 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e  * Mask of FTS5IN
22ea0 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61 67  DEX_QUERY_X flag
22eb0 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  s */.  Fts5Index
22ec0 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20  Iter **ppIter   
22ed0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
22ee0 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65  ew iterator obje
22ef0 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43  ct */.){.  Fts5C
22f00 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
22f10 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46   p->pConfig;.  F
22f20 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 52  ts5IndexIter *pR
22f30 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 49  et = 0;.  int iI
22f40 64 78 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75  dx = 0;.  Fts5Bu
22f50 66 66 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30  ffer buf = {0, 0
22f60 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  , 0};..  /* If t
22f70 68 65 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c  he QUERY_SCAN fl
22f80 61 67 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f  ag is set, all o
22f90 74 68 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20  ther flags must 
22fa0 62 65 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61  be clear. */.  a
22fb0 73 73 65 72 74 28 20 28 66 6c 61 67 73 20 26 20  ssert( (flags & 
22fc0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
22fd0 53 43 41 4e 29 3d 3d 30 0a 20 20 20 20 20 20 20  SCAN)==0.       
22fe0 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
22ff0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
23000 29 3d 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45  )==FTS5INDEX_QUE
23010 52 59 5f 53 43 41 4e 0a 20 20 29 3b 0a 0a 20 20  RY_SCAN.  );..  
23020 69 66 28 20 73 71 6c 69 74 65 33 46 74 73 35 42  if( sqlite3Fts5B
23030 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
23040 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31  , &buf, nToken+1
23050 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63  )==0 ){.    memc
23060 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54  py(&buf.p[1], pT
23070 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a  oken, nToken);..
23080 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
23090 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  BUG.    /* If th
230a0 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  e QUERY_TEST_NOI
230b0 44 58 20 66 6c 61 67 20 77 61 73 20 73 70 65 63  DX flag was spec
230c0 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68 69 73  ified, then this
230d0 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20 20 2a   must be a.    *
230e0 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79 2e 20  * prefix-query. 
230f0 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67  Instead of using
23100 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65 78 20   a prefix-index 
23110 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73 29 2c  (if one exists),
23120 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75 61 74   .    ** evaluat
23130 65 20 74 68 65 20 70 72 65 66 69 78 20 71 75 65  e the prefix que
23140 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69  ry using the mai
23150 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54 68 69  n FTS index. Thi
23160 73 20 69 73 20 75 73 65 64 0a 20 20 20 20 2a 2a  s is used.    **
23170 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73 61   for internal sa
23180 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 62 79  nity checking by
23190 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
231a0 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20 0a 20  heck in debug . 
231b0 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e     ** mode only.
231c0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 66 6c 61    */.    if( fla
231d0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
231e0 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20  UERY_TEST_NOIDX 
231f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23200 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
23210 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
23220 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  );.      iIdx = 
23230 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  1+pConfig->nPref
23240 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  ix;.    }else.#e
23250 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61  ndif.    if( fla
23260 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
23270 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20  UERY_PREFIX ){. 
23280 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d       int nChar =
23290 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
232a0 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
232b0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64  );.      for(iId
232c0 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66  x=1; iIdx<=pConf
232d0 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
232e0 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  x++){.        if
232f0 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  ( pConfig->aPref
23300 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61  ix[iIdx-1]==nCha
23310 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
23320 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
23330 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ( iIdx<=pConfig-
23340 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >nPrefix ){.    
23350 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
23360 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
23370 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
23380 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20  .      buf.p[0] 
23390 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  = FTS5_MAIN_PREF
233a0 49 58 20 2b 20 69 49 64 78 3b 0a 20 20 20 20 20  IX + iIdx;.     
233b0 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
233c0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
233d0 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
233e0 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c 20 62  uct, 1, flags, b
233f0 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
23400 2d 31 2c 20 30 2c 20 26 70 52 65 74 29 3b 0a 20  -1, 0, &pRet);. 
23410 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
23420 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
23430 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uct);.      }.  
23440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
23450 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67  nt bDesc = (flag
23460 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
23470 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20  ERY_DESC)!=0;.  
23480 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46      buf.p[0] = F
23490 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b  TS5_MAIN_PREFIX;
234a0 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70  .      fts5Setup
234b0 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44  PrefixIter(p, bD
234c0 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b  esc, buf.p, nTok
234d0 65 6e 2b 31 2c 20 26 70 52 65 74 29 3b 0a 20 20  en+1, &pRet);.  
234e0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e    }..    if( p->
234f0 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  rc ){.      sqli
23500 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65  te3Fts5IterClose
23510 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 70 52  (pRet);.      pR
23520 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 74  et = 0;.      ft
23530 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 29  s5CloseReader(p)
23540 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 70 49  ;.    }.    *ppI
23550 74 65 72 20 3d 20 70 52 65 74 3b 0a 20 20 20 20  ter = pRet;.    
23560 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
23570 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d  rFree(&buf);.  }
23580 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
23590 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
235a0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
235b0 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
235c0 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
235d0 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 69   only argument i
235e0 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a 69 6e 74  s at EOF..*/.int
235f0 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
23600 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  Eof(Fts5IndexIte
23610 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
23620 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
23630 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
23640 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49  K );.  return pI
23650 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a  ter->bEof;.}../*
23660 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
23670 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
23680 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c  wid. .*/.int sql
23690 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78 74  ite3Fts5IterNext
236a0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
236b0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
236c0 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
236d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
236e0 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ;.  fts5MultiIte
236f0 72 4e 65 78 74 28 70 49 74 65 72 2d 3e 70 49 6e  rNext(pIter->pIn
23700 64 65 78 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  dex, pIter, 0, 0
23710 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
23720 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
23730 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
23740 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
23750 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 74   next matching t
23760 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73 65 64 20  erm/rowid. Used 
23770 62 79 20 74 68 65 20 66 74 73 35 76 6f 63 61 62  by the fts5vocab
23780 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   module..*/.int 
23790 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
237a0 65 78 74 53 63 61 6e 28 46 74 73 35 49 6e 64 65  extScan(Fts5Inde
237b0 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
237c0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20   Fts5Index *p = 
237d0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a  pIter->pIndex;..
237e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
237f0 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c  >pIndex->rc==SQL
23800 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 66 74 73  ITE_OK );..  fts
23810 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
23820 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a  , pIter, 0, 0);.
23830 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
23840 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
23850 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
23860 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
23870 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
23880 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69  .iFirst ];.    i
23890 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 26  f( pSeg->pLeaf &
238a0 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 5b 30  & pSeg->term.p[0
238b0 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  ]!=FTS5_MAIN_PRE
238c0 46 49 58 20 29 7b 0a 20 20 20 20 20 20 66 74 73  FIX ){.      fts
238d0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 53 65  5DataRelease(pSe
238e0 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  g->pLeaf);.     
238f0 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 3d 20 30   pSeg->pLeaf = 0
23900 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62  ;.      pIter->b
23910 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Eof = 1;.    }. 
23920 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73   }..  return fts
23930 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74  5IndexReturn(pIt
23940 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a  er->pIndex);.}..
23950 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68  /*.** Move to th
23960 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20  e next matching 
23970 72 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72  rowid that occur
23980 73 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d  s at or after iM
23990 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66  atch. The.** def
239a0 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f  inition of "at o
239b0 72 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73  r after" depends
239c0 20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73   on whether this
239d0 20 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74   iterator iterat
239e0 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69  es.** in ascendi
239f0 6e 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67  ng or descending
23a00 20 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f   rowid order..*/
23a10 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
23a20 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73  IterNextFrom(Fts
23a30 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23a40 72 2c 20 69 36 34 20 69 4d 61 74 63 68 29 7b 0a  r, i64 iMatch){.
23a50 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
23a60 65 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70  extFrom(pIter->p
23a70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69 4d  Index, pIter, iM
23a80 61 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e 20  atch);.  return 
23a90 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
23aa0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
23ab0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
23ac0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69  the current rowi
23ad0 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c 69 74 65  d..*/.i64 sqlite
23ae0 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28 46  3Fts5IterRowid(F
23af0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
23b00 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
23b10 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
23b20 64 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a  d(pIter);.}../*.
23b30 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
23b40 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a 2f 0a 63  rrent term..*/.c
23b50 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
23b60 65 33 46 74 73 35 49 74 65 72 54 65 72 6d 28 46  e3Fts5IterTerm(F
23b70 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
23b80 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20  ter, int *pn){. 
23b90 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e 73 74 20   int n;.  const 
23ba0 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74  char *z = (const
23bb0 20 63 68 61 72 2a 29 66 74 73 35 4d 75 6c 74 69   char*)fts5Multi
23bc0 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c 20  IterTerm(pIter, 
23bd0 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20 6e 2d 31  &n);.  *pn = n-1
23be0 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a 5b 31 5d  ;.  return &z[1]
23bf0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
23c00 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
23c10 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
23c20 69 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ing a copy of th
23c30 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
23c40 66 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65  for.** the curre
23c50 6e 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74  nt entry. Output
23c60 20 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73   variable *pn is
23c70 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
23c80 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a   of the buffer .
23c90 2a 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f  ** in bytes befo
23ca0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
23cb0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
23cc0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
23cd0 6f 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20  oes not include 
23ce0 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62  the "number of b
23cf0 79 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20  ytes" varint.** 
23d00 66 69 65 6c 64 20 74 68 61 74 20 73 74 61 72 74  field that start
23d10 73 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  s the position l
23d20 69 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a  ist on disk..*/.
23d30 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
23d40 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
23d50 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
23d60 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
23d70 2a 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20  **pp,           
23d80 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
23d90 6f 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69  ointer to positi
23da0 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  on-list data */.
23db0 20 20 69 6e 74 20 2a 70 6e 2c 20 20 20 20 20 20    int *pn,      
23dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dd0 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f    /* OUT: Size o
23de0 66 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  f position-list 
23df0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 36  in bytes */.  i6
23e00 34 20 2a 70 69 52 6f 77 69 64 20 20 20 20 20 20  4 *piRowid      
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23e20 20 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 72 6f   OUT: Current ro
23e30 77 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  wid */.){.  Fts5
23e40 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
23e50 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
23e60 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
23e70 46 69 72 73 74 20 5d 3b 0a 20 20 61 73 73 65 72  First ];.  asser
23e80 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
23e90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
23ea0 29 3b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20  );.  *piRowid = 
23eb0 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20  pSeg->iRowid;.  
23ec0 2a 70 6e 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  *pn = pSeg->nPos
23ed0 3b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c  ;.  if( pSeg->iL
23ee0 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e  eafOffset+pSeg->
23ef0 6e 50 6f 73 20 3c 3d 20 70 53 65 67 2d 3e 70 4c  nPos <= pSeg->pL
23f00 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
23f10 20 20 20 2a 70 70 20 3d 20 26 70 53 65 67 2d 3e     *pp = &pSeg->
23f20 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69  pLeaf->p[pSeg->i
23f30 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 7d  LeafOffset];.  }
23f40 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75  else{.    fts5Bu
23f50 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
23f60 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
23f70 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
23f80 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
23f90 20 70 53 65 67 2c 20 26 70 49 74 65 72 2d 3e 70   pSeg, &pIter->p
23fa0 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 70  oslist);.    *pp
23fb0 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
23fc0 74 2e 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  t.p;.  }.  retur
23fd0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
23fe0 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
23ff0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
24000 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69  function is simi
24010 6c 61 72 20 74 6f 20 73 71 6c 69 74 65 33 46 74  lar to sqlite3Ft
24020 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 29 2c  s5IterPoslist(),
24030 20 65 78 63 65 70 74 20 74 68 61 74 20 69 74 0a   except that it.
24040 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 20 70 6f  ** copies the po
24050 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f  sition list into
24060 20 74 68 65 20 62 75 66 66 65 72 20 73 75 70 70   the buffer supp
24070 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
24080 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  nd .** argument.
24090 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
240a0 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 42 75  ts5IterPoslistBu
240b0 66 66 65 72 28 46 74 73 35 49 6e 64 65 78 49 74  ffer(Fts5IndexIt
240c0 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 42  er *pIter, Fts5B
240d0 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
240e0 46 74 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70  Fts5Index *p = p
240f0 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20  Iter->pIndex;.. 
24100 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
24110 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
24120 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42  ts5BufferZero(pB
24130 75 66 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69  uf);.  fts5Multi
24140 49 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70  IterPoslist(p, p
24150 49 74 65 72 2c 20 30 2c 20 70 42 75 66 29 3b 0a  Iter, 0, pBuf);.
24160 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24170 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
24180 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
24190 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
241a0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
241b0 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
241c0 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
241d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
241e0 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
241f0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
24200 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
24210 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
24220 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
24230 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
24240 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
24250 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
24260 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f  er);.    fts5Clo
24270 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29  seReader(pIndex)
24280 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
24290 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74  ead and decode t
242a0 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
242b0 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61  cord from the da
242c0 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50  tabase. .**.** P
242d0 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20  arameter anSize 
242e0 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
242f0 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e   array of size n
24300 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20  Col, where nCol 
24310 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  is.** the number
24320 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
24330 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
24340 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  FTS table..*/.in
24350 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
24360 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
24370 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
24380 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53  *pnRow, i64 *anS
24390 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  ize){.  int nCol
243a0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
243b0 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20  Col;.  Fts5Data 
243c0 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f  *pData;..  *pnRo
243d0 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  w = 0;.  memset(
243e0 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f  anSize, 0, sizeo
243f0 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a  f(i64) * nCol);.
24400 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
24410 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41  taRead(p, FTS5_A
24420 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
24430 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
24440 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d  ITE_OK && pData-
24450 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >nn ){.    int i
24460 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
24470 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ol;.    i += fts
24480 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
24490 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70  a->p[i], (u64*)p
244a0 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69  nRow);.    for(i
244b0 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e  Col=0; i<pData->
244c0 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b  nn && iCol<nCol;
244d0 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
244e0 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
244f0 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
24500 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69   (u64*)&anSize[i
24510 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Col]);.    }.  }
24520 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
24530 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65  ase(pData);.  re
24540 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
24550 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
24560 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75  * Replace the cu
24570 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22  rrent "averages"
24580 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65   record with the
24590 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
245a0 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70   buffer .** supp
245b0 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
245c0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
245d0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
245e0 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
245f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f  Fts5Index *p, co
24600 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
24610 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73  nt nData){.  ass
24620 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
24630 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44  TE_OK );.  fts5D
24640 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
24650 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
24660 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
24670 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24680 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
24690 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
246a0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
246b0 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
246c0 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
246d0 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
246e0 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
246f0 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
24700 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
24710 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
24720 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
24730 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a   p->nRead;.}../*
24740 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62  .** Set the 32-b
24750 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  it cookie value 
24760 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
24770 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63  art of all struc
24780 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73  ture .** records
24790 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
247a0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
247b0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
247c0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
247d0 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
247e0 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
247f0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
24800 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
24810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24820 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b  Fts5IndexSetCook
24830 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ie(Fts5Index *p,
24840 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e   int iNew){.  in
24850 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
24860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24870 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
24880 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
24890 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
248a0 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43  pConfig;    /* C
248b0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
248c0 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f  ect */.  u8 aCoo
248d0 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20  kie[4];         
248e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
248f0 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e   Binary represen
24900 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a  tation of iNew *
24910 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
24920 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20   *pBlob = 0;..  
24930 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
24940 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
24950 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61  lite3Fts5Put32(a
24960 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a  Cookie, iNew);..
24970 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
24980 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
24990 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ->db, pConfig->z
249a0 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
249b0 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c   .      "block",
249c0 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
249d0 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62  ROWID, 1, &pBlob
249e0 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
249f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24a00 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
24a10 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
24a20 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72  ie, 4, 0);.    r
24a30 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
24a40 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20  _close(pBlob);. 
24a50 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
24a60 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
24a70 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
24a80 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
24a90 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
24aa0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53  e *pStruct;.  pS
24ab0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
24ac0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
24ad0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
24ae0 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
24af0 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
24b00 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a  xReturn(p);.}...
24b10 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
24b20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
24b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24ba0 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
24bb0 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
24bc0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
24bd0 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
24be0 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74  -check .** funct
24bf0 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a  ionality..*/../*
24c00 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
24c10 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
24c20 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
24c30 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74  arguments..*/.st
24c40 61 74 69 63 20 75 36 34 20 66 74 73 35 49 6e 64  atic u64 fts5Ind
24c50 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
24c60 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
24c70 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
24c80 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64  iPos, .  int iId
24c90 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
24ca0 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54  *pTerm,.  int nT
24cb0 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erm.){.  int i;.
24cc0 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77    u64 ret = iRow
24cd0 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
24ce0 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20  t<<3) + iCol;.  
24cf0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
24d00 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49  + iPos;.  if( iI
24d10 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28  dx>=0 ) ret += (
24d20 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f  ret<<3) + (FTS5_
24d30 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
24d40 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dx);.  for(i=0; 
24d50 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65  i<nTerm; i++) re
24d60 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
24d70 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75  pTerm[i];.  retu
24d80 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  rn ret;.}..#ifde
24d90 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
24da0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
24db0 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20  on is purely an 
24dc0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
24dd0 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
24de0 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
24df0 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
24e00 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
24e10 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
24e20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
24e30 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73  nstead, it tests
24e40 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
24e50 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64  et of pgno/rowid
24e60 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
24e70 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65  e .** visited re
24e80 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
24e90 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  her the doclist-
24ea0 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64  index identified
24eb0 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a   by parameters.*
24ec0 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69  * iSegid/iLeaf i
24ed0 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f  s iterated in fo
24ee0 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73  rwards or revers
24ef0 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
24f00 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
24f10 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20  DlidxReverse(.  
24f20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
24f30 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f50 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
24f60 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
24f70 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f90 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
24fa0 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
24fb0 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
24fc0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
24fd0 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b  dx = 0;.  u64 ck
24fe0 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34  sum1 = 13;.  u64
24ff0 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
25000 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
25010 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
25020 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   0, iSegid, iLea
25030 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
25040 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
25050 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
25060 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
25070 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  t(p, pDlidx).  )
25080 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
25090 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
250a0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
250b0 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
250c0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
250d0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
250e0 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20  ert( pgno>iLeaf 
250f0 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d  );.    cksum1 +=
25100 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
25110 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
25120 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
25130 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
25140 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  lidx = 0;..  for
25150 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
25160 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
25170 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
25180 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
25190 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
251a0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
251b0 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
251c0 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
251d0 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
251e0 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
251f0 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
25200 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
25210 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
25220 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
25230 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
25240 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66  no(pDlidx)>iLeaf
25250 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b   );.    cksum2 +
25260 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
25270 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
25280 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
25290 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
252a0 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66  Dlidx = 0;..  if
252b0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
252c0 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b  OK && cksum1!=ck
252d0 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
252e0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a  TS5_CORRUPT;.}..
252f0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51  static int fts5Q
25300 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73  ueryCksum(.  Fts
25310 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
25320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25330 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63  Fts5 index objec
25340 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
25350 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
25360 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25370 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20     /* Index key 
25380 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
25390 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64    /* Size of ind
253c0 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20  ex key in bytes 
253d0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253f0 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
25400 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  r Fts5IndexQuery
25410 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75   */.  u64 *pCksu
25420 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
25430 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
25440 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
25450 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73 75  */.){.  u64 cksu
25460 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46  m = *pCksum;.  F
25470 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
25480 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e  dxIter = 0;.  in
25490 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
254a0 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20  s5IndexQuery(p, 
254b0 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 26 70 49  z, n, flags, &pI
254c0 64 78 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c  dxIter);..  whil
254d0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
254e0 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74   && 0==sqlite3Ft
254f0 73 35 49 74 65 72 45 6f 66 28 70 49 64 78 49 74  s5IterEof(pIdxIt
25500 65 72 29 20 29 7b 0a 20 20 20 20 69 36 34 20 64  er) ){.    i64 d
25510 75 6d 6d 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20  ummy;.    const 
25520 75 38 20 2a 70 50 6f 73 3b 0a 20 20 20 20 69 6e  u8 *pPos;.    in
25530 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 36 34 20  t nPos;.    i64 
25540 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46  rowid = sqlite3F
25550 74 73 35 49 74 65 72 52 6f 77 69 64 28 70 49 64  ts5IterRowid(pId
25560 78 49 74 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  xIter);.    rc =
25570 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
25580 50 6f 73 6c 69 73 74 28 70 49 64 78 49 74 65 72  Poslist(pIdxIter
25590 2c 20 26 70 50 6f 73 2c 20 26 6e 50 6f 73 2c 20  , &pPos, &nPos, 
255a0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
255b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
255c0 7b 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c  {.      Fts5Posl
255d0 69 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65  istReader sReade
255e0 72 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c  r;.      for(sql
255f0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52  ite3Fts5PoslistR
25600 65 61 64 65 72 49 6e 69 74 28 2d 31 2c 20 70 50  eaderInit(-1, pP
25610 6f 73 2c 20 6e 50 6f 73 2c 20 26 73 52 65 61 64  os, nPos, &sRead
25620 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
25630 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a  Reader.bEof==0;.
25640 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
25650 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64  3Fts5PoslistRead
25660 65 72 4e 65 78 74 28 26 73 52 65 61 64 65 72 29  erNext(&sReader)
25670 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
25680 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
25690 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65  5_POS2COLUMN(sRe
256a0 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20  ader.iPos);.    
256b0 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46      int iOff = F
256c0 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73  TS5_POS2OFFSET(s
256d0 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20  Reader.iPos);.  
256e0 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 66        cksum ^= f
256f0 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
25700 75 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  um(rowid, iCol, 
25710 69 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e  iOff, iIdx, z, n
25720 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
25730 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
25740 35 49 74 65 72 4e 65 78 74 28 70 49 64 78 49 74  5IterNext(pIdxIt
25750 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
25760 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72   sqlite3Fts5Iter
25770 43 6c 6f 73 65 28 70 49 64 78 49 74 65 72 29 3b  Close(pIdxIter);
25780 0a 0a 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b  ..  *pCksum = ck
25790 73 75 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sum;.  return rc
257a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
257b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73   function is als
257c0 6f 20 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65  o purely an inte
257d0 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f  rnal test. It do
257e0 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74  es not contribut
257f0 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e  e to .** FTS fun
25800 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65  ctionality, or e
25810 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74  ven the integrit
25820 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20  y-check, in any 
25830 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  way..*/.static v
25840 6f 69 64 20 66 74 73 35 54 65 73 74 54 65 72 6d  oid fts5TestTerm
25850 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
25860 2c 20 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  , .  Fts5Buffer 
25870 2a 70 50 72 65 76 2c 20 20 20 20 20 20 20 20 20  *pPrev,         
25880 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
25890 20 74 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74   term */.  const
258a0 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c   char *z, int n,
258b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
258c0 73 73 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20  ssibly new term 
258d0 74 6f 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34  to test */.  u64
258e0 20 65 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34   expected,.  u64
258f0 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e   *pCksum.){.  in
25900 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
25910 69 66 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20  if( pPrev->n==0 
25920 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
25930 72 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c  rSet(&rc, pPrev,
25940 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a   n, (const u8*)z
25950 29 3b 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28  );.  }else.  if(
25960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25970 26 20 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c  & (pPrev->n!=n |
25980 7c 20 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e  | memcmp(pPrev->
25990 70 2c 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20  p, z, n)) ){.   
259a0 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70   u64 cksum3 = *p
259b0 43 6b 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74  Cksum;.    const
259c0 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28   char *zTerm = (
259d0 63 6f 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72  const char*)&pPr
259e0 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65  ev->p[1];  /* te
259f0 72 6d 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62  rm sans prefix-b
25a00 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  yte */.    int n
25a10 54 65 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d  Term = pPrev->n-
25a20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1;            /*
25a30 20 53 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69   Size of zTerm i
25a40 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
25a50 6e 74 20 69 49 64 78 20 3d 20 28 70 50 72 65 76  nt iIdx = (pPrev
25a60 2d 3e 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41  ->p[0] - FTS5_MA
25a70 49 4e 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20  IN_PREFIX);.    
25a80 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64  int flags = (iId
25a90 78 3d 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49  x==0 ? 0 : FTS5I
25aa0 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
25ab0 58 29 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20  X);.    u64 ck1 
25ac0 3d 20 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32  = 0;.    u64 ck2
25ad0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68   = 0;..    /* Ch
25ae0 65 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73  eck that the res
25af0 75 6c 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f  ults returned fo
25b00 72 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 71  r ASC and DESC q
25b10 75 65 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a  ueries are.    *
25b20 2a 20 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e  * the same. If n
25b30 6f 74 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f  ot, call this co
25b40 72 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20  rruption.  */.  
25b50 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
25b60 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
25b70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
25b80 67 73 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69  gs, &ck1);.    i
25b90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25ba0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20   ){.      int f 
25bb0 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45  = flags|FTS5INDE
25bc0 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20  X_QUERY_DESC;.  
25bd0 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
25be0 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
25bf0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
25c00 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20  , &ck2);.    }. 
25c10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25c20 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32  E_OK && ck1!=ck2
25c30 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
25c40 52 55 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  RUPT;..    /* If
25c50 20 74 68 69 73 20 69 73 20 61 20 70 72 65 66 69   this is a prefi
25c60 78 20 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74  x query, check t
25c70 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
25c80 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a  returned if the.
25c90 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78      ** the index
25ca0 20 69 73 20 64 69 73 61 62 6c 65 64 20 61 72 65   is disabled are
25cb0 20 74 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f   the same. In bo
25cc0 74 68 20 41 53 43 20 61 6e 64 20 44 45 53 43 20  th ASC and DESC 
25cd0 6f 72 64 65 72 2e 20 0a 20 20 20 20 2a 2a 0a 20  order. .    **. 
25ce0 20 20 20 2a 2a 20 54 68 69 73 20 63 68 65 63 6b     ** This check
25cf0 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 70 65 72   may only be per
25d00 66 6f 72 6d 65 64 20 69 66 20 74 68 65 20 68 61  formed if the ha
25d10 73 68 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  sh table is empt
25d20 79 2e 20 54 68 69 73 0a 20 20 20 20 2a 2a 20 69  y. This.    ** i
25d30 73 20 62 65 63 61 75 73 65 20 74 68 65 20 68 61  s because the ha
25d40 73 68 20 74 61 62 6c 65 20 6f 6e 6c 79 20 73 75  sh table only su
25d50 70 70 6f 72 74 73 20 61 20 73 69 6e 67 6c 65 20  pports a single 
25d60 73 63 61 6e 20 71 75 65 72 79 20 61 74 0a 20 20  scan query at.  
25d70 20 20 2a 2a 20 61 20 74 69 6d 65 2c 20 61 6e 64    ** a time, and
25d80 20 74 68 65 20 6d 75 6c 74 69 2d 69 74 65 72 20   the multi-iter 
25d90 6c 6f 6f 70 20 66 72 6f 6d 20 77 68 69 63 68 20  loop from which 
25da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
25db0 20 63 61 6c 6c 65 64 0a 20 20 20 20 2a 2a 20 69   called.    ** i
25dc0 73 20 61 6c 72 65 61 64 79 20 70 65 72 66 6f 72  s already perfor
25dd0 6d 69 6e 67 20 73 75 63 68 20 61 20 73 63 61 6e  ming such a scan
25de0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
25df0 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d 3d 30 20  nPendingData==0 
25e00 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 49 64  ){.      if( iId
25e10 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  x>0 && rc==SQLIT
25e20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
25e30 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54  int f = flags|FT
25e40 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
25e50 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20 20  ST_NOIDX;.      
25e60 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
25e70 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72     rc = fts5Quer
25e80 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20  yCksum(p, iIdx, 
25e90 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c  zTerm, nTerm, f,
25ea0 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20 20   &ck2);.        
25eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25ec0 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20  K && ck1!=ck2 ) 
25ed0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
25ee0 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  T;.      }.     
25ef0 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20 72   if( iIdx>0 && r
25f00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25f10 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20          int f = 
25f20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
25f30 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
25f40 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
25f50 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 20 20 63  _DESC;.        c
25f60 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  k2 = 0;.        
25f70 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
25f80 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
25f90 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
25fa0 6b 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  k2);.        if(
25fb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25fc0 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
25fd0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
25fe0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
25ff0 20 20 20 63 6b 73 75 6d 33 20 5e 3d 20 63 6b 31     cksum3 ^= ck1
26000 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
26010 53 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20  Set(&rc, pPrev, 
26020 6e 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29  n, (const u8*)z)
26030 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
26040 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
26050 6d 33 21 3d 65 78 70 65 63 74 65 64 20 29 7b 0a  m3!=expected ){.
26060 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
26070 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20  CORRUPT;.    }. 
26080 20 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73     *pCksum = cks
26090 75 6d 33 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  um3;.  }.  p->rc
260a0 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23 65 6c 73 65   = rc;.}. .#else
260b0 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65  .# define fts5Te
260c0 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 78  stDlidxReverse(x
260d0 2c 79 2c 7a 29 0a 23 20 64 65 66 69 6e 65 20 66  ,y,z).# define f
260e0 74 73 35 54 65 73 74 54 65 72 6d 28 75 2c 76 2c  ts5TestTerm(u,v,
260f0 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69 66 0a  w,x,y,z).#endif.
26100 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
26110 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 41 6c  t:.**.**   1) Al
26120 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67  l leaves of pSeg
26130 20 62 65 74 77 65 65 6e 20 69 46 69 72 73 74 20   between iFirst 
26140 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75  and iLast (inclu
26150 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a  sive) exist and.
26160 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20  **      contain 
26170 7a 65 72 6f 20 74 65 72 6d 73 2e 0a 2a 2a 20 20  zero terms..**  
26180 20 32 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f   2) All leaves o
26190 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20 69  f pSeg between i
261a0 4e 6f 52 6f 77 69 64 20 61 6e 64 20 69 4c 61 73  NoRowid and iLas
261b0 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78  t (inclusive) ex
261c0 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  ist and.**      
261d0 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 72 6f 77  contain zero row
261e0 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ids..*/.static v
261f0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
26200 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79  egrityCheckEmpty
26210 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
26220 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
26230 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c 20  eSegment *pSeg, 
26240 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74      /* Segment t
26250 6f 20 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c  o check internal
26260 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a   consistency */.
26270 20 20 69 6e 74 20 69 46 69 72 73 74 2c 0a 20 20    int iFirst,.  
26280 69 6e 74 20 69 4e 6f 52 6f 77 69 64 2c 0a 20 20  int iNoRowid,.  
26290 69 6e 74 20 69 4c 61 73 74 0a 29 7b 0a 20 20 69  int iLast.){.  i
262a0 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4e 6f 77 20  nt i;..  /* Now 
262b0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69  check that the i
262c0 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76 65  ter.nEmpty leave
262d0 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  s following the 
262e0 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20 2a  current leaf.  *
262f0 2a 20 28 61 29 20 65 78 69 73 74 20 61 6e 64 20  * (a) exist and 
26300 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74  (b) contain no t
26310 65 72 6d 73 2e 20 2a 2f 0a 20 20 66 6f 72 28 69  erms. */.  for(i
26320 3d 69 46 69 72 73 74 3b 20 70 2d 3e 72 63 3d 3d  =iFirst; p->rc==
26330 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 3d  SQLITE_OK && i<=
26340 69 4c 61 73 74 3b 20 69 2b 2b 29 7b 0a 20 20 20  iLast; i++){.   
26350 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
26360 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
26370 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
26380 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
26390 69 64 2c 20 30 2c 20 69 29 29 3b 0a 20 20 20 20  id, 0, i));.    
263a0 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
263b0 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61 66     if( !fts5Leaf
263c0 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
263d0 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  ) ) p->rc = FTS5
263e0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
263f0 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64 20  if( i>=iNoRowid 
26400 26 26 20 30 21 3d 66 74 73 35 47 65 74 55 31 36  && 0!=fts5GetU16
26410 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 20 29  (&pLeaf->p[0]) )
26420 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
26430 52 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  RRUPT;.    }.   
26440 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
26450 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 69 66 28  (pLeaf);.    if(
26460 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
26470 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
26480 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65  id fts5IndexInte
26490 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
264a0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
264b0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
264c0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
264d0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
264e0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
264f0 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20 20  gment *pSeg     
26500 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63   /* Segment to c
26510 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f  heck internal co
26520 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b 0a  nsistency */.){.
26530 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
26540 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
26550 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ig;.  sqlite3_st
26560 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
26570 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74 20   int rc2;.  int 
26580 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  iIdxPrevLeaf = p
26590 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31  Seg->pgnoFirst-1
265a0 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50 72  ;.  int iDlidxPr
265b0 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70  evLeaf = pSeg->p
265c0 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28 20  gnoLast;..  if( 
265d0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d  pSeg->pgnoFirst=
265e0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  =0 ) return;..  
265f0 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
26600 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c 20  Stmt(p, &pStmt, 
26610 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
26620 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73  .      "SELECT s
26630 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67 6e  egid, term, (pgn
26640 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 20 26 20 31  o>>1), (pgno & 1
26650 29 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  ) FROM '%q'.'%q_
26660 69 64 78 27 20 57 48 45 52 45 20 73 65 67 69 64  idx' WHERE segid
26670 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e  =%d",.      pCon
26680 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
26690 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e  g->zName, pSeg->
266a0 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20  iSegid.  ));..  
266b0 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75  /* Iterate throu
266c0 67 68 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  gh the b-tree hi
266d0 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77  erarchy.  */.  w
266e0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
266f0 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
26700 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
26710 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
26720 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20 20 20   i64 iRow;      
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26740 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68 69 73  * Rowid for this
26750 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73   leaf */.    Fts
26760 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
26770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
26780 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65 61 66  ta for this leaf
26790 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64   */..    int nId
267a0 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f  xTerm = sqlite3_
267b0 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
267c0 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73  mt, 1);.    cons
267d0 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65 72 6d  t char *zIdxTerm
267e0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
267f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
26800 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
26810 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61 66 20     int iIdxLeaf 
26820 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
26830 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  _int(pStmt, 2);.
26840 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c 69 64      int bIdxDlid
26850 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  x = sqlite3_colu
26860 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 33 29  mn_int(pStmt, 3)
26870 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
26880 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74 69 6f   leaf in questio
26890 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
268a0 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20  en trimmed from 
268b0 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20  the segment, .  
268c0 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68 69 73    ** ignore this
268d0 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e 20 4f   b-tree entry. O
268e0 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64 20 69  therwise, load i
268f0 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a  t into memory. *
26900 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78 4c 65  /.    if( iIdxLe
26910 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  af<pSeg->pgnoFir
26920 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  st ) continue;. 
26930 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35 5f 53     iRow = FTS5_S
26940 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
26950 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 49  g->iSegid, 0, iI
26960 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65  dxLeaf);.    pLe
26970 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
26980 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20  d(p, iRow);.    
26990 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62  if( pLeaf==0 ) b
269a0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  reak;..    /* Ch
269b0 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
269c0 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  f contains at le
269d0 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e  ast one term, an
269e0 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  d that it is equ
269f0 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20  al.    ** to or 
26a00 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
26a10 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64  split-key in zId
26a20 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65  xTerm.  Also che
26a30 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ck that if there
26a40 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20  .    ** is also 
26a50 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20  a rowid pointer 
26a60 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20  within the leaf 
26a70 70 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20  page header, it 
26a80 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20  points to a.    
26a90 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ** location befo
26aa0 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f  re the term.  */
26ab0 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
26ac0 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  nn<=pLeaf->szLea
26ad0 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  f ){.      p->rc
26ae0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
26af0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26b00 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
26b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b20 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
26b30 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f   term on leaf */
26b40 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69  .      int iRowi
26b50 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dOff;           
26b60 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
26b70 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c  first rowid on l
26b80 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  eaf */.      int
26b90 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
26ba0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26bb0 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
26bc0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
26bd0 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
26be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26bf0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
26c00 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
26c10 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66  ey */..      iOf
26c20 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
26c30 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b  tTermOff(pLeaf);
26c40 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
26c50 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70   = fts5GetU16(&p
26c60 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20  Leaf->p[0]);.   
26c70 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
26c80 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  >=iOff ){.      
26c90 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
26ca0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
26cb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  lse{.        iOf
26cc0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
26cd0 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69  nt32(&pLeaf->p[i
26ce0 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Off], nTerm);.  
26cf0 20 20 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63        res = memc
26d00 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  mp(&pLeaf->p[iOf
26d10 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49  f], zIdxTerm, MI
26d20 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72  N(nTerm, nIdxTer
26d30 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m));.        if(
26d40 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
26d50 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d  nTerm - nIdxTerm
26d60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
26d70 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  s<0 ) p->rc = FT
26d80 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
26d90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74    }.    }.    ft
26da0 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
26db0 65 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  eaf);.    if( p-
26dc0 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 0a 20  >rc ) break;... 
26dd0 20 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20     /* Now check 
26de0 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
26df0 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
26e00 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
26e10 74 20 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61  t leaf.    ** (a
26e20 29 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20  ) exist and (b) 
26e30 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73  contain no terms
26e40 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64  . */.    fts5Ind
26e50 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
26e60 45 6d 70 74 79 28 0a 20 20 20 20 20 20 20 20 70  Empty(.        p
26e70 2c 20 70 53 65 67 2c 20 69 49 64 78 50 72 65 76  , pSeg, iIdxPrev
26e80 4c 65 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72  Leaf+1, iDlidxPr
26e90 65 76 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65  evLeaf+1, iIdxLe
26ea0 61 66 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20  af-1.    );.    
26eb0 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61  if( p->rc ) brea
26ec0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  k;..    /* If th
26ed0 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74  ere is a doclist
26ee0 2d 69 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68  -index, check th
26ef0 61 74 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68  at it looks righ
26f00 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49  t. */.    if( bI
26f10 64 78 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20  dxDlidx ){.     
26f20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
26f30 70 44 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20  pDlidx = 0;  /* 
26f40 46 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68  For iterating th
26f50 72 6f 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e  rough doclist in
26f60 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  dex */.      int
26f70 20 69 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64   iPrevLeaf = iId
26f80 78 4c 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74  xLeaf;.      int
26f90 20 69 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e   iSegid = pSeg->
26fa0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e  iSegid;.      in
26fb0 74 20 69 50 67 20 3d 20 30 3b 0a 20 20 20 20 20  t iPg = 0;.     
26fc0 20 69 36 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20   i64 iKey;..    
26fd0 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
26fe0 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
26ff0 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 49 64  , 0, iSegid, iId
27000 78 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  xLeaf);.        
27010 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
27020 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
27030 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
27040 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
27050 20 70 44 6c 69 64 78 29 0a 20 20 20 20 20 20 29   pDlidx).      )
27060 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68  {..        /* Ch
27070 65 63 6b 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65  eck any rowid-le
27080 73 73 20 70 61 67 65 73 20 74 68 61 74 20 6f 63  ss pages that oc
27090 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20 63  cur before the c
270a0 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a  urrent leaf. */.
270b0 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d          for(iPg=
270c0 69 50 72 65 76 4c 65 61 66 2b 31 3b 20 69 50 67  iPrevLeaf+1; iPg
270d0 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67  <fts5DlidxIterPg
270e0 6e 6f 28 70 44 6c 69 64 78 29 3b 20 69 50 67 2b  no(pDlidx); iPg+
270f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4b  +){.          iK
27100 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
27110 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
27120 30 2c 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20  0, iPg);.       
27130 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
27140 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
27150 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
27160 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
27170 20 20 20 20 20 69 66 28 20 66 74 73 35 47 65 74       if( fts5Get
27180 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d  U16(&pLeaf->p[0]
27190 29 21 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46  )!=0 ) p->rc = F
271a0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
271b0 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74           fts5Dat
271c0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
271d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
271e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
271f0 50 72 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44  PrevLeaf = fts5D
27200 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
27210 69 64 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  idx);..        /
27220 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
27230 20 6c 65 61 66 20 70 61 67 65 20 69 6e 64 69 63   leaf page indic
27240 61 74 65 64 20 62 79 20 74 68 65 20 69 74 65 72  ated by the iter
27250 61 74 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73  ator really does
27260 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74  .        ** cont
27270 61 69 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75  ain the rowid su
27280 67 67 65 73 74 65 64 20 62 79 20 74 68 65 20 73  ggested by the s
27290 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ame. */.        
272a0 69 4b 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d  iKey = FTS5_SEGM
272b0 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64  ENT_ROWID(iSegid
272c0 2c 20 30 2c 20 69 50 72 65 76 4c 65 61 66 29 3b  , 0, iPrevLeaf);
272d0 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d  .        pLeaf =
272e0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
272f0 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   iKey);.        
27300 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
27310 20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69         i64 iRowi
27320 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  d;.          int
27330 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
27340 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e  5GetU16(&pLeaf->
27350 70 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  p[0]);.         
27360 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
27370 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  K(pLeaf);.      
27380 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66      if( iRowidOf
27390 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  f>=pLeaf->szLeaf
273a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
273b0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
273c0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
273d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
273e0 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
273f0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69  (&pLeaf->p[iRowi
27400 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52  dOff], (u64*)&iR
27410 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20  owid);.         
27420 20 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66     if( iRowid!=f
27430 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
27440 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72  d(pDlidx) ) p->r
27450 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27460 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
27470 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
27480 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
27490 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
274a0 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50  }..      iDlidxP
274b0 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20  revLeaf = iPg;. 
274c0 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
274d0 65 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a  erFree(pDlidx);.
274e0 20 20 20 20 20 20 66 74 73 35 54 65 73 74 44 6c        fts5TestDl
274f0 69 64 78 52 65 76 65 72 73 65 28 70 2c 20 69 53  idxReverse(p, iS
27500 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b  egid, iIdxLeaf);
27510 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27520 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
27530 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
27540 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  t;.      /* TODO
27550 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73  : Check there is
27560 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65   no doclist inde
27570 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20  x */.    }..    
27580 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69  iIdxPrevLeaf = i
27590 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20  IdxLeaf;.  }..  
275a0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
275b0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
275c0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
275d0 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
275e0 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20  rc2;..  /* Page 
275f0 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20  iter.iLeaf must 
27600 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74  now be the right
27610 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69  most leaf-page i
27620 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f  n the segment */
27630 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e  .#if 0.  if( p->
27640 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27650 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65   iter.iLeaf!=pSe
27660 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20  g->pgnoLast ){. 
27670 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
27680 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e  CORRUPT;.  }.#en
27690 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75  dif.}.../*.** Ru
276a0 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b  n internal check
276b0 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
276c0 20 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28   the FTS index (
276d0 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79  a) is internally
276e0 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20   .** consistent 
276f0 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73  and (b) contains
27700 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69   entries for whi
27710 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68  ch the XOR of th
27720 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61  e checksums.** a
27730 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20  s calculated by 
27740 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
27750 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a  sum() is cksum..
27760 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
27770 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61  ITE_CORRUPT if a
27780 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e  ny of the intern
27790 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20  al checks fail, 
277a0 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65  or if the.** che
277b0 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d  cksum does not m
277c0 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c  atch. Return SQL
277d0 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68  ITE_OK if all ch
277e0 65 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75  ecks pass withou
277f0 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73  t.** error, or s
27800 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65  ome other SQLite
27810 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
27820 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e  nother error (e.
27830 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72  g. OOM).** occur
27840 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
27850 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72  3Fts5IndexIntegr
27860 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64  ityCheck(Fts5Ind
27870 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d  ex *p, u64 cksum
27880 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20  ){.  u64 cksum2 
27890 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
278a0 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d       /* Checksum
278b0 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e   based on conten
278c0 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f  ts of indexes */
278d0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f  .  Fts5Buffer po
278e0 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b  slist = {0,0,0};
278f0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
27900 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c  d to hold a posl
27910 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  ist */.  Fts5Ind
27920 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20  exIter *pIter;  
27930 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
27940 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
27950 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78  ugh entire index
27960 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
27970 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20  ure *pStruct;   
27980 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
27990 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20 20 2f  tructure */..  /
279a0 2a 20 55 73 65 64 20 62 79 20 65 78 74 72 61 20  * Used by extra 
279b0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73 20 6f  internal tests o
279c0 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45 42 55  nly run if NDEBU
279d0 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  G is not defined
279e0 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75 6d 33   */.  u64 cksum3
279f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
27a00 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
27a10 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65  m based on conte
27a20 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a  nts of indexes *
27a30 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
27a40 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20  erm = {0,0,0};  
27a50 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73      /* Buffer us
27a60 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73 74 20  ed to hold most 
27a70 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f 0a 20  recent term */. 
27a80 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20   .  /* Load the 
27a90 46 54 53 20 69 6e 64 65 78 20 73 74 72 75 63 74  FTS index struct
27aa0 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  ure */.  pStruct
27ab0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
27ac0 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43  Read(p);..  /* C
27ad0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e  heck that the in
27ae0 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20  ternal nodes of 
27af0 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74  each segment mat
27b00 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f  ch the leaves */
27b10 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
27b20 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20  {.    int iLvl, 
27b30 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c  iSeg;.    for(iL
27b40 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
27b50 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
27b60 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
27b70 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
27b80 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
27b90 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
27ba0 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72  .        Fts5Str
27bb0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
27bc0 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Seg = &pStruct->
27bd0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
27be0 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
27bf0 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
27c00 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28  ityCheckSegment(
27c10 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  p, pSeg);.      
27c20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
27c30 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75  * The cksum argu
27c40 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
27c50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
27c60 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75  a checksum calcu
27c70 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64  lated.  ** based
27c80 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64   on all expected
27c90 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
27ca0 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75  FTS index (inclu
27cb0 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65  ding prefix inde
27cc0 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e  x.  ** entries).
27cd0 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63   This block chec
27ce0 6b 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 73  ks that a checks
27cf0 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61  um calculated ba
27d00 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  sed on the.  ** 
27d10 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20  actual contents 
27d20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69 73 20  of FTS index is 
27d30 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a  identical..  **.
27d40 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e    ** Two version
27d50 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68  s of the same ch
27d60 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75  ecksum are calcu
27d70 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72 73 74  lated. The first
27d80 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72   (stack.  ** var
27d90 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61  iable cksum2) ba
27da0 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65  sed on entries e
27db0 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
27dc0 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
27dd0 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69  x.  ** while doi
27de0 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  ng a linear scan
27df0 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64   of each individ
27e00 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72  ual index in tur
27e10 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73  n. .  **.  ** As
27e20 20 65 61 63 68 20 74 65 72 6d 20 76 69 73 69 74   each term visit
27e30 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72  ed by the linear
27e40 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61   scans, a separa
27e50 74 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  te query for the
27e60 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20  .  ** same term 
27e70 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b  is performed. ck
27e80 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74  sum3 is calculat
27e90 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
27ea0 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74  entries.  ** ext
27eb0 72 61 63 74 65 64 20 62 79 20 74 68 65 73 65 20  racted by these 
27ec0 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
27ed0 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
27ee0 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
27ef0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c   0, 0, 0, 0, -1,
27f00 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20   0, &pIter);.   
27f10 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
27f20 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30  Eof(p, pIter)==0
27f30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
27f40 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
27f50 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20  er, 0, 0).  ){. 
27f60 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
27f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f80 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69  * Size of term i
27f90 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
27fa0 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20  64 iPos = 0;    
27fb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
27fc0 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d  sition read from
27fd0 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20   poslist */.    
27fe0 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20  int iOff = 0;   
27ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
28000 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73  ffset within pos
28010 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20  list */.    i64 
28020 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c  iRowid = fts5Mul
28030 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
28040 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  r);.    char *z 
28050 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c  = (char*)fts5Mul
28060 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
28070 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  , &n);..    /* I
28080 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77 20  f this is a new 
28090 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20  term, query for 
280a0 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d  it. Update cksum
280b0 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  3 with the resul
280c0 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 54  ts. */.    fts5T
280d0 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d  estTerm(p, &term
280e0 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20  , z, n, cksum2, 
280f0 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20 70  &cksum3);..    p
28100 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20  oslist.n = 0;.  
28110 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50    fts5MultiIterP
28120 6f 73 6c 69 73 74 28 70 2c 20 70 49 74 65 72 2c  oslist(p, pIter,
28130 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20   0, &poslist);. 
28140 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c     while( 0==sql
28150 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
28160 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c  ext64(poslist.p,
28170 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66   poslist.n, &iOf
28180 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20  f, &iPos) ){.   
28190 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54     int iCol = FT
281a0 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50  S5_POS2COLUMN(iP
281b0 6f 73 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  os);.      int i
281c0 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  TokOff = FTS5_PO
281d0 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a  S2OFFSET(iPos);.
281e0 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20        cksum2 ^= 
281f0 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  fts5IndexEntryCk
28200 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c  sum(iRowid, iCol
28210 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a  , iTokOff, -1, z
28220 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , n);.    }.  }.
28230 20 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 70    fts5TestTerm(p
28240 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63  , &term, 0, 0, c
28250 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b  ksum2, &cksum3);
28260 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65  ..  fts5MultiIte
28270 72 46 72 65 65 28 70 2c 20 70 49 74 65 72 29 3b  rFree(p, pIter);
28280 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
28290 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d  LITE_OK && cksum
282a0 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63  !=cksum2 ) p->rc
282b0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
282c0 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
282d0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
282e0 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
282f0 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 66 74  ree(&term);.  ft
28300 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 6f  s5BufferFree(&po
28310 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e  slist);.  return
28320 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
28330 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  (p);.}.../*.** C
28340 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 72 65 74  alculate and ret
28350 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 74  urn a checksum t
28360 68 61 74 20 69 73 20 74 68 65 20 58 4f 52 20 6f  hat is the XOR o
28370 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
28380 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66  y.** checksum of
28390 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 74 68 61   all entries tha
283a0 74 20 77 6f 75 6c 64 20 62 65 20 67 65 6e 65 72  t would be gener
283b0 61 74 65 64 20 62 79 20 74 68 65 20 74 6f 6b 65  ated by the toke
283c0 6e 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 62  n specified.** b
283d0 79 20 74 68 65 20 66 69 6e 61 6c 20 35 20 61 72  y the final 5 ar
283e0 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20  guments..*/.u64 
283f0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28400 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e  Cksum(.  Fts5Con
28410 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20  fig *pConfig,   
28420 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
28430 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74  iguration object
28440 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
28450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28460 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e        /* Documen
28470 74 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69  t term appears i
28480 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  n */.  int iCol,
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
284b0 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e   term appears in
284c0 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
284d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284e0 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
284f0 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20 69  n term appears i
28500 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
28510 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  r *pTerm, int nT
28520 65 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d 20 61  erm    /* Term a
28530 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75  t iPos */.){.  u
28540 36 34 20 72 65 74 20 3d 20 30 3b 20 20 20 20 20  64 ret = 0;     
28550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28560 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
28570 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20 20 20  /.  int iIdx;   
28580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28590 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61      /* For itera
285a0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69 6e 64  ting through ind
285b0 65 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d  exes */..  ret =
285c0 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
285d0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
285e0 6c 2c 20 69 50 6f 73 2c 20 30 2c 20 70 54 65 72  l, iPos, 0, pTer
285f0 6d 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f  m, nTerm);..  fo
28600 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78 3c 70  r(iIdx=0; iIdx<p
28610 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b  Config->nPrefix;
28620 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e   iIdx++){.    in
28630 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35 49 6e  t nByte = fts5In
28640 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65  dexCharlenToByte
28650 6c 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d  len(pTerm, nTerm
28660 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  , pConfig->aPref
28670 69 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20 20 69  ix[iIdx]);.    i
28680 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
28690 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49 6e 64    ret ^= fts5Ind
286a0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
286b0 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
286c0 20 69 49 64 78 2b 31 2c 20 70 54 65 72 6d 2c 20   iIdx+1, pTerm, 
286d0 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nByte);.    }.  
286e0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b  }..  return ret;
286f0 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
28700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
28740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28780 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c  *********.** Bel
28790 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73  ow this point is
287a0 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   the implementat
287b0 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73 35 5f  ion of the fts5_
287c0 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61 72 0a  decode() scalar.
287d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79  ** function only
287e0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f  ..*/../*.** Deco
287f0 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64 61 74  de a segment-dat
28800 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74 68 65  a rowid from the
28810 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
28820 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  his function is.
28830 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74 65 20  ** the opposite 
28840 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f 53 45  of macro FTS5_SE
28850 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a  GMENT_ROWID()..*
28860 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
28870 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 0a 20  s5DecodeRowid(. 
28880 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20 20 20   i64 iRowid,    
28890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288a0 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d 20 25   /* Rowid from %
288b0 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20  _data table */. 
288c0 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c 20 20   int *piSegid,  
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74   /* OUT: Segment
288f0 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62   id */.  int *pb
28900 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20 20 20  Dlidx,          
28910 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
28920 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20   Dlidx flag */. 
28930 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74 2c 20   int *piHeight, 
28940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28950 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68 74 20   /* OUT: Height 
28960 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f  */.  int *piPgno
28970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28980 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67       /* OUT: Pag
28990 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20  e number */.){. 
289a0 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29   *piPgno = (int)
289b0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
289c0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
289d0 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20  PAGE_B) - 1));. 
289e0 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
289f0 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20  _DATA_PAGE_B;.. 
28a00 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28 69 6e   *piHeight = (in
28a10 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
28a20 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
28a30 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20 31 29  A_HEIGHT_B) - 1)
28a40 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
28a50 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
28a60 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20  _B;..  *pbDlidx 
28a70 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
28a80 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52 6f 77   0x0001);.  iRow
28a90 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41  id >>= FTS5_DATA
28aa0 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65  _DLI_B;..  *piSe
28ab0 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  gid = (int)(iRow
28ac0 69 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c  id & (((i64)1 <<
28ad0 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29   FTS5_DATA_ID_B)
28ae0 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69   - 1));.}..stati
28af0 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
28b00 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63 2c 20  Rowid(int *pRc, 
28b10 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
28b20 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20 20 69  , i64 iKey){.  i
28b30 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  nt iSegid, iHeig
28b40 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64  ht, iPgno, bDlid
28b50 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69  x;       /* Rowi
28b60 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a  d compenents */.
28b70 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69    fts5DecodeRowi
28b80 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69 64 2c  d(iKey, &iSegid,
28b90 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67   &bDlidx, &iHeig
28ba0 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20  ht, &iPgno);..  
28bb0 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
28bc0 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d 3d 46  .    if( iKey==F
28bd0 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
28be0 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ID ){.      sqli
28bf0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
28c00 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
28c10 42 75 66 2c 20 22 7b 61 76 65 72 61 67 65 73 7d  Buf, "{averages}
28c20 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   ");.    }else{.
28c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
28c40 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
28c50 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
28c60 7b 73 74 72 75 63 74 75 72 65 7d 22 29 3b 0a 20  {structure}");. 
28c70 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b     }.  }.  else{
28c80 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
28c90 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
28ca0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b  tf(pRc, pBuf, "{
28cb0 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25 64 20  %ssegid=%d h=%d 
28cc0 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20  pgno=%d}",.     
28cd0 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64 6c 69     bDlidx ? "dli
28ce0 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65 67 69  dx " : "", iSegi
28cf0 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
28d00 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a  o.    );.  }.}..
28d10 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
28d20 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28 0a  DebugStructure(.
28d30 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
28d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d50 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
28d60 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
28d70 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
28d80 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
28d90 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  p.){.  int iLvl,
28da0 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
28db0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
28dc0 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73  e through levels
28dd0 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20  , segments */.. 
28de0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
28df0 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  l<p->nLevel; iLv
28e00 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 74  l++){.    Fts5St
28e10 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
28e20 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b  vl = &p->aLevel[
28e30 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74  iLvl];.    sqlit
28e40 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
28e50 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
28e60 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22 20 7b  uf, .        " {
28e70 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64  lvl=%d nMerge=%d
28e80 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c   nSeg=%d", iLvl,
28e90 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70   pLvl->nMerge, p
28ea0 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b  Lvl->nSeg.    );
28eb0 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b  .    for(iSeg=0;
28ec0 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67   iSeg<pLvl->nSeg
28ed0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
28ee0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
28ef0 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
28f00 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
28f10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
28f20 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
28f30 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
28f40 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b 69 64  .          " {id
28f50 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65 73 3d  =%d h=%d leaves=
28f60 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67 2d 3e  %d..%d}", pSeg->
28f70 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 6e 48  iSegid, pSeg->nH
28f80 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20 20 20  eight, .        
28f90 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
28fa0 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t, pSeg->pgnoLas
28fb0 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
28fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
28fd0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
28fe0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d  tf(pRc, pBuf, "}
28ff0 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ");.  }.}../*.**
29000 20 54 68 69 73 20 69 73 20 70 61 72 74 20 6f 66   This is part of
29010 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65   the fts5_decode
29020 28 29 20 64 65 62 75 67 67 69 6e 67 20 61 69 64  () debugging aid
29030 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
29040 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f  s pBlob/nBlob co
29050 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a  ntain a serializ
29060 65 64 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ed Fts5Structure
29070 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a   object. This.**
29080 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
29090 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
290a0 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
290b0 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62  n of the same ob
290c0 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62  ject.** to the b
290d0 75 66 66 65 72 20 70 61 73 73 65 64 20 61 73 20  uffer passed as 
290e0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
290f0 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
29100 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 53  void fts5DecodeS
29110 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20  tructure(.  int 
29120 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
29130 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
29140 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
29150 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
29160 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74  r *pBuf,.  const
29170 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20   u8 *pBlob, int 
29180 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72  nBlob.){.  int r
29190 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
291a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
291b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
291c0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 20  ts5Structure *p 
291d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
291e0 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75 63 74  * Decoded struct
291f0 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  ure object */.. 
29200 20 72 63 20 3d 20 66 74 73 35 53 74 72 75 63 74   rc = fts5Struct
29210 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c  ureDecode(pBlob,
29220 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a   nBlob, 0, &p);.
29230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29240 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20  _OK ){.    *pRc 
29250 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e  = rc;.    return
29260 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62  ;.  }..  fts5Deb
29270 75 67 53 74 72 75 63 74 75 72 65 28 70 52 63 2c  ugStructure(pRc,
29280 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73   pBuf, p);.  fts
29290 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
292a0 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  e(p);.}../*.** B
292b0 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
292c0 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
292d0 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
292e0 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
292f0 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
29300 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
29310 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
29320 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
29330 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
29340 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
29350 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
29360 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
29370 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
29380 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
29390 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
293a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
293b0 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
293c0 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
293d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
293e0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
293f0 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
29400 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
29410 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
29420 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
29430 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
29440 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
29450 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
29460 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
29470 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
29480 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
29490 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
294a0 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
294b0 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
294c0 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
294d0 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
294e0 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
294f0 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
29500 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
29510 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
29520 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
29530 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
29540 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
29550 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
29560 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
29570 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
29580 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
29590 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
295a0 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
295b0 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
295c0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
295d0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
295e0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
295f0 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
29600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
29610 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
29620 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
29630 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
29640 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
29650 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a 20 20    i64 iDocid;.  
29660 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
29670 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
29680 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74  iOff = sqlite3Ft
29690 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28  s5GetVarint(a, (
296a0 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20  u64*)&iDocid);. 
296b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
296c0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
296d0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64  (pRc, pBuf, " id
296e0 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
296f0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f  .  }.  while( iO
29700 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
29710 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44  nPos;.    int bD
29720 75 6d 6d 79 3b 0a 20 20 20 20 69 4f 66 66 20 2b  ummy;.    iOff +
29730 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
29740 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26  Size(&a[iOff], &
29750 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
29760 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
29770 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 70 52  DecodePoslist(pR
29780 63 2c 20 70 42 75 66 2c 20 26 61 5b 69 4f 66 66  c, pBuf, &a[iOff
29790 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e  ], MIN(n-iOff, n
297a0 50 6f 73 29 29 3b 0a 20 20 20 20 69 66 28 20 69  Pos));.    if( i
297b0 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69  Off<n ){.      i
297c0 36 34 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  64 iDelta;.     
297d0 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
297e0 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  Fts5GetVarint(&a
297f0 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
29800 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66  Delta);.      if
29810 28 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 72 65  ( iDelta==0 ) re
29820 74 75 72 6e 20 69 4f 66 66 3b 0a 20 20 20 20 20  turn iOff;.     
29830 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c 74   iDocid += iDelt
29840 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  a;.      sqlite3
29850 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
29860 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
29870 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44  , " id=%lld", iD
29880 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ocid);.    }.  }
29890 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b  ..  return iOff;
298a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  .}../*.** The im
298b0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
298c0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61  user-defined sca
298d0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73  lar function fts
298e0 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73  5_decode()..*/.s
298f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
29900 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a 20  ecodeFunction(. 
29910 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
29920 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20 20   *pCtx,         
29930 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c   /* Function cal
29940 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  l context */.  i
29950 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29970 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 73  * Number of args
29980 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20   (always 2) */. 
29990 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
299a0 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20 20  *apVal          
299b0 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72 67   /* Function arg
299c0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
299d0 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20 20  64 iRowid;      
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
299f0 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63 6f  * Rowid for reco
29a00 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65 64  rd being decoded
29a10 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69 64   */.  int iSegid
29a20 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c 62  ,iHeight,iPgno,b
29a30 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20 63  Dlidx;/* Rowid c
29a40 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20 63  omponents */.  c
29a50 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b 20  onst u8 *aBlob; 
29a60 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 2f  int n;         /
29a70 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63 6f  * Record to deco
29a80 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d 20  de */.  u8 *a = 
29a90 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  0;.  Fts5Buffer 
29aa0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
29ab0 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75 70       /* Build up
29ac0 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e 20   text to return 
29ad0 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  here */.  int rc
29ae0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
29af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
29b00 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
29b10 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 0a 20  t nSpace = 0;.. 
29b20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32   assert( nArg==2
29b30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 2c   );.  memset(&s,
29b40 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
29b50 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77 69  uffer));.  iRowi
29b60 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
29b70 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30 5d  e_int64(apVal[0]
29b80 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61 20  );..  /* Make a 
29b90 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f  copy of the seco
29ba0 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20 62  nd argument (a b
29bb0 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d 2e  lob) in aBlob[].
29bc0 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20 2a   The aBlob[].  *
29bd0 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f 77  * copy is follow
29be0 65 64 20 62 79 20 46 54 53 35 5f 44 41 54 41 5f  ed by FTS5_DATA_
29bf0 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78 30  ZERO_PADDING 0x0
29c00 30 20 62 79 74 65 73 2c 20 77 68 69 63 68 20 70  0 bytes, which p
29c10 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75 66  revents.  ** buf
29c20 66 65 72 20 6f 76 65 72 72 65 61 64 73 20 65 76  fer overreads ev
29c30 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72 64  en if the record
29c40 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a 2f   is corrupt.  */
29c50 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  .  n = sqlite3_v
29c60 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61 6c  alue_bytes(apVal
29c70 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d 20  [1]);.  aBlob = 
29c80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 6c  sqlite3_value_bl
29c90 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  ob(apVal[1]);.  
29ca0 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54 53  nSpace = n + FTS
29cb0 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44  5_DATA_ZERO_PADD
29cc0 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29  ING;.  a = (u8*)
29cd0 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
29ce0 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61 63  cZero(&rc, nSpac
29cf0 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20 29  e);.  if( a==0 )
29d00 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
29d10 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 61 42  ;.  memcpy(a, aB
29d20 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66 74 73  lob, n);...  fts
29d30 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f  5DecodeRowid(iRo
29d40 77 69 64 2c 20 26 69 53 65 67 69 64 2c 20 26 62  wid, &iSegid, &b
29d50 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c  Dlidx, &iHeight,
29d60 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73   &iPgno);..  fts
29d70 35 44 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c  5DebugRowid(&rc,
29d80 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20   &s, iRowid);.  
29d90 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20  if( bDlidx ){.  
29da0 20 20 46 74 73 35 44 61 74 61 20 64 6c 69 64 78    Fts5Data dlidx
29db0 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c  ;.    Fts5DlidxL
29dc0 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69  vl lvl;..    dli
29dd0 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c  dx.p = a;.    dl
29de0 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20  idx.nn = n;..   
29df0 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c   memset(&lvl, 0,
29e00 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
29e10 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e  xLvl));.    lvl.
29e20 70 44 61 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a  pData = &dlidx;.
29e30 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e      lvl.iLeafPgn
29e40 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20  o = iPgno;..    
29e50 66 6f 72 28 66 74 73 35 44 6c 69 64 78 4c 76 6c  for(fts5DlidxLvl
29e60 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e  Next(&lvl); lvl.
29e70 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69  bEof==0; fts5Dli
29e80 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29  dxLvlNext(&lvl))
29e90 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
29ea0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
29eb0 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a  rintf(&rc, &s, .
29ec0 20 20 20 20 20 20 20 20 20 20 22 20 25 64 28 25            " %d(%
29ed0 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66  lld)", lvl.iLeaf
29ee0 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64  Pgno, lvl.iRowid
29ef0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
29f00 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67    }else if( iSeg
29f10 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
29f20 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56   iRowid==FTS5_AV
29f30 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a  ERAGES_ROWID ){.
29f40 20 20 20 20 20 20 2f 2a 20 74 6f 64 6f 20 2a 2f        /* todo */
29f50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29f60 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75    fts5DecodeStru
29f70 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61  cture(&rc, &s, a
29f80 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , n);.    }.  }e
29f90 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66  lse{.    Fts5Buf
29fa0 66 65 72 20 74 65 72 6d 3b 0a 20 20 20 20 69 6e  fer term;.    in
29fb0 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a  t iTermOff = 0;.
29fc0 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d      int szLeaf =
29fd0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52 6f 77   0;.    int iRow
29fe0 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  idOff = 0;.    i
29ff0 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74  nt iOff;.    int
2a000 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
2a010 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30   memset(&term, 0
2a020 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66  , sizeof(Fts5Buf
2a030 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28 20  fer));..    if( 
2a040 6e 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 69 52  n>=4 ){.      iR
2a050 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
2a060 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
2a070 20 20 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35     szLeaf = fts5
2a080 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20  GetU16(&a[2]);. 
2a090 20 20 20 20 20 69 66 28 20 73 7a 4c 65 61 66 3c       if( szLeaf<
2a0a0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54 65  n ){.        iTe
2a0b0 72 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55  rmOff = fts5GetU
2a0c0 31 36 28 26 61 5b 73 7a 4c 65 61 66 5d 29 3b 0a  16(&a[szLeaf]);.
2a0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2a0e0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2a0f0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  Fts5BufferSet(&r
2a100 63 2c 20 26 73 2c 20 38 2c 20 28 63 6f 6e 73 74  c, &s, 8, (const
2a110 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b   u8*)"corrupt");
2a120 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f  .      goto deco
2a130 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  de_out;.    }.. 
2a140 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
2a150 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d   ){.      iOff =
2a160 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
2a170 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f  }else if( iTermO
2a180 66 66 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  ff ){.      iOff
2a190 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
2a1a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f   }else{.      iO
2a1b0 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
2a1c0 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
2a1d0 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
2a1e0 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
2a1f0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ;..    assert( i
2a200 52 6f 77 69 64 4f 66 66 3d 3d 30 20 7c 7c 20 69  RowidOff==0 || i
2a210 4f 66 66 3d 3d 69 52 6f 77 69 64 4f 66 66 20 29  Off==iRowidOff )
2a220 3b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  ;.    if( iRowid
2a230 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  Off ){.      iOf
2a240 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44  f += fts5DecodeD
2a250 6f 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20  oclist(&rc, &s, 
2a260 26 61 5b 69 4f 66 66 5d 2c 20 73 7a 4c 65 61 66  &a[iOff], szLeaf
2a270 2d 69 4f 66 66 29 3b 0a 20 20 20 20 7d 0a 0a 20  -iOff);.    }.. 
2a280 20 20 20 61 73 73 65 72 74 28 20 69 54 65 72 6d     assert( iTerm
2a290 4f 66 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d  Off==0 || iOff==
2a2a0 69 54 65 72 6d 4f 66 66 20 29 3b 0a 20 20 20 20  iTermOff );.    
2a2b0 77 68 69 6c 65 28 20 69 4f 66 66 3c 73 7a 4c 65  while( iOff<szLe
2a2c0 61 66 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  af ){.      int 
2a2d0 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66  nByte;.      iOf
2a2e0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2a2f0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
2a300 42 79 74 65 29 3b 0a 20 20 20 20 20 20 74 65 72  Byte);.      ter
2a310 6d 2e 6e 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  m.n= nKeep;.    
2a320 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
2a330 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72  ndBlob(&rc, &ter
2a340 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66  m, nByte, &a[iOf
2a350 66 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  f]);.      iOff 
2a360 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20  += nByte;..     
2a370 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a380 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a  erAppendPrintf(.
2a390 20 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26            &rc, &
2a3a0 73 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c  s, " term=%.*s",
2a3b0 20 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20   term.n, (const 
2a3c0 63 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20  char*)term.p.   
2a3d0 20 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66     );.      iOff
2a3e0 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f   += fts5DecodeDo
2a3f0 63 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  clist(&rc, &s, &
2a400 61 5b 69 4f 66 66 5d 2c 20 73 7a 4c 65 61 66 2d  a[iOff], szLeaf-
2a410 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28  iOff);.      if(
2a420 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a   iOff<szLeaf ){.
2a430 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
2a440 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2a450 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  &a[iOff], nKeep)
2a460 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a470 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
2a480 65 65 28 26 74 65 72 6d 29 3b 0a 20 20 7d 0a 20  ee(&term);.  }. 
2a490 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20   . decode_out:. 
2a4a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
2a4b0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2a4c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2a4d0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2a4e0 28 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68  (pCtx, (const ch
2a4f0 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51  ar*)s.p, s.n, SQ
2a500 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2a510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2a520 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2a530 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
2a540 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66  );.  }.  fts5Buf
2a550 66 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a  ferFree(&s);.}..
2a560 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2a570 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2a580 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2a590 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f  function fts5_ro
2a5a0 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  wid()..*/.static
2a5b0 20 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46   void fts5RowidF
2a5c0 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2a5d0 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2a5e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2a5f0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2a600 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2a610 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2a620 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a630 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2a640 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2a650 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2a660 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2a670 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2a680 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
2a690 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28  har *zArg;.  if(
2a6a0 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20   nArg==0 ){.    
2a6b0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2a6c0 72 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75  rror(pCtx, "shou
2a6d0 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
2a6e0 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29  d(subject, ....)
2a6f0 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
2a700 0a 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e  .    zArg = (con
2a710 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2a720 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
2a730 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30  l[0]);.    if( 0
2a740 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2a750 70 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74  p(zArg, "segment
2a760 22 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ") ){.      i64 
2a770 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e  iRowid;.      in
2a780 74 20 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  t segid, height,
2a790 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
2a7a0 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20 20 20 20   nArg!=4 ){.    
2a7b0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2a7c0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2a7d0 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
2a7e0 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2a7f0 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
2a800 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
2a810 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  o))", -1.       
2a820 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
2a830 0a 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d  .        segid =
2a840 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2a850 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
2a860 20 20 20 20 20 20 68 65 69 67 68 74 20 3d 20 73        height = s
2a870 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2a880 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20  (apVal[2]);.    
2a890 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74      pgno = sqlit
2a8a0 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
2a8b0 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[3]);.        
2a8c0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
2a8d0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69  GMENT_ROWID(segi
2a8e0 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
2a8f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2a900 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
2a910 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
2a920 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2a930 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2a940 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2a950 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72  x, .        "fir
2a960 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72  st arg to fts5_r
2a970 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27  owid() must be '
2a980 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20 20 20  segment' ".     
2a990 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d 6f 66     "or 'start-of
2a9a0 2d 69 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20  -index'".       
2a9b0 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20   , -1.      );. 
2a9c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2a9d0 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
2a9e0 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69   as part of regi
2a9f0 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35  stering the FTS5
2aa00 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74   module with dat
2aa10 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
2aa20 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73  ion db. It regis
2aa30 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65  ters several use
2aa40 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
2aa50 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75   functions usefu
2aa60 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a  l.** with FTS5..
2aa70 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2aa80 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2aa90 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2aaa0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2aab0 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51  some other.** SQ
2aac0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
2aad0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
2aae0 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ead..*/.int sqli
2aaf0 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
2ab00 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
2ab10 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2ab20 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2ab30 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74  n(.      db, "ft
2ab40 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53  s5_decode", 2, S
2ab50 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
2ab60 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
2ab70 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  n, 0, 0.  );.  i
2ab80 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ab90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2aba0 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2abb0 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
2abc0 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20  , "fts5_rowid", 
2abd0 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
2abe0 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e   0, fts5RowidFun
2abf0 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
2ac00 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2ac10 72 63 3b 0a 7d 0a 0a                             rc;.}..