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

Artifact 1d1939afbc434907993d7e9a0c631be630d5b0dc:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44  .  int nPendingD
28e0: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
28f0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
2900: 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64  tes of pending d
2910: 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72  ata */.  i64 iWr
2920: 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20  iteRowid;       
2930: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
2940: 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f  d for current do
2950: 63 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  c being written 
2960: 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65  */.  int bDelete
2970: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2980: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2990: 77 72 69 74 65 20 69 73 20 61 20 64 65 6c 65 74  write is a delet
29a0: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72  e */..  /* Error
29b0: 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74   state. */.  int
29c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29e0: 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f  Current error co
29f0: 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74  de */..  /* Stat
2a00: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 66 74  e used by the ft
2a10: 73 35 44 61 74 61 58 58 58 28 29 20 66 75 6e 63  s5DataXXX() func
2a20: 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69  tions. */.  sqli
2a30: 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65  te3_blob *pReade
2a40: 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  r;          /* R
2a50: 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e  O incr-blob open
2a60: 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65   on %_data table
2a70: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2a80: 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20  mt *pWriter;    
2a90: 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54        /* "INSERT
2aa0: 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55   ... %_data VALU
2ab0: 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71  ES(?,?)" */.  sq
2ac0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c  lite3_stmt *pDel
2ad0: 65 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  eter;         /*
2ae0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f   "DELETE FROM %_
2af0: 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41  data ... id>=? A
2b00: 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73  ND id<=?" */.  s
2b10: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64  qlite3_stmt *pId
2b20: 78 57 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f  xWriter;       /
2b30: 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f  * "INSERT ... %_
2b40: 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  idx VALUES(?,?,?
2b50: 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ,?)" */.  sqlite
2b60: 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65  3_stmt *pIdxDele
2b70: 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45  ter;      /* "DE
2b80: 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20  LETE FROM %_idx 
2b90: 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f  WHERE segid=? */
2ba0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2bb0: 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69  *pIdxSelect;.  i
2bc0: 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20  nt nRead;       
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2be0: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2bf0: 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f  f blocks read */
2c00: 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35  .};..struct Fts5
2c10: 44 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20  DoclistIter {.  
2c20: 75 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20  u8 *aEof;       
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20  /* Pointer to 1 
2c50: 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66  byte past end of
2c60: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f   doclist */..  /
2c70: 2a 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c  * Output variabl
2c80: 65 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20  es. aPoslist==0 
2c90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20  at EOF */.  i64 
2ca0: 69 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50  iRowid;.  u8 *aP
2cb0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50  oslist;.  int nP
2cc0: 6f 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53  oslist;.  int nS
2cd0: 69 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  ize;.};../*.** T
2ce0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2cf0: 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72  he "structure" r
2d00: 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69  ecord for each i
2d10: 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65  ndex are represe
2d20: 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e  nted.** using an
2d30: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72   Fts5Structure r
2d40: 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e  ecord in memory.
2d50: 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74   Which uses inst
2d60: 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a  ances of the .**
2d70: 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63   other Fts5Struc
2d80: 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73  tureXXX types as
2d90: 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a   components..*/.
2da0: 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63  struct Fts5Struc
2db0: 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20  tureSegment {.  
2dc0: 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20  int iSegid;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de0: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
2df0: 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74  .  int pgnoFirst
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e10: 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66     /* First leaf
2e20: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20   page number in 
2e30: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
2e40: 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20   pgnoLast;      
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e60: 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e  Last leaf page n
2e70: 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74  umber in segment
2e80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2e90: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2ea0: 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b   {.  int nMerge;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ed0: 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e  f segments in in
2ee0: 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e  cr-merge */.  in
2ef0: 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20  t nSeg;         
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f10: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f20: 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76   segments on lev
2f30: 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  el */.  Fts5Stru
2f40: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53  ctureSegment *aS
2f50: 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79  eg;     /* Array
2f60: 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53   of segments. aS
2f70: 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e  eg[0] is oldest.
2f80: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
2f90: 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20  s5Structure {.  
2fa0: 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20  int nRef;       
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc0: 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65  /* Object refere
2fd0: 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75  nce count */.  u
2fe0: 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  64 nWriteCounter
2ff0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3000: 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77  * Total leaves w
3010: 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20  ritten to level 
3020: 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d  0 */.  int nSegm
3030: 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ent;            
3040: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
3050: 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73  segments in this
3060: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
3070: 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20  int nLevel;     
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76  /* Number of lev
30a0: 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65  els in this inde
30b0: 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  x */.  Fts5Struc
30c0: 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c  tureLevel aLevel
30d0: 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20  [1];   /* Array 
30e0: 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20  of nLevel level 
30f0: 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f  objects */.};../
3100: 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f  *.** An object o
3110: 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72  f type Fts5SegWr
3120: 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20  iter is used to 
3130: 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74  write to segment
3140: 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  s..*/.struct Fts
3150: 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20  5PageWriter {.  
3160: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3180: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
3190: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
31a0: 20 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78    int iPrevPgidx
31b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31c0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61    /* Previous va
31d0: 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  lue written into
31e0: 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35   pgidx */.  Fts5
31f0: 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20  Buffer buf;     
3200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
3210: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3220: 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20   leaf data */.  
3230: 46 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78  Fts5Buffer pgidx
3240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3250: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3260: 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20  ning page-index 
3270: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3280: 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20  term;           
3290: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
32a0: 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f  ontaining previo
32b0: 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  us term on page 
32c0: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
32d0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20  5DlidxWriter {. 
32e0: 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20   int pgno;      
32f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3300: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3310: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
3320: 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69  .  int bPrevVali
3330: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
3340: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50     /* True if iP
3350: 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  rev is valid */.
3360: 20 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20    i64 iPrev;    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3380: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
3390: 77 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65  wid value writte
33a0: 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46  n to page */.  F
33b0: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20  ts5Buffer buf;  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33d0: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
33e0: 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f  ing page data */
33f0: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53  .};.struct Fts5S
3400: 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74  egWriter {.  int
3410: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3430: 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74  Segid to write t
3440: 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57  o */.  Fts5PageW
3450: 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
3460: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72         /* PageWr
3470: 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
3480: 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b   i64 iPrevRowid;
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a0: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
34b0: 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75  id written to cu
34c0: 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20  rrent leaf */.  
34d0: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
34e0: 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20  Doclist;        
34f0: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3500: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
3510: 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75  n doclist */.  u
3520: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  8 bFirstRowidInP
3530: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  age;           /
3540: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3550: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3560: 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f   page */.  /* TO
3570: 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72  DO1: Can use (wr
3580: 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29  iter.pgidx.n==0)
3590: 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72   instead of bFir
35a0: 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a  stTermInPage */.
35b0: 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49    u8 bFirstTermI
35c0: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
35d0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78    /* True if nex
35e0: 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66  t term will be f
35f0: 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a  irst in leaf */.
3600: 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74    int nLeafWritt
3610: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
3620: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
3630: 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
3640: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74  n */.  int nEmpt
3650: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
3660: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3670: 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74   of contiguous t
3680: 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a  erm-less nodes *
3690: 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b  /..  int nDlidx;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
36c0: 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78  d size of aDlidx
36d0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74  [] array */.  Ft
36e0: 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61  s5DlidxWriter *a
36f0: 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a  Dlidx;        /*
3700: 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c   Array of Fts5Dl
3710: 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74  idxWriter object
3720: 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65  s */..  /* Value
3730: 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  s to insert into
3740: 20 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65   the %_idx table
3750: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
3760: 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20   btterm;        
3770: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65        /* Next te
3780: 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  rm to insert int
3790: 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f  o %_idx table */
37a0: 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20  .  int iBtPage; 
37b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37c0: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
37d0: 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  r corresponding 
37e0: 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a  to btterm */.};.
37f0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
3800: 46 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35  Fts5CResult Fts5
3810: 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20  CResult;.struct 
3820: 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20  Fts5CResult {.  
3830: 75 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20  u16 iFirst;     
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3850: 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20  /* aSeg[] index 
3860: 6f 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72  of firstest iter
3870: 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65  ator */.  u8 bTe
3880: 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20  rmEq;           
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
38a0: 65 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61  e if the terms a
38b0: 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a  re equal */.};..
38c0: 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72  /*.** Object for
38d0: 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
38e0: 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d  gh a single segm
38f0: 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61  ent, visiting ea
3900: 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a  ch term/rowid.**
3910: 20 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67   pair in the seg
3920: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67  ment..**.** pSeg
3930: 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65  :.**   The segme
3940: 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  nt to iterate th
3950: 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65  rough..**.** iLe
3960: 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72  afPgno:.**   Cur
3970: 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e  rent leaf page n
3980: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67  umber within seg
3990: 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ment..**.** iLea
39a0: 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79  fOffset:.**   By
39b0: 74 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  te offset within
39c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
39d0: 66 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69  f that is the fi
39e0: 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20  rst byte of the 
39f0: 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c  .**   position l
3a00: 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79  ist data (one by
3a10: 74 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f  te passed the po
3a20: 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
3a30: 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f   field)..**   ro
3a40: 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65  wid field of the
3a50: 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20   current entry. 
3a60: 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20  Usually this is 
3a70: 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f  the size field o
3a80: 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74  f the.**   posit
3a90: 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54  ion list data. T
3aa0: 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20  he exception is 
3ab0: 69 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  if the rowid for
3ac0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
3ad0: 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20  ry .**   is the 
3ae0: 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68  last thing on th
3af0: 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a  e leaf page..**.
3b00: 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42  ** pLeaf:.**   B
3b10: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
3b20: 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
3b30: 67 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20  ge data. Set to 
3b40: 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  NULL at EOF..**.
3b50: 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  ** iTermLeafPgno
3b60: 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  , iTermLeafOffse
3b70: 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67  t:.**   Leaf pag
3b80: 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e  e number contain
3b90: 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72  ing the last ter
3ba0: 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  m read from the 
3bb0: 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20  segment. And.** 
3bc0: 20 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d    the offset imm
3bd0: 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
3be0: 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61  ng the term data
3bf0: 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a  ..**.** flags:.*
3c00: 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35  *   Mask of FTS5
3c10: 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c  _SEGITER_XXX val
3c20: 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64  ues. Interpreted
3c30: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
3c40: 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45  **   FTS5_SEGITE
3c50: 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20  R_ONETERM:.**   
3c60: 20 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68    If set, set th
3c70: 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f  e iterator to po
3c80: 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72  int to EOF after
3c90: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
3ca0: 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73  list .**     has
3cb0: 20 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e   been exhausted.
3cc0: 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20   Do not proceed 
3cd0: 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  to the next term
3ce0: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e   in the segment.
3cf0: 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45  .**.**   FTS5_SE
3d00: 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a  GITER_REVERSE:.*
3d10: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
3d20: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74  is only ever set
3d30: 20 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52   if FTS5_SEGITER
3d40: 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f  _ONETERM is also
3d50: 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20   set. If.**     
3d60: 69 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61  it is set, itera
3d70: 74 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64  te through rowid
3d80: 20 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f   in descending o
3d90: 72 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20  rder instead of 
3da0: 74 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75  the.**     defau
3db0: 6c 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64  lt ascending ord
3dc0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64  er..**.** iRowid
3dd0: 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66  Offset/nRowidOff
3de0: 73 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74  set/aRowidOffset
3df0: 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61  :.**     These a
3e00: 72 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46  re used if the F
3e10: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
3e20: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
3e30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65  .**.**     For e
3e40: 61 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ach rowid on the
3e50: 20 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64   page correspond
3e60: 69 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65  ing to the curre
3e70: 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20  nt term, the.** 
3e80: 20 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e      correspondin
3e90: 67 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d  g aRowidOffset[]
3ea0: 20 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f   entry is set to
3eb0: 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74   the byte offset
3ec0: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73   of the.**     s
3ed0: 74 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73  tart of the "pos
3ee0: 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22  ition-list-size"
3ef0: 20 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68   field within th
3f00: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54  e page..**.** iT
3f10: 65 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49  ermIdx:.**     I
3f20: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
3f30: 74 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61  term on iTermLea
3f40: 66 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74  fPgno..*/.struct
3f50: 20 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20   Fts5SegIter {. 
3f60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
3f70: 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20  gment *pSeg;    
3f80: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69   /* Segment to i
3f90: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a  terate through *
3fa0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20  /.  int flags;  
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63      /* Mask of c
3fd0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61  onfiguration fla
3fe0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  gs */.  int iLea
3ff0: 66 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  fPgno;          
4000: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4010: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
4020: 62 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ber */.  Fts5Dat
4030: 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20  a *pLeaf;       
4040: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4050: 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
4060: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65  .  Fts5Data *pNe
4070: 78 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  xtLeaf;         
4080: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
4090: 28 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f  (iLeafPgno+1) */
40a0: 0a 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73  .  int iLeafOffs
40b0: 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  et;             
40c0: 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65     /* Byte offse
40d0: 74 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74  t within current
40e0: 20 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54   leaf */..  /* T
40f0: 68 65 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73  he page and offs
4100: 65 74 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68  et from which th
4110: 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77  e current term w
4120: 61 73 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66  as read. The off
4130: 73 65 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65  set .  ** is the
4140: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 66   offset of the f
4150: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  irst rowid in th
4160: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
4170: 74 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65  t.  */.  int iTe
4180: 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  rmLeafPgno;.  in
4190: 74 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65  t iTermLeafOffse
41a0: 74 3b 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78  t;..  int iPgidx
41b0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
41c0: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
41d0: 66 73 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f  fset in pgidx */
41e0: 0a 20 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63  .  int iEndofDoc
41f0: 6c 69 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  list;..  /* The 
4200: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e  following are on
4210: 6c 79 20 75 73 65 64 20 69 66 20 74 68 65 20 46  ly used if the F
4220: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4230: 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e  RSE flag is set.
4240: 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64   */.  int iRowid
4250: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4260: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4270: 20 65 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64   entry in aRowid
4280: 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e  Offset[] */.  in
4290: 74 20 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20  t nRowidOffset; 
42a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
42b0: 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
42c0: 6f 66 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  of aRowidOffset[
42d0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
42e0: 20 2a 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20   *aRowidOffset; 
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4300: 41 72 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20  Array of offset 
4310: 74 6f 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20  to rowid fields 
4320: 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49  */..  Fts5DlidxI
4330: 74 65 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20  ter *pDlidx;    
4340: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
4350: 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
4360: 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61  ndex */..  /* Va
4370: 72 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65  riables populate
4380: 64 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65  d based on curre
4390: 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46  nt entry. */.  F
43a0: 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
43c0: 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a  * Current term *
43d0: 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20  /.  i64 iRowid; 
43e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43f0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72      /* Current r
4400: 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50  owid */.  int nP
4410: 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
4420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
4430: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
4440: 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e  current position
4450: 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62   list */.  int b
4460: 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Del;            
4470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4480: 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65  ue if the delete
4490: 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a   flag is set */.
44a0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  };../*.** Argume
44b0: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
44c0: 74 6f 20 61 6e 20 46 74 73 35 44 61 74 61 20 73  to an Fts5Data s
44d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 63 6f  tructure that co
44e0: 6e 74 61 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61  ntains a .** lea
44f0: 66 20 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69  f page..*/.#defi
4500: 6e 65 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46  ne ASSERT_SZLEAF
4510: 5f 4f 4b 28 78 29 20 61 73 73 65 72 74 28 20 5c  _OK(x) assert( \
4520: 0a 20 20 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66  .    (x)->szLeaf
4530: 3d 3d 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28 78 29  ==(x)->nn || (x)
4540: 2d 3e 73 7a 4c 65 61 66 3d 3d 66 74 73 35 47 65  ->szLeaf==fts5Ge
4550: 74 55 31 36 28 26 28 78 29 2d 3e 70 5b 32 5d 29  tU16(&(x)->p[2])
4560: 20 5c 0a 29 0a 0a 23 64 65 66 69 6e 65 20 46 54   \.)..#define FT
4570: 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
4580: 52 4d 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20  RM 0x01.#define 
4590: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
45a0: 45 52 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a  ERSE 0x02.../* .
45b0: 2a 2a 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61  ** Argument is a
45c0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46   pointer to an F
45d0: 74 73 35 44 61 74 61 20 73 74 72 75 63 74 75 72  ts5Data structur
45e0: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
45f0: 61 20 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20  a leaf.** page. 
4600: 54 68 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75  This macro evalu
4610: 61 74 65 73 20 74 6f 20 74 72 75 65 20 69 66 20  ates to true if 
4620: 74 68 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e  the leaf contain
4630: 73 20 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a  s no terms, or.*
4640: 2a 20 66 61 6c 73 65 20 69 66 20 69 74 20 63 6f  * false if it co
4650: 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20  ntains at least 
4660: 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65  one term..*/.#de
4670: 66 69 6e 65 20 66 74 73 35 4c 65 61 66 49 73 54  fine fts5LeafIsT
4680: 65 72 6d 6c 65 73 73 28 78 29 20 28 28 78 29 2d  ermless(x) ((x)-
4690: 3e 73 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e  >szLeaf >= (x)->
46a0: 6e 6e 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  nn)..#define fts
46b0: 35 4c 65 61 66 54 65 72 6d 4f 66 66 28 78 2c 20  5LeafTermOff(x, 
46c0: 69 29 20 28 66 74 73 35 47 65 74 55 31 36 28 26  i) (fts5GetU16(&
46d0: 28 78 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65  (x)->p[(x)->szLe
46e0: 61 66 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a 23  af + (i)*2]))..#
46f0: 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61 66 46  define fts5LeafF
4700: 69 72 73 74 52 6f 77 69 64 4f 66 66 28 78 29 20  irstRowidOff(x) 
4710: 28 66 74 73 35 47 65 74 55 31 36 28 28 78 29 2d  (fts5GetU16((x)-
4720: 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  >p))../*.** Obje
4730: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
4740: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72   through the mer
4750: 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f  ged results of o
4760: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
4770: 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67  nts,.** visiting
4780: 20 65 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64   each term/rowid
4790: 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72   pair in the mer
47a0: 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ged data..**.** 
47b0: 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61  nSeg is always a
47c0: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72   power of two gr
47d0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
47e0: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
47f0: 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  r of.** segments
4800: 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63   that this objec
4810: 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74  t is merging dat
4820: 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65  a from. Both the
4830: 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61   aSeg[] and.** a
4840: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61  First[] arrays a
4850: 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67  re sized at nSeg
4860: 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53   entries. The aS
4870: 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61  eg[] array is pa
4880: 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72  dded.** with zer
4890: 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68  oed objects - th
48a0: 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ese are handled 
48b0: 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20  as if they were 
48c0: 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64  iterators opened
48d0: 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67  .** on empty seg
48e0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
48f0: 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
4900: 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61  aring segments a
4910: 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b  Seg[N] and aSeg[
4920: 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73  N+1], where N is
4930: 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62   an.** even numb
4940: 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  er, is stored in
4950: 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29   aFirst[(nSeg+N)
4960: 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74  /2]. The "result
4970: 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d  " of the .** com
4980: 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20  parison in this 
4990: 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69  context is the i
49a0: 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72  ndex of the iter
49b0: 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e  ator that curren
49c0: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
49d0: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72   the smaller ter
49e0: 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  m/rowid combinat
49f0: 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61  ion. Iterators a
4a00: 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e  t EOF are.** con
4a10: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72  sidered to be gr
4a20: 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f  eater than all o
4a30: 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a  ther iterators..
4a40: 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20  **.** aFirst[1] 
4a50: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
4a60: 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20  ex in aSeg[] of 
4a70: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
4a80: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
4a90: 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
4aa0: 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b  overall. aFirst[
4ab0: 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a  0] is unused. .*
4ac0: 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a 2a  *.** poslist:.**
4ad0: 20 20 20 55 73 65 64 20 62 79 20 73 71 6c 69 74     Used by sqlit
4ae0: 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
4af0: 74 28 29 20 77 68 65 6e 20 74 68 65 20 70 6f 73  t() when the pos
4b00: 6c 69 73 74 20 6e 65 65 64 73 20 74 6f 20 62 65  list needs to be
4b10: 20 62 75 66 66 65 72 65 64 2e 0a 2a 2a 20 20 20   buffered..**   
4b20: 54 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  There is no way 
4b30: 74 6f 20 74 65 6c 6c 20 69 66 20 74 68 69 73 20  to tell if this 
4b40: 69 73 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 20  is populated or 
4b50: 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  not..*/.struct F
4b60: 74 73 35 49 6e 64 65 78 49 74 65 72 20 7b 0a 20  ts5IndexIter {. 
4b70: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64   Fts5Index *pInd
4b80: 65 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ex;             
4b90: 20 2f 2a 20 49 6e 64 65 78 20 74 68 61 74 20 6f   /* Index that o
4ba0: 77 6e 73 20 74 68 69 73 20 69 74 65 72 61 74 6f  wns this iterato
4bb0: 72 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  r */.  Fts5Struc
4bc0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20  ture *pStruct;  
4bd0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
4be0: 73 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  se structure for
4bf0: 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a   this iterator *
4c00: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 70  /.  Fts5Buffer p
4c10: 6f 73 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oslist;         
4c20: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
4c30: 6e 74 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74  ntaining current
4c40: 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20 69   poslist */..  i
4c50: 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20  nt nSeg;        
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4c70: 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d  * Size of aSeg[]
4c80: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
4c90: 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  bRev;           
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4cb0: 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20 69  rue to iterate i
4cc0: 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 20  n reverse order 
4cd0: 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70  */.  u8 bSkipEmp
4ce0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
4cf0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
4d00: 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74  skip deleted ent
4d10: 72 69 65 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f  ries */.  u8 bEo
4d20: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
4d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d40: 65 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 75 38  e at EOF */.  u8
4d50: 20 62 46 69 6c 74 65 72 65 64 3b 20 20 20 20 20   bFiltered;     
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4d70: 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 2d   True if column-
4d80: 66 69 6c 74 65 72 20 61 6c 72 65 61 64 79 20 61  filter already a
4d90: 70 70 6c 69 65 64 20 2a 2f 0a 0a 20 20 69 36 34  pplied */..  i64
4da0: 20 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20   iSwitchRowid;  
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4dc0: 46 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f  Firstest rowid o
4dd0: 66 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69  f other than aFi
4de0: 72 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35  rst[1] */.  Fts5
4df0: 43 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b  CResult *aFirst;
4e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4e10: 75 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61  urrent merge sta
4e20: 74 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a  te (see above) *
4e30: 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
4e40: 61 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20  aSeg[1];        
4e50: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
4e60: 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
4e70: 73 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20  s */.};.../*.** 
4e80: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
4e90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70  he following typ
4ea0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65  e is used to ite
4eb0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
4ec0: 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20   contents.** of 
4ed0: 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  a doclist-index 
4ee0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44  record..**.** pD
4ef0: 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64  ata:.**   Record
4f00: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
4f10: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61  doclist-index da
4f20: 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a  ta..**.** bEof:.
4f30: 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65  **   Set to true
4f40: 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68   once iterator h
4f50: 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a  as reached EOF..
4f60: 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20  **.** iOff:.**  
4f70: 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72   Set to the curr
4f80: 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69  ent offset withi
4f90: 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a  n record pData..
4fa0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c  */.struct Fts5Dl
4fb0: 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44  idxLvl {.  Fts5D
4fc0: 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20  ata *pData;     
4fd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
4fe0: 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67   for current pag
4ff0: 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20  e of this level 
5000: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20  */.  int iOff;  
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66     /* Current of
5030: 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20  fset into pData 
5040: 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20  */.  int bEof;  
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5060: 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72     /* At EOF alr
5070: 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46  eady */.  int iF
5080: 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20  irstOff;        
5090: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
50a0: 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61  by reverse itera
50b0: 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75  tors */..  /* Ou
50c0: 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a  tput variables *
50d0: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e  /.  int iLeafPgn
50e0: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
50f0: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
5100: 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66   of current leaf
5110: 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69   page */.  i64 i
5120: 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20  Rowid;          
5130: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
5140: 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20  t rowid on leaf 
5150: 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a  iLeafPgno */.};.
5160: 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78  struct Fts5Dlidx
5170: 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76  Iter {.  int nLv
5180: 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  l;.  int iSegid;
5190: 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  .  Fts5DlidxLvl 
51a0: 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61  aLvl[1];.};..sta
51b0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74  tic void fts5Put
51c0: 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31  U16(u8 *aOut, u1
51d0: 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b  6 iVal){.  aOut[
51e0: 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a  0] = (iVal>>8);.
51f0: 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61    aOut[1] = (iVa
5200: 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74  l&0xFF);.}..stat
5210: 69 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31  ic u16 fts5GetU1
5220: 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29  6(const u8 *aIn)
5230: 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36  {.  return ((u16
5240: 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20  )aIn[0] << 8) + 
5250: 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a  aIn[1];.} ../*.*
5260: 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72  * Allocate and r
5270: 65 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61  eturn a buffer a
5280: 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79  t least nByte by
5290: 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
52a0: 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
52b0: 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
52c0: 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61  d, return NULL a
52d0: 6e 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72  nd set the error
52e0: 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20   code in.** the 
52f0: 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
5300: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
5310: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  irst argument..*
5320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66  /.static void *f
5330: 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73  ts5IdxMalloc(Fts
5340: 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e  5Index *p, int n
5350: 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Byte){.  return 
5360: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
5370: 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42  cZero(&p->rc, nB
5380: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  yte);.}../*.** C
5390: 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65  ompare the conte
53a0: 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74  nts of the pLeft
53b0: 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68 65   buffer with the
53c0: 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62   pRight/nRight b
53d0: 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lob..**.** Retur
53e0: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
53f0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5400: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
5410: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
5420: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
5430: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5440: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
5450: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
5460: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
5470: 70 52 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66  pRight.*/.#ifdef
5480: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
5490: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 75 66  atic int fts5Buf
54a0: 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a  ferCompareBlob(.
54b0: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c    Fts5Buffer *pL
54c0: 65 66 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  eft,            
54d0: 20 20 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73    /* Left hand s
54e0: 69 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ide of compariso
54f0: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  n */.  const u8 
5500: 2a 70 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69  *pRight, int nRi
5510: 67 68 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20  ght    /* Right 
5520: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d  hand side of com
5530: 70 61 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  parison */.){.  
5540: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
5550: 4c 65 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29  Left->n, nRight)
5560: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
5570: 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70  mcmp(pLeft->p, p
5580: 52 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20  Right, nCmp);.  
5590: 72 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f  return (res==0 ?
55a0: 20 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69   (pLeft->n - nRi
55b0: 67 68 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23  ght) : res);.}.#
55c0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  endif../*.** Com
55d0: 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
55e0: 73 20 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66  s of the two buf
55f0: 66 65 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d  fers using memcm
5600: 70 28 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66  p(). If one buff
5610: 65 72 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69  er.** is a prefi
5620: 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
5630: 69 74 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  it is considered
5640: 20 74 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a   the lesser..**.
5650: 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66  ** Return -ve if
5660: 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65   pLeft is smalle
5670: 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30  r than pRight, 0
5680: 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75   if they are equ
5690: 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20  al or.** +ve if 
56a0: 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65  pRight is smalle
56b0: 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e  r than pLeft. In
56c0: 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a   other words:.**
56d0: 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70  .**     res = *p
56e0: 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a  Left - *pRight.*
56f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
5700: 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46  5BufferCompare(F
5710: 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74  ts5Buffer *pLeft
5720: 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 52  , Fts5Buffer *pR
5730: 69 67 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d  ight){.  int nCm
5740: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5750: 2c 20 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20  , pRight->n);.  
5760: 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70  int res = memcmp
5770: 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68  (pLeft->p, pRigh
5780: 74 2d 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  t->p, nCmp);.  r
5790: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
57a0: 28 70 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67  (pLeft->n - pRig
57b0: 68 74 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d  ht->n) : res);.}
57c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
57d0: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
57e0: 20 66 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65   fts5BlobCompare
57f0: 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  (.  const u8 *pL
5800: 65 66 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20  eft, int nLeft, 
5810: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69  .  const u8 *pRi
5820: 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a  ght, int nRight.
5830: 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
5840: 4d 49 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68  MIN(nLeft, nRigh
5850: 74 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  t);.  int res = 
5860: 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52  memcmp(pLeft, pR
5870: 69 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72  ight, nCmp);.  r
5880: 65 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20  eturn (res==0 ? 
5890: 28 6e 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29  (nLeft - nRight)
58a0: 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69   : res);.}.#endi
58b0: 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  f..static int ft
58c0: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
58d0: 66 66 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65  ff(Fts5Data *pLe
58e0: 61 66 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a  af){.  int ret;.
58f0: 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33    fts5GetVarint3
5900: 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61  2(&pLeaf->p[pLea
5910: 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29  f->szLeaf], ret)
5920: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
5930: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
5940: 68 65 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f  he read-only blo
5950: 62 20 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20  b handle, if it 
5960: 69 73 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  is open..*/.stat
5970: 69 63 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73  ic void fts5Clos
5980: 65 52 65 61 64 65 72 28 46 74 73 35 49 6e 64 65  eReader(Fts5Inde
5990: 78 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  x *p){.  if( p->
59a0: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73  pReader ){.    s
59b0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65  qlite3_blob *pRe
59c0: 61 64 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65  ader = p->pReade
59d0: 72 3b 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65  r;.    p->pReade
59e0: 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  r = 0;.    sqlit
59f0: 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52  e3_blob_close(pR
5a00: 65 61 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  eader);.  }.}...
5a10: 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61  /*.** Retrieve a
5a20: 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65   record from the
5a30: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
5a40: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
5a50: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
5a60: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e   returned and an
5a70: 20 65 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74   error left in t
5a80: 68 65 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78  he .** Fts5Index
5a90: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74   object..*/.stat
5aa0: 69 63 20 46 74 73 35 44 61 74 61 20 2a 66 74 73  ic Fts5Data *fts
5ab0: 35 44 61 74 61 52 65 61 64 28 46 74 73 35 49 6e  5DataRead(Fts5In
5ac0: 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77  dex *p, i64 iRow
5ad0: 69 64 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  id){.  Fts5Data 
5ae0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
5af0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
5b00: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  K ){.    int rc 
5b10: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
5b20: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5b30: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
5b40: 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72  s call may retur
5b50: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69  n SQLITE_ABORT i
5b60: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
5b70: 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20   a savepoint.   
5b80: 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73     ** rollback s
5b90: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
5ba0: 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63   used. In this c
5bb0: 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68  ase a new blob h
5bc0: 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69  andle.      ** i
5bd0: 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
5be0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
5bf0: 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  ob *pBlob = p->p
5c00: 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d  Reader;.      p-
5c10: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
5c20: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5c30: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c  _blob_reopen(pBl
5c40: 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  ob, iRowid);.   
5c50: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
5c60: 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
5c70: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70    p->pReader = p
5c80: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20  Blob;.      if( 
5c90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
5ca0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f  .        fts5Clo
5cb0: 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
5cc0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
5cd0: 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  c==SQLITE_ABORT 
5ce0: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
5cf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d00: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
5d10: 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61  le is not open a
5d20: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70  t this point, op
5d30: 65 6e 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a  en it and seek .
5d40: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65      ** to the re
5d50: 71 75 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20  quested entry.  
5d60: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52  */.    if( p->pR
5d70: 65 61 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d  eader==0 && rc==
5d80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5d90: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
5da0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
5db0: 66 69 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  fig;.      rc = 
5dc0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65  sqlite3_blob_ope
5dd0: 6e 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a  n(pConfig->db, .
5de0: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
5df0: 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61  g->zDb, p->zData
5e00: 54 62 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52  Tbl, "block", iR
5e10: 6f 77 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65  owid, 0, &p->pRe
5e20: 61 64 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20  ader.      );.  
5e30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65    }..    /* If e
5e40: 69 74 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c  ither of the sql
5e50: 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29  ite3_blob_open()
5e60: 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62   or sqlite3_blob
5e70: 5f 72 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a  _reopen() calls.
5e80: 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74      ** above ret
5e90: 75 72 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52  urned SQLITE_ERR
5ea0: 4f 52 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  OR, return SQLIT
5eb0: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69  E_CORRUPT_VTAB i
5ec0: 6e 73 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41  nstead..    ** A
5ed0: 6c 6c 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74  ll the reasons t
5ee0: 68 6f 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d  hose functions m
5ef0: 69 67 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49  ight return SQLI
5f00: 54 45 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69  TE_ERROR - missi
5f10: 6e 67 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c  ng.    ** table,
5f20: 20 6d 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f   missing row, no
5f30: 6e 2d 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62  n-blob/text in b
5f40: 6c 6f 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e  lock column - in
5f50: 64 69 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62  dicate .    ** b
5f60: 61 63 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72  acking store cor
5f70: 72 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20  ruption.  */.   
5f80: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5f90: 45 52 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53  ERROR ) rc = FTS
5fa0: 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20  5_CORRUPT;..    
5fb0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5fc0: 4b 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61  K ){.      u8 *a
5fd0: 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
5fe0: 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62         /* Read b
5ff0: 6c 6f 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68  lob data into th
6000: 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20  is buffer */.   
6010: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
6020: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
6030: 73 28 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20  s(p->pReader);. 
6040: 20 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20       int nAlloc 
6050: 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  = sizeof(Fts5Dat
6060: 61 29 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53  a) + nByte + FTS
6070: 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a  5_DATA_PADDING;.
6080: 20 20 20 20 20 20 70 52 65 74 20 3d 20 28 46 74        pRet = (Ft
6090: 73 35 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f  s5Data*)sqlite3_
60a0: 6d 61 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a  malloc(nAlloc);.
60b0: 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
60c0: 7b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  {.        pRet->
60d0: 6e 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  nn = nByte;.    
60e0: 20 20 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d      aOut = pRet-
60f0: 3e 70 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b  >p = (u8*)&pRet[
6100: 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
6110: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
6120: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
6130: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
6140: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6150: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
6160: 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70  ite3_blob_read(p
6170: 2d 3e 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c  ->pReader, aOut,
6180: 20 6e 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20   nByte, 0);.    
6190: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
61a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
61b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
61c0: 72 65 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ree(pRet);.     
61d0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
61e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
61f0: 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20    /* TODO1: Fix 
6200: 74 68 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  this */.        
6210: 70 52 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66  pRet->szLeaf = f
6220: 74 73 35 47 65 74 55 31 36 28 26 70 52 65 74 2d  ts5GetU16(&pRet-
6230: 3e 70 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  >p[2]);.      }.
6240: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
6250: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
6260: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  ad++;.  }..  ass
6270: 65 72 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d  ert( (pRet==0)==
6280: 28 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (p->rc!=SQLITE_O
6290: 4b 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  K) );.  return p
62a0: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
62b0: 6c 65 61 73 65 20 61 20 72 65 66 65 72 65 6e 63  lease a referenc
62c0: 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64  e to data record
62d0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
62e0: 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a  earlier call to.
62f0: 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61 64 28  ** fts5DataRead(
6300: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
6310: 64 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73  d fts5DataReleas
6320: 65 28 46 74 73 35 44 61 74 61 20 2a 70 44 61 74  e(Fts5Data *pDat
6330: 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  a){.  sqlite3_fr
6340: 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74  ee(pData);.}..st
6350: 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
6360: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20  exPrepareStmt(. 
6370: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20   Fts5Index *p,. 
6380: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a   sqlite3_stmt **
6390: 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a  ppStmt,.  char *
63a0: 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d  zSql.){.  if( p-
63b0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
63c0: 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29  {.    if( zSql )
63d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
63e0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
63f0: 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64  v2(p->pConfig->d
6400: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53  b, zSql, -1, ppS
6410: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  tmt, 0);.    }el
6420: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20  se{.      p->rc 
6430: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
6440: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6450: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
6460: 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
6470: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54  }.../*.** INSERT
6480: 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20 72 65   OR REPLACE a re
6490: 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f  cord into the %_
64a0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73  data table..*/.s
64b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
64c0: 61 74 61 57 72 69 74 65 28 46 74 73 35 49 6e 64  ataWrite(Fts5Ind
64d0: 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69  ex *p, i64 iRowi
64e0: 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  d, const u8 *pDa
64f0: 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a  ta, int nData){.
6500: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
6510: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b  ITE_OK ) return;
6520: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74  ..  if( p->pWrit
6530: 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73  er==0 ){.    Fts
6540: 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
6550: 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
6560: 20 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70     fts5IndexPrep
6570: 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70  areStmt(p, &p->p
6580: 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f  Writer, sqlite3_
6590: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
65a0: 20 20 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f     "REPLACE INTO
65b0: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28   '%q'.'%q_data'(
65c0: 69 64 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45  id, block) VALUE
65d0: 53 28 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20  S(?,?)", .      
65e0: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
65f0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
6600: 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28  .    ));.    if(
6610: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
6620: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f  .  }..  sqlite3_
6630: 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57  bind_int64(p->pW
6640: 72 69 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64  riter, 1, iRowid
6650: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
6660: 64 5f 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65  d_blob(p->pWrite
6670: 72 2c 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61  r, 2, pData, nDa
6680: 74 61 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  ta, SQLITE_STATI
6690: 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  C);.  sqlite3_st
66a0: 65 70 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a  ep(p->pWriter);.
66b0: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
66c0: 33 5f 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74  3_reset(p->pWrit
66d0: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  er);.}../*.** Ex
66e0: 65 63 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77  ecute the follow
66f0: 69 6e 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20  ing SQL:.**.**  
6700: 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25     DELETE FROM %
6710: 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 20 42  _data WHERE id B
6720: 45 54 57 45 45 4e 20 24 69 46 69 72 73 74 20 41  ETWEEN $iFirst A
6730: 4e 44 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61  ND $iLast.*/.sta
6740: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6750: 61 44 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65  aDelete(Fts5Inde
6760: 78 20 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74  x *p, i64 iFirst
6770: 2c 20 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20  , i64 iLast){.  
6780: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6790: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
67a0: 20 20 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65    if( p->pDelete
67b0: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  r==0 ){.    int 
67c0: 72 63 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66  rc;.    Fts5Conf
67d0: 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
67e0: 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68  >pConfig;.    ch
67f0: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
6800: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6810: 20 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d      "DELETE FROM
6820: 20 27 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20   '%q'.'%q_data' 
6830: 57 48 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20  WHERE id>=? AND 
6840: 69 64 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20  id<=?", .       
6850: 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
6860: 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
6870: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a      );.    if( z
6880: 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
6890: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
68a0: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
68b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
68c0: 5f 70 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e  _prepare_v2(pCon
68d0: 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  fig->db, zSql, -
68e0: 31 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c  1, &p->pDeleter,
68f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6900: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
6910: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
6920: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6930: 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a      p->rc = rc;.
6940: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
6950: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
6960: 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d  e3_bind_int64(p-
6970: 3e 70 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46  >pDeleter, 1, iF
6980: 69 72 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  irst);.  sqlite3
6990: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
69a0: 44 65 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73  Deleter, 2, iLas
69b0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  t);.  sqlite3_st
69c0: 65 70 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  ep(p->pDeleter);
69d0: 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
69e0: 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c  e3_reset(p->pDel
69f0: 65 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  eter);.}../*.** 
6a00: 52 65 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72  Remove all recor
6a10: 64 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ds associated wi
6a20: 74 68 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69  th segment iSegi
6a30: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
6a40: 64 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65  d fts5DataRemove
6a50: 53 65 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65  Segment(Fts5Inde
6a60: 78 20 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64  x *p, int iSegid
6a70: 29 7b 0a 20 20 69 36 34 20 69 46 69 72 73 74 20  ){.  i64 iFirst 
6a80: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
6a90: 4f 57 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b  OWID(iSegid, 0);
6aa0: 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46  .  i64 iLast = F
6ab0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
6ac0: 44 28 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31  D(iSegid+1, 0)-1
6ad0: 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65  ;.  fts5DataDele
6ae0: 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c  te(p, iFirst, iL
6af0: 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ast);.  if( p->p
6b00: 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  IdxDeleter==0 ){
6b10: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
6b20: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
6b30: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
6b40: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6b50: 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74  p, &p->pIdxDelet
6b60: 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
6b70: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
6b80: 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27  DELETE FROM '%q'
6b90: 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
6ba0: 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20  segid=?",.      
6bb0: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
6bc0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
6bd0: 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69  .    ));.  }.  i
6be0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
6bf0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
6c00: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
6c10: 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  IdxDeleter, 1, i
6c20: 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Segid);.    sqli
6c30: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
6c40: 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d  Deleter);.    p-
6c50: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
6c60: 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74  set(p->pIdxDelet
6c70: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
6c80: 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
6c90: 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35  rence to an Fts5
6ca0: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
6cb0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
6cc0: 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c  earlier .** call
6cd0: 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75 72   to fts5Structur
6ce0: 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35 53  eRead() or fts5S
6cf0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
6d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6d10: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
6d20: 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63 74  lease(Fts5Struct
6d30: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
6d40: 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20   if( pStruct && 
6d50: 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e  0>=(--pStruct->n
6d60: 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  Ref) ){.    int 
6d70: 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
6d80: 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20  Struct->nRef==0 
6d90: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
6da0: 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  i<pStruct->nLeve
6db0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
6dc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
6dd0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  uct->aLevel[i].a
6de0: 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Seg);.    }.    
6df0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
6e00: 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ruct);.  }.}..st
6e10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
6e20: 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35 53  ructureRef(Fts5S
6e30: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
6e40: 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e  t){.  pStruct->n
6e50: 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ref++;.}../*.** 
6e60: 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  Deserialize and 
6e70: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
6e80: 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72 72  ture record curr
6e90: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
6ea0: 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f  serialized.** fo
6eb0: 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65 72  rm within buffer
6ec0: 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a   pData/nData..**
6ed0: 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75  .** The Fts5Stru
6ee0: 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61  cture.aLevel[] a
6ef0: 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75  nd each Fts5Stru
6f00: 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b  ctureLevel.aSeg[
6f10: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f  ] array.** are o
6f20: 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79  ver-allocated by
6f30: 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20   one slot. This 
6f40: 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63  allows the struc
6f50: 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a  ture contents.**
6f60: 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69   to be more easi
6f70: 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  ly edited..**.**
6f80: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
6f90: 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73  urs, *ppOut is s
6fa0: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61  et to NULL and a
6fb0: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
6fc0: 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ode.** returned.
6fd0: 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f   Otherwise, *ppO
6fe0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
6ff0: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62  nt to the new ob
7000: 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ject and.** SQLI
7010: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
7020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
7030: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
7040: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  e(.  const u8 *p
7050: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
7060: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
7070: 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c  ontaining serial
7080: 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20 2a  ized structure *
7090: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70b0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
70c0: 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20 62  uffer pData in b
70d0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
70e0: 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20  iCookie,        
70f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
7100: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
7110: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73  e value */.  Fts
7120: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f  5Structure **ppO
7130: 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ut           /* 
7140: 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65  OUT: Deserialize
7150: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  d object */.){. 
7160: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7170: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30  _OK;.  int i = 0
7180: 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20  ;.  int iLvl;.  
7190: 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a  int nLevel = 0;.
71a0: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
71b0: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   0;.  int nByte;
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
71e0: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
71f0: 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20  ate at pRet */. 
7200: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
7210: 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pRet = 0;       
7220: 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62   /* Structure ob
7230: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
7240: 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  /..  /* Grab the
7250: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
7260: 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20  .  if( piCookie 
7270: 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71  ) *piCookie = sq
7280: 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28 70  lite3Fts5Get32(p
7290: 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a  Data);.  i = 4;.
72a0: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74  .  /* Read the t
72b0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  otal number of l
72c0: 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e  evels and segmen
72d0: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ts from the star
72e0: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74  t of the.  ** st
72f0: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20  ructure record. 
7300: 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47   */.  i += fts5G
7310: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7320: 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20  a[i], nLevel);. 
7330: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7340: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7350: 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42   nSegment);.  nB
7360: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69  yte = (.      si
7370: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7380: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
7390: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
73a0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
73b0: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
73c0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
73d0: 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f   (nLevel-1)    /
73e0: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
73f0: 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20   */.  );.  pRet 
7400: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7410: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
7420: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
7430: 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74  te);..  if( pRet
7440: 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52   ){.    pRet->nR
7450: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74  ef = 1;.    pRet
7460: 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65  ->nLevel = nLeve
7470: 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65  l;.    pRet->nSe
7480: 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74  gment = nSegment
7490: 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
74a0: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
74b0: 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74  &pData[i], &pRet
74c0: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
74d0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
74e0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
74f0: 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b   && iLvl<nLevel;
7500: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
7510: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7520: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74  el *pLvl = &pRet
7530: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
7540: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c        int nTotal
7550: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
7560: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  ;..      i += ft
7570: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7580: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7590: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20  Merge);.      i 
75a0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
75b0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
75c0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  otal);.      ass
75d0: 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76  ert( nTotal>=pLv
75e0: 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20  l->nMerge );.   
75f0: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
7600: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7610: 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
7620: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
7630: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f  , .          nTo
7640: 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  tal * sizeof(Fts
7650: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7660: 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  t).      );..   
7670: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7680: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7690: 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f  pLvl->nSeg = nTo
76a0: 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  tal;.        for
76b0: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54  (iSeg=0; iSeg<nT
76c0: 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  otal; iSeg++){. 
76d0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
76e0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
76f0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
7700: 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
7710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
7720: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7730: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
7740: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
7750: 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20  noFirst);.      
7760: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
7770: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7780: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
7790: 53 65 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a  Seg].pgnoLast);.
77a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
77b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
77c0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
77d0: 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ase(pRet);.     
77e0: 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20     pRet = 0;.   
77f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
7800: 20 20 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b    *ppOut = pRet;
7810: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7820: 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ./*.**.*/.static
7830: 20 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74   void fts5Struct
7840: 75 72 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20  ureAddLevel(int 
7850: 2a 70 52 63 2c 20 46 74 73 35 53 74 72 75 63 74  *pRc, Fts5Struct
7860: 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b  ure **ppStruct){
7870: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7890: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
78a0: 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
78b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c  ;.    int nLevel
78c0: 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   = pStruct->nLev
78d0: 65 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  el;.    int nByt
78e0: 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69  e = (.        si
78f0: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7900: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
7910: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
7920: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7930: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7940: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
7950: 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20   (nLevel+1)  /* 
7960: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
7970: 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53  /.    );..    pS
7980: 74 72 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f  truct = sqlite3_
7990: 72 65 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c  realloc(pStruct,
79a0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
79b0: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
79c0: 20 20 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63    memset(&pStruc
79d0: 74 2d 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c  t->aLevel[nLevel
79e0: 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  ], 0, sizeof(Fts
79f0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29  5StructureLevel)
7a00: 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  );.      pStruct
7a10: 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20  ->nLevel++;.    
7a20: 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
7a30: 74 72 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65  truct;.    }else
7a40: 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
7a50: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
7a60: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7a70: 45 78 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76  Extend level iLv
7a80: 6c 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20  l so that there 
7a90: 69 73 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c  is room for at l
7aa0: 65 61 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65  east nExtra more
7ab0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f  .** segments..*/
7ac0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7ad0: 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
7ae0: 4c 65 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52  Level(.  int *pR
7af0: 63 2c 20 0a 20 20 46 74 73 35 53 74 72 75 63 74  c, .  Fts5Struct
7b00: 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20  ure *pStruct, . 
7b10: 20 69 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e   int iLvl, .  in
7b20: 74 20 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74  t nExtra, .  int
7b30: 20 62 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66   bInsert.){.  if
7b40: 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
7b50: 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72  K ){.    Fts5Str
7b60: 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
7b70: 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
7b80: 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
7b90: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7ba0: 6d 65 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20  ment *aNew;.    
7bb0: 69 6e 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20  int nByte;..    
7bc0: 6e 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nByte = (pLvl->n
7bd0: 53 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20  Seg + nExtra) * 
7be0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7bf0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
7c00: 20 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    aNew = sqlite3
7c10: 5f 72 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61  _realloc(pLvl->a
7c20: 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  Seg, nByte);.   
7c30: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
7c40: 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d     if( bInsert==
7c50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  0 ){.        mem
7c60: 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e  set(&aNew[pLvl->
7c70: 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nSeg], 0, sizeof
7c80: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7c90: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
7ca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7cb0: 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65         int nMove
7cc0: 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20   = pLvl->nSeg * 
7cd0: 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
7ce0: 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
7cf0: 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61        memmove(&a
7d00: 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65  New[nExtra], aNe
7d10: 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20  w, nMove);.     
7d20: 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20     memset(aNew, 
7d30: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  0, sizeof(Fts5St
7d40: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20  ructureSegment) 
7d50: 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20  * nExtra);.     
7d60: 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61   }.      pLvl->a
7d70: 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20  Seg = aNew;.    
7d80: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7d90: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7da0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7db0: 2a 0a 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72  *.** Read, deser
7dc0: 69 61 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72  ialize and retur
7dd0: 6e 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  n the structure 
7de0: 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  record..**.** Th
7df0: 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e  e Fts5Structure.
7e00: 61 4c 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63  aLevel[] and eac
7e10: 68 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  h Fts5StructureL
7e20: 65 76 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61  evel.aSeg[] arra
7e30: 79 0a 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c  y.** are over-al
7e40: 6c 6f 63 61 74 65 64 20 61 73 20 64 65 73 63 72  located as descr
7e50: 69 62 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f  ibed for functio
7e60: 6e 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  n fts5StructureD
7e70: 65 63 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76  ecode() .** abov
7e80: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  e..**.** If an e
7e90: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c  rror occurs, NUL
7ea0: 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  L is returned an
7eb0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
7ec0: 6c 65 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46  left in the.** F
7ed0: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e  ts5Index handle.
7ee0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
7ef0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
7f00: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
7f10: 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  tion.** is calle
7f20: 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70  d, it is a no-op
7f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35  ..*/.static Fts5
7f40: 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35 53  Structure *fts5S
7f50: 74 72 75 63 74 75 72 65 52 65 61 64 28 46 74 73  tructureRead(Fts
7f60: 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
7f70: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
7f80: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
7f90: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
7fa0: 2a 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20  *pRet = 0;      
7fb0: 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72    /* Object to r
7fc0: 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  eturn */.  int i
7fd0: 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20  Cookie;         
7fe0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
7ff0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b  nfiguration cook
8000: 69 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  ie */.  Fts5Data
8010: 20 2a 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74   *pData;..  pDat
8020: 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
8030: 28 70 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  (p, FTS5_STRUCTU
8040: 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28  RE_ROWID);.  if(
8050: 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20   p->rc ) return 
8060: 30 3b 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f  0;.  /* TODO: Do
8070: 20 77 65 20 6e 65 65 64 20 74 68 69 73 20 69 66   we need this if
8080: 20 74 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20   the leaf-index 
8090: 69 73 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f  is appended? Pro
80a0: 62 61 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d 65  bably... */.  me
80b0: 6d 73 65 74 28 26 70 44 61 74 61 2d 3e 70 5b 70  mset(&pData->p[p
80c0: 44 61 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54  Data->nn], 0, FT
80d0: 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
80e0: 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35  ;.  p->rc = fts5
80f0: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
8100: 70 44 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d  pData->p, pData-
8110: 3e 6e 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26  >nn, &iCookie, &
8120: 70 52 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pRet);.  if( p->
8130: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
8140: 20 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69   pConfig->iCooki
8150: 65 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20  e!=iCookie ){.  
8160: 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
8170: 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28  3Fts5ConfigLoad(
8180: 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65  pConfig, iCookie
8190: 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61  );.  }..  fts5Da
81a0: 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
81b0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  ;.  if( p->rc!=S
81c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
81d0: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
81e0: 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20  ease(pRet);.    
81f0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  pRet = 0;.  }.  
8200: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
8210: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
8220: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
8230: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64   segments in ind
8240: 65 78 20 73 74 72 75 63 74 75 72 65 20 70 53 74  ex structure pSt
8250: 72 75 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75  ruct. This.** fu
8260: 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65  nction is only e
8270: 76 65 72 20 75 73 65 64 20 61 73 20 70 61 72 74  ver used as part
8280: 20 6f 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e   of assert() con
8290: 64 69 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64  ditions..*/.#ifd
82a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
82b0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
82c0: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
82d0: 6d 65 6e 74 73 28 46 74 73 35 53 74 72 75 63 74  ments(Fts5Struct
82e0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
82f0: 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20   int nSegment = 
8300: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
8310: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
8320: 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a   of segments */.
8330: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
8340: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
8370: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
8380: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  vels */.    for(
8390: 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
83a0: 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
83b0: 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65  vl++){.      nSe
83c0: 67 6d 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74  gment += pStruct
83d0: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
83e0: 53 65 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Seg;.    }.  }..
83f0: 20 20 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e    return nSegmen
8400: 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65  t;.}.#endif..#de
8410: 66 69 6e 65 20 66 74 73 35 42 75 66 66 65 72 53  fine fts5BufferS
8420: 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
8430: 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  uf, pBlob, nBlob
8440: 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73 73 65  ) {     \.  asse
8450: 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61  rt( (pBuf)->nSpa
8460: 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e  ce>=((pBuf)->n+n
8470: 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20  Blob) );        
8480: 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28       \.  memcpy(
8490: 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66  &(pBuf)->p[(pBuf
84a0: 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42  )->n], pBlob, nB
84b0: 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20 20 20  lob);           
84c0: 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20    \.  (pBuf)->n 
84d0: 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20  += nBlob;       
84e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
8500: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
8510: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
8520: 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 56 61  Varint(pBuf, iVa
8530: 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  l) {            
8540: 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
8550: 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
8560: 50 75 74 56 61 72 69 6e 74 28 26 28 70 42 75 66  PutVarint(&(pBuf
8570: 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c  )->p[(pBuf)->n],
8580: 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61   (iVal));  \.  a
8590: 73 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e  ssert( (pBuf)->n
85a0: 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e  Space>=(pBuf)->n
85b0: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
85d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69  .../*.** Seriali
85e0: 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ze and store the
85f0: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
8600: 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ord..**.** If an
8610: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c   error occurs, l
8620: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  eave an error co
8630: 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e  de in the Fts5In
8640: 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  dex object. If a
8650: 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61  n.** error has a
8660: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
8670: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
8680: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
8690: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
86a0: 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74 73  ructureWrite(Fts
86b0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
86c0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
86d0: 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  t){.  if( p->rc=
86e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
86f0: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
8700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8710: 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65 72  /* Buffer to ser
8720: 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e  ialize record in
8730: 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c  to */.    int iL
8740: 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  vl;             
8750: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
8760: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
8770: 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20  gh levels */.   
8780: 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20   int iCookie;   
8790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
87a0: 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74  * Cookie value t
87b0: 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20  o store */..    
87c0: 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
87d0: 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53  >nSegment==fts5S
87e0: 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67  tructureCountSeg
87f0: 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29  ments(pStruct) )
8800: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75  ;.    memset(&bu
8810: 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
8820: 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
8830: 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63 75  /* Append the cu
8840: 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74  rrent configurat
8850: 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20  ion cookie */.  
8860: 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70    iCookie = p->p
8870: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b  Config->iCookie;
8880: 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65  .    if( iCookie
8890: 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30  <0 ) iCookie = 0
88a0: 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71  ;..    if( 0==sq
88b0: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
88c0: 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  ize(&p->rc, &buf
88d0: 2c 20 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20 20  , 4+9+9+9) ){.  
88e0: 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
88f0: 75 74 33 32 28 62 75 66 2e 70 2c 20 69 43 6f 6f  ut32(buf.p, iCoo
8900: 6b 69 65 29 3b 0a 20 20 20 20 20 20 62 75 66 2e  kie);.      buf.
8910: 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20 66 74 73  n = 4;.      fts
8920: 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
8930: 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53  dVarint(&buf, pS
8940: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a  truct->nLevel);.
8950: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
8960: 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
8970: 28 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e  (&buf, pStruct->
8980: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  nSegment);.     
8990: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
89a0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
89b0: 2c 20 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e  , (i64)pStruct->
89c0: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
89d0: 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69      }..    for(i
89e0: 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72  Lvl=0; iLvl<pStr
89f0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76  uct->nLevel; iLv
8a00: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  l++){.      int 
8a10: 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  iSeg;           
8a20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8a30: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8a40: 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
8a50: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
8a60: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
8a70: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
8a80: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
8a90: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8aa0: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8ab0: 62 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  buf, pLvl->nMerg
8ac0: 65 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75  e);.      fts5Bu
8ad0: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8ae0: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8af0: 4c 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20  Lvl->nSeg);.    
8b00: 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e    assert( pLvl->
8b10: 6e 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53  nMerge<=pLvl->nS
8b20: 65 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72  eg );..      for
8b30: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
8b40: 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
8b50: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
8b60: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
8b70: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
8b80: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
8b90: 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  .iSegid);.      
8ba0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8bb0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8bc0: 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65   &buf, pLvl->aSe
8bd0: 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73  g[iSeg].pgnoFirs
8be0: 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
8bf0: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8c00: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
8c10: 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67   pLvl->aSeg[iSeg
8c20: 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20  ].pgnoLast);.   
8c30: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
8c40: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c  fts5DataWrite(p,
8c50: 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
8c60: 52 4f 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75  ROWID, buf.p, bu
8c70: 66 2e 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75  f.n);.    fts5Bu
8c80: 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
8c90: 20 20 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61    }.}..#if 0.sta
8ca0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
8cb0: 75 67 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a  ugStructure(int*
8cc0: 2c 46 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73  ,Fts5Buffer*,Fts
8cd0: 35 53 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74  5Structure*);.st
8ce0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 72  atic void fts5Pr
8cf0: 69 6e 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e  intStructure(con
8d00: 73 74 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f  st char *zCaptio
8d10: 6e 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  n, Fts5Structure
8d20: 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
8d30: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
8d40: 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
8d50: 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
8d60: 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66  f, 0, sizeof(buf
8d70: 29 29 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53  ));.  fts5DebugS
8d80: 74 72 75 63 74 75 72 65 28 26 72 63 2c 20 26 62  tructure(&rc, &b
8d90: 75 66 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  uf, pStruct);.  
8da0: 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20  fprintf(stdout, 
8db0: 22 25 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70  "%s: %s\n", zCap
8dc0: 74 69 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20  tion, buf.p);.  
8dd0: 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
8de0: 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
8df0: 28 26 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a  (&buf);.}.#else.
8e00: 23 20 64 65 66 69 6e 65 20 66 74 73 35 50 72 69  # define fts5Pri
8e10: 6e 74 53 74 72 75 63 74 75 72 65 28 78 2c 79 29  ntStructure(x,y)
8e20: 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20  .#endif..static 
8e30: 69 6e 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53  int fts5SegmentS
8e40: 69 7a 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ize(Fts5Structur
8e50: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b  eSegment *pSeg){
8e60: 0a 20 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53  .  return 1 + pS
8e70: 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70  eg->pgnoLast - p
8e80: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a  Seg->pgnoFirst;.
8e90: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
8ea0: 61 20 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20  a copy of index 
8eb0: 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
8ec0: 74 2e 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f  t. Except, promo
8ed0: 74 65 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73  te as many .** s
8ee0: 65 67 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69  egments as possi
8ef0: 62 6c 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72  ble to level iPr
8f00: 6f 6d 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d  omote. If an OOM
8f10: 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
8f20: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
8f30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
8f40: 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
8f50: 74 65 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65  teTo(.  Fts5Inde
8f60: 78 20 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f  x *p,.  int iPro
8f70: 6d 6f 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72  mote,.  int szPr
8f80: 6f 6d 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72  omote,.  Fts5Str
8f90: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a  ucture *pStruct.
8fa0: 29 7b 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b  ){.  int il, is;
8fb0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
8fc0: 4c 65 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70  Level *pOut = &p
8fd0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8fe0: 50 72 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28  Promote];..  if(
8ff0: 20 70 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30   pOut->nMerge==0
9000: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69   ){.    for(il=i
9010: 50 72 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53  Promote+1; il<pS
9020: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
9030: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35  l++){.      Fts5
9040: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
9050: 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d  pLvl = &pStruct-
9060: 3e 61 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20  >aLevel[il];.   
9070: 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
9080: 72 67 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  rge ) return;.  
9090: 20 20 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d      for(is=pLvl-
90a0: 3e 6e 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20  >nSeg-1; is>=0; 
90b0: 69 73 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69  is--){.        i
90c0: 6e 74 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d  nt sz = fts5Segm
90d0: 65 6e 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61  entSize(&pLvl->a
90e0: 53 65 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20  Seg[is]);.      
90f0: 20 20 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f    if( sz>szPromo
9100: 74 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  te ) return;.   
9110: 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
9120: 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
9130: 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69  ->rc, pStruct, i
9140: 50 72 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a  Promote, 1, 1);.
9150: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72          if( p->r
9160: 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  c ) return;.    
9170: 20 20 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d      memcpy(pOut-
9180: 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53  >aSeg, &pLvl->aS
9190: 65 67 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46  eg[is], sizeof(F
91a0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
91b0: 65 6e 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70  ent));.        p
91c0: 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20  Out->nSeg++;.   
91d0: 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d       pLvl->nSeg-
91e0: 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  -;.      }.    }
91f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
9200: 6e 65 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20  new segment has 
9210: 6a 75 73 74 20 62 65 65 6e 20 77 72 69 74 74 65  just been writte
9220: 6e 20 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20  n to level iLvl 
9230: 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  of index structu
9240: 72 65 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54  re.** pStruct. T
9250: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74  his function det
9260: 65 72 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73  ermines if any s
9270: 65 67 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62  egments should b
9280: 65 20 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73  e promoted.** as
9290: 20 61 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65   a result. Segme
92a0: 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64  nts are promoted
92b0: 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
92c0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66  s:.**.**   a) If
92d0: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73   the segment jus
92e0: 74 20 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61  t written is sma
92f0: 6c 6c 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72  ller than one or
9300: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a   more segments.*
9310: 2a 20 20 20 20 20 20 77 69 74 68 69 6e 20 74 68  *      within th
9320: 65 20 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c  e previous popul
9330: 61 74 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69  ated level, it i
9340: 73 20 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68  s promoted to th
9350: 65 20 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20  e previous.**   
9360: 20 20 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76     populated lev
9370: 65 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49  el..**.**   b) I
9380: 66 20 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75  f the segment ju
9390: 73 74 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61  st written is la
93a0: 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65  rger than the ne
93b0: 77 65 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a  west segment on.
93c0: 2a 2a 20 20 20 20 20 20 74 68 65 20 6e 65 78 74  **      the next
93d0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
93e0: 2c 20 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d  , then that segm
93f0: 65 6e 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68  ent, and any oth
9400: 65 72 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20  er adjacent.**  
9410: 20 20 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61      segments tha
9420: 74 20 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c  t are also small
9430: 65 72 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20  er than the one 
9440: 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72  just written, ar
9450: 65 20 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f  e .**      promo
9460: 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f  ted. .**.** If o
9470: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
9480: 6e 74 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64  nts are promoted
9490: 2c 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  , the structure 
94a0: 6f 62 6a 65 63 74 20 69 73 20 75 70 64 61 74 65  object is update
94b0: 64 0a 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20  d.** to reflect 
94c0: 74 68 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  this..*/.static 
94d0: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
94e0: 72 65 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73  rePromote(.  Fts
94f0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
9500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9510: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
9520: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76  ect */.  int iLv
9530: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
9540: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
9550: 78 20 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64  x level just upd
9560: 61 74 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74  ated */.  Fts5St
9570: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9580: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
9590: 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
95a0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
95b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
95c0: 20 69 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69   int iTst;.    i
95d0: 6e 74 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31  nt iPromote = -1
95e0: 3b 0a 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d  ;.    int szProm
95f0: 6f 74 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ote = 0;        
9600: 20 20 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61      /* Promote a
9610: 6e 79 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a  nything this siz
9620: 65 20 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a  e or smaller */.
9630: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
9640: 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
9650: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73    /* Segment jus
9660: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
9670: 20 69 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20   int szSeg;     
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9690: 2a 20 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e  * Size of segmen
96a0: 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  t just written *
96b0: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d  /.    int nSeg =
96c0: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
96d0: 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20  [iLvl].nSeg;..  
96e0: 20 20 69 66 28 20 6e 53 65 67 3d 3d 30 20 29 20    if( nSeg==0 ) 
96f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 53 65 67  return;.    pSeg
9700: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9710: 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70  vel[iLvl].aSeg[p
9720: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9730: 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20  Lvl].nSeg-1];.  
9740: 20 20 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70    szSeg = (1 + p
9750: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20  Seg->pgnoLast - 
9760: 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29  pSeg->pgnoFirst)
9770: 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
9780: 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61  for condition (a
9790: 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73  ) */.    for(iTs
97a0: 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d  t=iLvl-1; iTst>=
97b0: 30 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  0 && pStruct->aL
97c0: 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d  evel[iTst].nSeg=
97d0: 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20  =0; iTst--);.   
97e0: 20 69 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a   if( iTst>=0 ){.
97f0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9800: 20 20 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30     int szMax = 0
9810: 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
9820: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74  ctureLevel *pTst
9830: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
9840: 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20  vel[iTst];.     
9850: 20 61 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e   assert( pTst->n
9860: 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  Merge==0 );.    
9870: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73    for(i=0; i<pTs
9880: 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20  t->nSeg; i++){. 
9890: 20 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20         int sz = 
98a0: 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67  pTst->aSeg[i].pg
98b0: 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61  noLast - pTst->a
98c0: 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74  Seg[i].pgnoFirst
98d0: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66   + 1;.        if
98e0: 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d  ( sz>szMax ) szM
98f0: 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d  ax = sz;.      }
9900: 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78  .      if( szMax
9910: 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20  >=szSeg ){.     
9920: 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20     /* Condition 
9930: 28 61 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f  (a) is true. Pro
9940: 6d 6f 74 65 20 74 68 65 20 6e 65 77 65 73 74 20  mote the newest 
9950: 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c  segment on level
9960: 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76   .        ** iLv
9970: 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e  l to level iTst.
9980: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72    */.        iPr
9990: 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20  omote = iTst;.  
99a0: 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20        szPromote 
99b0: 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d  = szMax;.      }
99c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
99d0: 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  f condition (a) 
99e0: 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75  is not met, assu
99f0: 6d 65 20 28 62 29 20 69 73 20 74 72 75 65 2e 20  me (b) is true. 
9a00: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9a10: 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61  To().    ** is a
9a20: 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20   no-op if it is 
9a30: 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  not.  */.    if(
9a40: 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20   iPromote<0 ){. 
9a50: 20 20 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20       iPromote = 
9a60: 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72  iLvl;.      szPr
9a70: 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20  omote = szSeg;. 
9a80: 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
9a90: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
9aa0: 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50  p, iPromote, szP
9ab0: 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29  romote, pStruct)
9ac0: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
9ad0: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
9ae0: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
9af0: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
9b00: 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20  . If the end of 
9b10: 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  the .** doclist-
9b20: 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 72 65  index page is re
9b30: 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f  ached, return no
9b40: 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n-zero..*/.stati
9b50: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c  c int fts5DlidxL
9b60: 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78  vlNext(Fts5Dlidx
9b70: 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74  Lvl *pLvl){.  Ft
9b80: 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20  s5Data *pData = 
9b90: 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20  pLvl->pData;..  
9ba0: 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d  if( pLvl->iOff==
9bb0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
9bc0: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29   pLvl->bEof==0 )
9bd0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
9be0: 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e   = 1;.    pLvl->
9bf0: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
9c00: 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d 3e  arint32(&pData->
9c10: 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61  p[1], pLvl->iLea
9c20: 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c  fPgno);.    pLvl
9c30: 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65  ->iOff += fts5Ge
9c40: 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e  tVarint(&pData->
9c50: 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28  p[pLvl->iOff], (
9c60: 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77  u64*)&pLvl->iRow
9c70: 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  id);.    pLvl->i
9c80: 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d  FirstOff = pLvl-
9c90: 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  >iOff;.  }else{.
9ca0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
9cb0: 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d    for(iOff=pLvl-
9cc0: 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74  >iOff; iOff<pDat
9cd0: 61 2d 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a  a->nn; iOff++){.
9ce0: 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 2d        if( pData-
9cf0: 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b  >p[iOff] ) break
9d00: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
9d10: 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ( iOff<pData->nn
9d20: 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56   ){.      i64 iV
9d30: 61 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e  al;.      pLvl->
9d40: 69 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f  iLeafPgno += (iO
9d50: 66 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29  ff - pLvl->iOff)
9d60: 20 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66   + 1;.      iOff
9d70: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
9d80: 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  t(&pData->p[iOff
9d90: 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b  ], (u64*)&iVal);
9da0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f  .      pLvl->iRo
9db0: 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20  wid += iVal;.   
9dc0: 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20     pLvl->iOff = 
9dd0: 69 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  iOff;.    }else{
9de0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  .      pLvl->bEo
9df0: 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  f = 1;.    }.  }
9e00: 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d  ..  return pLvl-
9e10: 3e 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >bEof;.}../*.** 
9e20: 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
9e30: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
9e40: 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
9e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9e60: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
9e70: 74 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  tR(Fts5Index *p,
9e80: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
9e90: 70 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29  pIter, int iLvl)
9ea0: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  {.  Fts5DlidxLvl
9eb0: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
9ec0: 3e 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20  >aLvl[iLvl];..  
9ed0: 61 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74  assert( iLvl<pIt
9ee0: 65 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66  er->nLvl );.  if
9ef0: 28 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ( fts5DlidxLvlNe
9f00: 78 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20  xt(pLvl) ){.    
9f10: 69 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70  if( (iLvl+1) < p
9f20: 49 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20  Iter->nLvl ){.  
9f30: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
9f40: 72 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c  rNextR(p, pIter,
9f50: 20 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20   iLvl+1);.      
9f60: 69 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66  if( pLvl[1].bEof
9f70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ==0 ){.        f
9f80: 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
9f90: 4c 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  Lvl->pData);.   
9fa0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
9fb0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
9fc0: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
9fd0: 20 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20      pLvl->pData 
9fe0: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
9ff0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  , .            F
a000: 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28  TS5_DLIDX_ROWID(
a010: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  pIter->iSegid, i
a020: 4c 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65  Lvl, pLvl[1].iLe
a030: 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20  afPgno).        
a040: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
a050: 4c 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74 73  Lvl->pData ) fts
a060: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
a070: 76 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  vl);.      }.   
a080: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
a090: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
a0a0: 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69  bEof;.}.static i
a0b0: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
a0c0: 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a  Next(Fts5Index *
a0d0: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a0e0: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
a0f0: 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  rn fts5DlidxIter
a100: 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20  NextR(p, pIter, 
a110: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  0);.}../*.** The
a120: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
a130: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
a140: 67 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66  gument has the f
a150: 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20  ollowing fields 
a160: 73 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77  set.** as follow
a170: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
a180: 20 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73   sets up the res
a190: 74 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f  t of the iterato
a1a0: 72 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  r so that it.** 
a1b0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
a1c0: 72 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65  rst rowid in the
a1d0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a   doclist-index..
a1e0: 2a 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a  **.**   pData:.*
a1f0: 2a 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74 6f  *     pointer to
a200: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
a210: 65 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68  ecord, .**.** Wh
a220: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
a230: 20 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72   is called pIter
a240: 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74  ->iLeafPgno is t
a250: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
a260: 68 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73  he.** doclist is
a270: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
a280: 20 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72   (the one featur
a290: 69 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a  ing the term)..*
a2a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
a2b0: 35 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28  5DlidxIterFirst(
a2c0: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
a2d0: 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Iter){.  int i;.
a2e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
a2f0: 65 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a  er->nLvl; i++){.
a300: 20 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76 6c      fts5DlidxLvl
a310: 4e 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c 76  Next(&pIter->aLv
a320: 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  l[i]);.  }.  ret
a330: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
a340: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61  0].bEof;.}...sta
a350: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a360: 78 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64  xIterEof(Fts5Ind
a370: 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78  ex *p, Fts5Dlidx
a380: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
a390: 72 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51  return p->rc!=SQ
a3a0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
a3b0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a  ->aLvl[0].bEof;.
a3c0: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
a3d0: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
a3e0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
a3f0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
a400: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  ter){.  int i;..
a410: 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63    /* Advance eac
a420: 68 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20 6c  h level to the l
a430: 61 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ast entry on the
a440: 20 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20 20   last page */.  
a450: 66 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76  for(i=pIter->nLv
a460: 6c 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  l-1; p->rc==SQLI
a470: 54 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69  TE_OK && i>=0; i
a480: 2d 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  --){.    Fts5Dli
a490: 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  dxLvl *pLvl = &p
a4a0: 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20  Iter->aLvl[i];. 
a4b0: 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c     while( fts5Dl
a4c0: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
a4d0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  ==0 );.    pLvl-
a4e0: 3e 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20  >bEof = 0;..    
a4f0: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
a500: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70   Fts5DlidxLvl *p
a510: 43 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31  Child = &pLvl[-1
a520: 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  ];.      fts5Dat
a530: 61 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64 2d  aRelease(pChild-
a540: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 6d  >pData);.      m
a550: 65 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30 2c  emset(pChild, 0,
a560: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
a570: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 43  xLvl));.      pC
a580: 68 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66 74  hild->pData = ft
a590: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
a5a0: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
a5b0: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
a5c0: 3e 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c  >iSegid, i-1, pL
a5d0: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  vl->iLeafPgno). 
a5e0: 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
a5f0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  }.}../*.** Move 
a600: 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
a610: 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
a620: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  argument to the 
a630: 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a  previous entry..
a640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
a650: 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 46  s5DlidxLvlPrev(F
a660: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a670: 6c 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  l){.  int iOff =
a680: 20 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20   pLvl->iOff;..  
a690: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45  assert( pLvl->bE
a6a0: 6f 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69  of==0 );.  if( i
a6b0: 4f 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73  Off<=pLvl->iFirs
a6c0: 74 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c  tOff ){.    pLvl
a6d0: 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65  ->bEof = 1;.  }e
a6e0: 6c 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d  lse{.    u8 *a =
a6f0: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b   pLvl->pData->p;
a700: 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20  .    i64 iVal;. 
a710: 20 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20     int iLimit;. 
a720: 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69     int ii;.    i
a730: 6e 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20  nt nZero = 0;.. 
a740: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20     /* Currently 
a750: 69 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74  iOff points to t
a760: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
a770: 20 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20   a varint. This 
a780: 62 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65  block .    ** de
a790: 63 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e  crements iOff un
a7a0: 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
a7b0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
a7c0: 6f 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  of the previous 
a7d0: 0a 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20  .    ** varint. 
a7e0: 54 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20  Taking care not 
a7f0: 74 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f  to read any memo
a800: 72 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61  ry locations tha
a810: 74 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62  t occur.    ** b
a820: 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  efore the buffer
a830: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a   in memory.  */.
a840: 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f      iLimit = (iO
a850: 66 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20  ff>9 ? iOff-9 : 
a860: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66  0);.    for(iOff
a870: 2d 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b  --; iOff>iLimit;
a880: 20 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20   iOff--){.      
a890: 69 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26  if( (a[iOff-1] &
a8a0: 20 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61   0x80)==0 ) brea
a8b0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  k;.    }..    ft
a8c0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
a8d0: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61  Off], (u64*)&iVa
a8e0: 6c 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52  l);.    pLvl->iR
a8f0: 6f 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20  owid -= iVal;.  
a900: 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e    pLvl->iLeafPgn
a910: 6f 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69  o--;..    /* Ski
a920: 70 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 74  p backwards past
a930: 20 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e 74   any 0x00 varint
a940: 73 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  s. */.    for(ii
a950: 3d 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76  =iOff-1; ii>=pLv
a960: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20  l->iFirstOff && 
a970: 61 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d  a[ii]==0x00; ii-
a980: 2d 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b  -){.      nZero+
a990: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
a9a0: 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73   ii>=pLvl->iFirs
a9b0: 74 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20 26  tOff && (a[ii] &
a9c0: 20 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20 20   0x80) ){.      
a9d0: 2f 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d 65  /* The byte imme
a9e0: 64 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74  diately before t
a9f0: 68 65 20 6c 61 73 74 20 30 78 30 30 20 62 79 74  he last 0x00 byt
aa00: 65 20 68 61 73 20 74 68 65 20 30 78 38 30 20 62  e has the 0x80 b
aa10: 69 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e  it.      ** set.
aa20: 20 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78 30   So the last 0x0
aa30: 30 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72 69  0 is only a vari
aa40: 6e 74 20 30 20 69 66 20 74 68 65 72 65 20 61 72  nt 0 if there ar
aa50: 65 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20 20  e 8 more 0x80.  
aa60: 20 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65 66      ** bytes bef
aa70: 6f 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20  ore a[ii]. */.  
aa80: 20 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20      int bZero = 
aa90: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
aaa0: 2f 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74 20  /* True if last 
aab0: 30 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20  0x00 counts */. 
aac0: 20 20 20 20 20 69 66 28 20 28 69 69 2d 38 29 3e       if( (ii-8)>
aad0: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
aae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
aaf0: 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  j;.        for(j
ab00: 3d 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69  =1; j<=8 && (a[i
ab10: 69 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b  i-j] & 0x80); j+
ab20: 2b 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65 72  +);.        bZer
ab30: 6f 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20  o = (j>8);.     
ab40: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a 65   }.      if( bZe
ab50: 72 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b  ro==0 ) nZero--;
ab60: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d  .    }.    pLvl-
ab70: 3e 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a  >iLeafPgno -= nZ
ab80: 65 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69  ero;.    pLvl->i
ab90: 4f 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65  Off = iOff - nZe
aba0: 72 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  ro;.  }..  retur
abb0: 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a  n pLvl->bEof;.}.
abc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
abd0: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 46  DlidxIterPrevR(F
abe0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
abf0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
ac00: 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20  r, int iLvl){.  
ac10: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
ac20: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
ac30: 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65  l[iLvl];..  asse
ac40: 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e  rt( iLvl<pIter->
ac50: 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74  nLvl );.  if( ft
ac60: 73 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 70  s5DlidxLvlPrev(p
ac70: 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Lvl) ){.    if( 
ac80: 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72  (iLvl+1) < pIter
ac90: 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20  ->nLvl ){.      
aca0: 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
acb0: 76 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76  vR(p, pIter, iLv
acc0: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
acd0: 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20  pLvl[1].bEof==0 
ace0: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
acf0: 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
ad00: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
ad10: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
ad20: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
ad30: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  xLvl));.        
ad40: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
ad50: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
ad60: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
ad70: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
ad80: 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c  r->iSegid, iLvl,
ad90: 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67   pLvl[1].iLeafPg
ada0: 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
adb0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
adc0: 3e 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  >pData ){.      
add0: 20 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44      while( fts5D
ade0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
adf0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )==0 );.        
ae00: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30    pLvl->bEof = 0
ae10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ae20: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
ae30: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
ae40: 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73  Lvl[0].bEof;.}.s
ae50: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
ae60: 69 64 78 49 74 65 72 50 72 65 76 28 46 74 73 35  idxIterPrev(Fts5
ae70: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
ae80: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
ae90: 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c  .  return fts5Dl
aea0: 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20  idxIterPrevR(p, 
aeb0: 70 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a  pIter, 0);.}../*
aec0: 0a 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69  .** Free a docli
aed0: 73 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f  st-index iterato
aee0: 72 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74  r object allocat
aef0: 65 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49  ed by fts5DlidxI
af00: 74 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74  terInit()..*/.st
af10: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
af20: 69 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35  idxIterFree(Fts5
af30: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
af40: 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
af50: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
af60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
af70: 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nLvl; i++){. 
af80: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
af90: 65 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c  ease(pIter->aLvl
afa0: 5b 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20 20  [i].pData);.    
afb0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
afc0: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  ee(pIter);.  }.}
afd0: 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c 69  ..static Fts5Dli
afe0: 64 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69 64  dxIter *fts5Dlid
aff0: 78 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73  xIterInit(.  Fts
b000: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
b010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b020: 46 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20  Fts5 Backend to 
b030: 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
b040: 2f 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20  /.  int bRev,   
b050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b060: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
b070: 4f 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a  ORDER BY ASC */.
b080: 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
b0b0: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
b0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0d0: 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67       /* Leaf pag
b0e0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64  e number to load
b0f0: 20 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b   dlidx for */.){
b100: 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
b110: 20 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69   *pIter = 0;.  i
b120: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e  nt i;.  int bDon
b130: 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
b140: 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
b150: 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b  _OK && bDone==0;
b160: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
b170: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74  Byte = sizeof(Ft
b180: 73 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69  s5DlidxIter) + i
b190: 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   * sizeof(Fts5Dl
b1a0: 69 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73  idxLvl);.    Fts
b1b0: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77  5DlidxIter *pNew
b1c0: 3b 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46  ;..    pNew = (F
b1d0: 74 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71  ts5DlidxIter*)sq
b1e0: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49  lite3_realloc(pI
b1f0: 74 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ter, nByte);.   
b200: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
b210: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51        p->rc = SQ
b220: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
b230: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34  }else{.      i64
b240: 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44   iRowid = FTS5_D
b250: 4c 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69  LIDX_ROWID(iSegi
b260: 64 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a  d, i, iLeafPg);.
b270: 20 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c        Fts5DlidxL
b280: 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77  vl *pLvl = &pNew
b290: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20  ->aLvl[i];.     
b2a0: 20 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20   pIter = pNew;. 
b2b0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c       memset(pLvl
b2c0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
b2d0: 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20  DlidxLvl));.    
b2e0: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
b2f0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
b300: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69  iRowid);.      i
b310: 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26  f( pLvl->pData &
b320: 26 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e  & (pLvl->pData->
b330: 70 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d  p[0] & 0x0001)==
b340: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f  0 ){.        bDo
b350: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
b360: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76        pIter->nLv
b370: 6c 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  l = i+1;.    }. 
b380: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
b390: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b3a0: 20 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20    pIter->iSegid 
b3b0: 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66  = iSegid;.    if
b3c0: 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
b3d0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
b3e0: 46 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20  First(pIter);.  
b3f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66    }else{.      f
b400: 74 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74  ts5DlidxIterLast
b410: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
b420: 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  }.  }..  if( p->
b430: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b440: 0a 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74  .    fts5DlidxIt
b450: 65 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20  erFree(pIter);. 
b460: 20 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20     pIter = 0;.  
b470: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
b480: 72 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34  r;.}..static i64
b490: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
b4a0: 77 69 64 28 46 74 73 35 44 6c 69 64 78 49 74 65  wid(Fts5DlidxIte
b4b0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74  r *pIter){.  ret
b4c0: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
b4d0: 30 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61  0].iRowid;.}.sta
b4e0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
b4f0: 78 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c  xIterPgno(Fts5Dl
b500: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
b510: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d  .  return pIter-
b520: 3e 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67  >aLvl[0].iLeafPg
b530: 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61  no;.}../*.** Loa
b540: 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20  d the next leaf 
b550: 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65  page into the se
b560: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a  gment iterator..
b570: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
b580: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
b590: 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
b5a0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
b5b0: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
b5c0: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
b5d0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
b5e0: 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  Iter            
b5f0: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
b600: 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74   advance to next
b610: 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74   page */.){.  Ft
b620: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20  s5Data *pLeaf;. 
b630: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
b640: 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49  gment *pSeg = pI
b650: 74 65 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73  ter->pSeg;.  fts
b660: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
b670: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49  er->pLeaf);.  pI
b680: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b  ter->iLeafPgno++
b690: 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ;.  if( pIter->p
b6a0: 4e 65 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20  NextLeaf ){.    
b6b0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70  pIter->pLeaf = p
b6c0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b  Iter->pNextLeaf;
b6d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78  .    pIter->pNex
b6e0: 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c  tLeaf = 0;.  }el
b6f0: 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c  se if( pIter->iL
b700: 65 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70  eafPgno<=pSeg->p
b710: 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70  gnoLast ){.    p
b720: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74  Iter->pLeaf = ft
b730: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
b740: 20 20 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d         FTS5_SEGM
b750: 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
b760: 69 53 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69  iSegid, pIter->i
b770: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b  LeafPgno).    );
b780: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
b790: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
b7a0: 20 20 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49    }.  pLeaf = pI
b7b0: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69  ter->pLeaf;..  i
b7c0: 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  f( pLeaf ){.    
b7d0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
b7e0: 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66   = pLeaf->szLeaf
b7f0: 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35 4c 65  ;.    if( fts5Le
b800: 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65  afIsTermless(pLe
b810: 61 66 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74  af) ){.      pIt
b820: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
b830: 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b  t = pLeaf->nn+1;
b840: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
b850: 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f    pIter->iPgidxO
b860: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
b870: 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b  int32(&pLeaf->p[
b880: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
b890: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ],.          pIt
b8a0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
b8b0: 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
b8c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  .  }.}../*.** Ar
b8d0: 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20  gument p points 
b8e0: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
b8f0: 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20  aining a varint 
b900: 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  to be interprete
b910: 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69  d as a.** positi
b920: 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on list size fie
b930: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 72  ld. Read the var
b940: 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  int and return t
b950: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
b960: 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f  es.** read. Befo
b970: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65  re returning, se
b980: 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e  t *pnSz to the n
b990: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
b9a0: 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a  n the position.*
b9b0: 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44  * list, and *pbD
b9c0: 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  el to true if th
b9d0: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
b9e0: 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f   set, or false o
b9f0: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
ba00: 74 69 63 20 69 6e 74 20 66 74 73 35 47 65 74 50  tic int fts5GetP
ba10: 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74  oslistSize(const
ba20: 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53   u8 *p, int *pnS
ba30: 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a  z, int *pbDel){.
ba40: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74    int nSz;.  int
ba50: 20 6e 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61   n = 0;.  fts5Fa
ba60: 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  stGetVarint32(p,
ba70: 20 6e 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65   n, nSz);.  asse
ba80: 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b  rt_nc( nSz>=0 );
ba90: 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32  .  *pnSz = nSz/2
baa0: 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a  ;.  *pbDel = nSz
bab0: 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74   & 0x0001;.  ret
bac0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
bad0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
bae0: 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c  fOffset currentl
baf0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
bb00: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a  first byte of a.
bb10: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
bb20: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
bb30: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  d the value of t
bb40: 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f  he field and sto
bb50: 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20  re it.** in the 
bb60: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
bb70: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  les:.**.**   Fts
bb80: 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a  5SegIter.nPos.**
bb90: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62     Fts5SegIter.b
bba0: 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20  Del.**.** Leave 
bbb0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
bbc0: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67  fOffset pointing
bbd0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
bbe0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f  te of the .** po
bbf0: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
bc00: 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f  ent (if any)..*/
bc10: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
bc20: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
bc30: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
bc40: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
bc50: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
bc60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bc70: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
bc80: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
bc90: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
bca0: 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 69 6e  ead at */.    in
bcb0: 74 20 6e 53 7a 3b 0a 20 20 20 20 41 53 53 45 52  t nSz;.    ASSER
bcc0: 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65  T_SZLEAF_OK(pIte
bcd0: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 66  r->pLeaf);.    f
bce0: 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
bcf0: 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  32(pIter->pLeaf-
bd00: 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a  >p, iOff, nSz);.
bd10: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
bd20: 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29  = (nSz & 0x0001)
bd30: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f  ;.    pIter->nPo
bd40: 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20  s = nSz>>1;.    
bd50: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
bd60: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 61  et = iOff;.    a
bd70: 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d  ssert_nc( pIter-
bd80: 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 7d 0a  >nPos>=0 );.  }.
bd90: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
bda0: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
bdb0: 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  wid(Fts5Index *p
bdc0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
bdd0: 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d  Iter){.  u8 *a =
bde0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
bdf0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  ;        /* Buff
be00: 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  er to read data 
be10: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  from */.  int iO
be20: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
be30: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45  fOffset;..  ASSE
be40: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
be50: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66  er->pLeaf);.  if
be60: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
be70: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
be80: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
be90: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
bea0: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
beb0: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
bec0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
bed0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
bee0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
bef0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
bf00: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
bf10: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
bf20: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
bf30: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
bf40: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
bf50: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
bf60: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
bf70: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
bf80: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a  fset = iOff;.}..
bf90: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
bfa0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
bfb0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
bfc0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
bfd0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75   of the .** "nSu
bfe0: 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61  ffix" field of a
bff0: 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20   term. Function 
c000: 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20  parameter nKeep 
c010: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
c020: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50  ue.** of the "nP
c030: 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66  refix" field (if
c040: 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d   there was one -
c050: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20   it is passed 0 
c060: 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68  if this is.** th
c070: 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20  e first term in 
c080: 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a  the segment)..**
c090: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c0a0: 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a  n populates:.**.
c0b0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
c0c0: 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53  .term.**   Fts5S
c0d0: 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a  egIter.rowid.**.
c0e0: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  ** accordingly a
c0f0: 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53  nd leaves (Fts5S
c100: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
c110: 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63  et) set to the c
c120: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65  ontent of.** the
c130: 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20   first position 
c140: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
c150: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
c160: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  g to document .*
c170: 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  * (Fts5SegIter.i
c180: 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  Rowid)..*/.stati
c190: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
c1a0: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
c1b0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
c1c0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
c1d0: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
c1e0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
c1f0: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
c200: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
c210: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
c220: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
c230: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
c240: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
c250: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
c280: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
c290: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
c2a0: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
c2b0: 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65  ], nNew);.  pIte
c2c0: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65  r->term.n = nKee
c2d0: 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  p;.  fts5BufferA
c2e0: 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
c2f0: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
c300: 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  nNew, &a[iOff]);
c310: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
c320: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
c330: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c340: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
c350: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
c360: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
c370: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c380: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
c390: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
c3a0: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
c3b0: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
c3c0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
c3d0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c3e0: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
c3f0: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
c400: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
c410: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
c420: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
c430: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
c440: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
c450: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
c460: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
c470: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
c480: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
c490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c4a0: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
c4b0: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
c4c0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
c4d0: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
c4e0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
c4f0: 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  . The iterator i
c500: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
c510: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
c520: 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73  ry when .** this
c530: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
c540: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
c550: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
c560: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
c570: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
c580: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
c590: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
c5a0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
c5b0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
c5c0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
c5d0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
c5e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c5f0: 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
c600: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
c610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c620: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
c630: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
c640: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
c650: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
c660: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
c670: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
c680: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
c690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
c6a0: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
c6b0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
c6c0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
c6d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
c6e0: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
c6f0: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
c700: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
c710: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
c720: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
c730: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
c740: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
c750: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
c760: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
c770: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
c780: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
c790: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
c7a0: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
c7b0: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
c7c0: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
c7d0: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
c7e0: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
c7f0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
c800: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
c810: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
c820: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
c830: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
c840: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
c850: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c860: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
c870: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
c880: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74  pIter));.    pIt
c890: 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
c8a0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
c8b0: 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  fPgno = pSeg->pg
c8c0: 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66  noFirst-1;.    f
c8d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c8e0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
c8f0: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
c900: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c910: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c920: 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73  set = 4;.    ass
c930: 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70  ert_nc( pIter->p
c940: 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20  Leaf->nn>4 );.  
c950: 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4c 65    assert( fts5Le
c960: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
c970: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20  Iter->pLeaf)==4 
c980: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  );.    pIter->iP
c990: 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d  gidxOff = pIter-
c9a0: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31  >pLeaf->szLeaf+1
c9b0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
c9c0: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
c9d0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35  er, 0);.    fts5
c9e0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
c9f0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
ca00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
ca10: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
ca20: 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65  er called on ite
ca30: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
ca40: 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74  y calls to.** Ft
ca50: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77  s5IndexQuery() w
ca60: 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45  ith the FTS5INDE
ca70: 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61  X_QUERY_DESC fla
ca80: 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  g set..**.** The
ca90: 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20   iterator is in 
caa0: 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65  an unusual state
cab0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
cac0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74  ion is called: t
cad0: 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  he.** Fts5SegIte
cae0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61  r.iLeafOffset va
caf0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
cb00: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
cb10: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
cb20: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
cb30: 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20   size field for 
cb40: 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61  the first releva
cb50: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
cb60: 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67  page..** Fts5Seg
cb70: 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65  Iter.rowid is se
cb80: 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20  t, but nPos and 
cb90: 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a  bDel are not..**
cba0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
cbb0: 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69  n advances the i
cbc0: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
cbd0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
cbe0: 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61   last .** releva
cbf0: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
cc00: 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63  page and, if nec
cc10: 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69  essary, initiali
cc20: 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77  zes the .** aRow
cc30: 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69  idOffset[] and i
cc40: 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69  RowidOffset vari
cc50: 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70  ables. At this p
cc60: 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f  oint the iterato
cc70: 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72  r.** is in its r
cc80: 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46  egular state - F
cc90: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
cca0: 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f  Offset points to
ccb0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79   the first.** by
ccc0: 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  te of the positi
ccd0: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on list content 
cce0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ccf0: 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73  said rowid..*/.s
cd00: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cd10: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
cd20: 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  tPage(Fts5Index 
cd30: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
cd40: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e  *pIter){.  int n
cd50: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cd60: 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69  >szLeaf;.  int i
cd70: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
cd80: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d  ffset;.  u8 *a =
cd90: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
cda0: 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  ;.  int iRowidOf
cdb0: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  fset = 0;..  if(
cdc0: 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66   n>pIter->iEndof
cdd0: 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e  Doclist ){.    n
cde0: 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66   = pIter->iEndof
cdf0: 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
ce00: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
ce10: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
ce20: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
ce30: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
ce40: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
ce50: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
ce60: 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
ce70: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
ce80: 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  i], &nPos, &bDum
ce90: 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50  my);.    i += nP
cea0: 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  os;.    if( i>=n
ceb0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20   ) break;.    i 
cec0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
ced0: 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69  (&a[i], (u64*)&i
cee0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
cef0: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
cf00: 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52  lta;..    if( iR
cf10: 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65  owidOffset>=pIte
cf20: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
cf30: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
cf40: 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69  w = pIter->nRowi
cf50: 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20  dOffset + 8;.   
cf60: 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28     int *aNew = (
cf70: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
cf80: 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77  lloc(pIter->aRow
cf90: 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73  idOffset, nNew*s
cfa0: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
cfb0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
cfc0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
cfd0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
cfe0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
d000: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
d010: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
d020: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
d030: 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d  et = nNew;.    }
d040: 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f  ..    pIter->aRo
d050: 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64  widOffset[iRowid
d060: 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65  Offset++] = pIte
d070: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
d080: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d090: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a  Offset = i;.  }.
d0a0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
d0b0: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
d0c0: 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49  fset;.  fts5SegI
d0d0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
d0e0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  Iter);.}../*.**.
d0f0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d100: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
d110: 65 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64  eNewPage(Fts5Ind
d120: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
d130: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
d140: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
d150: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
d160: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
d170: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
d180: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
d190: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20  ER_ONETERM );.. 
d1a0: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
d1b0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
d1c0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
d1d0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
d1e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
d1f0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
d200: 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  o>pIter->iTermLe
d210: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74  afPgno ){.    Ft
d220: 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20  s5Data *pNew;.  
d230: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
d240: 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d  no--;.    pNew =
d250: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
d260: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
d270: 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
d280: 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
d290: 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  id, pIter->iLeaf
d2a0: 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20  Pgno.    ));.   
d2b0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
d2c0: 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f     /* iTermLeafO
d2d0: 66 66 73 65 74 20 6d 61 79 20 62 65 20 65 71 75  ffset may be equ
d2e0: 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20  al to szLeaf if 
d2f0: 74 68 65 20 74 65 72 6d 20 69 73 20 74 68 65 20  the term is the 
d300: 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  last.      ** th
d310: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
d320: 2d 20 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74  - i.e. the first
d330: 20 72 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65   rowid is on the
d340: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e   following page.
d350: 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
d360: 73 20 63 61 73 65 20 6c 65 61 76 65 20 70 49 74  s case leave pIt
d370: 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68  er->pLeaf==0, th
d380: 69 73 20 69 74 65 72 61 74 6f 72 20 69 73 20 61  is iterator is a
d390: 74 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20  t EOF. */.      
d3a0: 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  if( pIter->iLeaf
d3b0: 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65  Pgno==pIter->iTe
d3c0: 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20  rmLeafPgno ){.  
d3d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d3e0: 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b  ter->pLeaf==0 );
d3f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74  .        if( pIt
d400: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
d410: 73 65 74 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66  set<pNew->szLeaf
d420: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
d430: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65  ter->pLeaf = pNe
d440: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  w;.          pIt
d450: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
d460: 3d 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  = pIter->iTermLe
d470: 61 66 4f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  afOffset;.      
d480: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
d490: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f  .        int iRo
d4a0: 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  widOff;.        
d4b0: 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
d4c0: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
d4d0: 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  f(pNew);.       
d4e0: 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
d4f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  {.          pIte
d500: 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b  r->pLeaf = pNew;
d510: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
d520: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
d530: 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20  iRowidOff;.     
d540: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
d550: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
d560: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
d570: 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e  u8 *a = &pIter->
d580: 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e  pLeaf->p[pIter->
d590: 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
d5a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
d5b0: 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35  afOffset += fts5
d5c0: 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36  GetVarint(a, (u6
d5d0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
d5e0: 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
d5f0: 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
d600: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
d610: 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
d620: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
d630: 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
d640: 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65  Leaf ){.    pIte
d650: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
d660: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
d670: 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53  >nn+1;.    fts5S
d680: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
d690: 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
d6a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
d6b0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
d6c0: 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
d6d0: 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
d6e0: 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c  rgument currentl
d6f0: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61  y.** points to a
d700: 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20   delete marker. 
d710: 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20  A delete marker 
d720: 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  is an entry with
d730: 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73   a 0 byte.** pos
d740: 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73  ition-list..*/.s
d750: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
d760: 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 46  ltiIterIsEmpty(F
d770: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
d780: 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
d790: 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65  r){.  Fts5SegIte
d7a0: 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
d7b0: 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46  ->aSeg[pIter->aF
d7c0: 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b  irst[1].iFirst];
d7d0: 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
d7e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
d7f0: 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53  Seg->pLeaf && pS
d800: 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a  eg->nPos==0);.}.
d810: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69  ./*.** Advance i
d820: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f  terator pIter to
d830: 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e   the next entry.
d840: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72   .**.** If an er
d850: 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
d860: 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
d870: 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
d880: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74  e error code. It
d890: 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73   .** is not cons
d8a0: 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20  idered an error 
d8b0: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
d8c0: 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20  reaches EOF. If 
d8d0: 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
d8e0: 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
d8f0: 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
d900: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
d910: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
d920: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
d930: 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20  s5SegIterNext(. 
d940: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d960: 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
d970: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
d980: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d9a0: 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61  Iterator to adva
d9b0: 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62  nce */.  int *pb
d9c0: 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20  NewTerm         
d9d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
d9e0: 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72   Set for new ter
d9f0: 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  m */.){.  assert
da00: 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c  ( pbNewTerm==0 |
da10: 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  | *pbNewTerm==0 
da20: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
da30: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
da40: 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67   if( pIter->flag
da50: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
da60: 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20 20  _REVERSE ){.    
da70: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
da80: 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b  >pNextLeaf==0 );
da90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
daa0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30  ->iRowidOffset>0
dab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
dac0: 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  a = pIter->pLeaf
dad0: 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  ->p;.        int
dae0: 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69   iOff;.        i
daf0: 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
db00: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
db10: 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
db20: 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ..        pIter-
db30: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b  >iRowidOffset--;
db40: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
db50: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
db60: 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77  ff = pIter->aRow
db70: 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e  idOffset[pIter->
db80: 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20  iRowidOffset];. 
db90: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
dba0: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
dbb0: 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f  e(&a[iOff], &nPo
dbc0: 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20  s, &bDummy);.   
dbd0: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f       iOff += nPo
dbe0: 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47  s;.        fts5G
dbf0: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
dc00: 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
dc10: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  );.        pIter
dc20: 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c  ->iRowid -= iDel
dc30: 74 61 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  ta;.        fts5
dc40: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
dc50: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
dc60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
dc70: 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
dc80: 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
dc90: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
dca0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74   }else{.      Ft
dcb0: 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20  s5Data *pLeaf = 
dcc0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20  pIter->pLeaf;.  
dcd0: 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
dce0: 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
dcf0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
dd00: 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20  nKeep = 0;..    
dd10: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
dd20: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70  the end of the p
dd30: 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74  osition list wit
dd40: 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hin the current 
dd50: 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75  page. */.      u
dd60: 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b  8 *a = pLeaf->p;
dd70: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
dd80: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20  Leaf->szLeaf;.. 
dd90: 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45       ASSERT_SZLE
dda0: 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20  AF_OK(pLeaf);.  
ddb0: 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72      iOff = pIter
ddc0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20  ->iLeafOffset + 
ddd0: 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20  pIter->nPos;..  
dde0: 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
ddf0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
de00: 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f   next entry is o
de10: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
de20: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ge. */.        a
de30: 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d  ssert_nc( iOff<=
de40: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
de50: 6c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20  list );.        
de60: 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d  if( iOff>=pIter-
de70: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29  >iEndofDoclist )
de80: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65 77  {.          bNew
de90: 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20  Term = 1;.      
dea0: 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74      if( iOff!=ft
deb0: 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
dec0: 66 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20  ff(pLeaf) ){.   
ded0: 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d           iOff +=
dee0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
def0: 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70  (&a[iOff], nKeep
df00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
df10: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
df20: 20 20 20 20 20 20 20 20 75 36 34 20 69 44 65 6c          u64 iDel
df30: 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ta;.          iO
df40: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
df50: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
df60: 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20  ff], &iDelta);. 
df70: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
df80: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
df90: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
dfa0: 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20  rt_nc( iDelta>0 
dfb0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
dfc0: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
dfd0: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a  fOffset = iOff;.
dfe0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dff0: 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20   pIter->pSeg==0 
e000: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
e010: 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a   u8 *pList = 0;.
e020: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
e030: 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20  ar *zTerm = 0;. 
e040: 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74         int nList
e050: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73   = 0;.        as
e060: 73 65 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c  sert( (pIter->fl
e070: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e080: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70  ER_ONETERM) || p
e090: 62 4e 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20  bNewTerm );.    
e0a0: 20 20 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65      if( 0==(pIte
e0b0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
e0c0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29  SEGITER_ONETERM)
e0d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
e0e0: 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61  lite3Fts5HashSca
e0f0: 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b  nNext(p->pHash);
e100: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e110: 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e  e3Fts5HashScanEn
e120: 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a  try(p->pHash, &z
e130: 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e  Term, &pList, &n
e140: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  List);.        }
e150: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 69  .        if( pLi
e160: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
e170: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
e180: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
e190: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
e1a0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
e1b0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e1c0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e1d0: 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c  eaf->p = (u8*)pL
e1e0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ist;.          p
e1f0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20  Iter->pLeaf->nn 
e200: 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  = nList;.       
e210: 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d     pIter->pLeaf-
e220: 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b  >szLeaf = nList;
e230: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e240: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
e250: 3d 20 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20  = nList+1;.     
e260: 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
e270: 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
e280: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
e290: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72  (int)strlen(zTer
e2a0: 6d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  m),.            
e2b0: 20 20 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20    (u8*)zTerm);. 
e2c0: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e2d0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
e2e0: 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73  s5GetVarint(pLis
e2f0: 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d  t, (u64*)&pIter-
e300: 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  >iRowid);.      
e310: 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
e320: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
e330: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e340: 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20     iOff = 0;.   
e350: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74       /* Next ent
e360: 72 79 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65  ry is not on the
e370: 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f   current page */
e380: 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
e390: 69 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  iOff==0 ){.     
e3a0: 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
e3b0: 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
e3c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  r);.          pL
e3d0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65  eaf = pIter->pLe
e3e0: 61 66 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  af;.          if
e3f0: 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ( pLeaf==0 ) bre
e400: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53  ak;.          AS
e410: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
e420: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20  Leaf);.         
e430: 20 69 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73   if( (iOff = fts
e440: 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
e450: 66 66 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f  ff(pLeaf)) && iO
e460: 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff<pLeaf->szLeaf
e470: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
e480: 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46  iOff += sqlite3F
e490: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c  ts5GetVarint(&pL
e4a0: 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  eaf->p[iOff], (u
e4b0: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
e4c0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
e4d0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e4e0: 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20  set = iOff;..   
e4f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
e500: 61 66 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a  af->nn>pLeaf->sz
e510: 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
e520: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67        pIter->iPg
e530: 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e  idxOff = pLeaf->
e540: 73 7a 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74  szLeaf + fts5Get
e550: 56 61 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20  Varint32(.      
e560: 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c 65              &pLe
e570: 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c  af->p[pLeaf->szL
e580: 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e  eaf], pIter->iEn
e590: 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20  dofDoclist.     
e5a0: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
e5b0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
e5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e5d0: 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d   else if( pLeaf-
e5e0: 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  >nn>pLeaf->szLea
e5f0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  f ){.           
e600: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
e610: 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  f = pLeaf->szLea
e620: 66 20 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e  f + fts5GetVarin
e630: 74 33 32 28 0a 20 20 20 20 20 20 20 20 20 20 20  t32(.           
e640: 20 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70       &pLeaf->p[p
e650: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69  Leaf->szLeaf], i
e660: 4f 66 66 0a 20 20 20 20 20 20 20 20 20 20 20 20  Off.            
e670: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e680: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e690: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
e6a0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
e6b0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66  dofDoclist = iOf
e6c0: 66 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  f;.            b
e6d0: 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
e6e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e6f0: 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
e700: 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
e710: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
e720: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
e730: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e740: 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
e750: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e760: 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63  }..      /* Chec
e770: 6b 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  k if the iterato
e780: 72 20 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e  r is now at EOF.
e790: 20 49 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65   If so, return e
e7a0: 61 72 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69  arly. */.      i
e7b0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
e7c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ){.        if( b
e7d0: 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20  NewTerm ){.     
e7e0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
e7f0: 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45 47  flags & FTS5_SEG
e800: 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a  ITER_ONETERM ){.
e810: 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
e820: 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
e830: 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
e840: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e850: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
e860: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e870: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e880: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
e890: 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  er, nKeep);.    
e8a0: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
e8b0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
e8c0: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Iter);.         
e8d0: 20 20 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d     if( pbNewTerm
e8e0: 20 29 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20   ) *pbNewTerm = 
e8f0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
e900: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e910: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66          /* The f
e920: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62  ollowing could b
e930: 65 20 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e  e done by callin
e940: 67 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61  g fts5SegIterLoa
e950: 64 4e 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20  dNPos(). But.   
e960: 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62         ** this b
e970: 6c 6f 63 6b 20 69 73 20 70 61 72 74 69 63 75 6c  lock is particul
e980: 61 72 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63 65  arly performance
e990: 20 63 72 69 74 69 63 61 6c 2c 20 73 6f 20 65 71   critical, so eq
e9a0: 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20  uivalent.       
e9b0: 20 20 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e     ** code is in
e9c0: 6c 69 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20  lined. */.      
e9d0: 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20      int nSz;.   
e9e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
e9f0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
ea00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
ea10: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
ea20: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  (pIter->pLeaf->p
ea30: 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  , pIter->iLeafOf
ea40: 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20  fset, nSz);.    
ea50: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65        pIter->bDe
ea60: 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30  l = (nSz & 0x000
ea70: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  1);.          pI
ea80: 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e  ter->nPos = nSz>
ea90: 3e 31 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  >1;.          as
eaa0: 73 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e  sert_nc( pIter->
eab0: 6e 50 6f 73 3e 3d 30 20 29 3b 0a 20 20 20 20 20  nPos>=0 );.     
eac0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ead0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e   }.  }.}..#defin
eae0: 65 20 53 57 41 50 56 41 4c 28 54 2c 20 61 2c 20  e SWAPVAL(T, a, 
eaf0: 62 29 20 7b 20 54 20 74 6d 70 3b 20 74 6d 70 3d  b) { T tmp; tmp=
eb00: 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70 3b 20 7d  a; a=b; b=tmp; }
eb10: 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
eb20: 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
eb30: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
eb40: 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 61 20  irst rowid in a 
eb50: 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a 2a 2a  doclist. This.**
eb60: 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73 20 74   function sets t
eb70: 68 65 20 69 74 65 72 61 74 6f 72 20 75 70 20 73  he iterator up s
eb80: 6f 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20  o that iterates 
eb90: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
eba0: 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68 65 20   through.** the 
ebb0: 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  doclist..*/.stat
ebc0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
ebd0: 74 65 72 52 65 76 65 72 73 65 28 46 74 73 35 49  terReverse(Fts5I
ebe0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
ebf0: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ec00: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
ec10: 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70  Dlidx = pIter->p
ec20: 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44 61 74  Dlidx;.  Fts5Dat
ec30: 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  a *pLast = 0;.  
ec40: 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
ec50: 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64 78 20  ;..  if( pDlidx 
ec60: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  ){.    int iSegi
ec70: 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 2d  d = pIter->pSeg-
ec80: 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70 67 6e  >iSegid;.    pgn
ec90: 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c 69 64  oLast = fts5Dlid
eca0: 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
ecb0: 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d 20 66  );.    pLast = f
ecc0: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
ecd0: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
ece0: 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f 4c 61  D(iSegid, pgnoLa
ecf0: 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  st));.  }else{. 
ed00: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65     Fts5Data *pLe
ed10: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
ed20: 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  f;         /* Cu
ed30: 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20  rrent leaf data 
ed40: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72 72 65  */..    /* Curre
ed50: 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49 74 65  ntly, Fts5SegIte
ed60: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
ed70: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
ed80: 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20 2a 2a  t byte of.    **
ed90: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 63   position-list c
eda0: 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65 20 63  ontent for the c
edb0: 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20 42 61  urrent rowid. Ba
edc0: 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68 61 74  ck it up so that
edd0: 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74   it.    ** point
ede0: 73 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  s to the start o
edf0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
ee00: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
ee10: 2a 2f 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  */.    pIter->iL
ee20: 65 61 66 4f 66 66 73 65 74 20 2d 3d 20 73 71 6c  eafOffset -= sql
ee30: 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
ee40: 74 4c 65 6e 28 70 49 74 65 72 2d 3e 6e 50 6f 73  tLen(pIter->nPos
ee50: 2a 32 2b 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b  *2+pIter->bDel);
ee60: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
ee70: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
ee80: 75 65 20 74 68 65 6e 20 74 68 65 20 6c 61 72 67  ue then the larg
ee90: 65 73 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68  est rowid for th
eea0: 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a  e current.    **
eeb0: 20 74 65 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65   term may not be
eec0: 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
eed0: 75 72 72 65 6e 74 20 70 61 67 65 2e 20 53 6f 20  urrent page. So 
eee0: 73 65 61 72 63 68 20 66 6f 72 77 61 72 64 20 74  search forward t
eef0: 6f 0a 20 20 20 20 2a 2a 20 73 65 65 20 77 68 65  o.    ** see whe
ef00: 72 65 20 73 61 69 64 20 72 6f 77 69 64 20 72 65  re said rowid re
ef10: 61 6c 6c 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20  ally is.  */.   
ef20: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 45 6e 64   if( pIter->iEnd
ef30: 6f 66 44 6f 63 6c 69 73 74 3e 3d 70 4c 65 61 66  ofDoclist>=pLeaf
ef40: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
ef50: 20 20 69 6e 74 20 70 67 6e 6f 3b 0a 20 20 20 20    int pgno;.    
ef60: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
ef70: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 70  egment *pSeg = p
ef80: 49 74 65 72 2d 3e 70 53 65 67 3b 0a 0a 20 20 20  Iter->pSeg;..   
ef90: 20 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 72     /* The last r
efa0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
efb0: 69 73 74 20 6d 61 79 20 6e 6f 74 20 62 65 20 6f  ist may not be o
efc0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
efd0: 67 65 2e 20 53 65 61 72 63 68 0a 20 20 20 20 20  ge. Search.     
efe0: 20 2a 2a 20 66 6f 72 77 61 72 64 20 74 6f 20 66   ** forward to f
eff0: 69 6e 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ind the page con
f000: 74 61 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74  taining the last
f010: 20 72 6f 77 69 64 2e 20 20 2a 2f 0a 20 20 20 20   rowid.  */.    
f020: 20 20 66 6f 72 28 70 67 6e 6f 3d 70 49 74 65 72    for(pgno=pIter
f030: 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 20 21  ->iLeafPgno+1; !
f040: 70 2d 3e 72 63 20 26 26 20 70 67 6e 6f 3c 3d 70  p->rc && pgno<=p
f050: 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 20 70  Seg->pgnoLast; p
f060: 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  gno++){.        
f070: 69 36 34 20 69 41 62 73 20 3d 20 46 54 53 35 5f  i64 iAbs = FTS5_
f080: 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53  SEGMENT_ROWID(pS
f090: 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f  eg->iSegid, pgno
f0a0: 29 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 44  );.        Fts5D
f0b0: 61 74 61 20 2a 70 4e 65 77 20 3d 20 66 74 73 35  ata *pNew = fts5
f0c0: 44 61 74 61 52 65 61 64 28 70 2c 20 69 41 62 73  DataRead(p, iAbs
f0d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
f0e0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  New ){.         
f0f0: 20 69 6e 74 20 69 52 6f 77 69 64 2c 20 62 54 65   int iRowid, bTe
f100: 72 6d 6c 65 73 73 3b 0a 20 20 20 20 20 20 20 20  rmless;.        
f110: 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4c    iRowid = fts5L
f120: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
f130: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
f140: 20 20 62 54 65 72 6d 6c 65 73 73 20 3d 20 66 74    bTermless = ft
f150: 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73  s5LeafIsTermless
f160: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20  (pNew);.        
f170: 20 20 69 66 28 20 69 52 6f 77 69 64 20 29 7b 0a    if( iRowid ){.
f180: 20 20 20 20 20 20 20 20 20 20 20 20 53 57 41 50              SWAP
f190: 56 41 4c 28 46 74 73 35 44 61 74 61 2a 2c 20 70  VAL(Fts5Data*, p
f1a0: 4e 65 77 2c 20 70 4c 61 73 74 29 3b 0a 20 20 20  New, pLast);.   
f1b0: 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4c 61 73           pgnoLas
f1c0: 74 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  t = pgno;.      
f1d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
f1e0: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
f1f0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20  pNew);.         
f200: 20 69 66 28 20 62 54 65 72 6d 6c 65 73 73 3d 3d   if( bTermless==
f210: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
f220: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
f230: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
f240: 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61 74  pLast is NULL at
f250: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
f260: 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64  n the last rowid
f270: 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69 73   for this doclis
f280: 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20 74  t.  ** lies on t
f290: 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c  he page currentl
f2a0: 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  y indicated by t
f2b0: 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e 20  he iterator. In 
f2c0: 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a 20  this case .  ** 
f2d0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f2e0: 65 74 20 69 73 20 61 6c 72 65 61 64 79 20 73 65  et is already se
f2f0: 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
f300: 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  e position-list 
f310: 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64 20  size.  ** field 
f320: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
f330: 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61  the first releva
f340: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
f350: 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  page..  **.  ** 
f360: 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73 20  Or, if pLast is 
f370: 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 69  non-NULL, then i
f380: 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68  t is the page th
f390: 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
f3a0: 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64 2e  last.  ** rowid.
f3b0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63 6f   In this case co
f3c0: 6e 66 69 67 75 72 65 20 74 68 65 20 69 74 65 72  nfigure the iter
f3d0: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  ator so that it 
f3e0: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20 20  points to the.  
f3f0: 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  ** first rowid o
f400: 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20 2a  n this page..  *
f410: 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29 7b  /.  if( pLast ){
f420: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
f430: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
f440: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
f450: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
f460: 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  af = pLast;.    
f470: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
f480: 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
f490: 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
f4a0: 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
f4b0: 61 73 74 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b  ast);.    iOff +
f4c0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
f4d0: 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLast->p[iOff],
f4e0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
f4f0: 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65  Rowid);.    pIte
f500: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
f510: 20 69 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20   iOff;..    if( 
f520: 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
f530: 73 73 28 70 4c 61 73 74 29 20 29 7b 0a 20 20 20  ss(pLast) ){.   
f540: 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
f550: 44 6f 63 6c 69 73 74 20 3d 20 70 4c 61 73 74 2d  Doclist = pLast-
f560: 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65  >nn+1;.    }else
f570: 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  {.      pIter->i
f580: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 66  EndofDoclist = f
f590: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
f5a0: 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  Off(pLast);.    
f5b0: 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65  }..  }..  fts5Se
f5c0: 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
f5d0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
f5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
f5f0: 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c  r pIter currentl
f600: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
f610: 66 69 72 73 74 20 72 6f 77 69 64 20 6f 66 20 61  first rowid of a
f620: 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a 20 54 68 65   doclist..** The
f630: 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
f640: 69 6e 64 65 78 20 61 73 73 6f 63 69 61 74 65 64  index associated
f650: 20 77 69 74 68 20 74 68 65 20 66 69 6e 61 6c 20   with the final 
f660: 74 65 72 6d 20 6f 6e 20 74 68 65 20 63 75 72 72  term on the curr
f670: 65 6e 74 20 0a 2a 2a 20 70 61 67 65 2e 20 49 66  ent .** page. If
f680: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72   the current ter
f690: 6d 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 65  m is the last te
f6a0: 72 6d 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20  rm on the page, 
f6b0: 6c 6f 61 64 20 74 68 65 20 0a 2a 2a 20 64 6f 63  load the .** doc
f6c0: 6c 69 73 74 2d 69 6e 64 65 78 20 66 72 6f 6d 20  list-index from 
f6d0: 64 69 73 6b 20 61 6e 64 20 69 6e 69 74 69 61 6c  disk and initial
f6e0: 69 7a 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ize an iterator 
f6f0: 61 74 20 28 70 49 74 65 72 2d 3e 70 44 6c 69 64  at (pIter->pDlid
f700: 78 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  x)..*/.static vo
f710: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  id fts5SegIterLo
f720: 61 64 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65  adDlidx(Fts5Inde
f730: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
f740: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
f750: 20 69 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70   iSeg = pIter->p
f760: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 69  Seg->iSegid;.  i
f770: 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
f780: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
f790: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
f7a0: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65  .  Fts5Data *pLe
f7b0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
f7c0: 66 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65  f; /* Current le
f7d0: 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 61 73  af data */..  as
f7e0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
f7f0: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
f800: 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
f810: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
f820: 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  lidx==0 );..  /*
f830: 20 43 68 65 63 6b 20 69 66 20 74 68 65 20 63 75   Check if the cu
f840: 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 20 65 6e  rrent doclist en
f850: 64 73 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  ds on this page.
f860: 20 49 66 20 69 74 20 64 6f 65 73 2c 20 72 65 74   If it does, ret
f870: 75 72 6e 0a 20 20 2a 2a 20 65 61 72 6c 79 20 77  urn.  ** early w
f880: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 74  ithout loading t
f890: 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
f8a0: 20 28 61 73 20 69 74 20 62 65 6c 6f 6e 67 73 20   (as it belongs 
f8b0: 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 0a 20  to a different. 
f8c0: 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f 0a 20 20 69   ** term. */.  i
f8d0: 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  f( pIter->iTermL
f8e0: 65 61 66 50 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e  eafPgno==pIter->
f8f0: 69 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 26 26  iLeafPgno .   &&
f900: 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
f910: 63 6c 69 73 74 3c 70 4c 65 61 66 2d 3e 73 7a 4c  clist<pLeaf->szL
f920: 65 61 66 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  eaf .  ){.    re
f930: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 70 49 74  turn;.  }..  pIt
f940: 65 72 2d 3e 70 44 6c 69 64 78 20 3d 20 66 74 73  er->pDlidx = fts
f950: 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
f960: 2c 20 62 52 65 76 2c 20 69 53 65 67 2c 20 70 49  , bRev, iSeg, pI
f970: 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  ter->iTermLeafPg
f980: 6e 6f 29 3b 0a 7d 0a 0a 23 64 65 66 69 6e 65 20  no);.}..#define 
f990: 66 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72  fts5IndexSkipVar
f9a0: 69 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20  int(a, iOff) {  
f9b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e            \.  in
f9c0: 74 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b  t iEnd = iOff+9;
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
f9f0: 20 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66    while( (a[iOff
fa00: 2b 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20 69  ++] & 0x80) && i
fa10: 4f 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20  Off<iEnd );     
fa20: 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    \.}../*.** The
fa30: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
fa40: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
fa50: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
fa60: 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
fa70: 73 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61  s.** no valid va
fa80: 6c 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20  lues except for 
fa90: 74 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e  the Fts5SegIter.
faa0: 70 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72  pLeaf member var
fab0: 69 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66  iable. This.** f
fac0: 75 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73  unction searches
fad0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66   the leaf page f
fae0: 6f 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69  or a term matchi
faf0: 6e 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ng (pTerm/nTerm)
fb00: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73  ..**.** If the s
fb10: 70 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73  pecified term is
fb20: 20 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61   found on the pa
fb30: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65  ge, then the ite
fb40: 72 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a  rator is left.**
fb50: 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e   pointing to it.
fb60: 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65   If argument bGe
fb70: 20 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65   is zero and the
fb80: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75   term is not fou
fb90: 6e 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61  nd,.** the itera
fba0: 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  tor is left poin
fbb0: 74 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a  ting at EOF..**.
fbc0: 2a 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e  ** If bGe is non
fbd0: 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70  -zero and the sp
fbe0: 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
fbf0: 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
fc00: 74 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20  the.** iterator 
fc10: 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
fc20: 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74   to the smallest
fc30: 20 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67   term in the seg
fc40: 6d 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20  ment that.** is 
fc50: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
fc60: 73 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20  specified term, 
fc70: 65 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72  even if this ter
fc80: 6d 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a  m is not on the.
fc90: 2a 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  ** current page.
fca0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
fcb0: 66 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20  fts5LeafSeek(.  
fcc0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 2f 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72  /* Leave any err
fcf0: 6f 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a  or code here */.
fd00: 20 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20    int bGe,      
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd20: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
fd30: 3e 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46  >= search */.  F
fd40: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
fd50: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
fd60: 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65  * Iterator to se
fd70: 65 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ek */.  const u8
fd80: 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65   *pTerm, int nTe
fd90: 72 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20  rm      /* Term 
fda0: 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f  to search for */
fdb0: 0a 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  .){.  int iOff;.
fdc0: 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
fdd0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
fde0: 0a 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20  .  int szLeaf = 
fdf0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
fe00: 4c 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  Leaf;.  int n = 
fe10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
fe20: 3b 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20  ;..  int nMatch 
fe30: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70  = 0;.  int nKeep
fe40: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77   = 0;.  int nNew
fe50: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72   = 0;.  int iTer
fe60: 6d 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69  mOff;.  int iPgi
fe70: 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
fe80: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
fe90: 6e 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  nt offset in pgi
fea0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64  dx */.  int bEnd
feb0: 4f 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61  OfPage = 0;..  a
fec0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
fed0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50  LITE_OK );..  iP
fee0: 67 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20  gidx = szLeaf;. 
fef0: 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
ff00: 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
ff10: 67 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29  gidx], iTermOff)
ff20: 3b 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d  ;.  iOff = iTerm
ff30: 4f 66 66 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  Off;..  while( 1
ff40: 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75   ){..    /* Figu
ff50: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
ff60: 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e  new bytes are in
ff70: 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
ff80: 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
ff90: 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
ffa0: 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  New);.    if( nK
ffb0: 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20  eep<nMatch ){.  
ffc0: 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
ffd0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
ffe0: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70     assert( nKeep
fff0: 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20  >=nMatch );.    
10000 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63  if( nKeep==nMatc
10010 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  h ){.      int n
10020 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Cmp;.      int i
10030 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d  ;.      nCmp = M
10040 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
10050 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
10060 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
10070 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
10080 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
10090 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
100a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
100b0 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
100c0 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
100d0 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
100e0 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
100f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
10100 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
10110 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
10120 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
10130 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
10140 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10150 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
10160 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
10170 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
10180 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
10190 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
101a0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
101b0 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
101c0 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
101d0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
101e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
101f0 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
10200 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
10210 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
10220 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
10230 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
10240 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  mOff;..    /* Re
10250 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65  ad the nKeep fie
10260 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ld of the next t
10270 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  erm. */.    fts5
10280 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28  FastGetVarint32(
10290 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b  a, iOff, nKeep);
102a0 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61  .  }.. search_fa
102b0 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d  iled:.  if( bGe=
102c0 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61  =0 ){.    fts5Da
102d0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
102e0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
102f0 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
10300 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
10310 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67  se if( bEndOfPag
10320 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  e ){.    do {.  
10330 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
10340 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
10350 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  );.      if( pIt
10360 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72  er->pLeaf==0 ) r
10370 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d  eturn;.      a =
10380 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
10390 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  ;.      if( fts5
103a0 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70  LeafIsTermless(p
103b0 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20  Iter->pLeaf)==0 
103c0 29 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64  ){.        iPgid
103d0 78 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  x = pIter->pLeaf
103e0 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20  ->szLeaf;.      
103f0 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
10400 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
10410 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67  er->pLeaf->p[iPg
10420 69 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20  idx], iOff);.   
10430 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20       if( iOff<4 
10440 7c 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e  || iOff>=pIter->
10450 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
10460 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
10470 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
10480 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
10490 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20            nKeep 
104a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69  = 0;.          i
104b0 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b 0a  TermOff = iOff;.
104c0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70 49            n = pI
104d0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b 0a  ter->pLeaf->nn;.
104e0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
104f0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
10500 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65 77  2(&a[iOff], nNew
10510 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
10520 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
10530 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65      }.    }while
10540 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65 61  ( 1 );.  }.. sea
10550 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 0a 20 20  rch_success:..  
10560 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10570 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
10580 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
10590 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
105a0 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
105b0 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
105c0 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d  eafPgno = pIter-
105d0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20 20 66  >iLeafPgno;..  f
105e0 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
105f0 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72  >rc, &pIter->ter
10600 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72 6d 29  m, nKeep, pTerm)
10610 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70  ;.  fts5BufferAp
10620 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
10630 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e   &pIter->term, n
10640 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a  New, &a[iOff]);.
10650 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d 6e  .  if( iPgidx>=n
10660 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
10670 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
10680 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
10690 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
106a0 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
106b0 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
106c0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
106d0 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b 0a 20  idx], nExtra);. 
106e0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
106f0 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72 6d 4f  Doclist = iTermO
10700 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20 20 7d  ff + nExtra;.  }
10710 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78  .  pIter->iPgidx
10720 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a 0a 20  Off = iPgidx;.. 
10730 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
10740 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
10750 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
10760 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
10770 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
10780 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74  alize the object
10790 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20   pIter to point 
107a0 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54  to term pTerm/nT
107b0 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d 65  erm within segme
107c0 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20 74  nt.** pSeg. If t
107d0 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68 20  here is no such 
107e0 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64 65  term in the inde
107f0 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  x, the iterator 
10800 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a  is set to EOF..*
10810 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
10820 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64   occurs, Fts5Ind
10830 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20  ex.rc is set to 
10840 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
10850 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a  rror code. If .*
10860 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  * an error has a
10870 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
10880 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
10890 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
108a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
108b0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
108c0 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
108d0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
108e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
108f0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
10900 6e 64 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  nd */.  Fts5Buff
10910 65 72 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  er *pBuf,       
10920 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
10930 72 20 74 6f 20 75 73 65 20 66 6f 72 20 6c 6f 61  r to use for loa
10940 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  ding pages */.  
10950 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
10960 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
10970 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
10980 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  to */.  int flag
10990 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
109a0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
109b0 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58 58 58  of FTS5INDEX_XXX
109c0 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35   flags */.  Fts5
109d0 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
109e0 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
109f0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
10a00 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
10a10 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
10a20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
10a30 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
10a40 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67   */.){.  int iPg
10a50 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62 47 65 20   = 1;.  int bGe 
10a60 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  = (flags & FTS5I
10a70 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
10a80 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64 78 20 3d  ;.  int bDlidx =
10a90 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
10aa0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
10ab0 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73  here is a doclis
10ac0 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74  t-index */..  st
10ad0 61 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d  atic int nCall =
10ae0 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a   0;.  nCall++;..
10af0 20 20 61 73 73 65 72 74 28 20 62 47 65 3d 3d 30    assert( bGe==0
10b00 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53   || (flags & FTS
10b10 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
10b20 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  C)==0 );.  asser
10b30 74 28 20 70 54 65 72 6d 20 26 26 20 6e 54 65 72  t( pTerm && nTer
10b40 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  m );.  memset(pI
10b50 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
10b60 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
10b70 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a  ->pSeg = pSeg;..
10b80 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
10b90 73 65 74 73 20 73 74 61 63 6b 20 76 61 72 69 61  sets stack varia
10ba0 62 6c 65 20 69 50 67 20 74 6f 20 74 68 65 20 6c  ble iPg to the l
10bb0 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
10bc0 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f  that may.  ** co
10bd0 6e 74 61 69 6e 20 74 65 72 6d 20 28 70 54 65 72  ntain term (pTer
10be0 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20 69 74 20  m/nTerm), if it 
10bf0 69 73 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68  is present in th
10c00 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20  e segment. */.  
10c10 69 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  if( p->pIdxSelec
10c20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  t==0 ){.    Fts5
10c30 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
10c40 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
10c50 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
10c60 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
10c70 64 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65  dxSelect, sqlite
10c80 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
10c90 20 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e       "SELECT pgn
10ca0 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f  o FROM '%q'.'%q_
10cb0 69 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20  idx' WHERE ".   
10cc0 20 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20         "segid=? 
10cd0 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45  AND term<=? ORDE
10ce0 52 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c  R BY term DESC L
10cf0 49 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20  IMIT 1",.       
10d00 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c     pConfig->zDb,
10d10 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a   pConfig->zName.
10d20 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66      ));.  }.  if
10d30 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
10d40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  ;.  sqlite3_bind
10d50 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  _int(p->pIdxSele
10d60 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e 69 53 65  ct, 1, pSeg->iSe
10d70 67 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  gid);.  sqlite3_
10d80 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64  bind_blob(p->pId
10d90 78 53 65 6c 65 63 74 2c 20 32 2c 20 70 54 65 72  xSelect, 2, pTer
10da0 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45  m, nTerm, SQLITE
10db0 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
10dc0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
10dd0 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
10de0 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 69  Select) ){.    i
10df0 36 34 20 76 61 6c 20 3d 20 73 71 6c 69 74 65 33  64 val = sqlite3
10e00 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70  _column_int(p->p
10e10 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
10e20 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
10e30 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
10e40 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
10e50 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
10e60 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
10e70 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b  (p->pIdxSelect);
10e80 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65 67  ..  if( iPg<pSeg
10e90 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a 20  ->pgnoFirst ){. 
10ea0 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e 70     iPg = pSeg->p
10eb0 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62 44  gnoFirst;.    bD
10ec0 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  lidx = 0;.  }.. 
10ed0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
10ee0 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20 66  o = iPg - 1;.  f
10ef0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
10f00 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  ge(p, pIter);.. 
10f10 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
10f20 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65 61  f ){.    fts5Lea
10f30 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70 49  fSeek(p, bGe, pI
10f40 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  ter, pTerm, nTer
10f50 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  m);.  }..  if( p
10f60 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
10f70 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  && bGe==0 ){.   
10f80 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
10f90 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
10fa0 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
10fb0 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  Iter->pLeaf ){. 
10fc0 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26       if( flags &
10fd0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
10fe0 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 20  _DESC ){.       
10ff0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
11000 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
11010 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  VERSE;.      }. 
11020 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78 20       if( bDlidx 
11030 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
11040 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28  egIterLoadDlidx(
11050 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
11060 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61   }.      if( fla
11070 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
11080 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20  UERY_DESC ){.   
11090 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
110a0 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65 72  Reverse(p, pIter
110b0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
110c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65  .  }..  /* Eithe
110d0 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 31  r:.  **.  **   1
110e0 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  ) an error has o
110f0 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20 2a 2a  ccurred, or.  **
11100 20 20 20 32 29 20 74 68 65 20 69 74 65 72 61 74     2) the iterat
11110 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
11120 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29 20 74  , or.  **   3) t
11130 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
11140 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 77  ts to an entry w
11150 69 74 68 20 74 65 72 6d 20 28 70 54 65 72 6d 2f  ith term (pTerm/
11160 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a 2a 20  nTerm), or.  ** 
11170 20 20 34 29 20 74 68 65 20 46 54 53 35 49 4e 44    4) the FTS5IND
11180 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20 66 6c  EX_QUERY_SCAN fl
11190 61 67 20 77 61 73 20 73 65 74 20 61 6e 64 20 74  ag was set and t
111a0 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
111b0 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74 6f 20  ts.  **      to 
111c0 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
111d0 74 65 72 6d 20 67 72 65 61 74 65 72 20 74 68 61  term greater tha
111e0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 28 70  n or equal to (p
111f0 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20 20 2a  Term/nTerm)..  *
11200 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  /.  assert( p->r
11210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20  c!=SQLITE_OK    
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11240 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a 20 20        /* 1 */.  
11250 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65 61 66   || pIter->pLeaf
11260 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20 20 20  ==0             
11270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11290 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c 7c 20    /* 2 */.   || 
112a0 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
112b0 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e 74 65  eBlob(&pIter->te
112c0 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d  rm, pTerm, nTerm
112d0 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20 2f 2a  )==0          /*
112e0 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62 47 65   3 */.   || (bGe
112f0 20 26 26 20 66 74 73 35 42 75 66 66 65 72 43 6f   && fts5BufferCo
11300 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72  mpareBlob(&pIter
11310 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e  ->term, pTerm, n
11320 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34 20 2a  Term)>0)  /* 4 *
11330 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  /.  );.}../*.** 
11340 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
11350 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70  bject pIter to p
11360 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65  oint to term pTe
11370 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20  rm/nTerm within 
11380 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79  the.** in-memory
11390 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49 66 20   hash table. If 
113a0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
113b0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68 61 73   term in the has
113c0 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a 2a 2a  h-table, the .**
113d0 20 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74   iterator is set
113e0 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49   to EOF..**.** I
113f0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11400 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  s, Fts5Index.rc 
11410 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70  is set to an app
11420 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
11430 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ode. If .** an e
11440 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
11450 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
11460 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11470 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
11480 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
11490 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
114a0 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46 74 73  rHashInit(.  Fts
114b0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
114d0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a  FTS5 backend */.
114e0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
114f0 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
11500 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65    /* Term to see
11510 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  k to */.  int fl
11520 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
11530 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
11540 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 58  k of FTS5INDEX_X
11550 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46 74  XX flags */.  Ft
11560 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
11570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11580 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
11590 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ate */.){.  cons
115a0 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
115b0 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d 20 30  .  int nList = 0
115c0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20  ;.  const u8 *z 
115d0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  = 0;.  int n = 0
115e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
115f0 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73 65 72  pHash );.  asser
11600 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
11610 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20 70 54  _OK );..  if( pT
11620 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  erm==0 || (flags
11630 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
11640 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20 20 20  RY_SCAN) ){.    
11650 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
11660 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
11670 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74  p->pHash, (const
11680 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54   char*)pTerm, nT
11690 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  erm);.    sqlite
116a0 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
116b0 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  ry(p->pHash, (co
116c0 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c 20 26  nst char**)&z, &
116d0 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a  pList, &nList);.
116e0 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28 69 6e      n = (z ? (in
116f0 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20  t)strlen((const 
11700 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20  char*)z) : 0);. 
11710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
11720 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
11730 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
11740 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
11750 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48  5HashQuery(p->pH
11760 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
11770 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  *)pTerm, nTerm, 
11780 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b  &pList, &nList);
11790 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a  .    z = pTerm;.
117a0 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20      n = nTerm;. 
117b0 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20   }..  if( pList 
117c0 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  ){.    Fts5Data 
117d0 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69  *pLeaf;.    sqli
117e0 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65 74  te3Fts5BufferSet
117f0 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d  (&p->rc, &pIter-
11800 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20  >term, n, z);.  
11810 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64    pLeaf = fts5Id
11820 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
11830 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20  f(Fts5Data));.  
11840 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29    if( pLeaf==0 )
11850 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65   return;.    pLe
11860 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69  af->p = (u8*)pLi
11870 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e  st;.    pLeaf->n
11880 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
11890 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70  f = nList;.    p
118a0 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c  Iter->pLeaf = pL
118b0 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  eaf;.    pIter->
118c0 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74  iLeafOffset = ft
118d0 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 65 61  s5GetVarint(pLea
118e0 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74  f->p, (u64*)&pIt
118f0 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
11900 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
11910 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e  clist = pLeaf->n
11920 6e 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  n+1;..    if( fl
11930 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
11940 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
11950 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
11960 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
11970 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
11980 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
11990 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
119a0 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
119b0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
119c0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
119d0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
119e0 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68  }../*.** Zero th
119f0 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
11a00 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
11a10 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
11a20 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
11a30 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67 49  erClear(Fts5SegI
11a40 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66  ter *pIter){.  f
11a50 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
11a60 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66  Iter->term);.  f
11a70 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70  ts5DataRelease(p
11a80 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
11a90 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
11aa0 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
11ab0 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74  );.  fts5DlidxIt
11ac0 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44  erFree(pIter->pD
11ad0 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  lidx);.  sqlite3
11ae0 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f  _free(pIter->aRo
11af0 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65  widOffset);.  me
11b00 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73  mset(pIter, 0, s
11b10 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65  izeof(Fts5SegIte
11b20 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  r));.}..#ifdef S
11b30 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a  QLITE_DEBUG../*.
11b40 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
11b50 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72 74   is used as part
11b60 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73 65   of the big asse
11b70 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20 69  rt() procedure i
11b80 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a  mplemented by.**
11b90 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
11ba0 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74 20  IterSetup(). It 
11bb0 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
11bc0 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c   result currentl
11bd0 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a  y stored.** in *
11be0 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72 72  pRes is the corr
11bf0 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  ect result of co
11c00 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72 72  mparing the curr
11c10 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  ent positions of
11c20 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72   the.** two iter
11c30 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ators..*/.static
11c40 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72 74   void fts5Assert
11c50 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
11c60 28 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  (.  Fts5IndexIte
11c70 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73  r *pIter, .  Fts
11c80 35 53 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20  5SegIter *p1,.  
11c90 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c  Fts5SegIter *p2,
11ca0 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a  .  Fts5CResult *
11cb0 70 52 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31  pRes.){.  int i1
11cc0 20 3d 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61   = p1 - pIter->a
11cd0 53 65 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20  Seg;.  int i2 = 
11ce0 70 32 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  p2 - pIter->aSeg
11cf0 3b 0a 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  ;..  if( p1->pLe
11d00 61 66 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20  af || p2->pLeaf 
11d10 29 7b 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70  ){.    if( p1->p
11d20 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
11d30 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
11d40 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20  First==i2 );.   
11d50 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70   }else if( p2->p
11d60 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
11d70 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
11d80 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
11d90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
11da0 74 20 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d  t nMin = MIN(p1-
11db0 3e 74 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72  >term.n, p2->ter
11dc0 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  m.n);.      int 
11dd0 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d  res = memcmp(p1-
11de0 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72  >term.p, p2->ter
11df0 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  m.p, nMin);.    
11e00 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
11e10 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20  es = p1->term.n 
11e20 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20  - p2->term.n;.. 
11e30 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
11e40 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
11e50 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
11e60 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
11e70 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69  ssert( p1->iRowi
11e80 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b  d!=p2->iRowid );
11e90 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
11ea0 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
11eb0 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
11ec0 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31  ->bRev) ? -1 : 1
11ed0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
11ee0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11ef0 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
11f00 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
11f10 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
11f20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
11f30 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
11f40 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11f50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11f60 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
11f70 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
11f80 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
11f90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11fa0 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
11fb0 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
11fc0 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73  efined when this
11fd0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f   module.** is co
11fe0 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20  mpiled. In that 
11ff0 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  case, this funct
12000 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c  ion is essential
12010 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a  ly an assert() .
12020 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  ** statement use
12030 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
12040 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
12050 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
12060 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  st[] array.** ar
12070 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  e correct..*/.st
12080 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
12090 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
120a0 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  up(Fts5Index *p,
120b0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
120c0 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
120d0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
120e0 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
120f0 72 20 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74  r *pFirst = &pIt
12100 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
12110 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
12120 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ];.    int i;.
12130 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 46  .    assert( (pF
12140 69 72 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d  irst->pLeaf==0)=
12150 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a  =pIter->bEof );.
12160 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
12170 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  at pIter->iSwitc
12180 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f  hRowid is set co
12190 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
121a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
121b0 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
121c0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
121d0 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
121e0 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  eg[i];.      ass
121f0 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20  ert( p1==pFirst 
12200 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
12210 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20  1->pLeaf==0 .   
12220 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42          || fts5B
12230 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46  ufferCompare(&pF
12240 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d  irst->term, &p1-
12250 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20  >term) .        
12260 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64     || p1->iRowid
12270 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
12280 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  Rowid.          
12290 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c   || (p1->iRowid<
122a0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
122b0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
122c0 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  v.      );.    }
122d0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
122e0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
122f0 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
12300 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
12310 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
12320 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
12330 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
12340 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46  eg[i+1];.      F
12350 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
12360 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
12370 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b  t[(pIter->nSeg +
12380 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20   i) / 2];.      
12390 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
123a0 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
123b0 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
123c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
123d0 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e  i=1; i<(pIter->n
123e0 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b  Seg / 2); i+=2){
123f0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
12400 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
12410 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
12420 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74  irst[i*2].iFirst
12430 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ];.      Fts5Se
12440 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
12450 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
12460 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69  >aFirst[i*2+1].i
12470 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
12480 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
12490 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
124a0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  t[i];.      fts5
124b0 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
124c0 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
124d0 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
124e0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
124f0 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65   define fts5Asse
12500 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
12510 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
12520 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61  .** Do the compa
12530 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20  rison necessary 
12540 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65  to populate pIte
12550 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e  r->aFirst[iOut].
12560 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
12570 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
12580 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
12590 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
125a0 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  f an entry.** in
125b0 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67   the pIter->aSeg
125c0 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73  [] array that is
125d0 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c   (a) not at EOF,
125e0 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e   and (b) pointin
125f0 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68  g.** to a key th
12600 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  at is a duplicat
12610 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69  e of another, hi
12620 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a  gher priority, .
12630 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61  ** segment-itera
12640 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d  tor in the pSeg-
12650 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aSeg[] array..*
12660 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
12670 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
12680 61 72 65 28 46 74 73 35 49 6e 64 65 78 49 74 65  are(Fts5IndexIte
12690 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f  r *pIter, int iO
126a0 75 74 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20  ut){.  int i1;  
126b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
126d0 6f 66 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73  of left-hand Fts
126e0 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e  5SegIter */.  in
126f0 74 20 69 32 3b 20 20 20 20 20 20 20 20 20 20 20  t i2;           
12700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12710 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d   Index of right-
12720 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72  hand Fts5SegIter
12730 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a   */.  int iRes;.
12740 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
12750 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
12760 20 20 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46    /* Left-hand F
12770 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
12780 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b  Fts5SegIter *p2;
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 2f 2a 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74  /* Right-hand Ft
127b0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46  s5SegIter */.  F
127c0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
127d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
127e0 74 5b 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65  t[iOut];..  asse
127f0 72 74 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e  rt( iOut<pIter->
12800 6e 53 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29  nSeg && iOut>0 )
12810 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
12820 72 2d 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49  r->bRev==0 || pI
12830 74 65 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a  ter->bRev==1 );.
12840 0a 20 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49  .  if( iOut>=(pI
12850 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a  ter->nSeg/2) ){.
12860 20 20 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d      i1 = (iOut -
12870 20 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20   pIter->nSeg/2) 
12880 2a 20 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31  * 2;.    i2 = i1
12890 20 2b 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   + 1;.  }else{. 
128a0 20 20 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61     i1 = pIter->a
128b0 46 69 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46  First[iOut*2].iF
128c0 69 72 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70  irst;.    i2 = p
128d0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
128e0 74 2a 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  t*2+1].iFirst;. 
128f0 20 7d 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72   }.  p1 = &pIter
12900 2d 3e 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32  ->aSeg[i1];.  p2
12910 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
12920 69 32 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54  i2];..  pRes->bT
12930 65 72 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28  ermEq = 0;.  if(
12940 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
12950 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
12960 20 70 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p1 is at EOF */
12970 0a 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a  .    iRes = i2;.
12980 20 20 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e    }else if( p2->
12990 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
129a0 2f 2a 20 49 66 20 70 32 20 69 73 20 61 74 20 45  /* If p2 is at E
129b0 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
129c0 20 69 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   i1;.  }else{.  
129d0 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35    int res = fts5
129e0 42 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70  BufferCompare(&p
129f0 31 2d 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65  1->term, &p2->te
12a00 72 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73  rm);.    if( res
12a10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
12a20 65 72 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20  ert( i2>i1 );.  
12a30 20 20 20 20 61 73 73 65 72 74 28 20 69 32 21 3d      assert( i2!=
12a40 30 20 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d  0 );.      pRes-
12a50 3e 62 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20  >bTermEq = 1;.  
12a60 20 20 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77      if( p1->iRow
12a70 69 64 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29  id==p2->iRowid )
12a80 7b 0a 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44  {.        p1->bD
12a90 65 6c 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20  el = p2->bDel;. 
12aa0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 32         return i2
12ab0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12ac0 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77  res = ((p1->iRow
12ad0 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29  id > p2->iRowid)
12ae0 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f  ==pIter->bRev) ?
12af0 20 2d 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a   -1 : +1;.    }.
12b00 20 20 20 20 61 73 73 65 72 74 28 20 72 65 73 21      assert( res!
12b10 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65  =0 );.    if( re
12b20 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65  s<0 ){.      iRe
12b30 73 20 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73  s = i1;.    }els
12b40 65 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20  e{.      iRes = 
12b50 69 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  i2;.    }.  }.. 
12b60 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
12b70 28 75 31 36 29 69 52 65 73 3b 0a 20 20 72 65 74  (u16)iRes;.  ret
12b80 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12b90 4d 6f 76 65 20 74 68 65 20 73 65 67 2d 69 74 65  Move the seg-ite
12ba0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
12bb0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
12bc0 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 69   rowid on page i
12bd0 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a 20 49 74 20  LeafPgno..** It 
12be0 69 73 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6c  is an error if l
12bf0 65 61 66 20 69 4c 65 61 66 50 67 6e 6f 20 64 6f  eaf iLeafPgno do
12c00 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
12c10 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 72 6f 77 69  contains no rowi
12c20 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
12c30 69 64 20 66 74 73 35 53 65 67 49 74 65 72 47 6f  id fts5SegIterGo
12c40 74 6f 50 61 67 65 28 0a 20 20 46 74 73 35 49 6e  toPage(.  Fts5In
12c50 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
12c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
12c70 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
12c80 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
12c90 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
12ca0 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
12cb0 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
12cc0 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 0a    int iLeafPgno.
12cd0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 4c 65  ){.  assert( iLe
12ce0 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c  afPgno>pIter->iL
12cf0 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 69 66  eafPgno );..  if
12d00 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
12d10 72 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  r->pSeg->pgnoLas
12d20 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  t ){.    p->rc =
12d30 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
12d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
12d50 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65  DataRelease(pIte
12d60 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20  r->pNextLeaf);. 
12d70 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
12d80 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 70 49 74  eaf = 0;.    pIt
12d90 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20  er->iLeafPgno = 
12da0 69 4c 65 61 66 50 67 6e 6f 2d 31 3b 0a 20 20 20  iLeafPgno-1;.   
12db0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
12dc0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
12dd0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
12de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
12df0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
12e00 3d 3d 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ==iLeafPgno );..
12e10 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
12e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12e30 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
12e40 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d    u8 *a = pIter-
12e50 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20  >pLeaf->p;.     
12e60 20 69 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e   int n = pIter->
12e70 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
12e80 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
12e90 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
12ea0 66 66 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  ff(pIter->pLeaf)
12eb0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66 66  ;.      if( iOff
12ec0 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b  <4 || iOff>=n ){
12ed0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
12ee0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
12ef0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
12f00 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
12f10 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
12f20 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  f], (u64*)&pIter
12f30 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
12f40 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
12f50 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
12f60 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12f70 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
12f80 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
12f90 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
12fa0 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72  Advance the iter
12fb0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
12fc0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12fd0 6e 74 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61  nt until it is a
12fe0 74 20 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f  t or .** past ro
12ff0 77 69 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72  wid iFrom. Regar
13000 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
13010 75 65 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65  ue of iFrom, the
13020 20 69 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20   iterator is.** 
13030 61 6c 77 61 79 73 20 61 64 76 61 6e 63 65 64 20  always advanced 
13040 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a  at least once..*
13050 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13060 73 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f  s5SegIterNextFro
13070 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
13080 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
13090 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
130a0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
130b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
130c0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
130d0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
130e0 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34  advance */.  i64
130f0 20 69 4d 61 74 63 68 20 20 20 20 20 20 20 20 20   iMatch         
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13110 41 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72  Advance iterator
13120 20 61 74 20 6c 65 61 73 74 20 74 68 69 73 20 66   at least this f
13130 61 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62  ar */.){.  int b
13140 52 65 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c  Rev = (pIter->fl
13150 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
13160 45 52 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46  ER_REVERSE);.  F
13170 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
13180 6c 69 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44  lidx = pIter->pD
13190 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61  lidx;.  int iLea
131a0 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
131b0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
131c0 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73  bMove = 1;..  as
131d0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
131e0 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
131f0 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61  R_ONETERM );.  a
13200 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44  ssert( pIter->pD
13210 6c 69 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74  lidx );.  assert
13220 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
13230 3b 0a 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30  ;..  if( bRev==0
13240 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   ){.    while( !
13250 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
13260 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
13270 4d 61 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49  Match>fts5DlidxI
13280 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
13290 20 29 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50   ){.      iLeafP
132a0 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
132b0 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
132c0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
132d0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
132e0 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  dx);.    }.    a
132f0 73 73 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50  ssert_nc( iLeafP
13300 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno>=pIter->iLea
13310 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29  fPgno || p->rc )
13320 3b 0a 20 20 20 20 69 66 28 20 69 4c 65 61 66 50  ;.    if( iLeafP
13330 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66  gno>pIter->iLeaf
13340 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74  Pgno ){.      ft
13350 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
13360 65 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61  e(p, pIter, iLea
13370 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d  fPgno);.      bM
13380 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ove = 0;.    }. 
13390 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
133a0 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  rt( pIter->pNext
133b0 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61  Leaf==0 );.    a
133c0 73 73 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49  ssert( iMatch<pI
133d0 74 65 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  ter->iRowid );. 
133e0 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
133f0 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13400 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
13410 3c 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  <fts5DlidxIterRo
13420 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
13430 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
13440 65 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78  erPrev(p, pDlidx
13450 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65  );.    }.    iLe
13460 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69  afPgno = fts5Dli
13470 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
13480 78 29 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  x);..    assert(
13490 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
134a0 66 28 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20  f(p, pDlidx) || 
134b0 69 4c 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72  iLeafPgno<=pIter
134c0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
134d0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
134e0 6f 3c 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o<pIter->iLeafPg
134f0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  no ){.      pIte
13500 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69  r->iLeafPgno = i
13510 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20  LeafPgno+1;.    
13520 20 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76    fts5SegIterRev
13530 65 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70  erseNewPage(p, p
13540 49 74 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f  Iter);.      bMo
13550 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ve = 0;.    }.  
13560 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 66 28  }..  do{.    if(
13570 20 62 4d 6f 76 65 20 29 20 66 74 73 35 53 65 67   bMove ) fts5Seg
13580 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
13590 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  r, 0);.    if( p
135a0 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
135b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20   break;.    if( 
135c0 62 52 65 76 3d 3d 30 20 26 26 20 70 49 74 65 72  bRev==0 && pIter
135d0 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  ->iRowid>=iMatch
135e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
135f0 28 20 62 52 65 76 21 3d 30 20 26 26 20 70 49 74  ( bRev!=0 && pIt
13600 65 72 2d 3e 69 52 6f 77 69 64 3c 3d 69 4d 61 74  er->iRowid<=iMat
13610 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
13620 62 4d 6f 76 65 20 3d 20 31 3b 0a 20 20 7d 77 68  bMove = 1;.  }wh
13630 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
13640 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  TE_OK );.}.../*.
13650 2a 2a 20 46 72 65 65 20 74 68 65 20 69 74 65 72  ** Free the iter
13660 61 74 6f 72 20 6f 62 6a 65 63 74 20 70 61 73 73  ator object pass
13670 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
13680 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
13690 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
136a0 6c 74 69 49 74 65 72 46 72 65 65 28 46 74 73 35  ltiIterFree(Fts5
136b0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e  Index *p, Fts5In
136c0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
136d0 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
136e0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
136f0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
13700 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
13710 20 20 20 66 74 73 35 53 65 67 49 74 65 72 43 6c     fts5SegIterCl
13720 65 61 72 28 26 70 49 74 65 72 2d 3e 61 53 65 67  ear(&pIter->aSeg
13730 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
13740 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
13750 65 61 73 65 28 70 49 74 65 72 2d 3e 70 53 74 72  ease(pIter->pStr
13760 75 63 74 29 3b 0a 20 20 20 20 66 74 73 35 42 75  uct);.    fts5Bu
13770 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
13780 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73  >poslist);.    s
13790 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65  qlite3_free(pIte
137a0 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  r);.  }.}..stati
137b0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
137c0 49 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20  IterAdvanced(.  
137d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
137e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
137f0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
13800 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
13810 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  n */.  Fts5Index
13820 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
13830 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13840 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
13850 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
13860 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
13870 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
13880 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13890 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
138a0 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20  st advanced */. 
138b0 20 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20   int iMinset    
138c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
138d0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72   /* Minimum entr
138e0 79 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f  y in aFirst[] to
138f0 20 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   set */.){.  int
13900 20 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74   i;.  for(i=(pIt
13910 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
13920 64 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74  d)/2; i>=iMinset
13930 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   && p->rc==SQLIT
13940 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20  E_OK; i=i/2){.  
13950 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69    int iEq;.    i
13960 66 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75  f( (iEq = fts5Mu
13970 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65  ltiIterDoCompare
13980 28 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20  (pIter, i)) ){. 
13990 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
139a0 4e 65 78 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  Next(p, &pIter->
139b0 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20  aSeg[iEq], 0);. 
139c0 20 20 20 20 20 69 20 3d 20 70 49 74 65 72 2d 3e       i = pIter->
139d0 6e 53 65 67 20 2b 20 69 45 71 3b 0a 20 20 20 20  nSeg + iEq;.    
139e0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  }.  }.}../*.** S
139f0 75 62 2d 69 74 65 72 61 74 6f 72 20 69 43 68 61  ub-iterator iCha
13a00 6e 67 65 64 20 6f 66 20 69 74 65 72 61 74 6f 72  nged of iterator
13a10 20 70 49 74 65 72 20 68 61 73 20 6a 75 73 74 20   pIter has just 
13a20 62 65 65 6e 20 61 64 76 61 6e 63 65 64 2e 20 49  been advanced. I
13a30 74 20 73 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  t still.** point
13a40 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74 65  s to the same te
13a50 72 6d 20 74 68 6f 75 67 68 20 2d 20 6a 75 73 74  rm though - just
13a60 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
13a70 69 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  id. This functio
13a80 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  n.** attempts to
13a90 20 75 70 64 61 74 65 20 74 68 65 20 63 6f 6e 74   update the cont
13aa0 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49 74 65  ents of the pIte
13ab0 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 63 63 6f  r->aFirst[] acco
13ac0 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69  rdingly..** If i
13ad0 74 20 64 6f 65 73 20 73 6f 20 73 75 63 63 65 73  t does so succes
13ae0 73 66 75 6c 6c 79 2c 20 30 20 69 73 20 72 65 74  sfully, 0 is ret
13af0 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
13b00 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e   1..**.** If non
13b10 2d 7a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65  -zero is returne
13b20 64 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68  d, the caller sh
13b30 6f 75 6c 64 20 63 61 6c 6c 20 66 74 73 35 4d 75  ould call fts5Mu
13b40 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
13b50 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 69 74 65 72  ).** on the iter
13b60 61 74 6f 72 20 69 6e 73 74 65 61 64 2e 20 54 68  ator instead. Th
13b70 61 74 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  at function does
13b80 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 69   the same as thi
13b90 73 20 6f 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a  s one, except.**
13ba0 20 74 68 61 74 20 69 74 20 64 65 61 6c 73 20 77   that it deals w
13bb0 69 74 68 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63  ith more complic
13bc0 61 74 65 64 20 63 61 73 65 73 20 61 73 20 77 65  ated cases as we
13bd0 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ll..*/ .static i
13be0 6e 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  nt fts5MultiIter
13bf0 41 64 76 61 6e 63 65 52 6f 77 69 64 28 0a 20 20  AdvanceRowid(.  
13c00 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
13c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
13c30 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
13c40 6e 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78  n */.  Fts5Index
13c50 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
13c60 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
13c70 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
13c80 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
13c90 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
13ca0 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
13cb0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
13cc0 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
13cd0 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 29  st advanced */.)
13ce0 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
13cf0 2a 70 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e  *pNew = &pIter->
13d00 61 53 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a  aSeg[iChanged];.
13d10 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f  .  if( pNew->iRo
13d20 77 69 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69  wid==pIter->iSwi
13d30 74 63 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28  tchRowid.   || (
13d40 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74  pNew->iRowid<pIt
13d50 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13d60 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20  )==pIter->bRev. 
13d70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13d80 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
13d90 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
13da0 3e 61 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e  >aSeg[iChanged ^
13db0 20 30 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49   0x0001];.    pI
13dc0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13dd0 64 20 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20  d = pIter->bRev 
13de0 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
13df0 20 3a 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34   : LARGEST_INT64
13e00 3b 0a 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74  ;.    for(i=(pIt
13e10 65 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65  er->nSeg+iChange
13e20 64 29 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b  d)/2; 1; i=i/2){
13e30 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73 75  .      Fts5CResu
13e40 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65  lt *pRes = &pIte
13e50 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20  r->aFirst[i];.. 
13e60 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65       assert( pNe
13e70 77 2d 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20  w->pLeaf );.    
13e80 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13e90 62 54 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f  bTermEq==0 || pO
13ea0 74 68 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a  ther->pLeaf );..
13eb0 20 20 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e        if( pRes->
13ec0 62 54 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20  bTermEq ){.     
13ed0 20 20 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f     if( pNew->iRo
13ee0 77 69 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f  wid==pOther->iRo
13ef0 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
13f00 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
13f10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f     }else if( (pO
13f20 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65  ther->iRowid>pNe
13f30 77 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  w->iRowid)==pIte
13f40 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
13f50 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69       pIter->iSwi
13f60 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65  tchRowid = pOthe
13f70 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
13f80 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68       pNew = pOth
13f90 65 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  er;.        }els
13fa0 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69  e if( (pOther->i
13fb0 52 6f 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77  Rowid>pIter->iSw
13fc0 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
13fd0 72 2d 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20  r->bRev ){.     
13fe0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69       pIter->iSwi
13ff0 74 63 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65  tchRowid = pOthe
14000 72 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  r->iRowid;.     
14010 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14020 20 20 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20     pRes->iFirst 
14030 3d 20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70  = (u16)(pNew - p
14040 49 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20  Iter->aSeg);.   
14050 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72     if( i==1 ) br
14060 65 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68  eak;..      pOth
14070 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  er = &pIter->aSe
14080 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
14090 5b 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69  [i ^ 0x0001].iFi
140a0 72 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  rst ];.    }.  }
140b0 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
140c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
140d0 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61  Iter->bEof varia
140e0 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ble based on the
140f0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75   state of the su
14100 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a  b-iterators..*/.
14110 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14120 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28  MultiIterSetEof(
14130 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
14140 49 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67  Iter){.  Fts5Seg
14150 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
14160 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
14170 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
14180 73 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62  st ];.  pIter->b
14190 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61  Eof = pSeg->pLea
141a0 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69  f==0;.  pIter->i
141b0 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53  SwitchRowid = pS
141c0 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  eg->iRowid;.}../
141d0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
141e0 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
141f0 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a  xt entry. .**.**
14200 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
14210 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
14220 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74  de is left in Ft
14230 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69  s5Index.rc. It i
14240 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64  s not .** consid
14250 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
14260 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
14270 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66  aches EOF, or if
14280 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61   it is already a
14290 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74  t .** EOF when t
142a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
142b0 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
142c0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
142d0 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35  IterNext(.  Fts5
142e0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
142f0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
14300 72 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20  r,.  int bFrom, 
14310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14320 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
14330 61 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69  argument iFrom i
14340 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34  s valid */.  i64
14350 20 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20   iFrom          
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14370 41 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74  Advance at least
14380 20 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20   as far as this 
14390 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
143a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
143b0 20 20 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d      int bUseFrom
143c0 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20 64 6f   = bFrom;.    do
143d0 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69   {.      int iFi
143e0 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69  rst = pIter->aFi
143f0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  rst[1].iFirst;. 
14400 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72       int bNewTer
14410 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73  m = 0;.      Fts
14420 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
14430 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46   &pIter->aSeg[iF
14440 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73  irst];.      ass
14450 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
14460 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69  TE_OK );.      i
14470 66 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70  f( bUseFrom && p
14480 53 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20  Seg->pDlidx ){. 
14490 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
144a0 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53  erNextFrom(p, pS
144b0 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20  eg, iFrom);.    
144c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
144d0 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
144e0 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54  (p, pSeg, &bNewT
144f0 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  erm);.      }.. 
14500 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70       if( pSeg->p
14510 4c 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54  Leaf==0 || bNewT
14520 65 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66  erm .       || f
14530 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61  ts5MultiIterAdva
14540 6e 63 65 52 6f 77 69 64 28 70 2c 20 70 49 74 65  nceRowid(p, pIte
14550 72 2c 20 69 46 69 72 73 74 29 0a 20 20 20 20 20  r, iFirst).     
14560 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
14570 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
14580 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72  d(p, pIter, iFir
14590 73 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  st, 1);.        
145a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
145b0 45 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20  Eof(pIter);.    
145c0 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73    }.      fts5As
145d0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
145e0 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20  up(p, pIter);.. 
145f0 20 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20       bUseFrom = 
14600 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  0;.    }while( p
14610 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79  Iter->bSkipEmpty
14620 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
14630 72 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65  rIsEmpty(p, pIte
14640 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  r) );.  }.}..sta
14650 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
14660 74 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46  tiIterNext2(.  F
14670 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
14680 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
14690 49 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e  Iter,.  int *pbN
146a0 65 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20  ewTerm          
146b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
146c0 54 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20  True if *might* 
146d0 62 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29  be new term */.)
146e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  {.  assert( pIte
146f0 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b  r->bSkipEmpty );
14700 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
14710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
14720 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46  o {.      int iF
14730 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46  irst = pIter->aF
14740 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a  irst[1].iFirst;.
14750 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65        Fts5SegIte
14760 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
14770 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a  ->aSeg[iFirst];.
14780 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65        int bNewTe
14790 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66  rm = 0;..      f
147a0 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70  ts5SegIterNext(p
147b0 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72  , pSeg, &bNewTer
147c0 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  m);.      if( pS
147d0 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
147e0 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20  bNewTerm .      
147f0 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
14800 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c  rAdvanceRowid(p,
14810 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a   pIter, iFirst).
14820 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
14830 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
14840 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
14850 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
14860 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
14870 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b  erSetEof(pIter);
14880 0a 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54  .        *pbNewT
14890 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  erm = 1;.      }
148a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70  else{.        *p
148b0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
148c0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
148d0 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
148e0 65 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a  etup(p, pIter);.
148f0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73  .    }while( fts
14900 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74  5MultiIterIsEmpt
14910 79 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20  y(p, pIter) );. 
14920 20 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 46 74   }.}...static Ft
14930 73 35 49 6e 64 65 78 49 74 65 72 20 2a 66 74 73  s5IndexIter *fts
14940 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
14950 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14970 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
14980 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
14990 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  thin */.  int nS
149a0 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  eg.){.  Fts5Inde
149b0 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69  xIter *pNew;.  i
149c0 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20  nt nSlot;       
149d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
149e0 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e  * Power of two >
149f0 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72  = nSeg */..  for
14a00 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c  (nSlot=2; nSlot<
14a10 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f  nSeg; nSlot=nSlo
14a20 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66  t*2);.  pNew = f
14a30 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
14a40 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74  .      sizeof(Ft
14a50 73 35 49 6e 64 65 78 49 74 65 72 29 20 2b 20 20  s5IndexIter) +  
14a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e             /* pN
14a70 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65  ew */.      size
14a80 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20  of(Fts5SegIter) 
14a90 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20  * (nSlot-1) +   
14aa0 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20  /* pNew->aSeg[] 
14ab0 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  */.      sizeof(
14ac0 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e  Fts5CResult) * n
14ad0 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20  Slot         /* 
14ae0 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a  pNew->aFirst[] *
14af0 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  /.  );.  if( pNe
14b00 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  w ){.    pNew->n
14b10 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20  Seg = nSlot;.   
14b20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20   pNew->aFirst = 
14b30 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70  (Fts5CResult*)&p
14b40 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d  New->aSeg[nSlot]
14b50 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64  ;.    pNew->pInd
14b60 65 78 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 65  ex = p;.  }.  re
14b70 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
14b80 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e  .** Allocate a n
14b90 65 77 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  ew Fts5IndexIter
14ba0 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54   object..**.** T
14bb0 68 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69  he new object wi
14bc0 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74  ll be used to it
14bd0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61  erate through da
14be0 74 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20  ta in structure 
14bf0 70 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69  pStruct..** If i
14c00 4c 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68  Level is -ve, th
14c10 65 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61  en all data in a
14c20 6c 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d  ll segments is m
14c30 65 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c  erged. Or, if iL
14c40 65 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20  evel.** is zero 
14c50 6f 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61  or greater, data
14c60 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
14c70 6e 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74  nSegment segment
14c80 73 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65  s on level iLeve
14c90 6c 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a  l.** is merged..
14ca0 2a 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74  **.** The iterat
14cb0 6f 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69  or initially poi
14cc0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
14cd0 20 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72   term/rowid entr
14ce0 79 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65  y in the .** ite
14cf0 72 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73  rated data..*/.s
14d00 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14d10 75 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46  ultiIterNew(.  F
14d20 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14d40 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
14d50 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
14d60 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
14d70 75 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20  ure *pStruct,   
14d80 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75        /* Structu
14d90 72 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69  re of specific i
14da0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53  ndex */.  int bS
14db0 6b 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20 20  kipEmpty,       
14dc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
14dd0 65 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65  e to ignore dele
14de0 74 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74  te-keys */.  int
14df0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14e10 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
14e20 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  XXX flags */.  c
14e30 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
14e40 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f  int nTerm,     /
14e50 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74  * Term to seek t
14e60 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f  o (or NULL/0) */
14e70 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20  .  int iLevel,  
14e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e90 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69     /* Level to i
14ea0 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61  terate (-1 for a
14eb0 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  ll) */.  int nSe
14ec0 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  gment,          
14ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14ee0 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74  er of segments t
14ef0 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e  o merge (iLevel>
14f00 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  =0) */.  Fts5Ind
14f10 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  exIter **ppOut  
14f20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
14f30 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
14f40 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20  nt nSeg = 0;    
14f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14f60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
14f70 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65  ent-iters in use
14f80 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20   */.  int iIter 
14f90 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
14fa0 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e        /* */.  in
14fb0 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20  t iSeg;         
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14fd0 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
14fe0 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74   through segment
14ff0 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
15000 72 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b  r buf = {0,0,0};
15010 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
15020 20 75 73 65 64 20 62 79 20 66 74 73 35 53 65 67   used by fts5Seg
15030 49 74 65 72 53 65 65 6b 49 6e 69 74 28 29 20 2a  IterSeekInit() *
15040 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
15050 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20  eLevel *pLvl;.  
15060 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
15070 4e 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  New;..  assert( 
15080 28 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65  (pTerm==0 && nTe
15090 72 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c  rm==0) || iLevel
150a0 3c 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  <0 );..  /* Allo
150b0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
150c0 68 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67  he new multi-seg
150d0 2d 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20  -iterator. */.  
150e0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
150f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
15100 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
15110 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
15120 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73  t->nSegment==fts
15130 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53  5StructureCountS
15140 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29  egments(pStruct)
15150 20 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d   );.      nSeg =
15160 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
15170 6e 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b  nt;.      nSeg +
15180 3d 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20  = (p->pHash ? 1 
15190 3a 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  : 0);.    }else{
151a0 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49  .      nSeg = MI
151b0 4e 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  N(pStruct->aLeve
151c0 6c 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20  l[iLevel].nSeg, 
151d0 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d  nSegment);.    }
151e0 0a 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20  .  }.  *ppOut = 
151f0 70 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69  pNew = fts5Multi
15200 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65  IterAlloc(p, nSe
15210 67 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d  g);.  if( pNew==
15220 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e  0 ) return;.  pN
15230 65 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28  ew->bRev = (0!=(
15240 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
15250 58 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a  X_QUERY_DESC));.
15260 20 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70    pNew->bSkipEmp
15270 74 79 20 3d 20 28 75 38 29 62 53 6b 69 70 45 6d  ty = (u8)bSkipEm
15280 70 74 79 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 74  pty;.  pNew->pSt
15290 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a  ruct = pStruct;.
152a0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
152b0 65 66 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20  ef(pStruct);..  
152c0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 65 61  /* Initialize ea
152d0 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 6e  ch of the compon
152e0 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74 65 72  ent segment iter
152f0 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ators. */.  if( 
15300 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20  iLevel<0 ){.    
15310 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
15320 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53 74 72  el *pEnd = &pStr
15330 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  uct->aLevel[pStr
15340 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
15350 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29    if( p->pHash )
15360 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61  {.      /* Add a
15370 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f   segment iterato
15380 72 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  r for the curren
15390 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
153a0 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  e hash table. */
153b0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
153c0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
153d0 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
153e0 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49  ;.      fts5SegI
153f0 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c 20 70  terHashInit(p, p
15400 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61  Term, nTerm, fla
15410 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  gs, pIter);.    
15420 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26  }.    for(pLvl=&
15430 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
15440 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70  0]; pLvl<pEnd; p
15450 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f  Lvl++){.      fo
15460 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e 53 65  r(iSeg=pLvl->nSe
15470 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53  g-1; iSeg>=0; iS
15480 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 46  eg--){.        F
15490 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
154a0 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76  ent *pSeg = &pLv
154b0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20  l->aSeg[iSeg];. 
154c0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
154d0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
154e0 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
154f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
15500 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  erm==0 ){.      
15510 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
15520 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49 74  nit(p, pSeg, pIt
15530 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  er);.        }el
15540 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74  se{.          ft
15550 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69  s5SegIterSeekIni
15560 74 28 70 2c 20 26 62 75 66 2c 20 70 54 65 72 6d  t(p, &buf, pTerm
15570 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
15580 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20  pSeg, pIter);.  
15590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
155a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
155b0 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
155c0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65  ct->aLevel[iLeve
155d0 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67  l];.    for(iSeg
155e0 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30  =nSeg-1; iSeg>=0
155f0 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20  ; iSeg--){.     
15600 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74   fts5SegIterInit
15610 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  (p, &pLvl->aSeg[
15620 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e 61 53  iSeg], &pNew->aS
15630 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a 20 20  eg[iIter++]);.  
15640 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
15650 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20 29 3b  ( iIter==nSeg );
15660 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
15670 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ove was successf
15680 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  ul, each compone
15690 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77  nt iterators now
156a0 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f   points .  ** to
156b0 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
156c0 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e   in its segment.
156d0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
156e0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20  itialize the .  
156f0 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
15700 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  y. Or, if an err
15710 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
15720 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74   free the iterat
15730 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61  or.  ** object a
15740 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  nd set the outpu
15750 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
15760 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LL.  */.  if( p-
15770 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15780 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d  {.    for(iIter=
15790 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49  pNew->nSeg-1; iI
157a0 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b  ter>0; iIter--){
157b0 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  .      int iEq;.
157c0 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d        if( (iEq =
157d0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
157e0 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49  Compare(pNew, iI
157f0 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ter)) ){.       
15800 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
15810 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  (p, &pNew->aSeg[
15820 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
15830 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
15840 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65 77 2c  dvanced(p, pNew,
15850 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a 20 20   iEq, iIter);.  
15860 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15870 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
15880 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 66  Eof(pNew);.    f
15890 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
158a0 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65 77 29  erSetup(p, pNew)
158b0 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65 77 2d  ;..    if( pNew-
158c0 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26 20 66  >bSkipEmpty && f
158d0 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45 6d  ts5MultiIterIsEm
158e0 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29 7b 0a  pty(p, pNew) ){.
158f0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
15900 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65 77 2c  terNext(p, pNew,
15910 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
15920 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d  }else{.    fts5M
15930 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20  ultiIterFree(p, 
15940 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f 75  pNew);.    *ppOu
15950 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 74 73  t = 0;.  }.  fts
15960 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
15970 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  );.}../*.** Crea
15980 74 65 20 61 6e 20 46 74 73 35 49 6e 64 65 78 49  te an Fts5IndexI
15990 74 65 72 20 74 68 61 74 20 69 74 65 72 61 74 65  ter that iterate
159a0 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f  s through the do
159b0 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a  clist provided.*
159c0 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  * as the second 
159d0 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
159e0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
159f0 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74  tiIterNew2(.  Ft
15a00 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
15a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15a20 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
15a30 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
15a40 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  */.  Fts5Data *p
15a50 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
15a60 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20       /* Doclist 
15a70 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
15a80 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  gh */.  int bDes
15a90 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
15aa0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
15ab0 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72  for descending r
15ac0 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20  owid order */.  
15ad0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a  Fts5IndexIter **
15ae0 70 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20  ppOut           
15af0 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
15b00 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  .){.  Fts5IndexI
15b10 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  ter *pNew;.  pNe
15b20 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  w = fts5MultiIte
15b30 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20  rAlloc(p, 2);.  
15b40 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
15b50 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
15b60 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  er = &pNew->aSeg
15b70 5b 31 5d 3b 0a 0a 20 20 20 20 70 4e 65 77 2d 3e  [1];..    pNew->
15b80 62 46 69 6c 74 65 72 65 64 20 3d 20 31 3b 0a 20  bFiltered = 1;. 
15b90 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
15ba0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
15bb0 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
15bc0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20  pData->szLeaf>0 
15bd0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
15be0 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  pLeaf = pData;. 
15bf0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
15c00 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
15c10 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70  tVarint(pData->p
15c20 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
15c30 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70  iRowid);.      p
15c40 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
15c50 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b  ist = pData->nn;
15c60 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69  .      pNew->aFi
15c70 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20  rst[1].iFirst = 
15c80 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65  1;.      if( bDe
15c90 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  sc ){.        pN
15ca0 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20  ew->bRev = 1;.  
15cb0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
15cc0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
15cd0 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
15ce0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
15cf0 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
15d00 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
15d10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
15d20 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
15d30 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
15d40 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74      }.      pDat
15d50 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
15d60 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 45  {.      pNew->bE
15d70 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  of = 1;.    }.. 
15d80 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77     *ppOut = pNew
15d90 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74  ;.  }..  fts5Dat
15da0 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
15db0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15dc0 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
15dd0 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f 46 20  rator is at EOF 
15de0 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68  or if an error h
15df0 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a  as occurred. .**
15e00 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   False otherwise
15e10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15e20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
15e30 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
15e40 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
15e50 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
15e60 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c 7c 20  p->rc .      || 
15e70 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  (pIter->aSeg[ pI
15e80 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
15e90 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30  First ].pLeaf==0
15ea0 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66 20 0a  )==pIter->bEof .
15eb0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70    );.  return (p
15ec0 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62  ->rc || pIter->b
15ed0 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Eof);.}../*.** R
15ee0 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69 64 20  eturn the rowid 
15ef0 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  of the entry tha
15f00 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
15f10 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a  urrently points.
15f20 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20 69 74  ** to. If the it
15f30 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f  erator points to
15f40 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
15f50 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15f60 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73  d the.** results
15f70 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a   are undefined..
15f80 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 66 74  */.static i64 ft
15f90 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64  s5MultiIterRowid
15fa0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
15fb0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
15fc0 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  ( pIter->aSeg[ p
15fd0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
15fe0 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 20 29  iFirst ].pLeaf )
15ff0 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ;.  return pIter
16000 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
16010 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
16020 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  ].iRowid;.}../*.
16030 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65 72  ** Move the iter
16040 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ator to the next
16050 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66 6f 6c   entry at or fol
16060 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a  lowing iMatch..*
16070 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
16080 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46  s5MultiIterNextF
16090 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rom(.  Fts5Index
160a0 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65   *p, .  Fts5Inde
160b0 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20  xIter *pIter, . 
160c0 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20   i64 iMatch.){. 
160d0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
160e0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
160f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
16100 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31 2c 20  xt(p, pIter, 1, 
16110 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69 66 28  iMatch);.    if(
16120 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
16130 66 28 70 2c 20 70 49 74 65 72 29 20 29 20 62 72  f(p, pIter) ) br
16140 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69 64 20  eak;.    iRowid 
16150 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
16160 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
16170 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76   if( pIter->bRev
16180 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e 3d 69  ==0 && iRowid>=i
16190 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
161a0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
161b0 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69 64 3c  ev!=0 && iRowid<
161c0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
161d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
161e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
161f0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
16200 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d 20 61  ining the term a
16210 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
16220 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61  he .** entry tha
16230 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 63  t the iterator c
16240 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
16250 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  to..*/.static co
16260 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75 6c 74  nst u8 *fts5Mult
16270 69 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  iIterTerm(Fts5In
16280 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
16290 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35  int *pn){.  Fts5
162a0 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26 70 49  SegIter *p = &pI
162b0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
162c0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
162d0 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d  st ];.  *pn = p-
162e0 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72  >term.n;.  retur
162f0 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a  n p->term.p;.}..
16300 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
16310 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a 20 20  ChunkIterate(.  
16320 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
16330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16340 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63 74 20  /* Index object 
16350 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
16360 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20 20 20   *pSeg,         
16370 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20       /* Poslist 
16380 6f 66 20 74 68 69 73 20 69 74 65 72 61 74 6f 72  of this iterator
16390 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 74 78   */.  void *pCtx
163a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
163b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
163c0 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78 43 68   pointer for xCh
163d0 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  unk callback */.
163e0 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29    void (*xChunk)
163f0 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69  (Fts5Index*, voi
16400 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69  d*, const u8*, i
16410 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65  nt).){.  int nRe
16420 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20  m = pSeg->nPos; 
16430 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16440 65 72 20 6f 66 20 62 79 74 65 73 20 73 74 69 6c  er of bytes stil
16450 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46  l to come */.  F
16460 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
16470 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b   0;.  u8 *pChunk
16480 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
16490 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
164a0 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68  fset];.  int nCh
164b0 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
164c0 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
164d0 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61  eaf - pSeg->iLea
164e0 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e 74 20  fOffset);.  int 
164f0 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65  pgno = pSeg->iLe
16500 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67  afPgno;.  int pg
16510 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20 20 69  noSave = 0;..  i
16520 66 28 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20  f( (pSeg->flags 
16530 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
16540 45 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20  EVERSE)==0 ){.  
16550 20 20 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e    pgnoSave = pgn
16560 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  o+1;.  }..  whil
16570 65 28 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75  e( 1 ){.    xChu
16580 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75  nk(p, pCtx, pChu
16590 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20  nk, nChunk);.   
165a0 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b   nRem -= nChunk;
165b0 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
165c0 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20  ease(pData);.   
165d0 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a   if( nRem<=0 ){.
165e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
165f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67   }else{.      pg
16600 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74  no++;.      pDat
16610 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  a = fts5DataRead
16620 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
16630 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65  _ROWID(pSeg->pSe
16640 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29  g->iSegid, pgno)
16650 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
16660 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
16670 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70       pChunk = &p
16680 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20  Data->p[4];.    
16690 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e    nChunk = MIN(n
166a0 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65  Rem, pData->szLe
166b0 61 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69  af - 4);.      i
166c0 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76  f( pgno==pgnoSav
166d0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
166e0 65 72 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74  ert( pSeg->pNext
166f0 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Leaf==0 );.     
16700 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65     pSeg->pNextLe
16710 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
16720 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20      pData = 0;. 
16730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16740 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  .}..../*.** Allo
16750 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65  cate a new segme
16760 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20 73 74  nt-id for the st
16770 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
16780 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74   The new segment
16790 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65 20 62  .** id must be b
167a0 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36 35 33  etween 1 and 653
167b0 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e  35 inclusive, an
167c0 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 75 73  d must not be us
167d0 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75  ed by .** any cu
167e0 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69 6e 67  rrently existing
167f0 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61 20 66   segment. If a f
16800 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64 20 63  ree segment id c
16810 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a  annot be found,.
16820 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69  ** SQLITE_FULL i
16830 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
16840 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  * If an error ha
16850 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
16860 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
16870 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20  n is a no-op. 0 
16880 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
16890 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
168a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
168b0 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 46 74  AllocateSegid(Ft
168c0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
168d0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
168e0 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  ct){.  int iSegi
168f0 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d  d = 0;..  if( p-
16900 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
16910 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63  {.    if( pStruc
16920 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53  t->nSegment>=FTS
16930 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b  5_MAX_SEGMENT ){
16940 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  .      p->rc = S
16950 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
16960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 68 69  }else{.      whi
16970 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  le( iSegid==0 ){
16980 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4c 76  .        int iLv
16990 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 20  l, iSeg;.       
169a0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
169b0 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32 29 2c  ess(sizeof(u32),
169c0 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69 64 29   (void*)&iSegid)
169d0 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67 69 64  ;.        iSegid
169e0 20 3d 20 69 53 65 67 69 64 20 26 20 28 28 31 20   = iSegid & ((1 
169f0 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  << FTS5_DATA_ID_
16a00 42 29 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 66  B)-1);.        f
16a10 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c  or(iLvl=0; iLvl<
16a20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
16a30 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
16a40 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
16a50 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
16a60 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
16a70 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
16a80 20 20 20 20 20 20 69 66 28 20 69 53 65 67 69 64        if( iSegid
16a90 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  ==pStruct->aLeve
16aa0 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
16ab0 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20 20 20  g].iSegid ){.   
16ac0 20 20 20 20 20 20 20 20 20 20 20 69 53 65 67 69             iSegi
16ad0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  d = 0;.         
16ae0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
16af0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
16b00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
16b10 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d  return iSegid;.}
16b20 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20  ../*.** Discard 
16b30 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74  all data current
16b40 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65  ly cached in the
16b50 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f   hash-tables..*/
16b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
16b70 35 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74  5IndexDiscardDat
16b80 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  a(Fts5Index *p){
16b90 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48  .  assert( p->pH
16ba0 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69  ash || p->nPendi
16bb0 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69  ngData==0 );.  i
16bc0 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20  f( p->pHash ){. 
16bd0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
16be0 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68  shClear(p->pHash
16bf0 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
16c00 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a  ngData = 0;.  }.
16c10 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16c20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
16c30 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73  prefix, in bytes
16c40 2c 20 74 68 61 74 20 62 75 66 66 65 72 20 28 6e  , that buffer (n
16c50 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72 65 73  New/pNew) shares
16c60 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65 72 20  .** with buffer 
16c70 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a  (nOld/pOld)..*/.
16c80 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50  static int fts5P
16c90 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 0a 20  refixCompress(. 
16ca0 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74   int nOld, const
16cb0 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74   u8 *pOld,.  int
16cc0 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75 38 20   nNew, const u8 
16cd0 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69  *pNew.){.  int i
16ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74 73 35  ;.  assert( fts5
16cf0 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f 6c 64  BlobCompare(pOld
16d00 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e  , nOld, pNew, nN
16d10 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69  ew)<0 );.  for(i
16d20 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
16d30 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 5b 69  {.    if( pOld[i
16d40 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62 72 65  ]!=pNew[i] ) bre
16d50 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
16d60 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f   i;.}..static vo
16d70 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
16d80 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35 49 6e  xClear(.  Fts5In
16d90 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
16da0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
16db0 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73 68 20  r,.  int bFlush 
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c       /* If true,
16de0 20 77 72 69 74 65 20 64 6c 69 64 78 20 74 6f 20   write dlidx to 
16df0 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  disk */.){.  int
16e00 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 62 46   i;.  assert( bF
16e10 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69  lush==0 || (pWri
16e20 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26  ter->nDlidx>0 &&
16e30 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16e40 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a  [0].buf.n>0) );.
16e50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72    for(i=0; i<pWr
16e60 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b  iter->nDlidx; i+
16e70 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  +){.    Fts5Dlid
16e80 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20  xWriter *pDlidx 
16e90 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  = &pWriter->aDli
16ea0 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70  dx[i];.    if( p
16eb0 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20  Dlidx->buf.n==0 
16ec0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
16ed0 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20 20 20   bFlush ){.     
16ee0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
16ef0 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20  >pgno!=0 );.    
16f00 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
16f10 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
16f20 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
16f30 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
16f40 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  i, pDlidx->pgno)
16f50 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69  ,.          pDli
16f60 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64  dx->buf.p, pDlid
16f70 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29  x->buf.n.      )
16f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
16f90 74 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72  te3Fts5BufferZer
16fa0 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b  o(&pDlidx->buf);
16fb0 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72  .    pDlidx->bPr
16fc0 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  evValid = 0;.  }
16fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74  .}../*.** Grow t
16fe0 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  he pWriter->aDli
16ff0 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20 61 74  dx[] array to at
17000 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d   least nLvl elem
17010 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a  ents in size..**
17020 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79 20 65   Any new array e
17030 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65 72 6f  lements are zero
17040 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
17050 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
17060 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  nt fts5WriteDlid
17070 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49 6e 64  xGrow(.  Fts5Ind
17080 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67  ex *p,.  Fts5Seg
17090 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
170a0 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20  .  int nLvl.){. 
170b0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
170c0 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70  TE_OK && nLvl>=p
170d0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29  Writer->nDlidx )
170e0 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
170f0 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20 3d 20  riter *aDlidx = 
17100 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72  (Fts5DlidxWriter
17110 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
17120 63 28 0a 20 20 20 20 20 20 20 20 70 57 72 69 74  c(.        pWrit
17130 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65  er->aDlidx, size
17140 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  of(Fts5DlidxWrit
17150 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29  er) * nLvl.    )
17160 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64 78  ;.    if( aDlidx
17170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
17180 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
17190 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
171a0 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
171b0 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
171c0 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20  Writer) * (nLvl 
171d0 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  - pWriter->nDlid
171e0 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  x);.      memset
171f0 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72  (&aDlidx[pWriter
17200 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42  ->nDlidx], 0, nB
17210 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69  yte);.      pWri
17220 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44  ter->aDlidx = aD
17230 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69  lidx;.      pWri
17240 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c  ter->nDlidx = nL
17250 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  vl;.    }.  }.  
17260 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
17270 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75  ./*.** If the cu
17280 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e  rrent doclist-in
17290 64 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67  dex accumulating
172a0 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   in pWriter->aDl
172b0 69 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a  idx[] is large.*
172c0 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20  * enough, flush 
172d0 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72  it to disk and r
172e0 65 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69  eturn 1. Otherwi
172f0 73 65 20 64 69 73 63 61 72 64 20 69 74 20 61 6e  se discard it an
17300 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f  d return.** zero
17310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17320 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c  fts5WriteFlushDl
17330 69 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70  idx(Fts5Index *p
17340 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
17350 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74  *pWriter){.  int
17360 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f   bFlag = 0;..  /
17370 2a 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20  * If there were 
17380 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53  FTS5_MIN_DLIDX_S
17390 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74  IZE or more empt
173a0 79 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69  y leaf pages wri
173b0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
173c0 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20   database, also 
173d0 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73  write the doclis
173e0 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e  t-index to disk.
173f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74    */.  if( pWrit
17400 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
17410 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72  f.n>0 && pWriter
17420 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d  ->nEmpty>=FTS5_M
17430 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b  IN_DLIDX_SIZE ){
17440 0a 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a  .    bFlag = 1;.
17450 20 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44    }.  fts5WriteD
17460 6c 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72  lidxClear(p, pWr
17470 69 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20  iter, bFlag);.  
17480 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20  pWriter->nEmpty 
17490 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46  = 0;.  return bF
174a0 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  lag;.}../*.** Th
174b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
174c0 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70  alled whenever p
174d0 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65  rocessing of the
174e0 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65   doclist for the
174f0 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f   .** last term o
17500 6e 20 6c 65 61 66 20 70 61 67 65 20 28 70 57 72  n leaf page (pWr
17510 69 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69  iter->iBtPage) i
17520 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a  s completed. .**
17530 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d  .** The doclist-
17540 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74  index for that t
17550 65 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79  erm is currently
17560 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72   stored in-memor
17570 79 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  y within the.** 
17580 46 74 73 35 53 65 67 57 72 69 74 65 72 2e 61 44  Fts5SegWriter.aD
17590 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66  lidx[] array. If
175a0 20 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f   it is large eno
175b0 75 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ugh, this functi
175c0 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20  on.** writes it 
175d0 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c  out to disk. Or,
175e0 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d   if it is too sm
175f0 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69  all to bother wi
17600 74 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20  th, discards.** 
17610 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65  it..**.** Fts5Se
17620 67 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63  gWriter.btterm c
17630 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e  urrently contain
17640 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
17650 20 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67 65   on page iBtPage
17660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17670 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
17680 74 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  tree(Fts5Index *
17690 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72  p, Fts5SegWriter
176a0 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e   *pWriter){.  in
176b0 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65  t bFlag;..  asse
176c0 72 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74  rt( pWriter->iBt
176d0 50 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d  Page || pWriter-
176e0 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20  >nEmpty==0 );.  
176f0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74  if( pWriter->iBt
17700 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Page==0 ) return
17710 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35  ;.  bFlag = fts5
17720 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28  WriteFlushDlidx(
17730 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20  p, pWriter);..  
17740 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
17750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73  E_OK ){.    cons
17760 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72  t char *z = (pWr
17770 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30  iter->btterm.n>0
17780 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57  ?(const char*)pW
17790 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a  riter->btterm.p:
177a0 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20  "");.    /* The 
177b0 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c  following was al
177c0 72 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74  ready done in ft
177d0 73 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a  s5WriteInit(): *
177e0 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  /.    /* sqlite3
177f0 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
17800 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69  xWriter, 1, pWri
17810 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f  ter->iSegid); */
17820 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
17830 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72  d_blob(p->pIdxWr
17840 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69  iter, 2, z, pWri
17850 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53  ter->btterm.n, S
17860 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
17870 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
17880 69 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69  int64(p->pIdxWri
17890 74 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20  ter, 3, bFlag + 
178a0 28 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69  ((i64)pWriter->i
178b0 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20  BtPage<<1));.   
178c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d   sqlite3_step(p-
178d0 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
178e0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
178f0 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57  3_reset(p->pIdxW
17900 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 70 57  riter);.  }.  pW
17910 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d  riter->iBtPage =
17920 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   0;.}../*.** Thi
17930 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  s is called once
17940 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70   for each leaf p
17950 61 67 65 20 65 78 63 65 70 74 20 74 68 65 20 66  age except the f
17960 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69  irst that contai
17970 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f  ns.** at least o
17980 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e  ne term. Argumen
17990 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20  t (nTerm/pTerm) 
179a0 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79  is the split-key
179b0 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a   - a term that.*
179c0 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
179d0 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74   all terms writt
179e0 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65  en to earlier le
179f0 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20  aves, and equal 
17a00 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72  to or.** smaller
17a10 20 74 68 61 6e 20 74 68 65 20 66 69 72 73 74 20   than the first 
17a20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20  term on the new 
17a30 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  leaf..**.** If a
17a40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
17a50 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
17a60 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
17a70 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  ex.rc. If an err
17a80 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64  or.** has alread
17a90 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
17aa0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
17ab0 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
17ac0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
17ad0 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
17ae0 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73  BtreeTerm(.  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 2c  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 20 20 69  er object */.  i
17b60 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
17b70 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f  u8 *pTerm      /
17b80 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  * First term on 
17b90 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20  new page */.){. 
17ba0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42   fts5WriteFlushB
17bb0 74 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29  tree(p, pWriter)
17bc0 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65  ;.  fts5BufferSe
17bd0 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  t(&p->rc, &pWrit
17be0 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72  er->btterm, nTer
17bf0 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72  m, pTerm);.  pWr
17c00 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20  iter->iBtPage = 
17c10 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
17c20 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pgno;.}../*.** T
17c30 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17c40 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73  called when flus
17c50 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65  hing a leaf page
17c60 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
17c70 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c  o.** terms at al
17c80 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  l to disk..*/.st
17c90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
17ca0 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a  iteBtreeNoTerm(.
17cb0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
17cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cd0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
17ce0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
17cf0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17d00 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  iter          /*
17d10 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
17d20 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
17d30 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64  re were no rowid
17d40 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61  s on the leaf pa
17d50 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74 68  ge either and th
17d60 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a  e doclist-index.
17d70 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
17d80 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61   been started, a
17d90 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79  ppend an 0x00 by
17da0 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20  te to it.  */.  
17db0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
17dc0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26  rstRowidInPage &
17dd0 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
17de0 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a  x[0].buf.n>0 ){.
17df0 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
17e00 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
17e10 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
17e20 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
17e30 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
17e40 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
17e50 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
17e60 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
17e70 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b  pDlidx->buf, 0);
17e80 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
17e90 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72  ment the "number
17ea0 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c   of sequential l
17eb0 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61 20  eaves without a 
17ec0 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a  term" counter. *
17ed0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  /.  pWriter->nEm
17ee0 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63  pty++;.}..static
17ef0 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45 78   i64 fts5DlidxEx
17f00 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
17f10 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
17f20 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
17f30 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20  .  int iOff;..  
17f40 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47  iOff = 1 + fts5G
17f50 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
17f60 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
17f70 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56  wid);.  fts5GetV
17f80 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
17f90 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
17fa0 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  wid);.  return i
17fb0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
17fc0 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
17fd0 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
17fe0 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
17ff0 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74  nt leaf page. It
18000 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   is the.** first
18010 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68   on the page. Th
18020 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
18030 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61  nds an appropria
18040 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  te entry to the 
18050 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69  current.** docli
18060 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  st-index..*/.sta
18070 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
18080 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20  teDlidxAppend(. 
18090 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
180a0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
180b0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34  *pWriter, .  i64
180c0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74   iRowid.){.  int
180d0 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20   i;.  int bDone 
180e0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
180f0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18100 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69  K && bDone==0; i
18110 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61  ++){.    i64 iVa
18120 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  l;.    Fts5Dlidx
18130 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
18140 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
18150 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  x[i];..    if( p
18160 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  Dlidx->buf.n>=p-
18170 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
18180 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
18190 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
181a0 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75 6c  ndex page is ful
181b0 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 64  l. Write it to d
181c0 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20  isk and push.   
181d0 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20     ** a copy of 
181e0 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77 69  iRowid (which wi
181f0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69  ll become the fi
18200 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  rst rowid on the
18210 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64   next.      ** d
18220 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61  oclist-index lea
18230 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20  f page) up into 
18240 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f  the next level o
18250 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20  f the b-tree .  
18260 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79      ** hierarchy
18270 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65  . If the node be
18280 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20 63  ing flushed is c
18290 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f  urrently the roo
182a0 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a  t node,.      **
182b0 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66   also push its f
182c0 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61 72  irst rowid upwar
182d0 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c  ds. */.      pDl
182e0 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20  idx->buf.p[0] = 
182f0 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  0x01;    /* Not 
18300 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  the root node */
18310 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
18320 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
18330 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
18340 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18350 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
18360 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
18370 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
18380 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
18390 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73      );.      fts
183a0 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
183b0 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29  p, pWriter, i+2)
183c0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d  ;.      pDlidx =
183d0 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
183e0 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x[i];.      if( 
183f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18400 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75   && pDlidx[1].bu
18410 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
18420 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 66    i64 iFirst = f
18430 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
18440 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64  irstRowid(&pDlid
18450 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20  x->buf);..      
18460 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68    /* This was th
18470 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73  e root node. Pus
18480 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
18490 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20  d up to the new 
184a0 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  root. */.       
184b0 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20   pDlidx[1].pgno 
184c0 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a  = pDlidx->pgno;.
184d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
184e0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
184f0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18500 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29  Dlidx[1].buf, 0)
18510 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18520 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
18530 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
18540 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
18550 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20  pDlidx->pgno);. 
18560 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
18570 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
18580 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
18590 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69  lidx[1].buf, iFi
185a0 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44  rst);.        pD
185b0 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c  lidx[1].bPrevVal
185c0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
185d0 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20  pDlidx[1].iPrev 
185e0 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  = iFirst;.      
185f0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
18600 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
18610 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
18620 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
18630 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  vValid = 0;.    
18640 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b    pDlidx->pgno++
18650 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18660 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
18670 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c    }..    if( pDl
18680 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
18690 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
186a0 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d  iRowid - pDlidx-
186b0 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  >iPrev;.    }els
186c0 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 67  e{.      i64 iPg
186d0 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72  no = (i==0 ? pWr
186e0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
186f0 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
18700 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
18710 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
18720 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
18730 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18740 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18750 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
18760 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
18770 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
18780 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
18790 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
187a0 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
187b0 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
187c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
187d0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
187e0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
187f0 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
18800 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
18810 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
18820 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
18830 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
18840 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
18850 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
18860 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
18870 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
18880 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
18890 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
188a0 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
188b0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
188c0 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
188d0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
188e0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
188f0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20    i64 iRowid;.. 
18900 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 2d   assert( (pPage-
18910 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70  >pgidx.n==0)==(p
18920 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
18930 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20  rmInPage) );..  
18940 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
18950 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
18960 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
18970 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67  fts5GetU16(&pPag
18980 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a  e->buf.p[2]) );.
18990 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50    fts5PutU16(&pP
189a0 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28  age->buf.p[2], (
189b0 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
189c0 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65  );..  if( pWrite
189d0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
189e0 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  age ){.    /* No
189f0 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65   term was writte
18a00 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20  n to this page. 
18a10 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
18a20 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
18a30 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74   );.    fts5Writ
18a40 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20  eBtreeNoTerm(p, 
18a50 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73  pWriter);.  }els
18a60 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  e{.    /* Append
18a70 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74 68   the pgidx to th
18a80 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20 53  e page buffer. S
18a90 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65  et the szLeaf he
18aa0 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  ader field. */. 
18ab0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
18ac0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
18ad0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61  &pPage->buf, pPa
18ae0 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61  ge->pgidx.n, pPa
18af0 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20  ge->pgidx.p);.  
18b00 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
18b10 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69  e page out to di
18b20 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  sk */.  iRowid =
18b30 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
18b40 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
18b50 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gid, pPage->pgno
18b60 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
18b70 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50  te(p, iRowid, pP
18b80 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
18b90 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a  e->buf.n);..  /*
18ba0 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
18bb0 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  next page. */.  
18bc0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
18bd0 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66  pPage->buf);.  f
18be0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
18bf0 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20  Page->pgidx);.  
18c00 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
18c10 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
18c20 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
18c30 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72  o);.  pPage->iPr
18c40 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70  evPgidx = 0;.  p
18c50 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
18c60 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
18c70 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
18c80 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
18c90 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
18ca0 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en++;..  /* The 
18cb0 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e  new leaf holds n
18cc0 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64  o terms or rowid
18cd0 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  s */.  pWriter->
18ce0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18cf0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
18d00 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
18d10 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 1;.}../*.**
18d20 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
18d30 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
18d40 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
18d50 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
18d60 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
18d70 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
18d80 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
18d90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
18da0 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
18db0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
18dc0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
18dd0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
18de0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
18df0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
18e00 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18e10 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
18e20 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
18e30 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
18e40 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
18e50 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
18e60 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
18e70 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
18ea0 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
18eb0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
18ec0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
18ed0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
18ee0 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35  ->writer;.  Fts5
18ef0 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d  Buffer *pPgidx =
18f00 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
18f10 72 2e 70 67 69 64 78 3b 0a 0a 20 20 61 73 73 65  r.pgidx;..  asse
18f20 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
18f30 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
18f40 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d  ( pPage->buf.n>=
18f50 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 );.  assert( p
18f60 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c  Page->buf.n>4 ||
18f70 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
18f80 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20  TermInPage );.. 
18f90 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 72 65   /* If the curre
18fa0 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20  nt leaf page is 
18fb0 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74 20 74  full, flush it t
18fc0 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28  o disk. */.  if(
18fd0 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b   (pPage->buf.n +
18fe0 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65   pPgidx->n + nTe
18ff0 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e  rm + 2)>=p->pCon
19000 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
19010 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75 66 2e   if( pPage->buf.
19020 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73  n>4 ){.      fts
19030 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
19040 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
19050 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
19060 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70  rGrow(&p->rc, &p
19070 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
19080 2b 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49  +FTS5_DATA_PADDI
19090 4e 47 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  NG);.  }.  .  /*
190a0 20 54 4f 44 4f 31 3a 20 55 70 64 61 74 69 6e 67   TODO1: Updating
190b0 20 70 67 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a   pgidx here. */.
190c0 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73    pPgidx->n += s
190d0 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
190e0 69 6e 74 28 0a 20 20 20 20 20 20 26 70 50 67 69  int(.      &pPgi
190f0 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d  dx->p[pPgidx->n]
19100 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d  , pPage->buf.n -
19110 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
19120 64 78 0a 20 20 29 3b 0a 20 20 70 50 61 67 65 2d  dx.  );.  pPage-
19130 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20 70 50  >iPrevPgidx = pP
19140 61 67 65 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20  age->buf.n;.#if 
19150 30 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26  0.  fts5PutU16(&
19160 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69 64 78  pPgidx->p[pPgidx
19170 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66  ->n], pPage->buf
19180 2e 6e 29 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e  .n);.  pPgidx->n
19190 20 2b 3d 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20   += 2;.#endif.. 
191a0 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
191b0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
191c0 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
191d0 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
191e0 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20  ->pgno!=1 ){.   
191f0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
19200 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
19210 61 20 6c 65 61 66 20 74 68 61 74 20 69 73 20 6e  a leaf that is n
19220 6f 74 20 74 68 65 20 6c 65 66 74 6d 6f 73 74 20  ot the leftmost 
19230 6c 65 61 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a  leaf in.      **
19240 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 2d 74   the segment b-t
19250 72 65 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ree. In this cas
19260 65 20 69 74 20 69 73 20 6e 65 63 65 73 73 61 72  e it is necessar
19270 79 20 74 6f 20 61 64 64 20 61 20 74 65 72 6d 20  y to add a term 
19280 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  to.      ** the 
19290 62 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79  b-tree hierarchy
192a0 20 74 68 61 74 20 69 73 20 28 61 29 20 6c 61 72   that is (a) lar
192b0 67 65 72 20 74 68 61 6e 20 74 68 65 20 6c 61 72  ger than the lar
192c0 67 65 73 74 20 74 65 72 6d 20 0a 20 20 20 20 20  gest term .     
192d0 20 2a 2a 20 61 6c 72 65 61 64 79 20 77 72 69 74   ** already writ
192e0 74 65 6e 20 74 6f 20 74 68 65 20 73 65 67 6d 65  ten to the segme
192f0 6e 74 20 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c  nt and (b) small
19300 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
19310 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 69   to.      ** thi
19320 73 20 74 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72  s term. In other
19330 20 77 6f 72 64 73 2c 20 61 20 70 72 65 66 69 78   words, a prefix
19340 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   of (pTerm/nTerm
19350 29 20 74 68 61 74 20 69 73 20 6f 6e 65 0a 20 20  ) that is one.  
19360 20 20 20 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67      ** byte long
19370 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67  er than the long
19380 65 73 74 20 70 72 65 66 69 78 20 28 70 54 65 72  est prefix (pTer
19390 6d 2f 6e 54 65 72 6d 29 20 73 68 61 72 65 73 20  m/nTerm) shares 
193a0 77 69 74 68 20 74 68 65 0a 20 20 20 20 20 20 2a  with the.      *
193b0 2a 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 2e  * previous term.
193c0 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
193d0 20 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 65   ** Usually, the
193e0 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69   previous term i
193f0 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70  s available in p
19400 50 61 67 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20  Page->term. The 
19410 65 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20  exception.      
19420 2a 2a 20 69 73 20 69 66 20 74 68 69 73 20 69 73  ** is if this is
19430 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
19440 77 72 69 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e  written in an in
19450 63 72 65 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20  cremental-merge 
19460 73 74 65 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49  step..      ** I
19470 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
19480 70 72 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73  previous term is
19490 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2c 20   not available, 
194a0 73 6f 20 6a 75 73 74 20 77 72 69 74 65 20 61 0a  so just write a.
194b0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
194c0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69   (pTerm/nTerm) i
194d0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6e  nto the parent n
194e0 6f 64 65 2e 20 54 68 69 73 20 69 73 20 73 6c 69  ode. This is sli
194f0 67 68 74 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69  ghtly.      ** i
19500 6e 65 66 66 69 63 69 65 6e 74 2c 20 62 75 74 20  nefficient, but 
19510 73 74 69 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20  still correct.  
19520 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  */.      int n =
19530 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 69 66   nTerm;.      if
19540 28 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20  ( pPage->term.n 
19550 29 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 31  ){.        n = 1
19560 20 2b 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d   + fts5PrefixCom
19570 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74 65 72  press(pPage->ter
19580 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d  m.n, pPage->term
19590 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  .p, nTerm, pTerm
195a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
195b0 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65 54   fts5WriteBtreeT
195c0 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 2c 20  erm(p, pWriter, 
195d0 6e 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  n, pTerm);.     
195e0 20 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65   pPage = &pWrite
195f0 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20 20 7d  r->writer;.    }
19600 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50  .  }else{.    nP
19610 72 65 66 69 78 20 3d 20 66 74 73 35 50 72 65 66  refix = fts5Pref
19620 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65  ixCompress(pPage
19630 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d  ->term.n, pPage-
19640 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20  >term.p, nTerm, 
19650 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74 73 35  pTerm);.    fts5
19660 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
19670 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
19680 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69 78 29  e->buf, nPrefix)
19690 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65  ;.  }..  /* Appe
196a0 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
196b0 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 64 61   bytes of new da
196c0 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72  ta, then the ter
196d0 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a 20 20  m data itself.  
196e0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 2e 20  ** to the page. 
196f0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  */.  fts5BufferA
19700 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
19710 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
19720 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
19730 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  );.  fts5BufferA
19740 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
19750 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
19760 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20  Term - nPrefix, 
19770 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29  &pTerm[nPrefix])
19780 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
19790 68 65 20 46 74 73 35 50 61 67 65 57 72 69 74 65  he Fts5PageWrite
197a0 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f  r.term field. */
197b0 0a 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74  .  fts5BufferSet
197c0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
197d0 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  >term, nTerm, pT
197e0 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
197f0 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  >bFirstTermInPag
19800 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69 74 65  e = 0;..  pWrite
19810 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19820 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57 72 69  Page = 0;.  pWri
19830 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
19840 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a  InDoclist = 1;..
19850 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
19860 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c  || (pWriter->nDl
19870 69 64 78 3e 30 20 26 26 20 70 57 72 69 74 65 72  idx>0 && pWriter
19880 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e  ->aDlidx[0].buf.
19890 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72 69 74  n==0) );.  pWrit
198a0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67  er->aDlidx[0].pg
198b0 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f  no = pPage->pgno
198c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
198d0 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20 70 6f  d a rowid and po
198e0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
198f0 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77 72   field to the wr
19900 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a  iters output. .*
19910 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
19920 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77  s5WriteAppendRow
19930 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  id(.  Fts5Index 
19940 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72  *p, .  Fts5SegWr
19950 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20  iter *pWriter,. 
19960 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20 20 69   i64 iRowid,.  i
19970 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69 66 28  nt nPos.){.  if(
19980 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
19990 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
199a0 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
199b0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
199c0 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61  r;..    if( (pPa
199d0 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
199e0 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e  e->pgidx.n)>=p->
199f0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
19a00 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
19a10 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
19a20 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iter);.    }..  
19a30 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
19a40 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
19a50 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f  rowid written to
19a60 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
19a70 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  he .    ** rowid
19a80 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
19a90 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
19aa0 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
19ab0 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
19ac0 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
19ad0 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
19ae0 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
19af0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
19b00 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
19b10 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
19b20 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
19b30 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29  ge->buf.p, (u16)
19b40 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
19b50 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
19b60 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72  idxAppend(p, pWr
19b70 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
19b80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
19b90 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f  te the rowid. */
19ba0 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
19bb0 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
19bc0 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65  oclist || pWrite
19bd0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19be0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
19bf0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
19c00 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
19c10 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
19c20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19c30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
19c40 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72 69  c || iRowid>pWri
19c50 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64 20  ter->iPrevRowid 
19c60 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
19c70 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19c80 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
19c90 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70 57  buf, iRowid - pW
19ca0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
19cb0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 57  d);.    }.    pW
19cc0 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
19cd0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  d = iRowid;.    
19ce0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19cf0 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
19d00 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e  0;.    pWriter->
19d10 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
19d20 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74 73 35  e = 0;..    fts5
19d30 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
19d40 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
19d50 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a 20  e->buf, nPos);. 
19d60 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
19d70 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
19d80 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20 20  dPoslistData(.  
19d90 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
19da0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
19db0 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e 73  pWriter, .  cons
19dc0 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20 20  t u8 *aData, .  
19dd0 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20 46  int nData.){.  F
19de0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
19df0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
19e00 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73 74  >writer;.  const
19e10 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b 0a   u8 *a = aData;.
19e20 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61 3b    int n = nData;
19e30 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 2d  .  .  assert( p-
19e40 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e 30  >pConfig->pgsz>0
19e50 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   );.  while( p->
19e60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20  rc==SQLITE_OK . 
19e70 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e 62      && (pPage->b
19e80 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67  uf.n + pPage->pg
19e90 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e 70  idx.n + n)>=p->p
19ea0 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20 20  Config->pgsz .  
19eb0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20  ){.    int nReq 
19ec0 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
19ed0 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e  sz - pPage->buf.
19ee0 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n - pPage->pgidx
19ef0 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70  .n;.    int nCop
19f00 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  y = 0;.    while
19f10 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a  ( nCopy<nReq ){.
19f20 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b        i64 dummy;
19f30 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20  .      nCopy += 
19f40 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
19f50 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26  [nCopy], (u64*)&
19f60 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20  dummy);.    }.  
19f70 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19f80 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19f90 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70  pPage->buf, nCop
19fa0 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20  y, a);.    a += 
19fb0 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20  nCopy;.    n -= 
19fc0 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57  nCopy;.    fts5W
19fd0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
19fe0 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20   pWriter);.  }. 
19ff0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
1a000 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1a010 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1a020 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b  age->buf, n, a);
1a030 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  .  }.}../*.** Fl
1a040 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61 63  ush any data cac
1a050 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74 65  hed by the write
1a060 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  r object to the 
1a070 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20 61  database. Free a
1a080 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  ny.** allocation
1a090 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
1a0a0 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a 2f  h the writer..*/
1a0b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a0c0 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20 20  5WriteFinish(.  
1a0d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1a0e0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1a0f0 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1a100 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1a110 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 65  t */.  int *pnLe
1a120 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1a130 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e         /* OUT: N
1a140 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61  umber of leaf pa
1a150 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a 2f  ges in b-tree */
1a160 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  .){.  int i;.  F
1a170 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1a180 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72 2d  Leaf = &pWriter-
1a190 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20 70  >writer;.  if( p
1a1a0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a1b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1a1c0 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29 3b  Leaf->pgno>=1 );
1a1d0 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
1a1e0 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20  buf.n>4 ){.     
1a1f0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c   fts5WriteFlushL
1a200 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b  eaf(p, pWriter);
1a210 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c 65  .    }.    *pnLe
1a220 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e 6f  af = pLeaf->pgno
1a230 2d 31 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  -1;.    fts5Writ
1a240 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20 70  eFlushBtree(p, p
1a250 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 66  Writer);.  }.  f
1a260 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1a270 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20 66  Leaf->term);.  f
1a280 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1a290 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66 74  Leaf->buf);.  ft
1a2a0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 4c  s5BufferFree(&pL
1a2b0 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66  eaf->pgidx);.  f
1a2c0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1a2d0 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b  Writer->btterm);
1a2e0 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
1a2f0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20  Writer->nDlidx; 
1a300 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1a310 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
1a320 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1a330 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  [i].buf);.  }.  
1a340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
1a350 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d  iter->aDlidx);.}
1a360 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1a370 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46  s5WriteInit(.  F
1a380 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1a390 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1a3a0 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69  Writer, .  int i
1a3b0 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73 74  Segid.){.  const
1a3c0 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20 70   int nBuffer = p
1a3d0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
1a3e0 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
1a3f0 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 70  ING;..  memset(p
1a400 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Writer, 0, sizeo
1a410 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
1a420 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 53  );.  pWriter->iS
1a430 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 0a  egid = iSegid;..
1a440 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78    fts5WriteDlidx
1a450 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72 2c  Grow(p, pWriter,
1a460 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e   1);.  pWriter->
1a470 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31 3b  writer.pgno = 1;
1a480 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  .  pWriter->bFir
1a490 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31  stTermInPage = 1
1a4a0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74  ;.  pWriter->iBt
1a4b0 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73  Page = 1;..  ass
1a4c0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72  ert( pWriter->wr
1a4d0 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b  iter.buf.n==0 );
1a4e0 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69 74  .  assert( pWrit
1a4f0 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1a500 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 47  .n==0 );..  /* G
1a510 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66 66  row the two buff
1a520 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70 61  ers to pgsz + pa
1a530 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20 73  dding bytes in s
1a540 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ize. */.  sqlite
1a550 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28  3Fts5BufferSize(
1a560 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72  &p->rc, &pWriter
1a570 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c 20  ->writer.pgidx, 
1a580 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c 69  nBuffer);.  sqli
1a590 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1a5a0 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1a5b0 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c 20  er->writer.buf, 
1a5c0 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66 28  nBuffer);..  if(
1a5d0 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d 3d   p->pIdxWriter==
1a5e0 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
1a5f0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
1a600 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
1a610 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
1a620 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 57  tmt(p, &p->pIdxW
1a630 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d  riter, sqlite3_m
1a640 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
1a650 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 27    "INSERT INTO '
1a660 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65 67  %q'.'%q_idx'(seg
1a670 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56 41  id,term,pgno) VA
1a680 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20  LUES(?,?,?)", . 
1a690 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
1a6a0 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
1a6b0 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
1a6c0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
1a6d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a6e0 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1a6f0 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d 70  he 4-byte leaf-p
1a700 61 67 65 20 68 65 61 64 65 72 20 74 6f 20 30 78  age header to 0x
1a710 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65  00. */.    memse
1a720 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  t(pWriter->write
1a730 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b 0a  r.buf.p, 0, 4);.
1a740 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69      pWriter->wri
1a750 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a  ter.buf.n = 4;..
1a760 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65 20      /* Bind the 
1a770 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 73  current output s
1a780 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68 65  egment id to the
1a790 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20 54   index-writer. T
1a7a0 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a 2a  his is an.    **
1a7b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f 76   optimization ov
1a7c0 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20 73  er binding the s
1a7d0 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20 61  ame value over a
1a7e0 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73 20  nd over as rows 
1a7f0 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  are.    ** inser
1a800 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20 62  ted into %_idx b
1a810 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 77 72  y the current wr
1a820 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73 71  iter.  */.    sq
1a830 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1a840 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1a850 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1a860 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1a870 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 77  Iterator pIter w
1a880 61 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  as used to itera
1a890 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 69  te through the i
1a8a0 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 66  nput segments of
1a8b0 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d   on an.** increm
1a8c0 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65 72  ental merge oper
1a8d0 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e 63  ation. This func
1a8e0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 69  tion is called i
1a8f0 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74 61  f the incrementa
1a900 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70 20  l.** merge step 
1a910 68 61 73 20 66 69 6e 69 73 68 65 64 20 62 75 74  has finished but
1a920 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20 6e   the input has n
1a930 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65  ot been complete
1a940 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a 2f  ly exhausted..*/
1a950 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a960 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46 74  5TrimSegments(Ft
1a970 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1a980 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1a990 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46 74  ){.  int i;.  Ft
1a9a0 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20 20  s5Buffer buf;.  
1a9b0 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c 20  memset(&buf, 0, 
1a9c0 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1a9d0 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  r));.  for(i=0; 
1a9e0 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69  i<pIter->nSeg; i
1a9f0 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  ++){.    Fts5Seg
1aa00 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
1aa10 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
1aa20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65 67    if( pSeg->pSeg
1aa30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
1aa40 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65 6c  no-op */.    }el
1aa50 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65  se if( pSeg->pLe
1aa60 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  af==0 ){.      /
1aa70 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d 20  * All keys from 
1aa80 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d 65  this input segme
1aa90 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72 61  nt have been tra
1aaa0 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20 6f  nsfered to the o
1aab0 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a 20  utput..      ** 
1aac0 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69 72  Set both the fir
1aad0 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67 65  st and last page
1aae0 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74 6f  -numbers to 0 to
1aaf0 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74   indicate that t
1ab00 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  he.      ** segm
1ab10 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74 79  ent is now empty
1ab20 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67 2d  . */.      pSeg-
1ab30 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20  >pSeg->pgnoLast 
1ab40 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  = 0;.      pSeg-
1ab50 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74  >pSeg->pgnoFirst
1ab60 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1ab70 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20  .      int iOff 
1ab80 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61  = pSeg->iTermLea
1ab90 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a 20  fOffset;     /* 
1aba0 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66 69  Offset on new fi
1abb0 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f  rst leaf page */
1abc0 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61 66  .      i64 iLeaf
1abd0 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74 73  Rowid;.      Fts
1abe0 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20 20  5Data *pData;.  
1abf0 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70 53      int iId = pS
1ac00 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  eg->pSeg->iSegid
1ac10 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72 5b  ;.      u8 aHdr[
1ac20 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30 30  4] = {0x00, 0x00
1ac30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a 0a  , 0x00, 0x00};..
1ac40 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69 64        iLeafRowid
1ac50 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
1ac60 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67 2d  ROWID(iId, pSeg-
1ac70 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29 3b  >iTermLeafPgno);
1ac80 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66  .      pData = f
1ac90 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
1aca0 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20  LeafRowid);.    
1acb0 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20    if( pData ){. 
1acc0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1acd0 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20 20  rZero(&buf);.   
1ace0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47       fts5BufferG
1acf0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  row(&p->rc, &buf
1ad00 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20  , pData->nn);.  
1ad10 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ad20 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1ad30 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1ad40 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1ad50 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ad60 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1ad70 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1ad80 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20 20  >term.n);.      
1ad90 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ada0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1adb0 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e  buf, pSeg->term.
1adc0 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29  n, pSeg->term.p)
1add0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1ade0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1adf0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1ae00 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c  ta->szLeaf-iOff,
1ae10 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d   &pData->p[iOff]
1ae20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1ae30 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1ae40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
1ae50 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 66  Set the szLeaf f
1ae60 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20 20  ield */.        
1ae70 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62 75    fts5PutU16(&bu
1ae80 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 62 75 66  f.p[2], (u16)buf
1ae90 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  .n);.        }..
1aea0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75          /* Set u
1aeb0 70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69  p the new page-i
1aec0 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20  ndex array */.  
1aed0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1aee0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
1aef0 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a 20  >rc, &buf, 4);. 
1af00 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d         if( pSeg-
1af10 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67  >iLeafPgno==pSeg
1af20 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20  ->iTermLeafPgno 
1af30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65  .         && pSe
1af40 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  g->iEndofDoclist
1af50 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 0a  <pData->szLeaf .
1af60 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1af70 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d       int nDiff =
1af80 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d   pData->szLeaf -
1af90 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63   pSeg->iEndofDoc
1afa0 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  list;.          
1afb0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1afc0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1afd0 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d  buf, buf.n - 1 -
1afe0 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20   nDiff - 4);.   
1aff0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1b000 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1b010 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20  rc, &buf, .     
1b020 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d 3e           pData->
1b030 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69 64  nn - pSeg->iPgid
1b040 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  xOff, &pData->p[
1b050 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66 5d  pSeg->iPgidxOff]
1b060 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1b070 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1b080 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
1b090 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  (pData);.       
1b0a0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1b0b0 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69  oFirst = pSeg->i
1b0c0 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  TermLeafPgno;.  
1b0d0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
1b0e0 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
1b0f0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20  MENT_ROWID(iId, 
1b100 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b  1), iLeafRowid);
1b110 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1b120 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66 52  aWrite(p, iLeafR
1b130 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75 66  owid, buf.p, buf
1b140 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .n);.      }.   
1b150 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66   }.  }.  fts5Buf
1b160 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
1b170 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1b180 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c  s5MergeChunkCall
1b190 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65  back(.  Fts5Inde
1b1a0 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70  x *p, .  void *p
1b1b0 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  Ctx, .  const u8
1b1c0 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
1b1d0 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53 65  hunk.){.  Fts5Se
1b1e0 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1b1f0 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74 65   = (Fts5SegWrite
1b200 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35 57  r*)pCtx;.  fts5W
1b210 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
1b220 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65 72  tData(p, pWriter
1b230 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
1b240 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  );.}../*.**.*/.s
1b250 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1b260 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 0a  ndexMergeLevel(.
1b270 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b290 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1b2a0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1b2b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1b2c0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1b2d0 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75 72   IN/OUT: Stuctur
1b2e0 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
1b2f0 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
1b300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b310 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61 64  /* Level to read
1b320 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a 20   input from */. 
1b330 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20 20   int *pnRem     
1b340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b350 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f 20   /* Write up to 
1b360 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75 74  this many output
1b370 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20 20   leaves */.){.  
1b380 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1b390 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1b3a0 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  ct;.  Fts5Struct
1b3b0 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
1b3c0 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
1b3d0 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35 53  l[iLvl];.  Fts5S
1b3e0 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
1b3f0 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49 6e  LvlOut;.  Fts5In
1b400 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
1b410 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65   0;       /* Ite
1b420 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e  rator to read in
1b430 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  put data */.  in
1b440 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f  t nRem = pnRem ?
1b450 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a   *pnRem : 0;  /*
1b460 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67   Output leaf pag
1b470 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
1b480 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74   */.  int nInput
1b490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b4a0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1b4b0 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
1b4c0 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  s */.  Fts5SegWr
1b4d0 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
1b4e0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1b4f0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1b500 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1b510 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
1b520 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  Output segment *
1b530 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
1b540 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65  erm;.  int bOlde
1b550 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
1b560 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
1b570 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
1b580 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65  ment is the olde
1b590 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
1b5a0 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1b5b0 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72  Level );.  asser
1b5c0 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c  t( pLvl->nMerge<
1b5d0 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a  =pLvl->nSeg );..
1b5e0 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72    memset(&writer
1b5f0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
1b600 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d  SegWriter));.  m
1b610 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20  emset(&term, 0, 
1b620 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
1b630 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d  r));.  if( pLvl-
1b640 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70  >nMerge ){.    p
1b650 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63  LvlOut = &pStruc
1b660 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31  t->aLevel[iLvl+1
1b670 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1b680 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29  LvlOut->nSeg>0 )
1b690 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70  ;.    nInput = p
1b6a0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1b6b0 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74   pSeg = &pLvlOut
1b6c0 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e  ->aSeg[pLvlOut->
1b6d0 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74  nSeg-1];..    ft
1b6e0 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
1b6f0 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53  writer, pSeg->iS
1b700 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65  egid);.    write
1b710 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  r.writer.pgno = 
1b720 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31  pSeg->pgnoLast+1
1b730 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42 74  ;.    writer.iBt
1b740 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Page = 0;.  }els
1b750 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69  e{.    int iSegi
1b760 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
1b770 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
1b780 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e  );..    /* Exten
1b790 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74  d the Fts5Struct
1b7a0 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65  ure object as re
1b7b0 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65  quired to ensure
1b7c0 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20   the output.    
1b7d0 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74  ** segment exist
1b7e0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c  s. */.    if( iL
1b7f0 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vl==pStruct->nLe
1b800 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66  vel-1 ){.      f
1b810 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
1b820 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53  evel(&p->rc, ppS
1b830 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53  truct);.      pS
1b840 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1b850 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  t;.    }.    fts
1b860 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64  5StructureExtend
1b870 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53  Level(&p->rc, pS
1b880 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31  truct, iLvl+1, 1
1b890 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  , 0);.    if( p-
1b8a0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
1b8b0 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63    pLvl = &pStruc
1b8c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1b8d0 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
1b8e0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1b8f0 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74  iLvl+1];..    ft
1b900 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26  s5WriteInit(p, &
1b910 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b  writer, iSegid);
1b920 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ..    /* Add the
1b930 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20   new segment to 
1b940 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c  the output level
1b950 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26   */.    pSeg = &
1b960 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c  pLvlOut->aSeg[pL
1b970 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20  vlOut->nSeg];.  
1b980 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b    pLvlOut->nSeg+
1b990 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  +;.    pSeg->pgn
1b9a0 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  oFirst = 1;.    
1b9b0 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69  pSeg->iSegid = i
1b9c0 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75  Segid;.    pStru
1b9d0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a  ct->nSegment++;.
1b9e0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70  .    /* Read inp
1b9f0 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d  ut from all segm
1ba00 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
1ba10 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e  t level */.    n
1ba20 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53  Input = pLvl->nS
1ba30 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73  eg;.  }.  bOldes
1ba40 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53  t = (pLvlOut->nS
1ba50 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74  eg==1 && pStruct
1ba60 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32  ->nLevel==iLvl+2
1ba70 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  );..  assert( iL
1ba80 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66  vl>=0 );.  for(f
1ba90 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
1baa0 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30  p, pStruct, 0, 0
1bab0 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49  , 0, 0, iLvl, nI
1bac0 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a 20  nput, &pIter);. 
1bad0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
1bae0 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
1baf0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
1bb00 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
1bb10 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
1bb20 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72  .    Fts5SegIter
1bb30 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70 49   *pSegIter = &pI
1bb40 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
1bb50 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
1bb60 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50  st ];.    int nP
1bb70 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  os;             
1bb80 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69 74          /* posit
1bb90 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
1bba0 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  eld value */.   
1bbb0 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
1bbc0 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 3b  const u8 *pTerm;
1bbd0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66  ..    /* Check f
1bbe0 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74  or key annihilat
1bbf0 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ion. */.    if( 
1bc00 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d  pSegIter->nPos==
1bc10 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c  0 && (bOldest ||
1bc20 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d   pSegIter->bDel=
1bc30 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  =0) ) continue;.
1bc40 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74 73  .    pTerm = fts
1bc50 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
1bc60 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20  Iter, &nTerm);. 
1bc70 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74 65     if( nTerm!=te
1bc80 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70  rm.n || memcmp(p
1bc90 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54  Term, term.p, nT
1bca0 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66  erm) ){.      if
1bcb0 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65  ( pnRem && write
1bcc0 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e  r.nLeafWritten>n
1bcd0 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62  Rem ){.        b
1bce0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
1bcf0 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20       /* This is 
1bd00 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70 65  a new term. Appe
1bd10 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68 65  nd a term to the
1bd20 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 2e   output segment.
1bd30 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57 72   */.      fts5Wr
1bd40 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c  iteAppendTerm(p,
1bd50 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d 2c   &writer, nTerm,
1bd60 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 66   pTerm);.      f
1bd70 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1bd80 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72  >rc, &term, nTer
1bd90 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 7d  m, pTerm);.    }
1bda0 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20  ..    /* Append 
1bdb0 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68 65  the rowid to the
1bdc0 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 2f   output */.    /
1bdd0 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53 49  * WRITEPOSLISTSI
1bde0 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73 20 3d  ZE */.    nPos =
1bdf0 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 2a   pSegIter->nPos*
1be00 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62 44  2 + pSegIter->bD
1be10 65 6c 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  el;.    fts5Writ
1be20 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c 20  eAppendRowid(p, 
1be30 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75 6c  &writer, fts5Mul
1be40 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
1be50 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20 20  r), nPos);..    
1be60 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f  /* Append the po
1be70 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61  sition-list data
1be80 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a   to the output *
1be90 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49  /.    fts5ChunkI
1bea0 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74  terate(p, pSegIt
1beb0 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74  er, (void*)&writ
1bec0 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75  er, fts5MergeChu
1bed0 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d  nkCallback);.  }
1bee0 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
1bef0 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   last leaf page 
1bf00 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65  to disk. Set the
1bf10 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   output segment 
1bf20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20  b-tree height.  
1bf30 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66  ** and last leaf
1bf40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20   page number at 
1bf50 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20  the same time.  
1bf60 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69  */.  fts5WriteFi
1bf70 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c  nish(p, &writer,
1bf80 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74   &pSeg->pgnoLast
1bf90 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75  );..  if( fts5Mu
1bfa0 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49  ltiIterEof(p, pI
1bfb0 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  ter) ){.    int 
1bfc0 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76  i;..    /* Remov
1bfd0 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20  e the redundant 
1bfe0 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68  segments from th
1bff0 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  e %_data table *
1c000 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
1c010 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20  <nInput; i++){. 
1c020 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d       fts5DataRem
1c030 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c  oveSegment(p, pL
1c040 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67  vl->aSeg[i].iSeg
1c050 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
1c060 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65  /* Remove the re
1c070 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73  dundant segments
1c080 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20   from the input 
1c090 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28  level */.    if(
1c0a0 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e   pLvl->nSeg!=nIn
1c0b0 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  put ){.      int
1c0c0 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e   nMove = (pLvl->
1c0d0 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a  nSeg - nInput) *
1c0e0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1c0f0 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
1c100 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76       memmove(pLv
1c110 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e  l->aSeg, &pLvl->
1c120 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d  aSeg[nInput], nM
1c130 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ove);.    }.    
1c140 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1c150 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  t -= nInput;.   
1c160 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e   pLvl->nSeg -= n
1c170 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d  Input;.    pLvl-
1c180 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20  >nMerge = 0;.   
1c190 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   if( pSeg->pgnoL
1c1a0 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ast==0 ){.      
1c1b0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b  pLvlOut->nSeg--;
1c1c0 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
1c1d0 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  nSegment--;.    
1c1e0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  }.  }else{.    a
1c1f0 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e  ssert( pSeg->pgn
1c200 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66  oLast>0 );.    f
1c210 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1c220 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70  p, pIter);.    p
1c230 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49  Lvl->nMerge = nI
1c240 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  nput;.  }..  fts
1c250 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
1c260 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
1c270 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
1c280 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20 29  );.  if( pnRem )
1c290 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74 65   *pnRem -= write
1c2a0 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b 0a  r.nLeafWritten;.
1c2b0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20 74  }../*.** Do up t
1c2c0 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20 61  o nPg pages of a
1c2d0 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f 6e  utomerge work on
1c2e0 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73   the index..*/.s
1c2f0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1c300 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74 73  ndexMerge(.  Fts
1c310 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
1c320 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c330 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
1c340 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1c350 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63  ucture **ppStruc
1c360 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f  t,       /* IN/O
1c370 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75  UT: Current stru
1c380 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a  cture of index *
1c390 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20 20 20  /.  int nPg     
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3b0 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66 20      /* Pages of 
1c3c0 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b  work to do */.){
1c3d0 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50  .  int nRem = nP
1c3e0 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  g;.  Fts5Structu
1c3f0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
1c400 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65  pStruct;.  while
1c410 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72  ( nRem>0 && p->r
1c420 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c430 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
1c440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c450 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  /* To iterate th
1c460 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
1c470 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c      int iBestLvl
1c480 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1c490 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e  /* Level offerin
1c4a0 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74  g the most input
1c4b0 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
1c4c0 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20   int nBest = 0; 
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c4e0 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
1c4f0 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74  segments on best
1c500 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f   level */..    /
1c510 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74  * Set iBestLvl t
1c520 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72  o the level to r
1c530 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ead input segmen
1c540 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ts from. */.    
1c550 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
1c560 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20  >nLevel>0 );.   
1c570 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1c580 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1c590 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1c5a0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1c5b0 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
1c5c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1c5d0 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  vl];.      if( p
1c5e0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
1c5f0 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
1c600 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b  >nMerge>nBest ){
1c610 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74  .          iBest
1c620 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
1c630 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
1c640 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
1c650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
1c660 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1c670 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65     if( pLvl->nSe
1c680 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  g>nBest ){.     
1c690 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
1c6a0 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69  >nSeg;.        i
1c6b0 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
1c6c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1c6d0 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69     /* If nBest i
1c6e0 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20  s still 0, then 
1c6f0 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
1c700 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64  e empty. */.#ifd
1c710 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1c720 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1c730 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c  nBest==0 && iLvl
1c740 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1c750 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1c760 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1c770 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1c780 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Seg==0 );.    }.
1c790 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
1c7a0 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69 67  nBest<p->pConfig
1c7b0 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20 20  ->nAutomerge .  
1c7c0 20 20 20 20 20 20 26 26 20 70 53 74 72 75 63 74        && pStruct
1c7d0 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
1c7e0 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20 20  l].nMerge==0 .  
1c7f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
1c800 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ak;.    }.    ft
1c810 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1c820 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 69  l(p, &pStruct, i
1c830 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  BestLvl, &nRem);
1c840 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1c850 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 74  SQLITE_OK && pSt
1c860 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65  ruct->aLevel[iBe
1c870 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30  stLvl].nMerge==0
1c880 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74   ){.      fts5St
1c890 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
1c8a0 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70 53  , iBestLvl+1, pS
1c8b0 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20  truct);.    }.  
1c8c0 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20  }.  *ppStruct = 
1c8d0 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  pStruct;.}../*.*
1c8e0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c 65  * A total of nLe
1c8f0 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f 66  af leaf pages of
1c900 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20 62   data has just b
1c910 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20 61  een flushed to a
1c920 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d   level-0.** segm
1c930 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ent. This functi
1c940 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20 77  on updates the w
1c950 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63 63  rite-counter acc
1c960 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69 66  ordingly and, if
1c970 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20 70  .** necessary, p
1c980 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65 6e  erforms incremen
1c990 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e 0a  tal merge work..
1c9a0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1c9b0 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
1c9c0 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
1c9d0 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
1c9e0 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
1c9f0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1ca00 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1ca10 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1ca20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
1ca30 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20 20  dexAutomerge(.  
1ca40 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca60 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1ca70 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1ca80 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
1ca90 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
1caa0 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
1cab0 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
1cac0 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61 66  x */.  int nLeaf
1cad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cae0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1caf0 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76 65   of output leave
1cb00 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a  s just written *
1cb10 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
1cb20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1cb30 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f  ->pConfig->nAuto
1cb40 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20 46  merge>0 ){.    F
1cb50 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1cb60 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1cb70 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69 74  t;.    u64 nWrit
1cb80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1cb90 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20       /* Initial 
1cba0 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d 63  value of write-c
1cbb0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e  ounter */.    in
1cbc0 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20 20  t nWork;        
1cbd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cbe0 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71 75  umber of work-qu
1cbf0 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d 20  anta to perform 
1cc00 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d 3b  */.    int nRem;
1cc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1cc30 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65 66  f leaf pages lef
1cc40 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20  t to write */.. 
1cc50 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1cc60 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e 20   write-counter. 
1cc70 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 20  While doing so, 
1cc80 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20  set nWork. */.  
1cc90 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72 75    nWrite = pStru
1cca0 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1ccb0 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20 28  r;.    nWork = (
1ccc0 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b 20  int)(((nWrite + 
1ccd0 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f 72  nLeaf) / p->nWor
1cce0 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74 65  kUnit) - (nWrite
1ccf0 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29   / p->nWorkUnit)
1cd00 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  );.    pStruct->
1cd10 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b 3d  nWriteCounter +=
1cd20 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65 6d   nLeaf;.    nRem
1cd30 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f 72   = (int)(p->nWor
1cd40 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a 20  kUnit * nWork * 
1cd50 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29  pStruct->nLevel)
1cd60 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ;..    fts5Index
1cd70 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75 63  Merge(p, ppStruc
1cd80 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a  t, nRem);.  }.}.
1cd90 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1cda0 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67  5IndexCrisismerg
1cdb0 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
1cdc0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1cdd0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1cde0 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1cdf0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1ce00 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20 20  *ppStruct       
1ce10 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72   /* IN/OUT: Curr
1ce20 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f 66  ent structure of
1ce30 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 63   index */.){.  c
1ce40 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69 73  onst int nCrisis
1ce50 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
1ce60 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20 46  CrisisMerge;.  F
1ce70 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
1ce80 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63  truct = *ppStruc
1ce90 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20  t;.  int iLvl = 
1cea0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
1ceb0 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc!=SQLITE_OK |
1cec0 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  | pStruct->nLeve
1ced0 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  l>0 );.  while( 
1cee0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cef0 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   && pStruct->aLe
1cf00 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d  vel[iLvl].nSeg>=
1cf10 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20 66  nCrisis ){.    f
1cf20 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1cf30 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
1cf40 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61 73  iLvl, 0);.    as
1cf50 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
1cf60 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75 63  ITE_OK || pStruc
1cf70 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b  t->nLevel>(iLvl+
1cf80 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35 53 74  1) );.    fts5St
1cf90 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
1cfa0 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  , iLvl+1, pStruc
1cfb0 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a  t);.    iLvl++;.
1cfc0 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
1cfd0 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73 74  = pStruct;.}..st
1cfe0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
1cff0 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e 64  exReturn(Fts5Ind
1d000 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ex *p){.  int rc
1d010 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72   = p->rc;.  p->r
1d020 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1d030 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74   return rc;.}..t
1d040 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
1d050 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35 46  s5FlushCtx Fts5F
1d060 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74 20  lushCtx;.struct 
1d070 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a 20  Fts5FlushCtx {. 
1d080 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64 78   Fts5Index *pIdx
1d090 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ;.  Fts5SegWrite
1d0a0 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f  r writer; .};../
1d0b0 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75 66  *.** Buffer aBuf
1d0c0 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c 69  [] contains a li
1d0d0 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20 61  st of varints, a
1d0e0 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20  ll small enough 
1d0f0 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20 33  to fit.** in a 3
1d100 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20 52  2-bit integer. R
1d110 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20 6f  eturn the size o
1d120 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70 72  f the largest pr
1d130 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a 2a  efix of this .**
1d140 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65 73   list nMax bytes
1d150 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a 65   or less in size
1d160 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d170 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69  fts5PoslistPrefi
1d180 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75 66  x(const u8 *aBuf
1d190 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20 69  , int nMax){.  i
1d1a0 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64 75  nt ret;.  u32 du
1d1b0 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74 73  mmy;.  ret = fts
1d1c0 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42 75  5GetVarint32(aBu
1d1d0 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66 28  f, dummy);.  if(
1d1e0 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20 20   ret<nMax ){.   
1d1f0 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
1d200 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47     int i = fts5G
1d210 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75 66  etVarint32(&aBuf
1d220 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20  [ret], dummy);. 
1d230 20 20 20 20 20 69 66 28 20 28 72 65 74 20 2b 20       if( (ret + 
1d240 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61  i) > nMax ) brea
1d250 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b 3d 20  k;.      ret += 
1d260 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  i;.    }.  }.  r
1d270 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a  eturn ret;.}../*
1d280 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65 20 63 6f  .** Flush the co
1d290 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d  ntents of in-mem
1d2a0 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 20 69  ory hash table i
1d2b0 48 61 73 68 20 74 6f 20 61 20 6e 65 77 20 6c 65  Hash to a new le
1d2c0 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e  vel-0 .** segmen
1d2d0 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20  t on disk. Also 
1d2e0 75 70 64 61 74 65 20 74 68 65 20 63 6f 72 72 65  update the corre
1d2f0 73 70 6f 6e 64 69 6e 67 20 73 74 72 75 63 74 75  sponding structu
1d300 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a  re record..**.**
1d310 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d320 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
1d330 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
1d340 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
1d350 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
1d360 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
1d370 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
1d380 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1d390 76 6f 69 64 20 66 74 73 35 46 6c 75 73 68 4f 6e  void fts5FlushOn
1d3a0 65 48 61 73 68 28 46 74 73 35 49 6e 64 65 78 20  eHash(Fts5Index 
1d3b0 2a 70 29 7b 0a 20 20 46 74 73 35 48 61 73 68 20  *p){.  Fts5Hash 
1d3c0 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73  *pHash = p->pHas
1d3d0 68 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  h;.  Fts5Structu
1d3e0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 69  re *pStruct;.  i
1d3f0 6e 74 20 69 53 65 67 69 64 3b 0a 20 20 69 6e 74  nt iSegid;.  int
1d400 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20   pgnoLast = 0;  
1d410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d420 2a 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65  * Last leaf page
1d430 20 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65   number in segme
1d440 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61  nt */..  /* Obta
1d450 69 6e 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  in a reference t
1d460 6f 20 74 68 65 20 69 6e 64 65 78 20 73 74 72 75  o the index stru
1d470 63 74 75 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61  cture and alloca
1d480 74 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74  te a new segment
1d490 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  -id.  ** for the
1d4a0 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20 73 65 67   new level-0 seg
1d4b0 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72  ment.  */.  pStr
1d4c0 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
1d4d0 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69 53  ureRead(p);.  iS
1d4e0 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
1d4f0 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
1d500 75 63 74 29 3b 0a 0a 20 20 69 66 28 20 69 53 65  uct);..  if( iSe
1d510 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  gid ){.    const
1d520 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70   int pgsz = p->p
1d530 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20  Config->pgsz;.. 
1d540 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1d550 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20  Segment *pSeg;  
1d560 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20   /* New segment 
1d570 77 69 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a  within pStruct *
1d580 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  /.    Fts5Buffer
1d590 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20 20   *pBuf;         
1d5a0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e      /* Buffer in
1d5b0 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62   which to assemb
1d5c0 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  le leaf page */.
1d5d0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a      Fts5Buffer *
1d5e0 70 50 67 69 64 78 3b 20 20 20 20 20 20 20 20 20  pPgidx;         
1d5f0 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77    /* Buffer in w
1d600 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65  hich to assemble
1d610 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46   pgidx */..    F
1d620 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69  ts5SegWriter wri
1d630 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69  ter;.    fts5Wri
1d640 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65  teInit(p, &write
1d650 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20  r, iSegid);..   
1d660 20 70 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e   pBuf = &writer.
1d670 77 72 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20  writer.buf;.    
1d680 70 50 67 69 64 78 20 3d 20 26 77 72 69 74 65 72  pPgidx = &writer
1d690 2e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a  .writer.pgidx;..
1d6a0 20 20 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65      /* fts5Write
1d6b0 49 6e 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61  Init() should ha
1d6c0 76 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ve initialized t
1d6d0 68 65 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d  he buffers to (m
1d6e0 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20  ost likely).    
1d6f0 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  ** the maximum s
1d700 70 61 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a  pace required. *
1d710 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  /.    assert( p-
1d720 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70  >rc || pBuf->nSp
1d730 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53  ace>=(pgsz + FTS
1d740 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20  5_DATA_PADDING) 
1d750 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1d760 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e  ->rc || pPgidx->
1d770 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20  nSpace>=(pgsz + 
1d780 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
1d790 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65  G) );..    /* Be
1d7a0 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72  gin scanning thr
1d7b0 6f 75 67 68 20 68 61 73 68 20 74 61 62 6c 65 20  ough hash table 
1d7c0 65 6e 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f  entries. This lo
1d7d0 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  op runs once for
1d7e0 20 65 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72   each.    ** ter
1d7f0 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e  m/doclist curren
1d800 74 6c 79 20 73 74 6f 72 65 64 20 77 69 74 68 69  tly stored withi
1d810 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  n the hash table
1d820 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e  . */.    if( p->
1d830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d840 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
1d850 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1d860 61 6e 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c  anInit(pHash, 0,
1d870 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77   0);.    }.    w
1d880 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1d890 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c  ITE_OK && 0==sql
1d8a0 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1d8b0 45 6f 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20  Eof(pHash) ){.  
1d8c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d8d0 7a 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  zTerm;          
1d8e0 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
1d8f0 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20  ning term */.   
1d900 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f     const u8 *pDo
1d910 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f  clist;         /
1d920 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63  * Pointer to doc
1d930 6c 69 73 74 20 66 6f 72 20 74 68 69 73 20 74 65  list for this te
1d940 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rm */.      int 
1d950 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
1d960 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1d970 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79  of doclist in by
1d980 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a  tes */..      /*
1d990 20 57 72 69 74 65 20 74 68 65 20 74 65 72 6d 20   Write the term 
1d9a0 66 6f 72 20 74 68 69 73 20 65 6e 74 72 79 20 74  for this entry t
1d9b0 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20  o disk. */.     
1d9c0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1d9d0 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c  ScanEntry(pHash,
1d9e0 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69   &zTerm, &pDocli
1d9f0 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a  st, &nDoclist);.
1da00 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
1da10 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
1da20 69 74 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65  iter, (int)strle
1da30 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74  n(zTerm), (const
1da40 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20 20   u8*)zTerm);..  
1da50 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69 74      assert( writ
1da60 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  er.bFirstRowidIn
1da70 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Page==0 );.     
1da80 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66   if( pgsz>=(pBuf
1da90 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20  ->n + pPgidx->n 
1daa0 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29 20  + nDoclist + 1) 
1dab0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
1dac0 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1dad0 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
1dae0 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 2a   current leaf. *
1daf0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
1db00 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1db10 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69 73  ob(pBuf, pDoclis
1db20 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  t, nDoclist);.  
1db30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1db40 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
1db50 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  0;.        i64 i
1db60 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20 20  Delta = 0;.     
1db70 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
1db80 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ..        /* The
1db90 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74 20   entire doclist 
1dba0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
1dbb0 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20 66  this leaf. The f
1dbc0 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20 20  ollowing .      
1dbd0 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61 74    ** loop iterat
1dbe0 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20 70  es through the p
1dbf0 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61 6b  oslists that mak
1dc00 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74  e up the current
1dc10 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f 63   .        ** doc
1dc20 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  list.  */.      
1dc30 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1dc40 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66  SQLITE_OK && iOf
1dc50 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20  f<nDoclist ){.  
1dc60 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73          int nPos
1dc70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
1dc80 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20  nCopy;.         
1dc90 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
1dca0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
1dcb0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
1dcc0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28 75  oclist[iOff], (u
1dcd0 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20  64*)&iDelta);.  
1dce0 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20          nCopy = 
1dcf0 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
1dd00 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66  ze(&pDoclist[iOf
1dd10 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  f], &nPos, &bDum
1dd20 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  my);.          n
1dd30 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20  Copy += nPos;.  
1dd40 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 2b          iRowid +
1dd50 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
1dd60 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69      .          i
1dd70 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73 74  f( writer.bFirst
1dd80 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20  RowidInPage ){. 
1dd90 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50             fts5P
1dda0 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b 30  utU16(&pBuf->p[0
1ddb0 5d 2c 20 28 75 31 36 29 70 42 75 66 2d 3e 6e 29  ], (u16)pBuf->n)
1ddc0 3b 20 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77  ;   /* first row
1ddd0 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20  id on page */.  
1dde0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
1ddf0 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1de00 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1de10 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f  >p[pBuf->n], iRo
1de20 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1de30 20 20 77 72 69 74 65 72 2e 62 46 69 72 73 74 52    writer.bFirstR
1de40 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1de50 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1de60 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64  WriteDlidxAppend
1de70 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f  (p, &writer, iRo
1de80 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
1de90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1dea0 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71     pBuf->n += sq
1deb0 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72 69  lite3Fts5PutVari
1dec0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66  nt(&pBuf->p[pBuf
1ded0 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20  ->n], iDelta);. 
1dee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1def0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 75       assert( pBu
1df00 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61  f->n<=pBuf->nSpa
1df10 63 65 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ce );..         
1df20 20 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20   if( (pBuf->n + 
1df30 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70  pPgidx->n + nCop
1df40 79 29 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20  y) <= pgsz ){.  
1df50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1df60 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20   entire poslist 
1df70 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
1df80 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f  current leaf. So
1df90 20 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20   copy.          
1dfa0 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67    ** it in one g
1dfb0 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  o. */.          
1dfc0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1dfd0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
1dfe0 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
1dff0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1e000 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e010 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
1e020 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c  tire poslist wil
1e030 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69  l not fit on thi
1e040 73 20 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65  s leaf. So it ne
1e050 65 64 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  eds.            
1e060 2a 2a 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20  ** to be broken 
1e070 69 6e 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54  into sections. T
1e080 68 65 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63  he only qualific
1e090 61 74 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20  ation being.    
1e0a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1e0b0 65 61 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74  each varint must
1e0c0 20 62 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69   be stored conti
1e0d0 67 75 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20  guously.  */.   
1e0e0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75           const u
1e0f0 38 20 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70  8 *pPoslist = &p
1e100 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20  Doclist[iOff];. 
1e110 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69             int i
1e120 50 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Pos = 0;.       
1e130 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
1e140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
1e160 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20  t nSpace = pgsz 
1e170 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69  - pBuf->n - pPgi
1e180 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20  dx->n;.         
1e190 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a       int n = 0;.
1e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
1e1b0 28 20 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29  ( (nCopy - iPos)
1e1c0 3c 3d 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20  <=nSpace ){.    
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20              n = 
1e1e0 6e 43 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20  nCopy - iPos;.  
1e1f0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
1e200 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
1e210 20 20 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69     n = fts5Posli
1e220 73 74 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69  stPrefix(&pPosli
1e230 73 74 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65  st[iPos], nSpace
1e240 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1e250 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1e260 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a   assert( n>0 );.
1e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
1e280 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1e290 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50  ndBlob(pBuf, &pP
1e2a0 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29  oslist[iPos], n)
1e2b0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e2c0 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20  iPos += n;.     
1e2d0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
1e2e0 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
1e2f0 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20  n)>=pgsz ){.    
1e300 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1e310 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1e320 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20  , &writer);.    
1e330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
1e350 6f 73 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61  os>=nCopy ) brea
1e360 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
1e370 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e380 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
1e390 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Copy;.        }.
1e3a0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
1e3b0 2a 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74  * TODO2: Doclist
1e3c0 20 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74   terminator writ
1e3d0 74 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ten here. */.   
1e3e0 20 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42     /* pBuf->p[pB
1e3f0 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b  uf->n++] = '\0';
1e400 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
1e410 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
1e420 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
1e430 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1e440 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b  ScanNext(pHash);
1e450 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1e460 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
1e470 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35  pHash);.    fts5
1e480 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
1e490 77 72 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73  writer, &pgnoLas
1e4a0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61  t);..    /* Upda
1e4b0 74 65 20 74 68 65 20 46 74 73 35 53 74 72 75 63  te the Fts5Struc
1e4c0 74 75 72 65 2e 20 49 74 20 69 73 20 77 72 69 74  ture. It is writ
1e4d0 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ten back to the 
1e4e0 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65 0a  database by the.
1e4f0 20 20 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63      ** fts5Struc
1e500 74 75 72 65 52 65 6c 65 61 73 65 28 29 20 63 61  tureRelease() ca
1e510 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20  ll below.  */.  
1e520 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e    if( pStruct->n
1e530 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  Level==0 ){.    
1e540 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
1e550 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
1e560 26 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d  &pStruct);.    }
1e570 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1e580 72 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70  reExtendLevel(&p
1e590 2d 3e 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30  ->rc, pStruct, 0
1e5a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
1e5b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e5c0 4b 20 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20  K ){.      pSeg 
1e5d0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1e5e0 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72  el[0].aSeg[ pStr
1e5f0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e  uct->aLevel[0].n
1e600 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70  Seg++ ];.      p
1e610 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
1e620 65 67 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67  egid;.      pSeg
1e630 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b  ->pgnoFirst = 1;
1e640 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e  .      pSeg->pgn
1e650 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74  oLast = pgnoLast
1e660 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
1e670 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20  >nSegment++;.   
1e680 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
1e690 74 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30  turePromote(p, 0
1e6a0 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a  , pStruct);.  }.
1e6b0 0a 20 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f  .  fts5IndexAuto
1e6c0 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  merge(p, &pStruc
1e6d0 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  t, pgnoLast);.  
1e6e0 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
1e6f0 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74  erge(p, &pStruct
1e700 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
1e710 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
1e720 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  ct);.  fts5Struc
1e730 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
1e740 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  uct);.}../*.** F
1e750 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 73 74  lush any data st
1e760 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
1e770 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
1e780 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1e790 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1e7a0 64 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68  d fts5IndexFlush
1e7b0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1e7c0 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69    /* Unless it i
1e7d0 73 20 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74  s empty, flush t
1e7e0 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f  he hash table to
1e7f0 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70   disk */.  if( p
1e800 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29  ->nPendingData )
1e810 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d  {.    assert( p-
1e820 3e 70 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d  >pHash );.    p-
1e830 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20  >nPendingData = 
1e840 30 3b 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68  0;.    fts5Flush
1e850 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a  OneHash(p);.  }.
1e860 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  }...int sqlite3F
1e870 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
1e880 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1e890 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1e8a0 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
1e8b0 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20  Structure *pNew 
1e8c0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20  = 0;.  int nSeg 
1e8d0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1e8e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1e8f0 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
1e900 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75  lush(p);.  pStru
1e910 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
1e920 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66  reRead(p);..  if
1e930 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
1e940 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1e950 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
1e960 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
1e970 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
1e980 29 3b 0a 20 20 20 20 6e 53 65 67 20 3d 20 70 53  );.    nSeg = pS
1e990 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b  truct->nSegment;
1e9a0 0a 20 20 20 20 69 66 28 20 6e 53 65 67 3e 31 20  .    if( nSeg>1 
1e9b0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  ){.      int nBy
1e9c0 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1e9d0 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 20 20  Structure);.    
1e9e0 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72    nByte += (pStr
1e9f0 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a  uct->nLevel+1) *
1ea00 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1ea10 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20  ctureLevel);.   
1ea20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53     pNew = (Fts5S
1ea30 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
1ea40 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
1ea50 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
1ea60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1ea70 70 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35  pNew ){.    Fts5
1ea80 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1ea90 70 4c 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42  pLvl;.    int nB
1eaa0 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a  yte = nSeg * siz
1eab0 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1eac0 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70  eSegment);.    p
1ead0 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53  New->nLevel = pS
1eae0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b  truct->nLevel+1;
1eaf0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  .    pNew->nRef 
1eb00 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 1;.    pNew->n
1eb10 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20 70  WriteCounter = p
1eb20 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
1eb30 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20  unter;.    pLvl 
1eb40 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  = &pNew->aLevel[
1eb50 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
1eb60 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67  ;.    pLvl->aSeg
1eb70 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
1eb80 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65  eSegment*)sqlite
1eb90 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
1eba0 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
1ebb0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53      if( pLvl->aS
1ebc0 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  eg ){.      int 
1ebd0 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
1ebe0 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20    int iSegOut = 
1ebf0 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76  0;.      for(iLv
1ec00 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
1ec10 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
1ec20 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  +){.        for(
1ec30 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74  iSeg=0; iSeg<pSt
1ec40 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1ec50 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l].nSeg; iSeg++)
1ec60 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c  {.          pLvl
1ec70 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d 20  ->aSeg[iSegOut] 
1ec80 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  = pStruct->aLeve
1ec90 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65  l[iLvl].aSeg[iSe
1eca0 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53  g];.          iS
1ecb0 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20  egOut++;.       
1ecc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
1ecd0 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20   pNew->nSegment 
1ece0 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e  = pLvl->nSeg = n
1ecf0 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Seg;.    }else{.
1ed00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1ed10 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ee(pNew);.      
1ed20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  pNew = 0;.    }.
1ed30 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 20    }..  if( pNew 
1ed40 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 20  ){.    int iLvl 
1ed50 3d 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31  = pNew->nLevel-1
1ed60 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
1ed70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ed80 20 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c   pNew->aLevel[iL
1ed90 76 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20  vl].nSeg>0 ){.  
1eda0 20 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46      int nRem = F
1edb0 54 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49  TS5_OPT_WORK_UNI
1edc0 54 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  T;.      fts5Ind
1edd0 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
1ede0 26 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52  &pNew, iLvl, &nR
1edf0 65 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  em);.    }..    
1ee00 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
1ee10 74 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  te(p, pNew);.   
1ee20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1ee30 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d  lease(pNew);.  }
1ee40 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
1ee50 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1ee60 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
1ee70 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20  IndexReturn(p); 
1ee80 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
1ee90 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74  ts5IndexMerge(Ft
1eea0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20  s5Index *p, int 
1eeb0 6e 4d 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53  nMerge){.  Fts5S
1eec0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1eed0 74 3b 0a 0a 20 20 70 53 74 72 75 63 74 20 3d 20  t;..  pStruct = 
1eee0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
1eef0 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72  d(p);.  if( pStr
1ef00 75 63 74 20 26 26 20 70 53 74 72 75 63 74 2d 3e  uct && pStruct->
1ef10 6e 4c 65 76 65 6c 20 29 7b 0a 20 20 20 20 66 74  nLevel ){.    ft
1ef20 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20  s5IndexMerge(p, 
1ef30 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65  &pStruct, nMerge
1ef40 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
1ef50 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53 74  tureWrite(p, pSt
1ef60 72 75 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73  ruct);.  }.  fts
1ef70 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1ef80 65 28 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 72  e(pStruct);..  r
1ef90 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
1efa0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61  eturn(p);.}..sta
1efb0 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
1efc0 6c 69 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20  listCallback(.  
1efd0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1efe0 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c   void *pContext,
1eff0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
1f000 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
1f010 0a 29 7b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  .){.  assert_nc(
1f020 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20   nChunk>=0 );.  
1f030 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a  if( nChunk>0 ){.
1f040 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1f050 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 28 46 74  feAppendBlob((Ft
1f060 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74 65  s5Buffer*)pConte
1f070 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  xt, pChunk, nChu
1f080 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65  nk);.  }.}..type
1f090 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69  def struct Posli
1f0a0 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f  stCallbackCtx Po
1f0b0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
1f0c0 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  ;.struct Poslist
1f0d0 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20  CallbackCtx {.  
1f0e0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1f0f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f100 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1f110 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74  s buffer */.  Ft
1f120 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
1f130 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
1f140 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65   Restrict matche
1f150 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e  s to this column
1f160 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74 65   */.  int eState
1f170 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1f180 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
1f190 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65  ve */.};..typede
1f1a0 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  f struct Poslist
1f1b0 4f 66 66 73 65 74 73 43 74 78 20 50 6f 73 6c 69  OffsetsCtx Posli
1f1c0 73 74 4f 66 66 73 65 74 73 43 74 78 3b 0a 73 74  stOffsetsCtx;.st
1f1d0 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66 73  ruct PoslistOffs
1f1e0 65 74 73 43 74 78 20 7b 0a 20 20 46 74 73 35 42  etsCtx {.  Fts5B
1f1f0 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20  uffer *pBuf;    
1f200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 70             /* Ap
1f210 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62 75 66  pend to this buf
1f220 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  fer */.  Fts5Col
1f230 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20  set *pColset;   
1f240 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74           /* Rest
1f250 72 69 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20  rict matches to 
1f260 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20  this column */. 
1f270 20 69 6e 74 20 69 52 65 61 64 3b 0a 20 20 69 6e   int iRead;.  in
1f280 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a  t iWrite;.};../*
1f290 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74  .** TODO: Make t
1f2a0 68 69 73 20 6d 6f 72 65 20 65 66 66 69 63 69 65  his more efficie
1f2b0 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt!.*/.static in
1f2c0 74 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65  t fts5IndexColse
1f2d0 74 54 65 73 74 28 46 74 73 35 43 6f 6c 73 65 74  tTest(Fts5Colset
1f2e0 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69   *pColset, int i
1f2f0 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1f300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
1f310 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  set->nCol; i++){
1f320 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
1f330 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c  ->aiCol[i]==iCol
1f340 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
1f350 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1f360 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1f370 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 61  PoslistOffsetsCa
1f380 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
1f390 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20  dex *p, .  void 
1f3a0 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
1f3b0 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
1f3c0 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
1f3d0 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74  PoslistOffsetsCt
1f3e0 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
1f3f0 73 74 4f 66 66 73 65 74 73 43 74 78 2a 29 70 43  stOffsetsCtx*)pC
1f400 6f 6e 74 65 78 74 3b 0a 20 20 61 73 73 65 72 74  ontext;.  assert
1f410 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29  _nc( nChunk>=0 )
1f420 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30  ;.  if( nChunk>0
1f430 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   ){.    int i = 
1f440 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 3c  0;.    while( i<
1f450 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
1f460 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20 20 20  int iVal;.      
1f470 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
1f480 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69 5d 2c  nt32(&pChunk[i],
1f490 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20 69 56   iVal);.      iV
1f4a0 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52 65 61  al += pCtx->iRea
1f4b0 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70 43 74  d - 2;.      pCt
1f4c0 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61 6c 3b  x->iRead = iVal;
1f4d0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 49  .      if( fts5I
1f4e0 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70  ndexColsetTest(p
1f4f0 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 56  Ctx->pColset, iV
1f500 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 66  al) ){.        f
1f510 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
1f520 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e  endVarint(pCtx->
1f530 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32 20 2d  pBuf, iVal + 2 -
1f540 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29 3b 0a   pCtx->iWrite);.
1f550 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 69 57          pCtx->iW
1f560 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20 20 20  rite = iVal;.   
1f570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
1f580 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1f590 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43  s5PoslistFilterC
1f5a0 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
1f5b0 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
1f5c0 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63   *pContext, .  c
1f5d0 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c  onst u8 *pChunk,
1f5e0 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20   int nChunk.){. 
1f5f0 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
1f600 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73  Ctx *pCtx = (Pos
1f610 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a  listCallbackCtx*
1f620 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 61 73 73  )pContext;.  ass
1f630 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
1f640 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
1f650 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  k>0 ){.    /* Se
1f660 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20  arch through to 
1f670 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76  find the first v
1f680 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
1f690 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a   1. This is the.
1f6a0 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20      ** start of 
1f6b0 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73  the next columns
1f6c0 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e   hits. */.    in
1f6d0 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
1f6e0 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20   iStart = 0;..  
1f6f0 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
1f700 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  te==2 ){.      i
1f710 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66  nt iCol;.      f
1f720 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
1f730 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
1f740 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ol);.      if( f
1f750 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
1f760 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
1f770 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  , iCol) ){.     
1f780 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
1f790 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73  = 1;.        fts
1f7a0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1f7b0 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42  dVarint(pCtx->pB
1f7c0 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  uf, 1);.      }e
1f7d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
1f7e0 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20  x->eState = 0;. 
1f7f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f800 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69    do {.      whi
1f810 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20  le( i<nChunk && 
1f820 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20  pChunk[i]!=0x01 
1f830 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
1f840 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78  ( pChunk[i] & 0x
1f850 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  80 ) i++;.      
1f860 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
1f870 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
1f880 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
1f890 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
1f8a0 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e  ppendBlob(pCtx->
1f8b0 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53  pBuf, &pChunk[iS
1f8c0 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29  tart], i-iStart)
1f8d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f8e0 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  if( i<nChunk ){.
1f8f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
1f900 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
1f910 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b   = i;.        i+
1f920 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  +;.        if( i
1f930 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >=nChunk ){.    
1f940 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
1f950 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
1f960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f970 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
1f980 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20  nt32(pChunk, i, 
1f990 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iCol);.         
1f9a0 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
1f9b0 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
1f9c0 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
1f9d0 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
1f9e0 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
1f9f0 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
1fa00 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
1fa10 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74  feAppendBlob(pCt
1fa20 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b  x->pBuf, &pChunk
1fa30 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61  [iStart], i-iSta
1fa40 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
1fa50 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
1fa60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1fa70 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fa80 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
1fa90 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
1faa0 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
1fab0 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
1fac0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
1fad0 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73   (not EOF). This
1fae0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  .** function app
1faf0 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69 6f  ends the positio
1fb00 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72 20  n list data for 
1fb10 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
1fb20 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  y to.** buffer p
1fb30 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  Buf. It does not
1fb40 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   make a copy of 
1fb50 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
1fb60 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e  t size.** field.
1fb70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1fb80 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69  fts5SegiterPosli
1fb90 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  st(.  Fts5Index 
1fba0 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65  *p,.  Fts5SegIte
1fbb0 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35 43  r *pSeg,.  Fts5C
1fbc0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a  olset *pColset,.
1fbd0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1fbe0 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d 66  uf.){.  if( 0==f
1fbf0 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
1fc00 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67  ->rc, pBuf, pSeg
1fc10 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20 69  ->nPos) ){.    i
1fc20 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b  f( pColset==0 ){
1fc30 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b  .      fts5Chunk
1fc40 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c  Iterate(p, pSeg,
1fc50 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74   (void*)pBuf, ft
1fc60 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  s5PoslistCallbac
1fc70 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  k);.    }else{. 
1fc80 20 20 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e       if( p->pCon
1fc90 66 69 67 2d 3e 62 4f 66 66 73 65 74 73 3d 3d 30  fig->bOffsets==0
1fca0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 6f 73 6c   ){.        Posl
1fcb0 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 73 43  istOffsetsCtx sC
1fcc0 74 78 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  tx;.        mems
1fcd0 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69 7a  et(&sCtx, 0, siz
1fce0 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20 20  eof(sCtx));.    
1fcf0 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d 20      sCtx.pBuf = 
1fd00 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73 43  pBuf;.        sC
1fd10 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f  tx.pColset = pCo
1fd20 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 66 74  lset;.        ft
1fd30 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
1fd40 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26  , pSeg, (void*)&
1fd50 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73  sCtx, fts5Poslis
1fd60 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63 6b  tOffsetsCallback
1fd70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1fd80 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 43          PoslistC
1fd90 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b  allbackCtx sCtx;
1fda0 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42  .        sCtx.pB
1fdb0 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20  uf = pBuf;.     
1fdc0 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20     sCtx.pColset 
1fdd0 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20  = pColset;.     
1fde0 20 20 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d     sCtx.eState =
1fdf0 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
1fe00 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29  Test(pColset, 0)
1fe10 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1fe20 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30  ( sCtx.eState==0
1fe30 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d   || sCtx.eState=
1fe40 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74  =1 );.        ft
1fe50 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
1fe60 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26  , pSeg, (void*)&
1fe70 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73  sCtx, fts5Poslis
1fe80 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29  tFilterCallback)
1fe90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1fea0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f    }.}../*.** IN/
1feb0 4f 55 54 20 70 61 72 61 6d 65 74 65 72 20 28 2a  OUT parameter (*
1fec0 70 61 29 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  pa) points to a 
1fed0 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6e 20  position list n 
1fee0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 49  bytes in size. I
1fef0 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f  f.** the positio
1ff00 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20  n list contains 
1ff10 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c 75  entries for colu
1ff20 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20 28 2a  mn iCol, then (*
1ff30 70 61 29 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  pa) is set.** to
1ff40 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 75   point to the su
1ff50 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20  b-position-list 
1ff60 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20  for that column 
1ff70 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  and the number o
1ff80 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 69 74  f.** bytes in it
1ff90 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20 69   returned. Or, i
1ffa0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 70  f the argument p
1ffb0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65  osition list doe
1ffc0 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  s not.** contain
1ffd0 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66 6f 72   any entries for
1ffe0 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 72 65   column iCol, re
1fff0 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61 74 69  turn 0..*/.stati
20000 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45  c int fts5IndexE
20010 78 74 72 61 63 74 43 6f 6c 28 0a 20 20 63 6f 6e  xtractCol(.  con
20020 73 74 20 75 38 20 2a 2a 70 61 2c 20 20 20 20 20  st u8 **pa,     
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20040 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  IN/OUT: Pointer 
20050 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  to poslist */.  
20060 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
20070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20080 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66 20 70  /* IN: Size of p
20090 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oslist in bytes 
200a0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20 20 20  */.  int iCol   
200b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
200c0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
200d0 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d 20 70  o extract from p
200e0 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 69  oslist */.){.  i
200f0 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20 30 3b  nt iCurrent = 0;
20100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20110 2a 20 41 6e 79 74 68 69 6e 67 20 62 65 66 6f 72  * Anything befor
20120 65 20 74 68 65 20 66 69 72 73 74 20 30 78 30 31  e the first 0x01
20130 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20 20 63   is col 0 */.  c
20140 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a 70 61  onst u8 *p = *pa
20150 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 45  ;.  const u8 *pE
20160 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20 20 20  nd = &p[n];     
20170 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74 65 20      /* One byte 
20180 70 61 73 74 20 65 6e 64 20 6f 66 20 70 6f 73 69  past end of posi
20190 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 75  tion list */.  u
201a0 38 20 70 72 65 76 20 3d 20 30 3b 0a 0a 20 20 77  8 prev = 0;..  w
201b0 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43 75 72 72  hile( iCol>iCurr
201c0 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64  ent ){.    /* Ad
201d0 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20  vance pointer p 
201e0 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20  until it points 
201f0 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78  to pEnd or an 0x
20200 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73 0a  01 byte that is.
20210 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20      ** not part 
20220 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20  of a varint */. 
20230 20 20 20 77 68 69 6c 65 28 20 28 70 72 65 76 20     while( (prev 
20240 26 20 30 78 38 30 29 20 7c 7c 20 2a 70 21 3d 30  & 0x80) || *p!=0
20250 78 30 31 20 29 7b 0a 20 20 20 20 20 20 70 72 65  x01 ){.      pre
20260 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20 20 20  v = *p++;.      
20270 69 66 28 20 70 3d 3d 70 45 6e 64 20 29 20 72 65  if( p==pEnd ) re
20280 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
20290 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20    *pa = p++;.   
202a0 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   p += fts5GetVar
202b0 69 6e 74 33 32 28 70 2c 20 69 43 75 72 72 65 6e  int32(p, iCurren
202c0 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 43  t);.  }.  if( iC
202d0 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20 29 20 72  ol!=iCurrent ) r
202e0 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41  eturn 0;..  /* A
202f0 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72 20 70  dvance pointer p
20300 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e 74 73   until it points
20310 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e 20 30   to pEnd or an 0
20320 78 30 31 20 62 79 74 65 20 74 68 61 74 20 69 73  x01 byte that is
20330 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f  .  ** not part o
20340 66 20 61 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20  f a varint */.  
20350 61 73 73 65 72 74 28 20 28 70 72 65 76 20 26 20  assert( (prev & 
20360 30 78 38 30 29 3d 3d 30 20 29 3b 0a 20 20 77 68  0x80)==0 );.  wh
20370 69 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 28  ile( p<pEnd && (
20380 28 70 72 65 76 20 26 20 30 78 38 30 29 20 7c 7c  (prev & 0x80) ||
20390 20 2a 70 21 3d 30 78 30 31 29 20 29 7b 0a 20 20   *p!=0x01) ){.  
203a0 20 20 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20    prev = *p++;. 
203b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 20 2d 20   }.  return p - 
203c0 28 2a 70 61 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  (*pa);.}.../*.**
203d0 20 49 74 65 72 61 74 6f 72 20 70 4d 75 6c 74 69   Iterator pMulti
203e0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
203f0 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
20400 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
20410 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
20420 70 70 65 6e 64 73 20 74 68 65 20 66 6f 6c 6c 6f  ppends the follo
20430 77 69 6e 67 20 74 6f 20 62 75 66 66 65 72 20 70  wing to buffer p
20440 42 75 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  Buf:.**.**   * T
20450 68 65 20 76 61 72 69 6e 74 20 69 44 65 6c 74 61  he varint iDelta
20460 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74 68 65  , and.**   * the
20470 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 74   position list t
20480 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  hat currently po
20490 69 6e 74 73 20 74 6f 2c 20 69 6e 63 6c 75 64 69  ints to, includi
204a0 6e 67 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c  ng the size fiel
204b0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
204c0 6d 65 6e 74 20 70 43 6f 6c 73 65 74 20 69 73 20  ment pColset is 
204d0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 70  NULL, then the p
204e0 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 69 73 20  osition list is 
204f0 66 69 6c 74 65 72 65 64 20 61 63 63 6f 72 64 69  filtered accordi
20500 6e 67 0a 2a 2a 20 74 6f 20 70 43 6f 6c 73 65 74  ng.** to pColset
20510 20 62 65 66 6f 72 65 20 62 65 69 6e 67 20 61 70   before being ap
20520 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75  pended to the bu
20530 66 66 65 72 2e 20 49 66 20 74 68 69 73 20 6d 65  ffer. If this me
20540 61 6e 73 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  ans there are.**
20550 20 6e 6f 20 65 6e 74 72 69 65 73 20 69 6e 20 74   no entries in t
20560 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
20570 2c 20 6e 6f 74 68 69 6e 67 20 69 73 20 61 70 70  , nothing is app
20580 65 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66  ended to the buf
20590 66 65 72 20 28 6e 6f 74 0a 2a 2a 20 65 76 65 6e  fer (not.** even
205a0 20 69 44 65 6c 74 61 29 2e 0a 2a 2a 0a 2a 2a 20   iDelta)..**.** 
205b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
205c0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
205d0 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
205e0 72 63 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rc. .*/.static i
205f0 6e 74 20 66 74 73 35 41 70 70 65 6e 64 50 6f 73  nt fts5AppendPos
20600 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65  list(.  Fts5Inde
20610 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c  x *p,.  i64 iDel
20620 74 61 2c 0a 20 20 46 74 73 35 49 6e 64 65 78 49  ta,.  Fts5IndexI
20630 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46  ter *pMulti,.  F
20640 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
20650 65 74 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72  et,.  Fts5Buffer
20660 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20   *pBuf.){.  if( 
20670 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
20680 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
20690 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4d 75  ter *pSeg = &pMu
206a0 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d 75 6c 74  lti->aSeg[ pMult
206b0 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  i->aFirst[1].iFi
206c0 72 73 74 20 5d 3b 0a 20 20 20 20 61 73 73 65 72  rst ];.    asser
206d0 74 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  t( fts5MultiIter
206e0 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69 29 3d 3d  Eof(p, pMulti)==
206f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
20700 20 70 53 65 67 2d 3e 6e 50 6f 73 3e 30 20 29 3b   pSeg->nPos>0 );
20710 0a 20 20 20 20 69 66 28 20 30 3d 3d 66 74 73 35  .    if( 0==fts5
20720 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
20730 63 2c 20 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e  c, pBuf, pSeg->n
20740 50 6f 73 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20  Pos+9+9) ){.    
20750 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
20760 2d 3e 62 4f 66 66 73 65 74 73 0a 20 20 20 20 20  ->bOffsets.     
20770 20 20 26 26 20 70 53 65 67 2d 3e 69 4c 65 61 66    && pSeg->iLeaf
20780 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f  Offset+pSeg->nPo
20790 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  s<=pSeg->pLeaf->
207a0 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20 26  szLeaf .       &
207b0 26 20 28 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c  & (pColset==0 ||
207c0 20 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d   pColset->nCol==
207d0 31 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  1).      ){.    
207e0 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50      const u8 *pP
207f0 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  os = &pSeg->pLea
20800 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
20810 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20  Offset];.       
20820 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
20830 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29     if( pColset )
20840 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73  {.          nPos
20850 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74 72   = fts5IndexExtr
20860 61 63 74 43 6f 6c 28 26 70 50 6f 73 2c 20 70 53  actCol(&pPos, pS
20870 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73 65  eg->nPos, pColse
20880 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20  t->aiCol[0]);.  
20890 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 6f 73          if( nPos
208a0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
208b0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
208c0 20 20 20 20 20 20 20 20 20 6e 50 6f 73 20 3d 20           nPos = 
208d0 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20  pSeg->nPos;.    
208e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
208f0 73 65 72 74 28 20 6e 50 6f 73 3e 30 20 29 3b 0a  sert( nPos>0 );.
20900 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20910 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
20920 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29  nt(pBuf, iDelta)
20930 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
20940 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
20950 72 69 6e 74 28 70 42 75 66 2c 20 6e 50 6f 73 2a  rint(pBuf, nPos*
20960 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  2);.        fts5
20970 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
20980 42 6c 6f 62 28 70 42 75 66 2c 20 70 50 6f 73 2c  Blob(pBuf, pPos,
20990 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 7d 65   nPos);.      }e
209a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
209b0 20 69 53 76 31 3b 0a 20 20 20 20 20 20 20 20 69   iSv1;.        i
209c0 6e 74 20 69 53 76 32 3b 0a 20 20 20 20 20 20 20  nt iSv2;.       
209d0 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 20   int iData;..   
209e0 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 69       /* Append i
209f0 44 65 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20  Delta */.       
20a00 20 69 53 76 31 20 3d 20 70 42 75 66 2d 3e 6e 3b   iSv1 = pBuf->n;
20a10 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
20a20 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
20a30 69 6e 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61  int(pBuf, iDelta
20a40 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57  );..        /* W
20a50 52 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20  RITEPOSLISTSIZE 
20a60 2a 2f 0a 20 20 20 20 20 20 20 20 69 53 76 32 20  */.        iSv2 
20a70 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20  = pBuf->n;.     
20a80 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
20a90 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42  eAppendVarint(pB
20aa0 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32  uf, pSeg->nPos*2
20ab0 29 3b 0a 20 20 20 20 20 20 20 20 69 44 61 74 61  );.        iData
20ac0 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 0a 20 20 20   = pBuf->n;..   
20ad0 20 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72       fts5Segiter
20ae0 50 6f 73 6c 69 73 74 28 70 2c 20 70 53 65 67 2c  Poslist(p, pSeg,
20af0 20 70 43 6f 6c 73 65 74 2c 20 70 42 75 66 29 3b   pColset, pBuf);
20b00 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ..        if( pC
20b10 6f 6c 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20  olset ){.       
20b20 20 20 20 69 6e 74 20 6e 41 63 74 75 61 6c 20 3d     int nActual =
20b30 20 70 42 75 66 2d 3e 6e 20 2d 20 69 44 61 74 61   pBuf->n - iData
20b40 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20b50 6e 41 63 74 75 61 6c 21 3d 70 53 65 67 2d 3e 6e  nActual!=pSeg->n
20b60 50 6f 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Pos ){.         
20b70 20 20 20 69 66 28 20 6e 41 63 74 75 61 6c 3d 3d     if( nActual==
20b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
20b90 20 20 20 70 42 75 66 2d 3e 6e 20 3d 20 69 53 76     pBuf->n = iSv
20ba0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1;.             
20bb0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
20bc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20bd0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
20be0 6e 52 65 71 20 3d 20 73 71 6c 69 74 65 33 46 74  nReq = sqlite3Ft
20bf0 73 35 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 28  s5GetVarintLen((
20c00 75 33 32 29 28 6e 41 63 74 75 61 6c 2a 32 29 29  u32)(nActual*2))
20c10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
20c20 77 68 69 6c 65 28 20 69 53 76 32 3c 28 69 44 61  while( iSv2<(iDa
20c30 74 61 2d 6e 52 65 71 29 20 29 7b 20 70 42 75 66  ta-nReq) ){ pBuf
20c40 2d 3e 70 5b 69 53 76 32 2b 2b 5d 20 3d 20 30 78  ->p[iSv2++] = 0x
20c50 38 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20  80; }.          
20c60 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
20c70 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
20c80 70 5b 69 53 76 32 5d 2c 20 6e 41 63 74 75 61 6c  p[iSv2], nActual
20c90 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  *2);.           
20ca0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
20cb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
20cc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
20cd0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 73 74 61 74  turn 0;.}...stat
20ce0 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
20cf0 69 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35  istIterNext(Fts5
20d00 44 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74  DoclistIter *pIt
20d10 65 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70  er){.  u8 *p = p
20d20 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b  Iter->aPoslist +
20d30 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20   pIter->nSize + 
20d40 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
20d50 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
20d60 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20  r->aPoslist );. 
20d70 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61   if( p>=pIter->a
20d80 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  Eof ){.    pIter
20d90 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
20da0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
20db0 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20   iDelta;..    p 
20dc0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
20dd0 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  (p, (u64*)&iDelt
20de0 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
20df0 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
20e00 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f  ..    /* Read po
20e10 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
20e20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d   */.    if( p[0]
20e30 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
20e40 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
20e50 20 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20   pIter->nSize = 
20e60 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
20e70 70 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20  p, nPos);.      
20e80 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20  pIter->nPoslist 
20e90 3d 20 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20  = (nPos>>1);.   
20ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
20eb0 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
20ec0 28 28 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e  ((int)(p[0])) >>
20ed0 20 31 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   1;.      pIter-
20ee0 3e 6e 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20  >nSize = 1;.    
20ef0 7d 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50  }..    pIter->aP
20f00 6f 73 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a  oslist = p;.  }.
20f10 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
20f20 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
20f30 69 74 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  it(.  Fts5Buffer
20f40 20 2a 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44   *pBuf, .  Fts5D
20f50 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
20f60 72 0a 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49  r.){.  memset(pI
20f70 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
20f80 70 49 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72  pIter));.  pIter
20f90 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75  ->aPoslist = pBu
20fa0 66 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61  f->p;.  pIter->a
20fb0 45 6f 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70  Eof = &pBuf->p[p
20fc0 42 75 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44  Buf->n];.  fts5D
20fd0 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70  oclistIterNext(p
20fe0 49 74 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a  Iter);.}..#if 0.
20ff0 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64  /*.** Append a d
21000 6f 63 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72  oclist to buffer
21010 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   pBuf..**.** Thi
21020 73 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d  s function assum
21030 65 73 20 74 68 61 74 20 73 70 61 63 65 20 77 69  es that space wi
21040 74 68 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  thin the buffer 
21050 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
21060 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a  .** allocated..*
21070 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
21080 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
21090 69 64 28 0a 20 20 46 74 73 35 42 75 66 66 65 72  id(.  Fts5Buffer
210a0 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20   *pBuf,         
210b0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
210c0 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20  to write to */. 
210d0 20 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69   i64 *piLastRowi
210e0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
210f0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76   /* IN/OUT: Prev
21100 69 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74  ious rowid writt
21110 65 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20  en (if any) */. 
21120 20 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20   i64 iRowid     
21130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21140 20 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70   /* Rowid to app
21150 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65  end */.){.  asse
21160 72 74 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c  rt( pBuf->n!=0 |
21170 7c 20 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29  | (*piLastRowid)
21180 3d 3d 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66  ==0 );.  fts5Buf
21190 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
211a0 69 6e 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64  int(pBuf, iRowid
211b0 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29   - *piLastRowid)
211c0 3b 0a 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  ;.  *piLastRowid
211d0 20 3d 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e   = iRowid;.}.#en
211e0 64 69 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  dif..#define fts
211f0 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
21200 64 28 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77  d(pBuf, iLastRow
21210 69 64 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20  id, iRowid) {   
21220 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20      \.  assert( 
21230 28 70 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20  (pBuf)->n!=0 || 
21240 28 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20  (iLastRowid)==0 
21250 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
21260 20 20 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66       \.  fts5Buf
21270 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
21280 69 6e 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f  int((pBuf), (iRo
21290 77 69 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77  wid) - (iLastRow
212a0 69 64 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74  id)); \.  (iLast
212b0 52 6f 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64  Rowid) = (iRowid
212c0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
212e0 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
212f0 2a 20 42 75 66 66 65 72 73 20 70 31 20 61 6e 64  * Buffers p1 and
21300 20 70 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c   p2 contain docl
21310 69 73 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74  ists. This funct
21320 69 6f 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63  ion merges the c
21330 6f 6e 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65  ontent.** of the
21340 20 74 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f   two doclists to
21350 67 65 74 68 65 72 20 61 6e 64 20 73 65 74 73 20  gether and sets 
21360 62 75 66 66 65 72 20 70 31 20 74 6f 20 74 68 65  buffer p1 to the
21370 20 72 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a   result before.*
21380 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  * returning..**.
21390 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
213a0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
213b0 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
213c0 70 2d 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72  p->rc. If an err
213d0 6f 72 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64  or has.** alread
213e0 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
213f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
21400 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
21410 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65 50 72  void fts5MergePr
21420 65 66 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73  efixLists(.  Fts
21430 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
21440 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21450 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
21460 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ect */.  Fts5Buf
21470 66 65 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20  fer *p1,        
21480 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
21490 74 20 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20  t list to merge 
214a0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
214b0 2a 70 32 20 20 20 20 20 20 20 20 20 20 20 20 20  *p2             
214c0 20 20 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c       /* Second l
214d0 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
214e0 29 7b 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29  ){.  if( p2->n )
214f0 7b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  {.    i64 iLastR
21500 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
21510 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31  s5DoclistIter i1
21520 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73  ;.    Fts5Doclis
21530 74 49 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74  tIter i2;.    Ft
21540 73 35 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20  s5Buffer out;.  
21550 20 20 46 74 73 35 42 75 66 66 65 72 20 74 6d 70    Fts5Buffer tmp
21560 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75  ;.    memset(&ou
21570 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74  t, 0, sizeof(out
21580 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  ));.    memset(&
21590 74 6d 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74  tmp, 0, sizeof(t
215a0 6d 70 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74  mp));..    sqlit
215b0 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
215c0 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70  (&p->rc, &out, p
215d0 31 2d 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20  1->n + p2->n);. 
215e0 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
215f0 65 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b  erInit(p1, &i1);
21600 0a 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74  .    fts5Doclist
21610 49 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32  IterInit(p2, &i2
21620 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d  );.    while( p-
21630 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
21640 26 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d  & (i1.aPoslist!=
21650 30 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74  0 || i2.aPoslist
21660 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66  !=0) ){.      if
21670 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30  ( i2.aPoslist==0
21680 20 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74   || (i1.aPoslist
21690 20 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32   && i1.iRowid<i2
216a0 2e 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  .iRowid) ){.    
216b0 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72      /* Copy entr
216c0 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20  y from i1 */.   
216d0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70       fts5MergeAp
216e0 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20  pendDocid(&out, 
216f0 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69  iLastRowid, i1.i
21700 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
21710 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
21720 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69  pendBlob(&out, i
21730 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e  1.aPoslist, i1.n
21740 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65  Poslist+i1.nSize
21750 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
21760 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
21770 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i1);.      }.   
21780 20 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61     else if( i1.a
21790 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32  Poslist==0 || i2
217a0 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77  .iRowid!=i1.iRow
217b0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  id ){.        /*
217c0 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d   Copy entry from
217d0 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66   i2 */.        f
217e0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
217f0 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
21800 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
21810 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
21820 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
21830 6f 62 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73  ob(&out, i2.aPos
21840 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73  list, i2.nPoslis
21850 74 2b 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20  t+i2.nSize);.   
21860 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
21870 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20  IterNext(&i2);. 
21880 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
21890 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69  e{.        i64 i
218a0 50 6f 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20  Pos1 = 0;.      
218b0 20 20 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b    i64 iPos2 = 0;
218c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
218d0 66 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  f1 = 0;.        
218e0 69 6e 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20  int iOff2 = 0;. 
218f0 20 20 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20         u8 *a1 = 
21900 26 69 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e  &i1.aPoslist[i1.
21910 6e 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  nSize];.        
21920 75 38 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f  u8 *a2 = &i2.aPo
21930 73 6c 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b  slist[i2.nSize];
21940 0a 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ..        Fts5Po
21950 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74  slistWriter writ
21960 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  er;.        mems
21970 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73  et(&writer, 0, s
21980 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a  izeof(writer));.
21990 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67  .        /* Merg
219a0 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69  e the two positi
219b0 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20  on lists. */ .  
219c0 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 41        fts5MergeA
219d0 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c  ppendDocid(&out,
219e0 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e   iLastRowid, i2.
219f0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
21a00 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
21a10 26 74 6d 70 29 3b 0a 0a 20 20 20 20 20 20 20 20  &tmp);..        
21a20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69  sqlite3Fts5Posli
21a30 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e  stNext64(a1, i1.
21a40 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31  nPoslist, &iOff1
21a50 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  , &iPos1);.     
21a60 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
21a70 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
21a80 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
21a90 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 0a 20  ff2, &iPos2);.. 
21aa0 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d         while( p-
21ab0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
21ac0 26 20 28 69 50 6f 73 31 3e 3d 30 20 7c 7c 20 69  & (iPos1>=0 || i
21ad0 50 6f 73 32 3e 3d 30 29 20 29 7b 0a 20 20 20 20  Pos2>=0) ){.    
21ae0 20 20 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a        i64 iNew;.
21af0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
21b00 6f 73 32 3c 30 20 7c 7c 20 28 69 50 6f 73 31 3e  os2<0 || (iPos1>
21b10 3d 30 20 26 26 20 69 50 6f 73 31 3c 69 50 6f 73  =0 && iPos1<iPos
21b20 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  2) ){.          
21b30 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 31 3b 0a    iNew = iPos1;.
21b40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21b50 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
21b60 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73  xt64(a1, i1.nPos
21b70 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69  list, &iOff1, &i
21b80 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
21b90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21ba0 20 20 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 32      iNew = iPos2
21bb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
21bc0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
21bd0 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50  Next64(a2, i2.nP
21be0 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20  oslist, &iOff2, 
21bf0 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20  &iPos2);.       
21c00 20 20 20 20 20 69 66 28 20 69 50 6f 73 31 3d 3d       if( iPos1==
21c10 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20  iPos2 ){.       
21c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
21c30 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
21c40 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c  a1, i1.nPoslist,
21c50 20 26 69 4f 66 66 31 2c 26 69 50 6f 73 31 29 3b   &iOff1,&iPos1);
21c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
21c70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21c80 20 20 20 20 20 69 66 28 20 69 4e 65 77 21 3d 77       if( iNew!=w
21c90 72 69 74 65 72 2e 69 50 72 65 76 20 7c 7c 20 74  riter.iPrev || t
21ca0 6d 70 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  mp.n==0 ){.     
21cb0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
21cc0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
21cd0 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 74  tWriterAppend(&t
21ce0 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65  mp, &writer, iNe
21cf0 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  w);.          }.
21d00 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
21d10 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
21d20 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
21d30 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
21d40 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75  AppendVarint(&ou
21d50 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20  t, tmp.n * 2);. 
21d60 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
21d70 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
21d80 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70  &out, tmp.p, tmp
21d90 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .n);.        fts
21da0 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
21db0 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66  (&i1);.        f
21dc0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
21dd0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d  xt(&i2);.      }
21de0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
21df0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
21e00 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
21e10 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
21e20 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
21e30 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
21e40 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
21e50 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20 63  /*.** Swap the c
21e60 6f 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66 65  ontents of buffe
21e70 72 20 2a 70 31 20 77 69 74 68 20 74 68 61 74 20  r *p1 with that 
21e80 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74 69  of *p2..*/.stati
21e90 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66 65  c void fts5Buffe
21ea0 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65 72  rSwap(Fts5Buffer
21eb0 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65 72   *p1, Fts5Buffer
21ec0 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75 66   *p2){.  Fts5Buf
21ed0 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20  fer tmp = *p1;. 
21ee0 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70   *p1 = *p2;.  *p
21ef0 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74  2 = tmp;.}..stat
21f00 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75  ic void fts5Setu
21f10 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46  pPrefixIter(.  F
21f20 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
21f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21f40 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20  * Index to read 
21f50 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44  from */.  int bD
21f60 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  esc,            
21f70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21f80 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20  e for "ORDER BY 
21f90 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20  rowid DESC" */. 
21fa0 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65   const u8 *pToke
21fb0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
21fc0 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
21fd0 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20  ining prefix to 
21fe0 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e  match */.  int n
21ff0 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20  Token,          
22000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
22010 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f  ze of buffer pTo
22020 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ken in bytes */.
22030 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
22040 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
22050 20 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61    /* Restrict ma
22060 74 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63  tches to these c
22070 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35  olumns */.  Fts5
22080 49 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74  IndexIter **ppIt
22090 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er          /* O
220a0 55 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72  UT: New iterator
220b0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 74 72   */.){.  Fts5Str
220c0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
220d0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 61  .  Fts5Buffer *a
220e0 42 75 66 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  Buf;.  const int
220f0 20 6e 42 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61   nBuf = 32;..  a
22100 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65  Buf = (Fts5Buffe
22110 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
22120 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42  (p, sizeof(Fts5B
22130 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20  uffer)*nBuf);.  
22140 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
22150 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
22160 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70  .  if( aBuf && p
22170 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f  Struct ){.    co
22180 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
22190 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
221a0 53 43 41 4e 3b 0a 20 20 20 20 69 6e 74 20 69 3b  SCAN;.    int i;
221b0 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
221c0 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
221d0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 31 20 3d  5IndexIter *p1 =
221e0 20 30 3b 20 20 20 20 20 2f 2a 20 49 74 65 72 61   0;     /* Itera
221f0 74 6f 72 20 75 73 65 64 20 74 6f 20 67 61 74 68  tor used to gath
22200 65 72 20 64 61 74 61 20 66 72 6f 6d 20 69 6e 64  er data from ind
22210 65 78 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  ex */.    Fts5Da
22220 74 61 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 46  ta *pData;.    F
22230 74 73 35 42 75 66 66 65 72 20 64 6f 63 6c 69 73  ts5Buffer doclis
22240 74 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54  t;.    int bNewT
22250 65 72 6d 20 3d 20 31 3b 0a 0a 20 20 20 20 6d 65  erm = 1;..    me
22260 6d 73 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30  mset(&doclist, 0
22270 2c 20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74  , sizeof(doclist
22280 29 29 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35  ));.    for(fts5
22290 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
222a0 70 53 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67  pStruct, 1, flag
222b0 73 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65  s, pToken, nToke
222c0 6e 2c 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a  n, -1, 0, &p1);.
222d0 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
222e0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d  iIterEof(p, p1)=
222f0 3d 30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  =0;.        fts5
22300 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28 70  MultiIterNext2(p
22310 2c 20 70 31 2c 20 26 62 4e 65 77 54 65 72 6d 29  , p1, &bNewTerm)
22320 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 36  .    ){.      i6
22330 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
22340 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 31  ultiIterRowid(p1
22350 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65  );.      int nTe
22360 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  rm;.      const 
22370 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73 35  u8 *pTerm = fts5
22380 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 31  MultiIterTerm(p1
22390 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20  , &nTerm);.     
223a0 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d 63   assert_nc( memc
223b0 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d  mp(pToken, pTerm
223c0 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54  , MIN(nToken, nT
223d0 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20 20  erm))<=0 );.    
223e0 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29    if( bNewTerm )
223f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 54  {.        if( nT
22400 65 72 6d 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65  erm<nToken || me
22410 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65  mcmp(pToken, pTe
22420 72 6d 2c 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72  rm, nToken) ) br
22430 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  eak;.      }..  
22440 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74 2e      if( doclist.
22450 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69  n>0 && iRowid<=i
22460 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20 20  LastRowid ){.   
22470 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d       for(i=0; p-
22480 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
22490 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b  & doclist.n; i++
224a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
224b0 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20  ert( i<nBuf );. 
224c0 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42 75           if( aBu
224d0 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20  f[i].n==0 ){.   
224e0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
224f0 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74  ferSwap(&doclist
22500 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
22510 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
22520 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74  ferZero(&doclist
22530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
22540 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22550 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
22560 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74  ists(p, &doclist
22570 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
22580 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
22590 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
225a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
225b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
225c0 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
225d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
225e0 69 66 28 20 21 66 74 73 35 41 70 70 65 6e 64 50  if( !fts5AppendP
225f0 6f 73 6c 69 73 74 28 70 2c 20 69 52 6f 77 69 64  oslist(p, iRowid
22600 2d 69 4c 61 73 74 52 6f 77 69 64 2c 20 70 31 2c  -iLastRowid, p1,
22610 20 70 43 6f 6c 73 65 74 2c 20 26 64 6f 63 6c 69   pColset, &docli
22620 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  st) ){.        i
22630 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
22640 69 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  id;.      }.    
22650 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  }..    for(i=0; 
22660 69 3c 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20  i<nBuf; i++){.  
22670 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
22680 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22690 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72 65      fts5MergePre
226a0 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f 63  fixLists(p, &doc
226b0 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
226c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
226d0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61  ts5BufferFree(&a
226e0 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Buf[i]);.    }. 
226f0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
22700 46 72 65 65 28 70 2c 20 70 31 29 3b 0a 0a 20 20  Free(p, p1);..  
22710 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 49 64    pData = fts5Id
22720 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
22730 66 28 46 74 73 35 44 61 74 61 29 20 2b 20 64 6f  f(Fts5Data) + do
22740 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 69 66  clist.n);.    if
22750 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20  ( pData ){.     
22760 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38 2a   pData->p = (u8*
22770 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20 20  )&pData[1];.    
22780 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70 44    pData->nn = pD
22790 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64 6f  ata->szLeaf = do
227a0 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20 6d  clist.n;.      m
227b0 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c 20  emcpy(pData->p, 
227c0 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c 69  doclist.p, docli
227d0 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  st.n);.      fts
227e0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 70  5MultiIterNew2(p
227f0 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c 20  , pData, bDesc, 
22800 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  ppIter);.    }. 
22810 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
22820 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20 7d  e(&doclist);.  }
22830 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ..  fts5Structur
22840 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
22850 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
22860 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  e(aBuf);.}.../*.
22870 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61 74  ** Indicate that
22880 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   all subsequent 
22890 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
228a0 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 29  Fts5IndexWrite()
228b0 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20 74   pertain.** to t
228c0 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68  he document with
228d0 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a 2a   rowid iRowid..*
228e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
228f0 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74 65  5IndexBeginWrite
22900 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
22910 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34 20  nt bDelete, i64 
22920 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65 72  iRowid){.  asser
22930 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
22940 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c  _OK );..  /* All
22950 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20 74  ocate the hash t
22960 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20 6e  able if it has n
22970 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
22980 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 69  allocated */.  i
22990 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20 29  f( p->pHash==0 )
229a0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71  {.    p->rc = sq
229b0 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65 77  lite3Fts5HashNew
229c0 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70 2d  (p->pConfig, &p-
229d0 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e  >pHash, &p->nPen
229e0 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  dingData);.  }..
229f0 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68    /* Flush the h
22a00 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
22a10 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  k if required */
22a20 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d  .  if( iRowid<p-
22a30 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20  >iWriteRowid .  
22a40 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e   || (iRowid==p->
22a50 69 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70  iWriteRowid && p
22a60 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20  ->bDelete==0).  
22a70 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67   || (p->nPending
22a80 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69  Data > p->pConfi
22a90 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20  g->nHashSize) . 
22aa0 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
22ab0 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a  xFlush(p);.  }..
22ac0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
22ad0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e   = iRowid;.  p->
22ae0 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74  bDelete = bDelet
22af0 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  e;.  return fts5
22b00 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
22b10 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
22b20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  data to disk..*/
22b30 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22b40 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e  IndexSync(Fts5In
22b50 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d  dex *p, int bCom
22b60 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  mit){.  assert( 
22b70 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
22b80 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
22b90 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62  lush(p);.  if( b
22ba0 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f  Commit ) fts5Clo
22bb0 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72  seReader(p);.  r
22bc0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
22bd0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
22be0 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
22bf0 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
22c00 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
22c10 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
22c20 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
22c30 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
22c40 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
22c50 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
22c60 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
22c70 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
22c80 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
22c90 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
22ca0 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
22cb0 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
22cc0 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
22cd0 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
22ce0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
22cf0 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
22d00 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f  x *p){.  fts5Clo
22d10 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66  seReader(p);.  f
22d20 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
22d30 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ata(p);.  assert
22d40 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
22d50 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  OK );.  return S
22d60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22d70 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61  ** The %_data ta
22d80 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
22d90 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69  y empty when thi
22da0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
22db0 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  lled. This.** fu
22dc0 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
22dd0 20 69 74 20 77 69 74 68 20 74 68 65 20 69 6e 69   it with the ini
22de0 74 69 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f  tial structure o
22df0 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
22e00 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68  index,.** and th
22e10 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f  e initial versio
22e20 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67  n of the "averag
22e30 65 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65  es" record (a ze
22e40 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a  ro-byte blob)..*
22e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
22e60 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73  5IndexReinit(Fts
22e70 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
22e80 73 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20  s5Structure s;. 
22e90 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
22ea0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
22eb0 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74  ure));.  fts5Dat
22ec0 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
22ed0 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28  VERAGES_ROWID, (
22ee0 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29  const u8*)"", 0)
22ef0 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
22f00 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20  eWrite(p, &s);. 
22f10 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
22f20 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
22f30 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
22f40 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
22f50 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65  . If the bCreate
22f60 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
22f70 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64  e, create.** and
22f80 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
22f90 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74  underlying %_dat
22fa0 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
22fb0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
22fc0 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
22fd0 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
22fe0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
22ff0 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
23000 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
23010 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
23020 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
23030 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
23040 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
23050 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  n(.  Fts5Config 
23060 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74  *pConfig, .  int
23070 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73   bCreate, .  Fts
23080 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63  5Index **pp,.  c
23090 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
230a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
230b0 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  _OK;.  Fts5Index
230c0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
230d0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
230e0 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d  ject */..  *pp =
230f0 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a   p = (Fts5Index*
23100 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
23110 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
23120 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
23130 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
23140 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43  _OK ){.    p->pC
23150 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
23160 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  .    p->nWorkUni
23170 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e  t = FTS5_WORK_UN
23180 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  IT;.    p->zData
23190 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
231a0 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
231b0 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
231c0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
231d0 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
231e0 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
231f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
23200 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
23210 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
23220 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
23230 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
23240 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
23250 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
23260 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
23270 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23280 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
23290 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
232a0 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
232b0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
232c0 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
232d0 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
232e0 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
232f0 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
23300 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
23310 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23330 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23340 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
23350 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
23360 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
23370 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
23380 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
23390 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
233a0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
233b0 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
233c0 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
233d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
233e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
233f0 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
23400 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
23410 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
23420 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
23430 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
23440 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
23450 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
23460 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23470 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
23480 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
23490 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  der==0 );.    sq
234a0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
234b0 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
234c0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
234d0 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
234e0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
234f0 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
23500 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
23510 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
23520 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
23530 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
23540 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
23550 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
23560 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
23570 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
23580 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
23590 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
235a0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
235b0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
235c0 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
235d0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
235e0 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
235f0 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
23600 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
23610 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
23620 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
23630 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
23640 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
23650 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
23660 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
23670 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
23680 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
23690 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
236a0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
236b0 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65  xCharlenToBytele
236c0 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
236d0 2a 70 2c 20 0a 20 20 69 6e 74 20 6e 42 79 74 65  *p, .  int nByte
236e0 2c 20 0a 20 20 69 6e 74 20 6e 43 68 61 72 0a 29  , .  int nChar.)
236f0 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
23700 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
23710 30 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29  0; i<nChar; i++)
23720 7b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79  {.    if( n>=nBy
23730 74 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  te ) return 0;  
23740 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e      /* Input con
23750 74 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e  tains fewer than
23760 20 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a   nChar chars */.
23770 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
23780 64 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30  d char)p[n++]>=0
23790 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69  xc0 ){.      whi
237a0 6c 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30  le( (p[n] & 0xc0
237b0 29 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20  )==0x80 ) n++;. 
237c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
237d0 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49  n n;.}../*.** pI
237e0 6e 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63  n is a UTF-8 enc
237f0 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e  oded string, nIn
23800 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20   bytes in size. 
23810 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
23820 72 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20  r of.** unicode 
23830 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
23840 65 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61  e string..*/.sta
23850 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
23860 78 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63  xCharlen(const c
23870 68 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49  har *pIn, int nI
23880 6e 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20  n){.  int nChar 
23890 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
238a0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
238b0 77 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a  while( i<nIn ){.
238c0 20 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65      if( (unsigne
238d0 64 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e  d char)pIn[i++]>
238e0 3d 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77  =0xc0 ){.      w
238f0 68 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28  hile( i<nIn && (
23900 70 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d  pIn[i] & 0xc0)==
23910 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20  0x80 ) i++;.    
23920 7d 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20  }.    nChar++;. 
23930 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61   }.  return nCha
23940 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  r;.}../*.** Inse
23950 72 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74  rt or remove dat
23960 61 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65  a to or from the
23970 20 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d   index. Each tim
23980 65 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20  e a document is 
23990 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20  .** added to or 
239a0 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
239b0 20 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e   index, this fun
239c0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
239d0 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74  one or more.** t
239e0 69 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  imes..**.** For 
239f0 61 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75  an insert, it mu
23a00 73 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63  st be called onc
23a10 65 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e  e for each token
23a20 20 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75   in the new docu
23a30 6d 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20  ment..** If the 
23a40 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64  operation is a d
23a50 65 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62  elete, it must b
23a60 65 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61  e called (at lea
23a70 73 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  st) once for eac
23a80 68 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65  h.** unique toke
23a90 6e 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e  n in the documen
23aa0 74 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76  t with an iCol v
23ab0 61 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a  alue less than z
23ac0 65 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a  ero. The iPos.**
23ad0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e   argument is ign
23ae0 6f 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74  ored for a delet
23af0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
23b00 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
23b10 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
23b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b30 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77     /* Index to w
23b40 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  rite to */.  int
23b50 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20   iCol,          
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b70 43 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70  Column token app
23b80 65 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20  ears in (-ve -> 
23b90 64 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74  delete) */.  int
23ba0 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20   iPos,          
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23bc0 50 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65  Position of toke
23bd0 6e 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20  n within column 
23be0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23bf0 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
23c00 6b 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f  ken  /* Token to
23c10 20 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74   add or remove t
23c20 6f 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20  o or from index 
23c30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
23c60 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
23c70 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20  gh indexes */.  
23c80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
23c90 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
23ca0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
23cb0 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a  /.  Fts5Config *
23cc0 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
23cd0 6e 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  nfig;..  assert(
23ce0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23cf0 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28  K );.  assert( (
23d00 69 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c  iCol<0)==p->bDel
23d10 65 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64  ete );..  /* Add
23d20 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68   the entry to th
23d30 65 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64  e main terms ind
23d40 65 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ex. */.  rc = sq
23d50 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
23d60 74 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61  te(.      p->pHa
23d70 73 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  sh, p->iWriteRow
23d80 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20  id, iCol, iPos, 
23d90 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
23da0 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
23db0 0a 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  .  );..  for(i=0
23dc0 3b 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  ; i<pConfig->nPr
23dd0 65 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49  efix && rc==SQLI
23de0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
23df0 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 68 61 72   const int nChar
23e00 20 3d 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65   = pConfig->aPre
23e10 66 69 78 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  fix[i];.    int 
23e20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65 33 46  nByte = sqlite3F
23e30 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54  ts5IndexCharlenT
23e40 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c  oBytelen(pToken,
23e50 20 6e 54 6f 6b 65 6e 2c 20 6e 43 68 61 72 29 3b   nToken, nChar);
23e60 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
23e70 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
23e80 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
23e90 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20 20  e(p->pHash, .   
23ea0 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74 65         p->iWrite
23eb0 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
23ec0 73 2c 20 28 63 68 61 72 29 28 46 54 53 35 5f 4d  s, (char)(FTS5_M
23ed0 41 49 4e 5f 50 52 45 46 49 58 2b 69 2b 31 29 2c  AIN_PREFIX+i+1),
23ee0 20 70 54 6f 6b 65 6e 2c 0a 20 20 20 20 20 20 20   pToken,.       
23ef0 20 20 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29     nByte.      )
23f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
23f10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23f20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74  ** Open a new it
23f30 65 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74  erator to iterat
23f40 65 20 74 68 6f 75 67 68 20 61 6c 6c 20 72 6f 77  e though all row
23f50 69 64 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  id that match th
23f60 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
23f70 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
23f80 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
23f90 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
23fa0 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
23fb0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
23fc0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
23fd0 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
23fe0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
23ff0 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
24000 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
24010 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
24020 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
24030 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
24040 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
24050 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
24060 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
24070 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
24080 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
24090 20 2f 2a 20 4d 61 74 63 68 20 74 68 65 73 65 20   /* Match these 
240a0 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20 2a 2f 0a  columns only */.
240b0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
240c0 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20  **ppIter        
240d0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74    /* OUT: New it
240e0 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  erator object */
240f0 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  .){.  Fts5Config
24100 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
24110 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e  Config;.  Fts5In
24120 64 65 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20  dexIter *pRet = 
24130 30 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20  0;.  int iIdx = 
24140 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  0;.  Fts5Buffer 
24150 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b  buf = {0, 0, 0};
24160 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55  ..  /* If the QU
24170 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73  ERY_SCAN flag is
24180 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20   set, all other 
24190 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c  flags must be cl
241a0 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ear. */.  assert
241b0 28 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  ( (flags & FTS5I
241c0 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
241d0 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d 46 54  ==0 || flags==FT
241e0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
241f0 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73 71 6c  AN );..  if( sql
24200 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
24210 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ze(&p->rc, &buf,
24220 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29 7b   nToken+1)==0 ){
24230 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62 75 66  .    memcpy(&buf
24240 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20 6e  .p[1], pToken, n
24250 54 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64 65 66 20  Token);..#ifdef 
24260 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
24270 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45 52 59   /* If the QUERY
24280 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66 6c 61 67  _TEST_NOIDX flag
24290 20 77 61 73 20 73 70 65 63 69 66 69 65 64 2c 20   was specified, 
242a0 74 68 65 6e 20 74 68 69 73 20 6d 75 73 74 20 62  then this must b
242b0 65 20 61 0a 20 20 20 20 2a 2a 20 70 72 65 66 69  e a.    ** prefi
242c0 78 2d 71 75 65 72 79 2e 20 49 6e 73 74 65 61 64  x-query. Instead
242d0 20 6f 66 20 75 73 69 6e 67 20 61 20 70 72 65 66   of using a pref
242e0 69 78 2d 69 6e 64 65 78 20 28 69 66 20 6f 6e 65  ix-index (if one
242f0 20 65 78 69 73 74 73 29 2c 20 0a 20 20 20 20 2a   exists), .    *
24300 2a 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 70  * evaluate the p
24310 72 65 66 69 78 20 71 75 65 72 79 20 75 73 69 6e  refix query usin
24320 67 20 74 68 65 20 6d 61 69 6e 20 46 54 53 20 69  g the main FTS i
24330 6e 64 65 78 2e 20 54 68 69 73 20 69 73 20 75 73  ndex. This is us
24340 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 69 6e  ed.    ** for in
24350 74 65 72 6e 61 6c 20 73 61 6e 69 74 79 20 63 68  ternal sanity ch
24360 65 63 6b 69 6e 67 20 62 79 20 74 68 65 20 69 6e  ecking by the in
24370 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 69 6e  tegrity-check in
24380 20 64 65 62 75 67 20 0a 20 20 20 20 2a 2a 20 6d   debug .    ** m
24390 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f 0a 20 20  ode only.  */.  
243a0 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 62    if( pConfig->b
243b0 50 72 65 66 69 78 49 6e 64 65 78 3d 3d 30 20 7c  PrefixIndex==0 |
243c0 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
243d0 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
243e0 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20 20 20 20  NOIDX) ){.      
243f0 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
24400 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
24410 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20 20 20  PREFIX );.      
24420 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66 69 67  iIdx = 1+pConfig
24430 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20 20 7d  ->nPrefix;.    }
24440 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
24450 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53 35  if( flags & FTS5
24460 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46  INDEX_QUERY_PREF
24470 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  IX ){.      int 
24480 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e 64 65  nChar = fts5Inde
24490 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65 6e 2c  xCharlen(pToken,
244a0 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20   nToken);.      
244b0 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49 64 78  for(iIdx=1; iIdx
244c0 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
244d0 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20  ix; iIdx++){.   
244e0 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67       if( pConfig
244f0 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 2d 31  ->aPrefix[iIdx-1
24500 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65 61 6b  ]==nChar ) break
24510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24520 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c 3d 70  .    if( iIdx<=p
24530 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20  Config->nPrefix 
24540 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
24550 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
24560 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
24570 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20 62 75  ead(p);.      bu
24580 66 2e 70 5b 30 5d 20 3d 20 28 75 38 29 28 46 54  f.p[0] = (u8)(FT
24590 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b  S5_MAIN_PREFIX +
245a0 20 69 49 64 78 29 3b 0a 20 20 20 20 20 20 69 66   iIdx);.      if
245b0 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
245c0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
245d0 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
245e0 2c 20 31 2c 20 66 6c 61 67 73 2c 20 62 75 66 2e  , 1, flags, buf.
245f0 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c  p, nToken+1, -1,
24600 20 30 2c 20 26 70 52 65 74 29 3b 0a 20 20 20 20   0, &pRet);.    
24610 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
24620 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
24630 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
24640 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
24650 62 44 65 73 63 20 3d 20 28 66 6c 61 67 73 20 26  bDesc = (flags &
24660 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
24670 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20 20 20 20  _DESC)!=0;.     
24680 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35   buf.p[0] = FTS5
24690 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20  _MAIN_PREFIX;.  
246a0 20 20 20 20 66 74 73 35 53 65 74 75 70 50 72 65      fts5SetupPre
246b0 66 69 78 49 74 65 72 28 70 2c 20 62 44 65 73 63  fixIter(p, bDesc
246c0 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b  , buf.p, nToken+
246d0 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 52 65  1, pColset, &pRe
246e0 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  t);.    }..    i
246f0 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20  f( p->rc ){.    
24700 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 74 65    sqlite3Fts5Ite
24710 72 43 6c 6f 73 65 28 70 52 65 74 29 3b 0a 20 20  rClose(pRet);.  
24720 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
24730 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
24740 64 65 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  der(p);.    }.  
24750 20 20 2a 70 70 49 74 65 72 20 3d 20 70 52 65 74    *ppIter = pRet
24760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
24770 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
24780 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24790 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
247a0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
247b0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
247c0 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
247d0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
247e0 6d 65 6e 74 20 69 73 20 61 74 20 45 4f 46 2e 0a  ment is at EOF..
247f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
24800 73 35 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e  s5IterEof(Fts5In
24810 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
24820 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
24830 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
24840 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
24850 75 72 6e 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b  urn pIter->bEof;
24860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
24870 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68  o the next match
24880 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69  ing rowid. .*/.i
24890 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
248a0 65 72 4e 65 78 74 28 46 74 73 35 49 6e 64 65 78  erNext(Fts5Index
248b0 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
248c0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
248d0 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
248e0 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75  E_OK );.  fts5Mu
248f0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 49 74 65  ltiIterNext(pIte
24900 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72  r->pIndex, pIter
24910 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  , 0, 0);.  retur
24920 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
24930 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29  n(pIter->pIndex)
24940 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
24950 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
24960 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e  hing term/rowid.
24970 20 55 73 65 64 20 62 79 20 74 68 65 20 66 74 73   Used by the fts
24980 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a  5vocab module..*
24990 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
249a0 35 49 74 65 72 4e 65 78 74 53 63 61 6e 28 46 74  5IterNextScan(Ft
249b0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
249c0 65 72 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  er){.  Fts5Index
249d0 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
249e0 64 65 78 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  dex;..  assert( 
249f0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
24a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
24a10 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
24a20 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
24a30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  , 0);.  if( p->r
24a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24a50 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
24a60 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
24a70 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
24a80 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
24a90 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70  .    if( pSeg->p
24aa0 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e 74 65  Leaf && pSeg->te
24ab0 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41  rm.p[0]!=FTS5_MA
24ac0 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a 20 20 20  IN_PREFIX ){.   
24ad0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
24ae0 73 65 28 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b  se(pSeg->pLeaf);
24af0 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 4c 65  .      pSeg->pLe
24b00 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 49  af = 0;.      pI
24b10 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20  ter->bEof = 1;. 
24b20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
24b30 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24b40 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
24b50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  );.}../*.** Move
24b60 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74   to the next mat
24b70 63 68 69 6e 67 20 72 6f 77 69 64 20 74 68 61 74  ching rowid that
24b80 20 6f 63 63 75 72 73 20 61 74 20 6f 72 20 61 66   occurs at or af
24b90 74 65 72 20 69 4d 61 74 63 68 2e 20 54 68 65 0a  ter iMatch. The.
24ba0 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66  ** definition of
24bb0 20 22 61 74 20 6f 72 20 61 66 74 65 72 22 20 64   "at or after" d
24bc0 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
24bd0 72 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  r this iterator 
24be0 69 74 65 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61  iterates.** in a
24bf0 73 63 65 6e 64 69 6e 67 20 6f 72 20 64 65 73 63  scending or desc
24c00 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64  ending rowid ord
24c10 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
24c20 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 46 72  e3Fts5IterNextFr
24c30 6f 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  om(Fts5IndexIter
24c40 20 2a 70 49 74 65 72 2c 20 69 36 34 20 69 4d 61   *pIter, i64 iMa
24c50 74 63 68 29 7b 0a 20 20 66 74 73 35 4d 75 6c 74  tch){.  fts5Mult
24c60 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 49  iIterNextFrom(pI
24c70 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
24c80 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 72  er, iMatch);.  r
24c90 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
24ca0 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
24cb0 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dex);.}../*.** R
24cc0 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
24cd0 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20  t rowid..*/.i64 
24ce0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 52  sqlite3Fts5IterR
24cf0 6f 77 69 64 28 46 74 73 35 49 6e 64 65 78 49 74  owid(Fts5IndexIt
24d00 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
24d10 74 75 72 6e 20 66 74 73 35 4d 75 6c 74 69 49 74  turn fts5MultiIt
24d20 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a  erRowid(pIter);.
24d30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
24d40 74 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d  the current term
24d50 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
24d60 2a 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72  *sqlite3Fts5Iter
24d70 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74  Term(Fts5IndexIt
24d80 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a  er *pIter, int *
24d90 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  pn){.  int n;.  
24da0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
24db0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 66 74 73  (const char*)fts
24dc0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
24dd0 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e  Iter, &n);.  *pn
24de0 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e   = n-1;.  return
24df0 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74 61 74   &z[1];.}...stat
24e00 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
24e10 45 78 74 72 61 63 74 43 6f 6c 73 65 74 20 28 0a  ExtractColset (.
24e20 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
24e30 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
24e40 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66    /* Colset to f
24e50 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f  ilter on */.  co
24e60 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e  nst u8 *pPos, in
24e70 74 20 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a  t nPos,       /*
24e80 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   Position list *
24e90 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
24ea0 70 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20  pBuf            
24eb0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
24ec0 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ffer */.){.  int
24ed0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24ee0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 74 73  .  int i;..  fts
24ef0 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66  5BufferZero(pBuf
24f00 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
24f10 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69  pColset->nCol; i
24f20 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ++){.    const u
24f30 38 20 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a  8 *pSub = pPos;.
24f40 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 66      int nSub = f
24f50 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
24f60 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20  ol(&pSub, nPos, 
24f70 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69  pColset->aiCol[i
24f80 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 53 75 62  ]);.    if( nSub
24f90 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75   ){.      fts5Bu
24fa0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
24fb0 72 63 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c 20  rc, pBuf, nSub, 
24fc0 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pSub);.    }.  }
24fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
24fe0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
24ff0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
25000 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
25010 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f  a copy of the po
25020 73 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a  sition list for.
25030 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  ** the current e
25040 6e 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61 72  ntry. Output var
25050 69 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65 74  iable *pn is set
25060 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
25070 74 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 69  the buffer .** i
25080 6e 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 72  n bytes before r
25090 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
250a0 54 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 73  The returned pos
250b0 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20  ition list does 
250c0 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20  not include the 
250d0 22 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73  "number of bytes
250e0 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c  " varint.** fiel
250f0 64 20 74 68 61 74 20 73 74 61 72 74 73 20 74 68  d that starts th
25100 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
25110 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20  on disk..*/.int 
25120 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
25130 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e  oslist(.  Fts5In
25140 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
25150 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
25160 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20  Colset,         
25170 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 66 69 6c     /* Column fil
25180 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ter (or NULL) */
25190 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70  .  const u8 **pp
251a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
251b0 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74     /* OUT: Point
251c0 65 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c  er to position-l
251d0 69 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  ist data */.  in
251e0 74 20 2a 70 6e 2c 20 20 20 20 20 20 20 20 20 20  t *pn,          
251f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25200 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f   OUT: Size of po
25210 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62  sition-list in b
25220 79 74 65 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70  ytes */.  i64 *p
25230 69 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20  iRowid          
25240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
25250 3a 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20  : Current rowid 
25260 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49  */.){.  Fts5SegI
25270 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
25280 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
25290 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
252a0 74 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t ];.  assert( p
252b0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63  Iter->pIndex->rc
252c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
252d0 20 2a 70 69 52 6f 77 69 64 20 3d 20 70 53 65 67   *piRowid = pSeg
252e0 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69 66 28 20  ->iRowid;.  if( 
252f0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70  pIter->pIndex->p
25300 43 6f 6e 66 69 67 2d 3e 62 4f 66 66 73 65 74 73  Config->bOffsets
25310 20 0a 20 20 20 26 26 20 70 53 65 67 2d 3e 69 4c   .   && pSeg->iL
25320 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e  eafOffset+pSeg->
25330 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61  nPos<=pSeg->pLea
25340 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a  f->szLeaf .  ){.
25350 20 20 20 20 75 38 20 2a 70 50 6f 73 20 3d 20 26      u8 *pPos = &
25360 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70  pSeg->pLeaf->p[p
25370 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  Seg->iLeafOffset
25380 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ];.    if( pCols
25390 65 74 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e  et==0 || pIter->
253a0 62 46 69 6c 74 65 72 65 64 20 29 7b 0a 20 20 20  bFiltered ){.   
253b0 20 20 20 2a 70 6e 20 3d 20 70 53 65 67 2d 3e 6e     *pn = pSeg->n
253c0 50 6f 73 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d  Pos;.      *pp =
253d0 20 70 50 6f 73 3b 0a 20 20 20 20 7d 65 6c 73 65   pPos;.    }else
253e0 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 6e 43   if( pColset->nC
253f0 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 2a  ol==1 ){.      *
25400 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 20  pp = pPos;.     
25410 20 2a 70 6e 20 3d 20 66 74 73 35 49 6e 64 65 78   *pn = fts5Index
25420 45 78 74 72 61 63 74 43 6f 6c 28 70 70 2c 20 70  ExtractCol(pp, p
25430 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73  Seg->nPos, pCols
25440 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20  et->aiCol[0]);. 
25450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25460 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
25470 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
25480 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
25490 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28 70 43  ExtractColset(pC
254a0 6f 6c 73 65 74 2c 20 70 50 6f 73 2c 20 70 53 65  olset, pPos, pSe
254b0 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d  g->nPos, &pIter-
254c0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
254d0 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pp = pIter->po
254e0 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 20 20 2a  slist.p;.      *
254f0 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  pn = pIter->posl
25500 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  ist.n;.    }.  }
25510 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75  else{.    fts5Bu
25520 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d  fferZero(&pIter-
25530 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 66  >poslist);.    f
25540 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73  ts5SegiterPoslis
25550 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  t(pIter->pIndex,
25560 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20   pSeg, pColset, 
25570 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
25580 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 74 65  ;.    *pp = pIte
25590 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20  r->poslist.p;.  
255a0 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70    *pn = pIter->p
255b0 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a 20 20  oslist.n;.  }.  
255c0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
255d0 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
255e0 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
255f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25600 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69   similar to sqli
25610 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
25620 73 74 28 29 2c 20 65 78 63 65 70 74 20 74 68 61  st(), except tha
25630 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  t it.** copies t
25640 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
25650 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72   into the buffer
25660 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65   supplied as the
25670 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75   second .** argu
25680 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
25690 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
256a0 69 73 74 42 75 66 66 65 72 28 46 74 73 35 49 6e  istBuffer(Fts5In
256b0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
256c0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
256d0 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  ){.  Fts5Index *
256e0 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  p = pIter->pInde
256f0 78 3b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  x;.  Fts5SegIter
25700 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
25710 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
25720 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
25730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
25740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
25750 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
25760 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35 53 65  (pBuf);.  fts5Se
25770 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  giterPoslist(p, 
25780 70 53 65 67 2c 20 30 2c 20 70 42 75 66 29 3b 0a  pSeg, 0, pBuf);.
25790 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
257a0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
257b0 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69  /*.** Close an i
257c0 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62  terator opened b
257d0 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c  y an earlier cal
257e0 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  l to sqlite3Fts5
257f0 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f  IndexQuery()..*/
25800 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73  .void sqlite3Fts
25810 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49  5IterClose(Fts5I
25820 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
25830 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
25840 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20 2a  .    Fts5Index *
25850 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d 3e  pIndex = pIter->
25860 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73 35  pIndex;.    fts5
25870 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
25880 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74  ter->pIndex, pIt
25890 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c 6f  er);.    fts5Clo
258a0 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78 29  seReader(pIndex)
258b0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
258c0 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74  ead and decode t
258d0 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
258e0 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64 61  cord from the da
258f0 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20 50  tabase. .**.** P
25900 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65 20  arameter anSize 
25910 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 6e  must point to an
25920 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20 6e   array of size n
25930 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c 20  Col, where nCol 
25940 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  is.** the number
25950 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65 64   of user defined
25960 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
25970 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e  FTS table..*/.in
25980 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
25990 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46 74  exGetAverages(Ft
259a0 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
259b0 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e 53  *pnRow, i64 *anS
259c0 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f 6c  ize){.  int nCol
259d0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e   = p->pConfig->n
259e0 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61 20  Col;.  Fts5Data 
259f0 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52 6f  *pData;..  *pnRo
25a00 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28  w = 0;.  memset(
25a10 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65 6f  anSize, 0, sizeo
25a20 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b 0a  f(i64) * nCol);.
25a30 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61    pData = fts5Da
25a40 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 41  taRead(p, FTS5_A
25a50 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b 0a  VERAGES_ROWID);.
25a60 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
25a70 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61 2d  ITE_OK && pData-
25a80 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >nn ){.    int i
25a90 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 43   = 0;.    int iC
25aa0 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ol;.    i += fts
25ab0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
25ac0 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 70  a->p[i], (u64*)p
25ad0 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28 69  nRow);.    for(i
25ae0 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d 3e  Col=0; i<pData->
25af0 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c 3b  nn && iCol<nCol;
25b00 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
25b10 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
25b20 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
25b30 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b 69   (u64*)&anSize[i
25b40 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Col]);.    }.  }
25b50 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
25b60 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72 65  ase(pData);.  re
25b70 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
25b80 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
25b90 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 75  * Replace the cu
25ba0 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73 22  rrent "averages"
25bb0 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68 65   record with the
25bc0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
25bd0 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70   buffer .** supp
25be0 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  lied as the seco
25bf0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  nd argument..*/.
25c00 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
25c10 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73 28  ndexSetAverages(
25c20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f  Fts5Index *p, co
25c30 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69  nst u8 *pData, i
25c40 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73  nt nData){.  ass
25c50 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
25c60 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44  TE_OK );.  fts5D
25c70 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
25c80 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c  _AVERAGES_ROWID,
25c90 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a   pData, nData);.
25ca0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
25cb0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
25cc0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25cd0 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
25ce0 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64   blocks this mod
25cf0 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72 6f  ule has read fro
25d00 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20  m the %_data.** 
25d10 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77  table since it w
25d20 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69  as created..*/.i
25d30 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
25d40 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e 64  dexReads(Fts5Ind
25d50 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ex *p){.  return
25d60 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a   p->nRead;.}../*
25d70 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62  .** Set the 32-b
25d80 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20  it cookie value 
25d90 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
25da0 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63  art of all struc
25db0 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73  ture .** records
25dc0 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61   to the value pa
25dd0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
25de0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
25df0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
25e00 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
25e10 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
25e20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
25e30 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73   error.** occurs
25e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
25e50 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b  Fts5IndexSetCook
25e60 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ie(Fts5Index *p,
25e70 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e   int iNew){.  in
25e80 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
25e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ea0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
25eb0 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69  e */.  Fts5Confi
25ec0 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
25ed0 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43  pConfig;    /* C
25ee0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a  onfiguration obj
25ef0 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f  ect */.  u8 aCoo
25f00 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20  kie[4];         
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25f20 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e   Binary represen
25f30 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a  tation of iNew *
25f40 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  /.  sqlite3_blob
25f50 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20   *pBlob = 0;..  
25f60 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
25f70 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71  QLITE_OK );.  sq
25f80 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28 61  lite3Fts5Put32(a
25f90 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a  Cookie, iNew);..
25fa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
25fb0 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
25fc0 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a  ->db, pConfig->z
25fd0 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c  Db, p->zDataTbl,
25fe0 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c   .      "block",
25ff0 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f   FTS5_STRUCTURE_
26000 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62  ROWID, 1, &pBlob
26010 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
26020 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
26030 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
26040 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b  ite(pBlob, aCook
26050 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72  ie, 4, 0);.    r
26060 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
26070 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20  _close(pBlob);. 
26080 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
26090 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .}..int sqlite3F
260a0 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66  ts5IndexLoadConf
260b0 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ig(Fts5Index *p)
260c0 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
260d0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53  e *pStruct;.  pS
260e0 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75  truct = fts5Stru
260f0 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20  ctureRead(p);.  
26100 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
26110 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
26120 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
26130 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a  xReturn(p);.}...
26140 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
26150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
26190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
261d0 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74  *****.** Below t
261e0 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65  his point is the
261f0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
26200 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  of the integrity
26210 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74  -check .** funct
26220 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a  ionality..*/../*
26230 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d  .** Return a sim
26240 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c  ple checksum val
26250 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ue based on the 
26260 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36  arguments..*/.u6
26270 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
26280 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20  exEntryCksum(.  
26290 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69  i64 iRowid, .  i
262a0 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20  nt iCol, .  int 
262b0 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64  iPos, .  int iId
262c0 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
262d0 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54  *pTerm,.  int nT
262e0 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  erm.){.  int i;.
262f0 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77    u64 ret = iRow
26300 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  id;.  ret += (re
26310 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20  t<<3) + iCol;.  
26320 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
26330 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49  + iPos;.  if( iI
26340 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28  dx>=0 ) ret += (
26350 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f  ret<<3) + (FTS5_
26360 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
26370 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dx);.  for(i=0; 
26380 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65  i<nTerm; i++) re
26390 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
263a0 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75  pTerm[i];.  retu
263b0 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65  rn ret;.}..#ifde
263c0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
263d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
263e0 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20  on is purely an 
263f0 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
26400 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
26410 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
26420 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
26430 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
26440 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
26450 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49  any way..**.** I
26460 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74 73  nstead, it tests
26470 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 73   that the same s
26480 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64  et of pgno/rowid
26490 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72   combinations ar
264a0 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65  e .** visited re
264b0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
264c0 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  her the doclist-
264d0 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65 64  index identified
264e0 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a   by parameters.*
264f0 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69  * iSegid/iLeaf i
26500 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f  s iterated in fo
26510 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72 73  rwards or revers
26520 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  e order..*/.stat
26530 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
26540 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20 20  DlidxReverse(.  
26550 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
26560 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
26570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26580 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74   /* Segment id t
26590 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o load from */. 
265a0 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20   int iLeaf      
265b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265c0 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74   /* Load doclist
265d0 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20  -index for this 
265e0 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  leaf */.){.  Fts
265f0 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
26600 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b  dx = 0;.  u64 ck
26610 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34  sum1 = 13;.  u64
26620 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20   cksum2 = 13;.. 
26630 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35   for(pDlidx=fts5
26640 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c  DlidxIterInit(p,
26650 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61   0, iSegid, iLea
26660 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  f);.      fts5Dl
26670 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
26680 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
26690 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
266a0 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29  t(p, pDlidx).  )
266b0 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  {.    i64 iRowid
266c0 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
266d0 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20  Rowid(pDlidx);. 
266e0 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74     int pgno = ft
266f0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
26700 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73  pDlidx);.    ass
26710 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20  ert( pgno>iLeaf 
26720 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d  );.    cksum1 +=
26730 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29   iRowid + ((i64)
26740 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20  pgno<<32);.  }. 
26750 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
26760 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44  ee(pDlidx);.  pD
26770 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72  lidx = 0;..  for
26780 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64  (pDlidx=fts5Dlid
26790 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20  xIterInit(p, 1, 
267a0 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a  iSegid, iLeaf);.
267b0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
267c0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
267d0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
267e0 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70 2c  DlidxIterPrev(p,
267f0 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20   pDlidx).  ){.  
26800 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66    i64 iRowid = f
26810 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
26820 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69  d(pDlidx);.    i
26830 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c  nt pgno = fts5Dl
26840 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
26850 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  dx);.    assert(
26860 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
26870 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66  no(pDlidx)>iLeaf
26880 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b   );.    cksum2 +
26890 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
268a0 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
268b0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
268c0 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
268d0 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66  Dlidx = 0;..  if
268e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
268f0 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b  OK && cksum1!=ck
26900 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46  sum2 ) p->rc = F
26910 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a  TS5_CORRUPT;.}..
26920 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 51  static int fts5Q
26930 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73  ueryCksum(.  Fts
26940 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
26950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26960 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63  Fts5 index objec
26970 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c  t */.  int iIdx,
26980 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
26990 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
269a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20     /* Index key 
269b0 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
269c0 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
269d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64    /* Size of ind
269f0 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20  ex key in bytes 
26a00 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
26a30 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  r Fts5IndexQuery
26a40 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75   */.  u64 *pCksu
26a50 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
26a60 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
26a70 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20   Checksum value 
26a80 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73 75  */.){.  u64 cksu
26a90 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46  m = *pCksum;.  F
26aa0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
26ab0 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e  dxIter = 0;.  in
26ac0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74  t rc = sqlite3Ft
26ad0 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20  s5IndexQuery(p, 
26ae0 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c 20  z, n, flags, 0, 
26af0 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 77  &pIdxIter);..  w
26b00 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
26b10 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
26b20 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49 64  3Fts5IterEof(pId
26b30 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 36  xIter) ){.    i6
26b40 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 63 6f 6e  4 dummy;.    con
26b50 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a 20 20 20  st u8 *pPos;.   
26b60 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69   int nPos;.    i
26b70 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74  64 rowid = sqlit
26b80 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64 28  e3Fts5IterRowid(
26b90 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20 72  pIdxIter);.    r
26ba0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
26bb0 74 65 72 50 6f 73 6c 69 73 74 28 70 49 64 78 49  terPoslist(pIdxI
26bc0 74 65 72 2c 20 30 2c 20 26 70 50 6f 73 2c 20 26  ter, 0, &pPos, &
26bd0 6e 50 6f 73 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  nPos, &dummy);. 
26be0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26bf0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
26c00 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
26c10 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66  sReader;.      f
26c20 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f  or(sqlite3Fts5Po
26c30 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28  slistReaderInit(
26c40 70 50 6f 73 2c 20 6e 50 6f 73 2c 20 26 73 52 65  pPos, nPos, &sRe
26c50 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ader);.         
26c60 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d 3d 30   sReader.bEof==0
26c70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
26c80 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
26c90 61 64 65 72 4e 65 78 74 28 26 73 52 65 61 64 65  aderNext(&sReade
26ca0 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  r).      ){.    
26cb0 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46      int iCol = F
26cc0 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 73  TS5_POS2COLUMN(s
26cd0 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20  Reader.iPos);.  
26ce0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
26cf0 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
26d00 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
26d10 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d          cksum ^=
26d20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
26d30 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69  xEntryCksum(rowi
26d40 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20 69  d, iCol, iOff, i
26d50 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20  Idx, z, n);.    
26d60 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
26d70 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65  qlite3Fts5IterNe
26d80 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20  xt(pIdxIter);.  
26d90 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
26da0 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 70  3Fts5IterClose(p
26db0 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70 43  IdxIter);..  *pC
26dc0 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20 20  ksum = cksum;.  
26dd0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
26de0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
26df0 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65 6c  on is also purel
26e00 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65  y an internal te
26e10 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74 20  st. It does not 
26e20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a 2a  contribute to .*
26e30 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c  * FTS functional
26e40 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68 65  ity, or even the
26e50 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
26e60 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f  , in any way..*/
26e70 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
26e80 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74 73  5TestTerm(.  Fts
26e90 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
26ea0 73 35 42 75 66 66 65 72 20 2a 70 50 72 65 76 2c  s5Buffer *pPrev,
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26ec0 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20 2a   Previous term *
26ed0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
26ee0 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  z, int n,       
26ef0 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20      /* Possibly 
26f00 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73 74  new term to test
26f10 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63 74   */.  u64 expect
26f20 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73 75  ed,.  u64 *pCksu
26f30 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  m.){.  int rc = 
26f40 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50 72  p->rc;.  if( pPr
26f50 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ev->n==0 ){.    
26f60 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  fts5BufferSet(&r
26f70 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f  c, pPrev, n, (co
26f80 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d 65  nst u8*)z);.  }e
26f90 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  lse.  if( rc==SQ
26fa0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72 65  LITE_OK && (pPre
26fb0 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63 6d  v->n!=n || memcm
26fc0 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20 6e  p(pPrev->p, z, n
26fd0 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63 6b  )) ){.    u64 ck
26fe0 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a  sum3 = *pCksum;.
26ff0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27000 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zTerm = (const c
27010 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b 31  har*)&pPrev->p[1
27020 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e 73  ];  /* term sans
27030 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f 0a   prefix-byte */.
27040 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20      int nTerm = 
27050 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20 20  pPrev->n-1;     
27060 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
27070 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65 73  f zTerm in bytes
27080 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64 78   */.    int iIdx
27090 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d 20   = (pPrev->p[0] 
270a0 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  - FTS5_MAIN_PREF
270b0 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61  IX);.    int fla
270c0 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f 20  gs = (iIdx==0 ? 
270d0 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51 55  0 : FTS5INDEX_QU
270e0 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20 20  ERY_PREFIX);.   
270f0 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20 20   u64 ck1 = 0;.  
27100 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a 0a    u64 ck2 = 0;..
27110 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
27120 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65  t the results re
27130 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20 61  turned for ASC a
27140 6e 64 20 44 45 53 43 20 71 75 65 72 69 65 73 20  nd DESC queries 
27150 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  are.    ** the s
27160 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61 6c  ame. If not, cal
27170 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74 69 6f  l this corruptio
27180 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  n.  */.    rc = 
27190 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
271a0 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
271b0 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63 6b  Term, flags, &ck
271c0 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  1);.    if( rc==
271d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
271e0 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
271f0 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
27200 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63 20  _DESC;.      rc 
27210 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
27220 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
27230 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
27240 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
27250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
27260 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
27270 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a   FTS5_CORRUPT;..
27280 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
27290 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72 79  s a prefix query
272a0 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
272b0 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
272c0 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  d if the.    ** 
272d0 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69 73  the index is dis
272e0 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73 61  abled are the sa
272f0 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43 20  me. In both ASC 
27300 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e 20  and DESC order. 
27310 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
27320 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f 6e  his check may on
27330 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64 20  ly be performed 
27340 69 66 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  if the hash tabl
27350 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69 73  e is empty. This
27360 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61 75  .    ** is becau
27370 73 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  se the hash tabl
27380 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73 20  e only supports 
27390 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71 75  a single scan qu
273a0 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61 20  ery at.    ** a 
273b0 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d 75  time, and the mu
273c0 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66 72  lti-iter loop fr
273d0 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 66 75  om which this fu
273e0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
273f0 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61  .    ** is alrea
27400 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73 75  dy performing su
27410 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20 20  ch a scan. */.  
27420 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e    if( p->nPendin
27430 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  gData==0 ){.    
27440 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26 20    if( iIdx>0 && 
27450 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27460 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d  .        int f =
27470 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58   flags|FTS5INDEX
27480 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44  _QUERY_TEST_NOID
27490 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d  X;.        ck2 =
274a0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   0;.        rc =
274b0 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
274c0 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
274d0 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b  nTerm, f, &ck2);
274e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
274f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
27500 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54  1!=ck2 ) rc = FT
27510 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
27520 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 49    }.      if( iI
27530 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  dx>0 && rc==SQLI
27540 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27550 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
27560 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
27570 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49 4e  EST_NOIDX|FTS5IN
27580 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b 0a  DEX_QUERY_DESC;.
27590 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b          ck2 = 0;
275a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 74  .        rc = ft
275b0 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20  s5QueryCksum(p, 
275c0 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65  iIdx, zTerm, nTe
275d0 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20  rm, f, &ck2);.  
275e0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
275f0 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d  LITE_OK && ck1!=
27600 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ck2 ) rc = FTS5_
27610 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
27620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75  .    }..    cksu
27630 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66  m3 ^= ck1;.    f
27640 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63  ts5BufferSet(&rc
27650 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e  , pPrev, n, (con
27660 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20  st u8*)z);..    
27670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27680 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70  K && cksum3!=exp
27690 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72  ected ){.      r
276a0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
276b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b  ;.    }.    *pCk
276c0 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20  sum = cksum3;.  
276d0 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a  }.  p->rc = rc;.
276e0 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }. .#else.# defi
276f0 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69 64 78  ne fts5TestDlidx
27700 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23  Reverse(x,y,z).#
27710 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73 74   define fts5Test
27720 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a  Term(u,v,w,x,y,z
27730 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
27740 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a  Check that:.**.*
27750 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65  *   1) All leave
27760 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65 65  s of pSeg betwee
27770 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61  n iFirst and iLa
27780 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65  st (inclusive) e
27790 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20  xist and.**     
277a0 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65   contain zero te
277b0 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c  rms..**   2) All
277c0 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67 20   leaves of pSeg 
277d0 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64  between iNoRowid
277e0 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c   and iLast (incl
277f0 75 73 69 76 65 29 20 65 78 69 73 74 20 61 6e 64  usive) exist and
27800 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e  .**      contain
27810 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f   zero rowids..*/
27820 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
27830 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43  5IndexIntegrityC
27840 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73  heckEmpty(.  Fts
27850 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73  5Index *p,.  Fts
27860 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
27870 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20  t *pSeg,     /* 
27880 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b  Segment to check
27890 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73   internal consis
278a0 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69  tency */.  int i
278b0 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f  First,.  int iNo
278c0 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61  Rowid,.  int iLa
278d0 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  st.){.  int i;..
278e0 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74    /* Now check t
278f0 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d  hat the iter.nEm
27900 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f  pty leaves follo
27910 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  wing the current
27920 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65   leaf.  ** (a) e
27930 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  xist and (b) con
27940 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a  tain no terms. *
27950 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74  /.  for(i=iFirst
27960 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
27970 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20  OK && i<=iLast; 
27980 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61  i++){.    Fts5Da
27990 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35  ta *pLeaf = fts5
279a0 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
279b0 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
279c0 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29 29  Seg->iSegid, i))
279d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 20  ;.    if( pLeaf 
279e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66 74  ){.      if( !ft
279f0 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73  s5LeafIsTermless
27a00 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63 20  (pLeaf) ) p->rc 
27a10 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
27a20 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e 6f        if( i>=iNo
27a30 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73 35  Rowid && 0!=fts5
27a40 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
27a50 66 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63  f(pLeaf) ) p->rc
27a60 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
27a70 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
27a80 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
27a90 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
27aa0 20 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67 72   void fts5Integr
27ab0 69 74 79 43 68 65 63 6b 50 67 69 64 78 28 46 74  ityCheckPgidx(Ft
27ac0 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
27ad0 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20  Data *pLeaf){.  
27ae0 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30  int iTermOff = 0
27af0 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 46  ;.  int ii;..  F
27b00 74 73 35 42 75 66 66 65 72 20 62 75 66 31 20 3d  ts5Buffer buf1 =
27b10 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73 35   {0,0,0};.  Fts5
27b20 42 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b 30  Buffer buf2 = {0
27b30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20 70  ,0,0};..  ii = p
27b40 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
27b50 77 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66 2d  while( ii<pLeaf-
27b60 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51  >nn && p->rc==SQ
27b70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
27b80 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
27b90 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 49  iOff;.    int nI
27ba0 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d 20  ncr;..    ii += 
27bb0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
27bc0 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20 6e  &pLeaf->p[ii], n
27bd0 49 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72 6d  Incr);.    iTerm
27be0 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20 20  Off += nIncr;.  
27bf0 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66    iOff = iTermOf
27c00 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66  f;..    if( iOff
27c10 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
27c20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
27c30 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
27c40 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65     }else if( iTe
27c50 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b 0a  rmOff==nIncr ){.
27c60 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b        int nByte;
27c70 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
27c80 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
27c90 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  pLeaf->p[iOff], 
27ca0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 66  nByte);.      if
27cb0 28 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e 70  ( (iOff+nByte)>p
27cc0 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
27cd0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
27ce0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27d00 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
27d10 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c 20  (&p->rc, &buf1, 
27d20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e 70  nByte, &pLeaf->p
27d30 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 7d  [iOff]);.      }
27d40 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27d50 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42 79    int nKeep, nBy
27d60 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  te;.      iOff +
27d70 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
27d80 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  2(&pLeaf->p[iOff
27d90 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20  ], nKeep);.     
27da0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
27db0 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
27dc0 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65 29  >p[iOff], nByte)
27dd0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65 65  ;.      if( nKee
27de0 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f 66  p>buf1.n || (iOf
27df0 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d 3e  f+nByte)>pLeaf->
27e00 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  szLeaf ){.      
27e10 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
27e20 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
27e30 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75 66  lse{.        buf
27e40 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20  1.n = nKeep;.   
27e50 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
27e60 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
27e70 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c 20  , &buf1, nByte, 
27e80 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 29  &pLeaf->p[iOff])
27e90 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27ea0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
27eb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27ec0 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
27ed0 72 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c 20  rCompare(&buf1, 
27ee0 26 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20 20  &buf2);.        
27ef0 69 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d 3e  if( res<=0 ) p->
27f00 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
27f10 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  T;.      }.    }
27f20 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
27f30 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 32  et(&p->rc, &buf2
27f40 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e 70  , buf1.n, buf1.p
27f50 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42 75  );.  }..  fts5Bu
27f60 66 66 65 72 46 72 65 65 28 26 62 75 66 31 29 3b  fferFree(&buf1);
27f70 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
27f80 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74 61  e(&buf2);.}..sta
27f90 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
27fa0 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  exIntegrityCheck
27fb0 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35 49  Segment(.  Fts5I
27fc0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
27fd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
27fe0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
27ff0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
28000 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
28010 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e  g      /* Segmen
28020 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65 72  t to check inter
28030 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79 20  nal consistency 
28040 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66  */.){.  Fts5Conf
28050 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
28060 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c 69  >pConfig;.  sqli
28070 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
28080 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b 0a  = 0;.  int rc2;.
28090 20 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c 65    int iIdxPrevLe
280a0 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  af = pSeg->pgnoF
280b0 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69 44  irst-1;.  int iD
280c0 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70  lidxPrevLeaf = p
280d0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 0a  Seg->pgnoLast;..
280e0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
280f0 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75 72  First==0 ) retur
28100 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 50  n;..  fts5IndexP
28110 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70  repareStmt(p, &p
28120 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70  Stmt, sqlite3_mp
28130 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53 45  rintf(.      "SE
28140 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65 72 6d  LECT segid, term
28150 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70 67  , (pgno>>1), (pg
28160 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27 25  no&1) FROM %Q.'%
28170 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65 67  q_idx' WHERE seg
28180 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70 43  id=%d",.      pC
28190 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e  onfig->zDb, pCon
281a0 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65 67  fig->zName, pSeg
281b0 2d 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a 0a  ->iSegid.  ));..
281c0 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68 72    /* Iterate thr
281d0 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65 20  ough the b-tree 
281e0 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a 20  hierarchy.  */. 
281f0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
28200 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
28210 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
28220 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
28230 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20 20     i64 iRow;    
28240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28250 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74 68   /* Rowid for th
28260 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 46  is leaf */.    F
28270 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20  ts5Data *pLeaf; 
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28290 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c 65  Data for this le
282a0 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20 6e  af */..    int n
282b0 49 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74 65  IdxTerm = sqlite
282c0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
282d0 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63 6f  Stmt, 1);.    co
282e0 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54 65  nst char *zIdxTe
282f0 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  rm = (const char
28300 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
28310 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
28320 0a 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65 61  .    int iIdxLea
28330 66 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  f = sqlite3_colu
28340 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32 29  mn_int(pStmt, 2)
28350 3b 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44 6c  ;.    int bIdxDl
28360 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  idx = sqlite3_co
28370 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
28380 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  3);..    /* If t
28390 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73 74  he leaf in quest
283a0 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
283b0 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72 6f  been trimmed fro
283c0 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20 0a  m the segment, .
283d0 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74 68      ** ignore th
283e0 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79 2e  is b-tree entry.
283f0 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61 64   Otherwise, load
28400 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e   it into memory.
28410 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64 78   */.    if( iIdx
28420 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f 46  Leaf<pSeg->pgnoF
28430 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  irst ) continue;
28440 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53 35  .    iRow = FTS5
28450 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
28460 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49 64  Seg->iSegid, iId
28470 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65 61  xLeaf);.    pLea
28480 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
28490 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20 69  (p, iRow);.    i
284a0 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62 72  f( pLeaf==0 ) br
284b0 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  eak;..    /* Che
284c0 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66  ck that the leaf
284d0 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
284e0 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e 64  st one term, and
284f0 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75 61   that it is equa
28500 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20 6c  l.    ** to or l
28510 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
28520 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64 78  plit-key in zIdx
28530 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65 63  Term.  Also chec
28540 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65 0a  k that if there.
28550 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20 61      ** is also a
28560 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20 77   rowid pointer w
28570 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20 70  ithin the leaf p
28580 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20 70  age header, it p
28590 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20 2a  oints to a.    *
285a0 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f 72  * location befor
285b0 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f 0a  e the term.  */.
285c0 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e      if( pLeaf->n
285d0 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  n<=pLeaf->szLeaf
285e0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
285f0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
28600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28610 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20   int iOff;      
28620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28630 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
28640 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f 0a  term on leaf */.
28650 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
28660 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
28670 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66    /* Offset of f
28680 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65  irst rowid on le
28690 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  af */.      int 
286a0 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
286b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
286c0 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20  of term on leaf 
286d0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
286e0 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20 20    int res;      
286f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28700 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74   Comparison of t
28710 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b 65  erm and split-ke
28720 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66 66  y */..      iOff
28730 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
28740 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b 0a  TermOff(pLeaf);.
28750 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
28760 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
28770 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
28780 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
28790 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20 20  Off>=iOff ){.   
287a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
287b0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
287c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
287d0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
287e0 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d 3e  arint32(&pLeaf->
287f0 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29 3b  p[iOff], nTerm);
28800 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 6d  .        res = m
28810 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b  emcmp(&pLeaf->p[
28820 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c  iOff], zIdxTerm,
28830 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78   MIN(nTerm, nIdx
28840 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20 20  Term));.        
28850 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
28860 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54   = nTerm - nIdxT
28870 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  erm;.        if(
28880 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d   res<0 ) p->rc =
28890 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
288a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74       }..      ft
288b0 73 35 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b  s5IntegrityCheck
288c0 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66 29 3b  Pgidx(p, pLeaf);
288d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44  .    }.    fts5D
288e0 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66  ataRelease(pLeaf
288f0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
28900 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
28910 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74  * Now check that
28920 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79   the iter.nEmpty
28930 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e   leaves followin
28940 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  g the current le
28950 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65 78  af.    ** (a) ex
28960 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74  ist and (b) cont
28970 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f  ain no terms. */
28980 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e  .    fts5IndexIn
28990 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70 74  tegrityCheckEmpt
289a0 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20 70 53  y(.        p, pS
289b0 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65 61 66  eg, iIdxPrevLeaf
289c0 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76 4c 65  +1, iDlidxPrevLe
289d0 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d 31  af+1, iIdxLeaf-1
289e0 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
289f0 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
28a00 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
28a10 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
28a20 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69  ex, check that i
28a30 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a  t looks right. *
28a40 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78 44 6c  /.    if( bIdxDl
28a50 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73  idx ){.      Fts
28a60 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
28a70 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20  dx = 0;  /* For 
28a80 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
28a90 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  h doclist index 
28aa0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50 72  */.      int iPr
28ab0 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61  evLeaf = iIdxLea
28ac0 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  f;.      int iSe
28ad0 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65 67  gid = pSeg->iSeg
28ae0 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 50  id;.      int iP
28af0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36 34  g = 0;.      i64
28b00 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f   iKey;..      fo
28b10 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
28b20 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c  dxIterInit(p, 0,
28b30 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61   iSegid, iIdxLea
28b40 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74  f);.          ft
28b50 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
28b60 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
28b70 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69 64          fts5Dlid
28b80 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
28b90 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20  idx).      ){.. 
28ba0 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
28bb0 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70  any rowid-less p
28bc0 61 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 20  ages that occur 
28bd0 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
28be0 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20  nt leaf. */.    
28bf0 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65      for(iPg=iPre
28c00 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73  vLeaf+1; iPg<fts
28c10 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
28c20 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a  Dlidx); iPg++){.
28c30 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d            iKey =
28c40 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
28c50 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 67 29  WID(iSegid, iPg)
28c60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
28c70 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64  f = fts5DataRead
28c80 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20 20  (p, iKey);.     
28c90 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
28ca0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
28cb0 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  ( fts5LeafFirstR
28cc0 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 21 3d  owidOff(pLeaf)!=
28cd0 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
28ce0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
28cf0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
28d00 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
28d10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28d20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72 65    }.        iPre
28d30 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c 69 64  vLeaf = fts5Dlid
28d40 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
28d50 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  );..        /* C
28d60 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
28d70 61 66 20 70 61 67 65 20 69 6e 64 69 63 61 74 65  af page indicate
28d80 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
28d90 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20  r really does.  
28da0 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e        ** contain
28db0 20 74 68 65 20 72 6f 77 69 64 20 73 75 67 67 65   the rowid sugge
28dc0 73 74 65 64 20 62 79 20 74 68 65 20 73 61 6d 65  sted by the same
28dd0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b 65  . */.        iKe
28de0 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  y = FTS5_SEGMENT
28df0 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
28e00 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20  PrevLeaf);.     
28e10 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
28e20 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
28e30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
28e40 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
28e50 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
28e60 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
28e70 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46  dOff = fts5LeafF
28e80 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
28e90 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 41  af);.          A
28ea0 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28  SSERT_SZLEAF_OK(
28eb0 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  pLeaf);.        
28ec0 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e    if( iRowidOff>
28ed0 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
28ee0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
28ef0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
28f00 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  PT;.          }e
28f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
28f20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
28f30 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f  pLeaf->p[iRowidO
28f40 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77  ff], (u64*)&iRow
28f50 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  id);.           
28f60 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66 74 73   if( iRowid!=fts
28f70 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
28f80 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72 63 20  pDlidx) ) p->rc 
28f90 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
28fa0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
28fb0 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
28fc0 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
28fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
28fe0 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72 65  .      iDlidxPre
28ff0 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20 20 20  vLeaf = iPg;.   
29000 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
29010 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
29020 20 20 20 20 66 74 73 35 54 65 73 74 44 6c 69 64      fts5TestDlid
29030 78 52 65 76 65 72 73 65 28 70 2c 20 69 53 65 67  xReverse(p, iSeg
29040 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
29050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29060 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d  iDlidxPrevLeaf =
29070 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b   pSeg->pgnoLast;
29080 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20  .      /* TODO: 
29090 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 20 6e  Check there is n
290a0 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 20  o doclist index 
290b0 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 49  */.    }..    iI
290c0 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64  dxPrevLeaf = iId
290d0 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63  xLeaf;.  }..  rc
290e0 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  2 = sqlite3_fina
290f0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
29100 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
29110 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 63  _OK ) p->rc = rc
29120 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69 74  2;..  /* Page it
29130 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f  er.iLeaf must no
29140 77 20 62 65 20 74 68 65 20 72 69 67 68 74 6d 6f  w be the rightmo
29150 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20  st leaf-page in 
29160 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23  the segment */.#
29170 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72 63  if 0.  if( p->rc
29180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
29190 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d  ter.iLeaf!=pSeg-
291a0 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20  >pgnoLast ){.   
291b0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
291c0 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  RRUPT;.  }.#endi
291d0 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  f.}.../*.** Run 
291e0 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20  internal checks 
291f0 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
29200 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61 29  he FTS index (a)
29210 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a   is internally .
29220 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e  ** consistent an
29230 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20 65  d (b) contains e
29240 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63 68  ntries for which
29250 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20   the XOR of the 
29260 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20  checksums.** as 
29270 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 73 71  calculated by sq
29280 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45 6e  lite3Fts5IndexEn
29290 74 72 79 43 6b 73 75 6d 28 29 20 69 73 20 63 6b  tryCksum() is ck
292a0 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  sum..**.** Retur
292b0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
292c0 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20 69   if any of the i
292d0 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 66  nternal checks f
292e0 61 69 6c 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a  ail, or if the.*
292f0 2a 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 20  * checksum does 
29300 6e 6f 74 20 6d 61 74 63 68 2e 20 52 65 74 75 72  not match. Retur
29310 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61  n SQLITE_OK if a
29320 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 20 77  ll checks pass w
29330 69 74 68 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c  ithout.** error,
29340 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 53   or some other S
29350 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
29360 20 69 66 20 61 6e 6f 74 68 65 72 20 65 72 72 6f   if another erro
29370 72 20 28 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20  r (e.g. OOM).** 
29380 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
29390 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 49  qlite3Fts5IndexI
293a0 6e 74 65 67 72 69 74 79 43 68 65 63 6b 28 46 74  ntegrityCheck(Ft
293b0 73 35 49 6e 64 65 78 20 2a 70 2c 20 75 36 34 20  s5Index *p, u64 
293c0 63 6b 73 75 6d 29 7b 0a 20 20 75 36 34 20 63 6b  cksum){.  u64 ck
293d0 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20 20  sum2 = 0;       
293e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
293f0 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63  cksum based on c
29400 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78  ontents of index
29410 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66  es */.  Fts5Buff
29420 65 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c  er poslist = {0,
29430 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65  0,0};   /* Buffe
29440 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 61  r used to hold a
29450 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74   poslist */.  Ft
29460 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
29470 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
29480 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
29490 20 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65 20   through entire 
294a0 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35 53  index */.  Fts5S
294b0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
294c0 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  t;         /* In
294d0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
294e0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
294f0 44 45 42 55 47 0a 20 20 2f 2a 20 55 73 65 64 20  DEBUG.  /* Used 
29500 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61  by extra interna
29510 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e  l tests only run
29520 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
29530 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75  t defined */.  u
29540 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20  64 cksum3 = 0;  
29550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29560 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
29570 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
29580 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
29590 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b  5Buffer term = {
295a0 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20  0,0,0};      /* 
295b0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
295c0 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  old most recent 
295d0 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  term */.#endif. 
295e0 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20   .  /* Load the 
295f0 46 54 53 20 69 6e 64 65 78 20 73 74 72 75 63 74  FTS index struct
29600 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  ure */.  pStruct
29610 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
29620 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43  Read(p);..  /* C
29630 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e  heck that the in
29640 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20  ternal nodes of 
29650 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74  each segment mat
29660 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f  ch the leaves */
29670 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
29680 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20  {.    int iLvl, 
29690 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c  iSeg;.    for(iL
296a0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
296b0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
296c0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
296d0 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
296e0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
296f0 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
29700 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72  .        Fts5Str
29710 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
29720 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Seg = &pStruct->
29730 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
29740 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
29750 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
29760 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28  ityCheckSegment(
29770 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  p, pSeg);.      
29780 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
29790 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75  * The cksum argu
297a0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
297b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
297c0 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75  a checksum calcu
297d0 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64  lated.  ** based
297e0 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64   on all expected
297f0 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
29800 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75  FTS index (inclu
29810 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65  ding prefix inde
29820 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e  x.  ** entries).
29830 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63   This block chec
29840 6b 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 73  ks that a checks
29850 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61  um calculated ba
29860 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  sed on the.  ** 
29870 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20  actual contents 
29880 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69 73 20  of FTS index is 
29890 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a  identical..  **.
298a0 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e    ** Two version
298b0 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68  s of the same ch
298c0 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75  ecksum are calcu
298d0 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72 73 74  lated. The first
298e0 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72   (stack.  ** var
298f0 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61  iable cksum2) ba
29900 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65  sed on entries e
29910 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
29920 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
29930 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69  x.  ** while doi
29940 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  ng a linear scan
29950 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64   of each individ
29960 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72  ual index in tur
29970 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73  n. .  **.  ** As
29980 20 65 61 63 68 20 74 65 72 6d 20 76 69 73 69 74   each term visit
29990 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72  ed by the linear
299a0 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61   scans, a separa
299b0 74 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  te query for the
299c0 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20  .  ** same term 
299d0 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b  is performed. ck
299e0 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74  sum3 is calculat
299f0 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
29a00 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74  entries.  ** ext
29a10 72 61 63 74 65 64 20 62 79 20 74 68 65 73 65 20  racted by these 
29a20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
29a30 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
29a40 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
29a50 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d 31 2c   0, 0, 0, 0, -1,
29a60 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20   0, &pIter);.   
29a70 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
29a80 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30  Eof(p, pIter)==0
29a90 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
29aa0 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
29ab0 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20  er, 0, 0).  ){. 
29ac0 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20     int n;       
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29ae0 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d 20 69  * Size of term i
29af0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69  n bytes */.    i
29b00 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20 20 20  64 iPos = 0;    
29b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
29b20 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72 6f 6d  sition read from
29b30 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20   poslist */.    
29b40 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20 20 20  int iOff = 0;   
29b50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
29b60 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 6f 73  ffset within pos
29b70 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36 34 20  list */.    i64 
29b80 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c  iRowid = fts5Mul
29b90 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65  tiIterRowid(pIte
29ba0 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  r);.    char *z 
29bb0 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d 75 6c  = (char*)fts5Mul
29bc0 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
29bd0 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  , &n);..    /* I
29be0 66 20 74 68 69 73 20 69 73 20 61 20 6e 65 77 20  f this is a new 
29bf0 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f 72 20  term, query for 
29c00 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73 75 6d  it. Update cksum
29c10 33 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  3 with the resul
29c20 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 54  ts. */.    fts5T
29c30 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d  estTerm(p, &term
29c40 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32 2c 20  , z, n, cksum2, 
29c50 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20 20 70  &cksum3);..    p
29c60 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a 20 20  oslist.n = 0;.  
29c70 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73    fts5SegiterPos
29c80 6c 69 73 74 28 70 2c 20 26 70 49 74 65 72 2d 3e  list(p, &pIter->
29c90 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
29ca0 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20 2c 20  st[1].iFirst] , 
29cb0 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20  0, &poslist);.  
29cc0 20 20 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69    while( 0==sqli
29cd0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
29ce0 78 74 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20  xt64(poslist.p, 
29cf0 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66  poslist.n, &iOff
29d00 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20  , &iPos) ){.    
29d10 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53    int iCol = FTS
29d20 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f  5_POS2COLUMN(iPo
29d30 73 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 54  s);.      int iT
29d40 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53  okOff = FTS5_POS
29d50 32 4f 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20  2OFFSET(iPos);. 
29d60 20 20 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 73       cksum2 ^= s
29d70 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 45  qlite3Fts5IndexE
29d80 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64  ntryCksum(iRowid
29d90 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c  , iCol, iTokOff,
29da0 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20   -1, z, n);.    
29db0 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54 65 73 74  }.  }.  fts5Test
29dc0 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c 20 30  Term(p, &term, 0
29dd0 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b  , 0, cksum2, &ck
29de0 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35 4d 75  sum3);..  fts5Mu
29df0 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70  ltiIterFree(p, p
29e00 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Iter);.  if( p->
29e10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29e20 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29   cksum!=cksum2 )
29e30 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
29e40 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74  RRUPT;..  fts5St
29e50 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
29e60 53 74 72 75 63 74 29 3b 0a 23 69 66 64 65 66 20  Struct);.#ifdef 
29e70 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
29e80 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
29e90 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66  erm);.#endif.  f
29ea0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
29eb0 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  oslist);.  retur
29ec0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
29ed0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n(p);.}../******
29ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f20 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
29f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
29f70 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  * Below this poi
29f80 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  nt is the implem
29f90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
29fa0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63  fts5_decode() sc
29fb0 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  alar.** function
29fc0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a   only..*/../*.**
29fd0 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e   Decode a segmen
29fe0 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f  t-data rowid fro
29ff0 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2a000 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
2a010 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f  n is.** the oppo
2a020 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54  site of macro FT
2a030 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2a040 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
2a050 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  id fts5DecodeRow
2a060 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64  id(.  i64 iRowid
2a070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a080 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
2a090 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65  rom %_data table
2a0a0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67   */.  int *piSeg
2a0b0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2a0c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
2a0d0 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
2a0e0 74 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20  t *pbDlidx,     
2a0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a100 20 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67   OUT: Dlidx flag
2a110 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69   */.  int *piHei
2a120 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
2a130 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65        /* OUT: He
2a140 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ight */.  int *p
2a150 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20  iPgno           
2a160 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2a170 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  : Page number */
2a180 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20  .){.  *piPgno = 
2a190 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
2a1a0 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
2a1b0 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
2a1c0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
2a1d0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2a1e0 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20  B;..  *piHeight 
2a1f0 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2a200 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2a210 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29  5_DATA_HEIGHT_B)
2a220 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
2a230 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48   >>= FTS5_DATA_H
2a240 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44  EIGHT_B;..  *pbD
2a250 6c 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f  lidx = (int)(iRo
2a260 77 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20  wid & 0x0001);. 
2a270 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2a280 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20  _DATA_DLI_B;..  
2a290 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29  *piSegid = (int)
2a2a0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2a2b0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2a2c0 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a  ID_B) - 1));.}..
2a2d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2a2e0 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a  DebugRowid(int *
2a2f0 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2a300 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29  *pBuf, i64 iKey)
2a310 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  {.  int iSegid, 
2a320 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20  iHeight, iPgno, 
2a330 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a  bDlidx;       /*
2a340 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74   Rowid compenent
2a350 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64  s */.  fts5Decod
2a360 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53  eRowid(iKey, &iS
2a370 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26  egid, &bDlidx, &
2a380 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
2a390 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d  ;..  if( iSegid=
2a3a0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b  =0 ){.    if( iK
2a3b0 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  ey==FTS5_AVERAGE
2a3c0 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
2a3d0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a3e0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2a3f0 52 63 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72  Rc, pBuf, "{aver
2a400 61 67 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65  ages} ");.    }e
2a410 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2a420 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2a430 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2a440 75 66 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d  uf, "{structure}
2a450 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
2a460 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2a470 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2a480 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2a490 66 2c 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20  f, "{%ssegid=%d 
2a4a0 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a  h=%d pgno=%d}",.
2a4b0 20 20 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f          bDlidx ?
2a4c0 20 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20   "dlidx " : "", 
2a4d0 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
2a4e0 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20   iPgno.    );.  
2a4f0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
2a500 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
2a510 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ure(.  int *pRc,
2a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a530 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2a540 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
2a550 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
2a560 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  uf,.  Fts5Struct
2a570 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20  ure *p.){.  int 
2a580 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20  iLvl, iSeg;     
2a590 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2a5a0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
2a5b0 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20  evels, segments 
2a5c0 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30  */..  for(iLvl=0
2a5d0 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c  ; iLvl<p->nLevel
2a5e0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46  ; iLvl++){.    F
2a5f0 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
2a600 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c  l *pLvl = &p->aL
2a610 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
2a620 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2a630 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2a640 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20  c, pBuf, .      
2a650 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72    " {lvl=%d nMer
2a660 67 65 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20  ge=%d nSeg=%d", 
2a670 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  iLvl, pLvl->nMer
2a680 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20  ge, pLvl->nSeg. 
2a690 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53     );.    for(iS
2a6a0 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d  eg=0; iSeg<pLvl-
2a6b0 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  >nSeg; iSeg++){.
2a6c0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
2a6d0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2a6e0 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
2a6f0 53 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  Seg];.      sqli
2a700 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2a710 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2a720 42 75 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65  Buf, " {id=%d le
2a730 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a  aves=%d..%d}", .
2a740 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e            pSeg->
2a750 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67  iSegid, pSeg->pg
2a760 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70  noFirst, pSeg->p
2a770 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b  gnoLast.      );
2a780 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a790 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2a7a0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2a7b0 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a  uf, "}");.  }.}.
2a7c0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70  ./*.** This is p
2a7d0 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
2a7e0 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
2a7f0 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  ng aid..**.** Ar
2a800 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42  guments pBlob/nB
2a810 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65  lob contain a se
2a820 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72  rialized Fts5Str
2a830 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54  ucture object. T
2a840 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
2a850 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d  appends a human-
2a860 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
2a870 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
2a880 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ame object.** to
2a890 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73   the buffer pass
2a8a0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2a8b0 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73   argument. .*/.s
2a8c0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2a8d0 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a  ecodeStructure(.
2a8e0 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a900 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2a910 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2a920 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2a930 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2a940 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2a950 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2a980 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2a990 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  re *p = 0;      
2a9a0 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20       /* Decoded 
2a9b0 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
2a9c0 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35   */..  rc = fts5
2a9d0 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
2a9e0 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c  pBlob, nBlob, 0,
2a9f0 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
2aa00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2aa10 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
2aa20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
2aa30 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
2aa40 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b  e(pRc, pBuf, p);
2aa50 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2aa60 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f  Release(p);.}../
2aa70 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72  *.** This is par
2aa80 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2aa90 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2aaa0 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75   aid..**.** Argu
2aab0 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f  ments pBlob/nBlo
2aac0 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76  b contain an "av
2aad0 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20  erages" record. 
2aae0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
2aaf0 2a 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61  * appends a huma
2ab00 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65  n-readable repre
2ab10 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63  sentation of rec
2ab20 6f 72 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ord to the buffe
2ab30 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20  r passed .** as 
2ab40 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2ab50 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
2ab60 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 41  void fts5DecodeA
2ab70 76 65 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a  verages(.  int *
2ab80 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2ab90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2aba0 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2abb0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2abc0 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2abd0 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2abe0 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20  Blob.){.  int i 
2abf0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
2ac00 72 20 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a  r *zSpace = "";.
2ac10 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f  .  while( i<nBlo
2ac20 62 20 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61  b ){.    u64 iVa
2ac30 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  l;.    i += sqli
2ac40 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2ac50 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61  (&pBlob[i], &iVa
2ac60 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2ac70 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2ac80 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2ac90 20 22 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c   "%s%d", zSpace,
2aca0 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20   (int)iVal);.   
2acb0 20 7a 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20   zSpace = " ";. 
2acc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66   }.}../*.** Buff
2acd0 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75  er (a/n) is assu
2ace0 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
2acf0 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69   list of seriali
2ad00 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61  zed varints. Rea
2ad10 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74  d.** each varint
2ad20 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20   and append its 
2ad30 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
2ad40 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20  ation to buffer 
2ad50 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  pBuf. Return.** 
2ad60 61 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65  after either the
2ad70 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
2ad80 20 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20   exhausted or a 
2ad90 30 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e  0 value is read.
2ada0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2adb0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
2adc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2add0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
2ade0 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
2adf0 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
2ae00 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a  odePoslist(int *
2ae10 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2ae20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
2ae30 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *a, int n){.  in
2ae40 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68  t iOff = 0;.  wh
2ae50 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2ae60 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
2ae70 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2ae80 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
2ae90 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  ], iVal);.    sq
2aea0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2aeb0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2aec0 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56   pBuf, " %d", iV
2aed0 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
2aee0 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
2aef0 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75   The start of bu
2af00 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61  ffer (a/n) conta
2af10 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  ins the start of
2af20 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20   a doclist. The 
2af30 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f  doclist.** may o
2af40 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68  r may not finish
2af50 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
2af60 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
2af70 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74  n appends a text
2af80 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
2af90 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  on of the part o
2afa0 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68  f the doclist th
2afb0 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f  at is present to
2afc0 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e   buffer.** pBuf.
2afd0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
2afe0 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2aff0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2b000 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
2b010 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
2b020 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
2b030 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20  codeDoclist(int 
2b040 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
2b050 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
2b060 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
2b070 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20  64 iDocid = 0;. 
2b080 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a   int iOff = 0;..
2b090 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2b0a0 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46   iOff = sqlite3F
2b0b0 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
2b0c0 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a  (u64*)&iDocid);.
2b0d0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2b0e0 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2b0f0 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69  f(pRc, pBuf, " i
2b100 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29  d=%lld", iDocid)
2b110 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69  ;.  }.  while( i
2b120 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74  Off<n ){.    int
2b130 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62   nPos;.    int b
2b140 44 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Del;.    iOff +=
2b150 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
2b160 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e  ize(&a[iOff], &n
2b170 50 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20  Pos, &bDel);.   
2b180 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2b190 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2b1a0 52 63 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73  Rc, pBuf, " nPos
2b1b0 3d 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44  =%d%s", nPos, bD
2b1c0 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20  el?"*":"");.    
2b1d0 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
2b1e0 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70  dePoslist(pRc, p
2b1f0 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d  Buf, &a[iOff], M
2b200 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29  IN(n-iOff, nPos)
2b210 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  );.    if( iOff<
2b220 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
2b230 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66  Delta;.      iOf
2b240 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
2b250 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
2b260 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
2b270 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64  a);.      iDocid
2b280 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
2b290 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2b2a0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2b2b0 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d  pRc, pBuf, " id=
2b2c0 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
2b2d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2b2e0 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
2b2f0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
2b300 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65  ation of user-de
2b310 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
2b320 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64  ction fts5_decod
2b330 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  e()..*/.static v
2b340 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75  oid fts5DecodeFu
2b350 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
2b360 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
2b370 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
2b380 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65  ction call conte
2b390 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  xt */.  int nArg
2b3a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b3b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2b3c0 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79  r of args (alway
2b3d0 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s 2) */.  sqlite
2b3e0 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20  3_value **apVal 
2b3f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e            /* Fun
2b400 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
2b410 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77  */.){.  i64 iRow
2b420 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
2b430 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64          /* Rowid
2b440 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e   for record bein
2b450 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69  g decoded */.  i
2b460 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67 68  nt iSegid,iHeigh
2b470 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f  t,iPgno,bDlidx;/
2b480 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e  * Rowid componen
2b490 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38  ts */.  const u8
2b4a0 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20   *aBlob; int n; 
2b4b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72          /* Recor
2b4c0 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20  d to decode */. 
2b4d0 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74   u8 *a = 0;.  Ft
2b4e0 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20  s5Buffer s;     
2b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b500 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74   Build up text t
2b510 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f  o return here */
2b520 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b530 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2b540 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
2b550 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63  e */.  int nSpac
2b560 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  e = 0;..  assert
2b570 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d  ( nArg==2 );.  m
2b580 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a  emset(&s, 0, siz
2b590 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
2b5a0 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c  ;.  iRowid = sql
2b5b0 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
2b5c0 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f  (apVal[0]);..  /
2b5d0 2a 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  * Make a copy of
2b5e0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2b5f0 6d 65 6e 74 20 28 61 20 62 6c 6f 62 29 20 69 6e  ment (a blob) in
2b600 20 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42   aBlob[]. The aB
2b610 6c 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20  lob[].  ** copy 
2b620 69 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46  is followed by F
2b630 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
2b640 44 44 49 4e 47 20 30 78 30 30 20 62 79 74 65 73  DDING 0x00 bytes
2b650 2c 20 77 68 69 63 68 20 70 72 65 76 65 6e 74 73  , which prevents
2b660 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 76 65  .  ** buffer ove
2b670 72 72 65 61 64 73 20 65 76 65 6e 20 69 66 20 74  rreads even if t
2b680 68 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72  he record is cor
2b690 72 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20  rupt.  */.  n = 
2b6a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
2b6b0 74 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  tes(apVal[1]);. 
2b6c0 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   aBlob = sqlite3
2b6d0 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61  _value_blob(apVa
2b6e0 6c 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20  l[1]);.  nSpace 
2b6f0 3d 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  = n + FTS5_DATA_
2b700 5a 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20  ZERO_PADDING;.  
2b710 61 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33  a = (u8*)sqlite3
2b720 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
2b730 72 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69  rc, nSpace);.  i
2b740 66 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64  f( a==0 ) goto d
2b750 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d  ecode_out;.  mem
2b760 63 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29  cpy(a, aBlob, n)
2b770 3b 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65  ;...  fts5Decode
2b780 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69  Rowid(iRowid, &i
2b790 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
2b7a0 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
2b7b0 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52  );..  fts5DebugR
2b7c0 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52  owid(&rc, &s, iR
2b7d0 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c  owid);.  if( bDl
2b7e0 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44  idx ){.    Fts5D
2b7f0 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46  ata dlidx;.    F
2b800 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b  ts5DlidxLvl lvl;
2b810 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20  ..    dlidx.p = 
2b820 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20  a;.    dlidx.nn 
2b830 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = n;..    memset
2b840 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  (&lvl, 0, sizeof
2b850 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b  (Fts5DlidxLvl));
2b860 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d  .    lvl.pData =
2b870 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c   &dlidx;.    lvl
2b880 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  .iLeafPgno = iPg
2b890 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73  no;..    for(fts
2b8a0 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c  5DlidxLvlNext(&l
2b8b0 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30  vl); lvl.bEof==0
2b8c0 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  ; fts5DlidxLvlNe
2b8d0 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20  xt(&lvl)){.     
2b8e0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2b8f0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26  erAppendPrintf(&
2b900 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20  rc, &s, .       
2b910 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20     " %d(%lld)", 
2b920 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c  lvl.iLeafPgno, l
2b930 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20  vl.iRowid.      
2b940 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2b950 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29   if( iSegid==0 )
2b960 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  {.    if( iRowid
2b970 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  ==FTS5_AVERAGES_
2b980 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66  ROWID ){.      f
2b990 74 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65  ts5DecodeAverage
2b9a0 73 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29  s(&rc, &s, a, n)
2b9b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2b9c0 20 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72     fts5DecodeStr
2b9d0 75 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20  ucture(&rc, &s, 
2b9e0 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  a, n);.    }.  }
2b9f0 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75  else{.    Fts5Bu
2ba00 66 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20  ffer term;      
2ba10 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
2ba20 6e 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f  nt term read fro
2ba30 6d 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e  m page */.    in
2ba40 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
2ba50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2ba60 66 66 73 65 74 20 6f 66 20 70 67 69 64 78 20 69  ffset of pgidx i
2ba70 6e 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74  n a[] */.    int
2ba80 20 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20   iPgidxOff;.    
2ba90 69 6e 74 20 69 50 67 69 64 78 50 72 65 76 20 3d  int iPgidxPrev =
2baa0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
2bab0 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20   Previous value 
2bac0 72 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20  read from pgidx 
2bad0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d  */.    int iTerm
2bae0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Off = 0;.    int
2baf0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a   iRowidOff = 0;.
2bb00 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20      int iOff;.  
2bb10 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a    int nDoclist;.
2bb20 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72  .    memset(&ter
2bb30 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
2bb40 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20  5Buffer));..    
2bb50 69 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20  if( n<4 ){.     
2bb60 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2bb70 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37  erSet(&rc, &s, 7
2bb80 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f  , (const u8*)"co
2bb90 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67  rrupt");.      g
2bba0 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a  oto decode_out;.
2bbb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bbc0 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
2bbd0 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a  5GetU16(&a[0]);.
2bbe0 20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20        iPgidxOff 
2bbf0 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47  = szLeaf = fts5G
2bc00 65 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20  etU16(&a[2]);.  
2bc10 20 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66      if( iPgidxOf
2bc20 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66  f<n ){.        f
2bc30 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
2bc40 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54  a[iPgidxOff], iT
2bc50 65 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  ermOff);.      }
2bc60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
2bc70 65 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74 69  ecode the positi
2bc80 6f 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74 20  on list tail at 
2bc90 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
2bca0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28   page */.    if(
2bcb0 20 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b   iRowidOff!=0 ){
2bcc0 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52  .      iOff = iR
2bcd0 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c  owidOff;.    }el
2bce0 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 21  se if( iTermOff!
2bcf0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66  =0 ){.      iOff
2bd00 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
2bd10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f   }else{.      iO
2bd20 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20  ff = szLeaf;.   
2bd30 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
2bd40 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
2bd50 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
2bd60 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  ;..    /* Decode
2bd70 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73   any more doclis
2bd80 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  t data that appe
2bd90 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ars on the page 
2bda0 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
2bdb0 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f  * first term. */
2bdc0 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20  .    nDoclist = 
2bdd0 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72  (iTermOff ? iTer
2bde0 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d  mOff : szLeaf) -
2bdf0 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44   iOff;.    fts5D
2be00 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
2be10 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
2be20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20  nDoclist);..    
2be30 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66 66  while( iPgidxOff
2be40 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  <n ){.      int 
2be50 62 46 69 72 73 74 20 3d 20 28 69 50 67 69 64 78  bFirst = (iPgidx
2be60 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20  Off==szLeaf);   
2be70 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69    /* True for fi
2be80 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  rst term on page
2be90 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
2bea0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
2beb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bec0 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61  /* Bytes of data
2bed0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45   */.      int iE
2bee0 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  nd;.      .     
2bef0 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74   iPgidxOff += ft
2bf00 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
2bf10 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79  [iPgidxOff], nBy
2bf20 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64  te);.      iPgid
2bf30 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a  xPrev += nByte;.
2bf40 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67        iOff = iPg
2bf50 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20  idxPrev;..      
2bf60 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  if( iPgidxOff<n 
2bf70 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47  ){.        fts5G
2bf80 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2bf90 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
2bfa0 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  ;.        iEnd =
2bfb0 20 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42   iPgidxPrev + nB
2bfc0 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  yte;.      }else
2bfd0 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d  {.        iEnd =
2bfe0 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d   szLeaf;.      }
2bff0 0a 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 72  ..      if( bFir
2c000 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  st==0 ){.       
2c010 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2c020 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
2c030 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2c040 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74     term.n = nByt
2c050 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
2c060 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2c070 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
2c080 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  ], nByte);.     
2c090 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
2c0a0 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
2c0b0 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66  , nByte, &a[iOff
2c0c0 5d 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ]);.      iOff +
2c0d0 3d 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20  = nByte;..      
2c0e0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2c0f0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20  rAppendPrintf(. 
2c100 20 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73           &rc, &s
2c110 2c 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20  , " term=%.*s", 
2c120 74 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63  term.n, (const c
2c130 68 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20  har*)term.p.    
2c140 20 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20    );.      iOff 
2c150 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63  += fts5DecodeDoc
2c160 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
2c170 5b 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66  [iOff], iEnd-iOf
2c180 66 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  f);.    }..    f
2c190 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
2c1a0 65 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65  erm);.  }.  . de
2c1b0 63 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  code_out:.  sqli
2c1c0 74 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69  te3_free(a);.  i
2c1d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2c1e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2c1f0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
2c200 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  , (const char*)s
2c210 2e 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f  .p, s.n, SQLITE_
2c220 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65  TRANSIENT);.  }e
2c230 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2c240 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f  _result_error_co
2c250 64 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20  de(pCtx, rc);.  
2c260 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  }.  fts5BufferFr
2c270 65 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(&s);.}../*.**
2c280 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74   The implementat
2c290 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69  ion of user-defi
2c2a0 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
2c2b0 69 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29  ion fts5_rowid()
2c2c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2c2d0 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
2c2e0 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  on(.  sqlite3_co
2c2f0 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20  ntext *pCtx,    
2c300 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2c310 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a  n call context *
2c320 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20  /.  int nArg,   
2c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c340 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c350 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29   args (always 2)
2c360 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61   */.  sqlite3_va
2c370 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20  lue **apVal     
2c380 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f        /* Functio
2c390 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  n arguments */.)
2c3a0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2c3b0 7a 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67  zArg;.  if( nArg
2c3c0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2c3d0 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
2c3e0 70 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65  pCtx, "should be
2c3f0 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62  : fts5_rowid(sub
2c400 6a 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31  ject, ....)", -1
2c410 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2c420 7a 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68  zArg = (const ch
2c430 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
2c440 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
2c450 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c  ;.    if( 0==sql
2c460 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
2c470 67 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b  g, "segment") ){
2c480 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69  .      i64 iRowi
2c490 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67  d;.      int seg
2c4a0 69 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20  id, pgno;.      
2c4b0 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
2c4c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2c4d0 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78  esult_error(pCtx
2c4e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22  , .            "
2c4f0 73 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f  should be: fts5_
2c500 72 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c  rowid('segment',
2c510 20 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c   segid, pgno))",
2c520 20 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20   -1.        );. 
2c530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c540 20 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69      segid = sqli
2c550 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70  te3_value_int(ap
2c560 56 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Val[1]);.       
2c570 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f   pgno = sqlite3_
2c580 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b  value_int(apVal[
2c590 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  2]);.        iRo
2c5a0 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  wid = FTS5_SEGME
2c5b0 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  NT_ROWID(segid, 
2c5c0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73  pgno);.        s
2c5d0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
2c5e0 74 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64  t64(pCtx, iRowid
2c5f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2c600 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2c610 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
2c620 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20  (pCtx, .        
2c630 22 66 69 72 73 74 20 61 72 67 20 74 6f 20 66 74  "first arg to ft
2c640 73 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20  s5_rowid() must 
2c650 62 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c 20  be 'segment'" , 
2c660 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  -1.      );.    
2c670 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
2c680 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73  his is called as
2c690 20 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65   part of registe
2c6a0 72 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f  ring the FTS5 mo
2c6b0 64 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61  dule with databa
2c6c0 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
2c6d0 20 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72   db. It register
2c6e0 73 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64  s several user-d
2c6f0 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
2c700 6e 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a  nctions useful.*
2c710 2a 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a  * with FTS5..**.
2c720 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
2c730 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
2c740 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
2c750 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d  rror occurs, som
2c760 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74  e other.** SQLit
2c770 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
2c780 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
2c790 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2c7a0 46 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71  Fts5IndexInit(sq
2c7b0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
2c7c0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63  t rc = sqlite3_c
2c7d0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
2c7e0 20 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f        db, "fts5_
2c7f0 64 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49  decode", 2, SQLI
2c800 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35  TE_UTF8, 0, fts5
2c810 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20  DecodeFunction, 
2c820 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
2c830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2c840 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c850 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2c860 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  n(.        db, "
2c870 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c  fts5_rowid", -1,
2c880 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
2c890 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
2c8a0 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  on, 0, 0.    );.
2c8b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2c8c0 0a 7d 0a 0a                                      .}..