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

Artifact b622a0a70f57a96469e6828da2dd70e0872aeb37:


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 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30  iRes;.  return 0
12b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
12b90 74 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20  the seg-iter so 
12ba0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
12bb0 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
12bc0 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50  d on page iLeafP
12bd0 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e  gno..** It is an
12be0 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69   error if leaf i
12bf0 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f  LeafPgno does no
12c00 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
12c10 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a  ins no rowids..*
12c20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
12c30 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
12c40 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
12c50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
12c60 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
12c70 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
12c80 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
12c90 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
12ca0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
12cb0 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
12cc0 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20   iLeafPgno.){.  
12cd0 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e  assert( iLeafPgn
12ce0 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
12cf0 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  no );..  if( iLe
12d00 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53  afPgno>pIter->pS
12d10 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
12d20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
12d30 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73  _CORRUPT;.  }els
12d40 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  e{.    fts5DataR
12d50 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e  elease(pIter->pN
12d60 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  extLeaf);.    pI
12d70 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  ter->pNextLeaf =
12d80 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   0;.    pIter->i
12d90 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
12da0 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35  Pgno-1;.    fts5
12db0 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
12dc0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
12dd0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
12de0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
12df0 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65  ->iLeafPgno==iLe
12e00 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
12e10 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
12e20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
12e30 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20   iOff;.      u8 
12e40 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
12e50 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  f->p;.      int 
12e60 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
12e70 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20  ->szLeaf;..     
12e80 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
12e90 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49  FirstRowidOff(pI
12ea0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
12eb0 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
12ec0 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20   iOff>=n ){.    
12ed0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
12ee0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
12ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
12f00 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
12f10 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
12f20 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
12f30 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
12f40 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
12f50 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
12f60 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
12f70 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
12f80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12f90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  }.}../*.** Advan
12fa0 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
12fb0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
12fc0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e  cond argument un
12fd0 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20  til it is at or 
12fe0 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69  .** past rowid i
12ff0 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73  From. Regardless
13000 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
13010 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72   iFrom, the iter
13020 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79  ator is.** alway
13030 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65  s advanced at le
13040 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61  ast once..*/.sta
13050 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
13060 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
13070 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
13080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13090 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
130a0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
130b0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
130c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
130d0 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
130e0 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74  ce */.  i64 iMat
130f0 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
13100 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
13110 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c  ce iterator at l
13120 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f  east this far */
13130 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d  .){.  int bRev =
13140 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
13150 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
13160 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c  VERSE);.  Fts5Dl
13170 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
13180 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b  = pIter->pDlidx;
13190 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
131a0 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
131b0 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65  gno;.  int bMove
131c0 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
131d0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
131e0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
131f0 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
13200 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20  ( pIter->pDlidx 
13210 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
13220 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20  er->pLeaf );..  
13230 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
13240 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
13250 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
13260 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
13270 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  >fts5DlidxIterRo
13280 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
13290 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d       iLeafPgno =
132a0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
132b0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
132c0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
132d0 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a  ext(p, pDlidx);.
132e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
132f0 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d  _nc( iLeafPgno>=
13300 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
13310 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20   || p->rc );.   
13320 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
13330 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
13340 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
13350 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20  IterGotoPage(p, 
13360 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f  pIter, iLeafPgno
13370 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
13380 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
13390 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
133a0 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  Iter->pNextLeaf=
133b0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
133c0 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e  ( iMatch<pIter->
133d0 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68  iRowid );.    wh
133e0 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49  ile( !fts5DlidxI
133f0 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
13400 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35  ) && iMatch<fts5
13410 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
13420 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20  Dlidx) ){.      
13430 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
13440 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20  v(p, pDlidx);.  
13450 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e    }.    iLeafPgn
13460 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
13470 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
13480 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
13490 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
134a0 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66  pDlidx) || iLeaf
134b0 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno<=pIter->iLe
134c0 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
134d0 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74  f( iLeafPgno<pIt
134e0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b  er->iLeafPgno ){
134f0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
13500 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
13510 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73  gno+1;.      fts
13520 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
13530 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
13540 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
13550 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
13560 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76  do{.    if( bMov
13570 65 20 29 20 66 74 73 35 53 65 67 49 74 65 72 4e  e ) fts5SegIterN
13580 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29  ext(p, pIter, 0)
13590 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d  ;.    if( pIter-
135a0 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61  >pLeaf==0 ) brea
135b0 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d  k;.    if( bRev=
135c0 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
135d0 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72  wid>=iMatch ) br
135e0 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65  eak;.    if( bRe
135f0 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69  v!=0 && pIter->i
13600 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20  Rowid<=iMatch ) 
13610 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65  break;.    bMove
13620 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 1;.  }while( 
13630 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
13640 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72   );.}.../*.** Fr
13650 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ee the iterator 
13660 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
13670 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
13680 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
13690 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
136a0 65 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78  erFree(Fts5Index
136b0 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74   *p, Fts5IndexIt
136c0 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
136d0 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69  ( pIter ){.    i
136e0 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
136f0 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
13700 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
13710 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26  s5SegIterClear(&
13720 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b  pIter->aSeg[i]);
13730 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
13740 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
13750 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b  pIter->pStruct);
13760 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
13770 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ree(&pIter->posl
13780 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
13790 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
137a0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
137b0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  d fts5MultiIterA
137c0 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49  dvanced(.  Fts5I
137d0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
137e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
137f0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
13800 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
13810 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
13820 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
13830 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
13840 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
13850 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
13860 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
13870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13880 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
13890 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
138a0 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  vanced */.  int 
138b0 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20  iMinset         
138c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
138d0 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20  inimum entry in 
138e0 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20  aFirst[] to set 
138f0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
13900 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
13910 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
13920 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70   i>=iMinset && p
13930 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
13940 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74   i=i/2){.    int
13950 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69   iEq;.    if( (i
13960 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
13970 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65  erDoCompare(pIte
13980 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20  r, i)) ){.      
13990 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
139a0 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
139b0 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
139c0 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
139d0 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
139e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74  .}../*.** Sub-it
139f0 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20  erator iChanged 
13a00 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  of iterator pIte
13a10 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  r has just been 
13a20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69  advanced. It sti
13a30 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ll.** points to 
13a40 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68  the same term th
13a50 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69  ough - just a di
13a60 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54  fferent rowid. T
13a70 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
13a80 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61  attempts to upda
13a90 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
13aa0 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46  of the pIter->aF
13ab0 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67  irst[] according
13ac0 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  ly..** If it doe
13ad0 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  s so successfull
13ae0 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  y, 0 is returned
13af0 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a  . Otherwise 1..*
13b00 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  *.** If non-zero
13b10 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
13b20 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
13b30 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74  call fts5MultiIt
13b40 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20  erAdvanced().** 
13b50 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  on the iterator 
13b60 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75  instead. That fu
13b70 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
13b80 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65  same as this one
13b90 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
13ba0 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d   it deals with m
13bb0 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
13bc0 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  cases as well..*
13bd0 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  / .static int ft
13be0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
13bf0 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ceRowid(.  Fts5I
13c00 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
13c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
13c20 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
13c30 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
13c40 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
13c50 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
13c60 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
13c70 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
13c80 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
13c90 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20 20  int iChanged    
13ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cb0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
13cc0 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
13cd0 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 46  vanced */.){.  F
13ce0 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77  ts5SegIter *pNew
13cf0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13d00 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66  iChanged];..  if
13d10 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
13d20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13d30 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d  wid.   || (pNew-
13d40 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69  >iRowid<pIter->i
13d50 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
13d60 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20  ter->bRev.  ){. 
13d70 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74     int i;.    Ft
13d80 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65  s5SegIter *pOthe
13d90 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
13da0 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30  [iChanged ^ 0x00
13db0 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01];.    pIter->
13dc0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
13dd0 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41  Iter->bRev ? SMA
13de0 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41  LLEST_INT64 : LA
13df0 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20  RGEST_INT64;.   
13e00 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
13e10 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
13e20 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20   1; i=i/2){.    
13e30 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
13e40 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
13e50 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20  irst[i];..      
13e60 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
13e70 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eaf );.      ass
13e80 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d  ert( pRes->bTerm
13e90 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d  Eq==0 || pOther-
13ea0 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20  >pLeaf );..     
13eb0 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d   if( pRes->bTerm
13ec0 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Eq ){.        if
13ed0 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
13ee0 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29  pOther->iRowid )
13ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
13f00 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 1;.        }e
13f10 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
13f20 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
13f30 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13f40 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
13f50 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13f60 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
13f70 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
13f80 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20  pNew = pOther;. 
13f90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13fa0 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
13fb0 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  >pIter->iSwitchR
13fc0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13fd0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
13fe0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13ff0 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
14000 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
14010 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
14020 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70 4e  es->iFirst = (pN
14030 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  ew - pIter->aSeg
14040 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  );.      if( i==
14050 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  1 ) break;..    
14060 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65    pOther = &pIte
14070 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
14080 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30  aFirst[i ^ 0x000
14090 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
140a0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
140b0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
140c0 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66   the pIter->bEof
140d0 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64 20   variable based 
140e0 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  on the state of 
140f0 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72  the sub-iterator
14100 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
14110 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53  d fts5MultiIterS
14120 65 74 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49  etEof(Fts5IndexI
14130 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
14140 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
14150 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
14160 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
14170 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49  ].iFirst ];.  pI
14180 74 65 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65 67  ter->bEof = pSeg
14190 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49  ->pLeaf==0;.  pI
141a0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
141b0 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64  d = pSeg->iRowid
141c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
141d0 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
141e0 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
141f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
14200 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
14210 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
14220 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
14230 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  . It is not .** 
14240 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
14250 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
14260 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c  tor reaches EOF,
14270 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72   or if it is alr
14280 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20  eady at .** EOF 
14290 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
142a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
142b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
142c0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a  5MultiIterNext(.
142d0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
142e0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
142f0 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62   *pIter,.  int b
14300 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
14310 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
14320 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  ue if argument i
14330 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f  From is valid */
14340 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20  .  i64 iFrom    
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14360 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74     /* Advance at
14370 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73   least as far as
14380 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66   this */.){.  if
14390 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
143a0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55  OK ){.    int bU
143b0 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
143c0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
143d0 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65  nt iFirst = pIte
143e0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
143f0 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  rst;.      int b
14400 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
14410 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
14420 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
14430 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
14440 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
14450 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
14460 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f       if( bUseFro
14470 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64  m && pSeg->pDlid
14480 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  x ){.        fts
14490 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d  5SegIterNextFrom
144a0 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29  (p, pSeg, iFrom)
144b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
144c0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
144d0 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
144e0 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
144f0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
14500 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
14510 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
14520 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
14530 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
14540 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29  , pIter, iFirst)
14550 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
14560 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
14570 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
14580 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
14590 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
145a0 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29  terSetEof(pIter)
145b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
145c0 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
145d0 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65  terSetup(p, pIte
145e0 72 29 3b 0a 0a 20 20 20 20 20 20 62 55 73 65 46  r);..      bUseF
145f0 72 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  rom = 0;.    }wh
14600 69 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b 69  ile( pIter->bSki
14610 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
14620 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
14630 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a  , pIter) );.  }.
14640 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
14650 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
14660 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  2(.  Fts5Index *
14670 70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49  p, .  Fts5IndexI
14680 74 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e  ter *pIter,.  in
14690 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
146a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
146b0 20 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d   OUT: True if *m
146c0 69 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72  ight* be new ter
146d0 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  m */.){.  assert
146e0 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d  ( pIter->bSkipEm
146f0 70 74 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  pty );.  if( p->
14700 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14710 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
14720 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74  int iFirst = pIt
14730 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
14740 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74 73 35  irst;.      Fts5
14750 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
14760 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
14770 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20  rst];.      int 
14780 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20  bNewTerm = 0;.. 
14790 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
147a0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
147b0 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
147c0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
147d0 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
147e0 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
147f0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
14800 77 69 64 28 70 2c 20 70 49 74 65 72 2c 20 69 46  wid(p, pIter, iF
14810 69 72 73 74 29 0a 20 20 20 20 20 20 29 7b 0a 20  irst).      ){. 
14820 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
14830 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
14840 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31  pIter, iFirst, 1
14850 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  );.        fts5M
14860 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
14870 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 2a  Iter);.        *
14880 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20  pbNewTerm = 1;. 
14890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
148a0 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
148b0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
148c0 20 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74    fts5AssertMult
148d0 69 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49  iIterSetup(p, pI
148e0 74 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c  ter);..    }whil
148f0 65 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  e( fts5MultiIter
14900 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72  IsEmpty(p, pIter
14910 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 73 74 61  ) );.  }.}...sta
14920 74 69 63 20 46 74 73 35 49 6e 64 65 78 49 74 65  tic Fts5IndexIte
14930 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r *fts5MultiIter
14940 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e 64  Alloc(.  Fts5Ind
14950 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
14960 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
14970 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
14980 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
14990 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46 74  int nSeg.){.  Ft
149a0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65  s5IndexIter *pNe
149b0 77 3b 0a 20 20 69 6e 74 20 6e 53 6c 6f 74 3b 20  w;.  int nSlot; 
149c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149d0 20 20 20 20 20 2f 2a 20 50 6f 77 65 72 20 6f 66       /* Power of
149e0 20 74 77 6f 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a   two >= nSeg */.
149f0 0a 20 20 66 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20  .  for(nSlot=2; 
14a00 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f  nSlot<nSeg; nSlo
14a10 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e  t=nSlot*2);.  pN
14a20 65 77 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ew = fts5IdxMall
14a30 6f 63 28 70 2c 20 0a 20 20 20 20 20 20 73 69 7a  oc(p, .      siz
14a40 65 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  eof(Fts5IndexIte
14a50 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20  r) +            
14a60 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a 20 20 20 20   /* pNew */.    
14a70 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67    sizeof(Fts5Seg
14a80 49 74 65 72 29 20 2a 20 28 6e 53 6c 6f 74 2d 31  Iter) * (nSlot-1
14a90 29 20 2b 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61  ) +   /* pNew->a
14aa0 53 65 67 5b 5d 20 2a 2f 0a 20 20 20 20 20 20 73  Seg[] */.      s
14ab0 69 7a 65 6f 66 28 46 74 73 35 43 52 65 73 75 6c  izeof(Fts5CResul
14ac0 74 29 20 2a 20 6e 53 6c 6f 74 20 20 20 20 20 20  t) * nSlot      
14ad0 20 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 46 69 72     /* pNew->aFir
14ae0 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b 0a 20 20 69  st[] */.  );.  i
14af0 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70  f( pNew ){.    p
14b00 4e 65 77 2d 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f  New->nSeg = nSlo
14b10 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 46 69  t;.    pNew->aFi
14b20 72 73 74 20 3d 20 28 46 74 73 35 43 52 65 73 75  rst = (Fts5CResu
14b30 6c 74 2a 29 26 70 4e 65 77 2d 3e 61 53 65 67 5b  lt*)&pNew->aSeg[
14b40 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20 70 4e 65 77  nSlot];.    pNew
14b50 2d 3e 70 49 6e 64 65 78 20 3d 20 70 3b 0a 20 20  ->pIndex = p;.  
14b60 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
14b70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
14b80 74 65 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64  te a new Fts5Ind
14b90 65 78 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a  exIter object..*
14ba0 2a 0a 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a  *.** The new obj
14bb0 65 63 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  ect will be used
14bc0 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
14bd0 75 67 68 20 64 61 74 61 20 69 6e 20 73 74 72 75  ugh data in stru
14be0 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a  cture pStruct..*
14bf0 2a 20 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d  * If iLevel is -
14c00 76 65 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74  ve, then all dat
14c10 61 20 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74  a in all segment
14c20 73 20 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c  s is merged. Or,
14c30 20 69 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73   if iLevel.** is
14c40 20 7a 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72   zero or greater
14c50 2c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  , data from the 
14c60 66 69 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73  first nSegment s
14c70 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
14c80 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65   iLevel.** is me
14c90 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rged..**.** The 
14ca0 69 74 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c  iterator initial
14cb0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
14cc0 20 66 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69   first term/rowi
14cd0 64 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a  d entry in the .
14ce0 2a 2a 20 69 74 65 72 61 74 65 64 20 64 61 74 61  ** iterated data
14cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14d00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
14d10 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  w(.  Fts5Index *
14d20 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14d30 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14d40 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20  kend to iterate 
14d50 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35  within */.  Fts5
14d60 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
14d70 63 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ct,         /* S
14d80 74 72 75 63 74 75 72 65 20 6f 66 20 73 70 65 63  tructure of spec
14d90 69 66 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20  ific index */.  
14da0 69 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 2c 20  int bSkipEmpty, 
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 2f 2a 20 54 72 75 65 20 74 6f 20 69 67 6e 6f 72  /* True to ignor
14dd0 65 20 64 65 6c 65 74 65 2d 6b 65 79 73 20 2a 2f  e delete-keys */
14de0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 2f 2a 20 46 54 53 35 49 4e 44 45 58 5f     /* FTS5INDEX_
14e10 51 55 45 52 59 5f 58 58 58 20 66 6c 61 67 73 20  QUERY_XXX flags 
14e20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
14e30 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
14e40 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
14e50 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c 4c  seek to (or NULL
14e60 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  /0) */.  int iLe
14e70 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  vel,            
14e80 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65           /* Leve
14e90 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d 31  l to iterate (-1
14ea0 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20 69   for all) */.  i
14eb0 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20 20  nt nSegment,    
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ed0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  * Number of segm
14ee0 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28 69  ents to merge (i
14ef0 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20 46  Level>=0) */.  F
14f00 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 2a 70  ts5IndexIter **p
14f10 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 2f  pOut           /
14f20 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
14f30 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  ){.  int nSeg = 
14f40 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
14f50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
14f60 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73 20  f segment-iters 
14f70 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74 20  in use */.  int 
14f80 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  iIter = 0;      
14f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 2a              /* *
14fa0 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20 20  /.  int iSeg;   
14fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fc0 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69      /* Used to i
14fd0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 73  terate through s
14fe0 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73  egments */.  Fts
14ff0 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30  5Buffer buf = {0
15000 2c 30 2c 30 7d 3b 20 20 20 20 20 20 20 2f 2a 20  ,0,0};       /* 
15010 42 75 66 66 65 72 20 75 73 65 64 20 62 79 20 66  Buffer used by f
15020 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
15030 69 74 28 29 20 2a 2f 0a 20 20 46 74 73 35 53 74  it() */.  Fts5St
15040 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
15050 76 6c 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  vl;.  Fts5IndexI
15060 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73  ter *pNew;..  as
15070 73 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20  sert( (pTerm==0 
15080 26 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20  && nTerm==0) || 
15090 69 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f  iLevel<0 );..  /
150a0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
150b0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c   for the new mul
150c0 74 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e  ti-seg-iterator.
150d0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   */.  if( p->rc=
150e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
150f0 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
15100 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15110 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
15120 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
15130 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
15140 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20  truct) );.      
15150 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
15160 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20  nSegment;.      
15170 6e 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73  nSeg += (p->pHas
15180 68 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20  h ? 1 : 0);.    
15190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65  }else{.      nSe
151a0 67 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d  g = MIN(pStruct-
151b0 3e 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e  >aLevel[iLevel].
151c0 6e 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b  nSeg, nSegment);
151d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70  .    }.  }.  *pp
151e0 4f 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73  Out = pNew = fts
151f0 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
15200 70 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20  p, nSeg);.  if( 
15210 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
15220 3b 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d  ;.  pNew->bRev =
15230 20 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54   (0!=(flags & FT
15240 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
15250 53 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53  SC));.  pNew->bS
15260 6b 69 70 45 6d 70 74 79 20 3d 20 62 53 6b 69 70  kipEmpty = bSkip
15270 45 6d 70 74 79 3b 0a 20 20 70 4e 65 77 2d 3e 70  Empty;.  pNew->p
15280 53 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74  Struct = pStruct
15290 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
152a0 65 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a 0a  eRef(pStruct);..
152b0 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
152c0 65 61 63 68 20 6f 66 20 74 68 65 20 63 6f 6d 70  each of the comp
152d0 6f 6e 65 6e 74 20 73 65 67 6d 65 6e 74 20 69 74  onent segment it
152e0 65 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 69 66  erators. */.  if
152f0 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20  ( iLevel<0 ){.  
15300 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
15310 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26 70 53  evel *pEnd = &pS
15320 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 70 53  truct->aLevel[pS
15330 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  truct->nLevel];.
15340 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68      if( p->pHash
15350 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64 64   ){.      /* Add
15360 20 61 20 73 65 67 6d 65 6e 74 20 69 74 65 72 61   a segment itera
15370 74 6f 72 20 66 6f 72 20 74 68 65 20 63 75 72 72  tor for the curr
15380 65 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ent contents of 
15390 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
153a0 2a 2f 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  */.      Fts5Seg
153b0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
153c0 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
153d0 2b 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  +];.      fts5Se
153e0 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c  gIterHashInit(p,
153f0 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
15400 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20  lags, pIter);.  
15410 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 4c 76 6c    }.    for(pLvl
15420 3d 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  =&pStruct->aLeve
15430 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b  l[0]; pLvl<pEnd;
15440 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pLvl++){.      
15450 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e  for(iSeg=pLvl->n
15460 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20  Seg-1; iSeg>=0; 
15470 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20  iSeg--){.       
15480 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
15490 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26 70  gment *pSeg = &p
154a0 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b  Lvl->aSeg[iSeg];
154b0 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 65 67  .        Fts5Seg
154c0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
154d0 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b  New->aSeg[iIter+
154e0 2b 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +];.        if( 
154f0 70 54 65 72 6d 3d 3d 30 20 29 7b 0a 20 20 20 20  pTerm==0 ){.    
15500 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
15510 72 49 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70  rInit(p, pSeg, p
15520 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Iter);.        }
15530 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
15540 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
15550 6e 69 74 28 70 2c 20 26 62 75 66 2c 20 70 54 65  nit(p, &buf, pTe
15560 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
15570 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
15580 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15590 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
155a0 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74  .    pLvl = &pSt
155b0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
155c0 76 65 6c 5d 3b 0a 20 20 20 20 66 6f 72 28 69 53  vel];.    for(iS
155d0 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  eg=nSeg-1; iSeg>
155e0 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
155f0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49 6e     fts5SegIterIn
15600 69 74 28 70 2c 20 26 70 4c 76 6c 2d 3e 61 53 65  it(p, &pLvl->aSe
15610 67 5b 69 53 65 67 5d 2c 20 26 70 4e 65 77 2d 3e  g[iSeg], &pNew->
15620 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d 29 3b 0a  aSeg[iIter++]);.
15630 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
15640 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
15650 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
15660 61 62 6f 76 65 20 77 61 73 20 73 75 63 63 65 73  above was succes
15670 73 66 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f  sful, each compo
15680 6e 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e  nent iterators n
15690 6f 77 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20  ow points .  ** 
156a0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
156b0 72 79 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e  ry in its segmen
156c0 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  t. In this case 
156d0 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a  initialize the .
156e0 20 20 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72    ** aFirst[] ar
156f0 72 61 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65  ray. Or, if an e
15700 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
15710 64 2c 20 66 72 65 65 20 74 68 65 20 69 74 65 72  d, free the iter
15720 61 74 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  ator.  ** object
15730 20 61 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74   and set the out
15740 70 75 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20  put variable to 
15750 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20  NULL.  */.  if( 
15760 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
15770 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65   ){.    for(iIte
15780 72 3d 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20  r=pNew->nSeg-1; 
15790 69 49 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d  iIter>0; iIter--
157a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71  ){.      int iEq
157b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 45 71  ;.      if( (iEq
157c0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
157d0 44 6f 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20  DoCompare(pNew, 
157e0 69 49 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20  iIter)) ){.     
157f0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
15800 78 74 28 70 2c 20 26 70 4e 65 77 2d 3e 61 53 65  xt(p, &pNew->aSe
15810 67 5b 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20  g[iEq], 0);.    
15820 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
15830 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 4e 65  rAdvanced(p, pNe
15840 77 2c 20 69 45 71 2c 20 69 49 74 65 72 29 3b 0a  w, iEq, iIter);.
15850 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15860 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53    fts5MultiIterS
15870 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a 20 20 20  etEof(pNew);.   
15880 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
15890 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 4e 65  IterSetup(p, pNe
158a0 77 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 4e 65  w);..    if( pNe
158b0 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 26 26  w->bSkipEmpty &&
158c0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73   fts5MultiIterIs
158d0 45 6d 70 74 79 28 70 2c 20 70 4e 65 77 29 20 29  Empty(p, pNew) )
158e0 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  {.      fts5Mult
158f0 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 4e 65  iIterNext(p, pNe
15900 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  w, 0, 0);.    }.
15910 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73    }else{.    fts
15920 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
15930 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70  , pNew);.    *pp
15940 4f 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66  Out = 0;.  }.  f
15950 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62  ts5BufferFree(&b
15960 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  uf);.}../*.** Cr
15970 65 61 74 65 20 61 6e 20 46 74 73 35 49 6e 64 65  eate an Fts5Inde
15980 78 49 74 65 72 20 74 68 61 74 20 69 74 65 72 61  xIter that itera
15990 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  tes through the 
159a0 64 6f 63 6c 69 73 74 20 70 72 6f 76 69 64 65 64  doclist provided
159b0 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
159c0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  d argument..*/.s
159d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
159e0 75 6c 74 69 49 74 65 72 4e 65 77 32 28 0a 20 20  ultiIterNew2(.  
159f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
15a20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69  to iterate withi
15a30 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  n */.  Fts5Data 
15a40 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20 20 20  *pData,         
15a50 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c 69 73         /* Doclis
15a60 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
15a70 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20 62 44  ough */.  int bD
15a80 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  esc,            
15a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
15aa0 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69 6e 67  e for descending
15ab0 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a 2f 0a   rowid order */.
15ac0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
15ad0 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20 20  **ppOut         
15ae0 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20    /* New object 
15af0 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65  */.){.  Fts5Inde
15b00 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70  xIter *pNew;.  p
15b10 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  New = fts5MultiI
15b20 74 65 72 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a  terAlloc(p, 2);.
15b30 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
15b40 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15b50 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
15b60 65 67 5b 31 5d 3b 0a 0a 20 20 20 20 70 4e 65 77  eg[1];..    pNew
15b70 2d 3e 62 46 69 6c 74 65 72 65 64 20 3d 20 31 3b  ->bFiltered = 1;
15b80 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
15b90 73 20 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52  s = FTS5_SEGITER
15ba0 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66  _ONETERM;.    if
15bb0 28 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e  ( pData->szLeaf>
15bc0 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  0 ){.      pIter
15bd0 2d 3e 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b  ->pLeaf = pData;
15be0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
15bf0 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
15c00 47 65 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d  GetVarint(pData-
15c10 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  >p, (u64*)&pIter
15c20 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
15c30 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
15c40 63 6c 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e  clist = pData->n
15c50 6e 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  n;.      pNew->a
15c60 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15c70 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62  = 1;.      if( b
15c80 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Desc ){.        
15c90 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a  pNew->bRev = 1;.
15ca0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66          pIter->f
15cb0 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
15cc0 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20  ITER_REVERSE;.  
15cd0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
15ce0 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
15cf0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
15d00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15d10 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
15d20 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
15d30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44        }.      pD
15d40 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ata = 0;.    }el
15d50 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
15d60 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
15d70 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e  .    *ppOut = pN
15d80 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  ew;.  }..  fts5D
15d90 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
15da0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
15db0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
15dc0 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
15dd0 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
15de0 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
15df0 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
15e00 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
15e10 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
15e20 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
15e30 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
15e40 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
15e50 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c  ( p->rc .      |
15e60 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  | (pIter->aSeg[ 
15e70 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
15e80 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d  .iFirst ].pLeaf=
15e90 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66  =0)==pIter->bEof
15ea0 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20   .  );.  return 
15eb0 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
15ec0 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >bEof);.}../*.**
15ed0 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
15ee0 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
15ef0 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
15f00 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
15f10 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
15f20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
15f30 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
15f40 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
15f50 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
15f60 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
15f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
15f80 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
15f90 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  id(Fts5IndexIter
15fa0 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
15fb0 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  rt( pIter->aSeg[
15fc0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15fd0 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
15fe0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
15ff0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
16000 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
16010 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  t ].iRowid;.}../
16020 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
16030 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
16040 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
16050 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
16060 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
16070 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
16080 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
16090 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e  ex *p, .  Fts5In
160a0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
160b0 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b  .  i64 iMatch.){
160c0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
160d0 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
160e0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
160f0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31  Next(p, pIter, 1
16100 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69  , iMatch);.    i
16110 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
16120 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20  Eof(p, pIter) ) 
16130 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69  break;.    iRowi
16140 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
16150 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
16160 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
16170 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e  ev==0 && iRowid>
16180 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
16190 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
161a0 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69  bRev!=0 && iRowi
161b0 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
161c0 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
161d0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
161e0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
161f0 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
16200 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16210 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74   the .** entry t
16220 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
16230 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
16240 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
16250 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75  const u8 *fts5Mu
16260 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35  ltiIterTerm(Fts5
16270 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
16280 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74  , int *pn){.  Ft
16290 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26  s5SegIter *p = &
162a0 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
162b0 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
162c0 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20  irst ];.  *pn = 
162d0 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74  p->term.n;.  ret
162e0 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d  urn p->term.p;.}
162f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16300 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a  s5ChunkIterate(.
16310 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
16320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16330 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63    /* Index objec
16340 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
16350 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20  er *pSeg,       
16360 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73         /* Poslis
16370 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61 74  t of this iterat
16380 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  or */.  void *pC
16390 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
163a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
163b0 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78  xt pointer for x
163c0 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  Chunk callback *
163d0 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e  /.  void (*xChun
163e0 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76  k)(Fts5Index*, v
163f0 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c  oid*, const u8*,
16400 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e   int).){.  int n
16410 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Rem = pSeg->nPos
16420 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
16430 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73 74  mber of bytes st
16440 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20  ill to come */. 
16450 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
16460 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75   = 0;.  u8 *pChu
16470 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  nk = &pSeg->pLea
16480 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
16490 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e  Offset];.  int n
164a0 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
164b0 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73  , pSeg->pLeaf->s
164c0 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e 69 4c  zLeaf - pSeg->iL
164d0 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20 69 6e  eafOffset);.  in
164e0 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 69  t pgno = pSeg->i
164f0 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
16500 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a 0a 20  pgnoSave = 0;.. 
16510 20 69 66 28 20 28 70 53 65 67 2d 3e 66 6c 61 67   if( (pSeg->flag
16520 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
16530 5f 52 45 56 45 52 53 45 29 3d 3d 30 20 29 7b 0a  _REVERSE)==0 ){.
16540 20 20 20 20 70 67 6e 6f 53 61 76 65 20 3d 20 70      pgnoSave = p
16550 67 6e 6f 2b 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  gno+1;.  }..  wh
16560 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 78 43  ile( 1 ){.    xC
16570 68 75 6e 6b 28 70 2c 20 70 43 74 78 2c 20 70 43  hunk(p, pCtx, pC
16580 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20  hunk, nChunk);. 
16590 20 20 20 6e 52 65 6d 20 2d 3d 20 6e 43 68 75 6e     nRem -= nChun
165a0 6b 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  k;.    fts5DataR
165b0 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20  elease(pData);. 
165c0 20 20 20 69 66 28 20 6e 52 65 6d 3c 3d 30 20 29     if( nRem<=0 )
165d0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
165e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
165f0 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20 20 20 70 44  pgno++;.      pD
16600 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65  ata = fts5DataRe
16610 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
16620 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 70  NT_ROWID(pSeg->p
16630 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70 67 6e  Seg->iSegid, pgn
16640 6f 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  o));.      if( p
16650 44 61 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Data==0 ) break;
16660 0a 20 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20  .      pChunk = 
16670 26 70 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20  &pData->p[4];.  
16680 20 20 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e      nChunk = MIN
16690 28 6e 52 65 6d 2c 20 70 44 61 74 61 2d 3e 73 7a  (nRem, pData->sz
166a0 4c 65 61 66 20 2d 20 34 29 3b 0a 20 20 20 20 20  Leaf - 4);.     
166b0 20 69 66 28 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53   if( pgno==pgnoS
166c0 61 76 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ave ){.        a
166d0 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 4e 65  ssert( pSeg->pNe
166e0 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
166f0 20 20 20 20 20 70 53 65 67 2d 3e 70 4e 65 78 74       pSeg->pNext
16700 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20  Leaf = pData;.  
16710 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30 3b        pData = 0;
16720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16730 20 7d 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c   }.}..../*.** Al
16740 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67  locate a new seg
16750 6d 65 6e 74 2d 69 64 20 66 6f 72 20 74 68 65 20  ment-id for the 
16760 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
16770 74 2e 20 54 68 65 20 6e 65 77 20 73 65 67 6d 65  t. The new segme
16780 6e 74 0a 2a 2a 20 69 64 20 6d 75 73 74 20 62 65  nt.** id must be
16790 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 36   between 1 and 6
167a0 35 33 33 35 20 69 6e 63 6c 75 73 69 76 65 2c 20  5335 inclusive, 
167b0 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  and must not be 
167c0 75 73 65 64 20 62 79 20 0a 2a 2a 20 61 6e 79 20  used by .** any 
167d0 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74 69  currently existi
167e0 6e 67 20 73 65 67 6d 65 6e 74 2e 20 49 66 20 61  ng segment. If a
167f0 20 66 72 65 65 20 73 65 67 6d 65 6e 74 20 69 64   free segment id
16800 20 63 61 6e 6e 6f 74 20 62 65 20 66 6f 75 6e 64   cannot be found
16810 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c  ,.** SQLITE_FULL
16820 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
16830 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
16840 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75  has already occu
16850 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
16860 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ion is a no-op. 
16870 30 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  0 is .** returne
16880 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
16890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
168a0 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28  s5AllocateSegid(
168b0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
168c0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
168d0 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 69 53 65  ruct){.  int iSe
168e0 67 69 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  gid = 0;..  if( 
168f0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
16900 20 29 7b 0a 20 20 20 20 69 66 28 20 70 53 74 72   ){.    if( pStr
16910 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3e 3d 46  uct->nSegment>=F
16920 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
16930 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
16940 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
16950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77    }else{.      w
16960 68 69 6c 65 28 20 69 53 65 67 69 64 3d 3d 30 20  hile( iSegid==0 
16970 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  ){.        int i
16980 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20  Lvl, iSeg;.     
16990 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
169a0 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 75 33 32  mness(sizeof(u32
169b0 29 2c 20 28 76 6f 69 64 2a 29 26 69 53 65 67 69  ), (void*)&iSegi
169c0 64 29 3b 0a 20 20 20 20 20 20 20 20 69 53 65 67  d);.        iSeg
169d0 69 64 20 3d 20 69 53 65 67 69 64 20 26 20 28 28  id = iSegid & ((
169e0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
169f0 44 5f 42 29 2d 31 29 3b 0a 20 20 20 20 20 20 20  D_B)-1);.       
16a00 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
16a10 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
16a20 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
16a30 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
16a40 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e  ; iSeg<pStruct->
16a50 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
16a60 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20  g; iSeg++){.    
16a70 20 20 20 20 20 20 20 20 69 66 28 20 69 53 65 67          if( iSeg
16a80 69 64 3d 3d 70 53 74 72 75 63 74 2d 3e 61 4c 65  id==pStruct->aLe
16a90 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
16aa0 53 65 67 5d 2e 69 53 65 67 69 64 20 29 7b 0a 20  Seg].iSegid ){. 
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 53 65               iSe
16ac0 67 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gid = 0;.       
16ad0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
16ae0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
16af0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
16b00 20 20 72 65 74 75 72 6e 20 69 53 65 67 69 64 3b    return iSegid;
16b10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
16b20 64 20 61 6c 6c 20 64 61 74 61 20 63 75 72 72 65  d all data curre
16b30 6e 74 6c 79 20 63 61 63 68 65 64 20 69 6e 20 74  ntly cached in t
16b40 68 65 20 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a  he hash-tables..
16b50 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
16b60 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
16b70 61 74 61 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ata(Fts5Index *p
16b80 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
16b90 70 48 61 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e  pHash || p->nPen
16ba0 64 69 6e 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20  dingData==0 );. 
16bb0 20 69 66 28 20 70 2d 3e 70 48 61 73 68 20 29 7b   if( p->pHash ){
16bc0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
16bd0 48 61 73 68 43 6c 65 61 72 28 70 2d 3e 70 48 61  HashClear(p->pHa
16be0 73 68 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e  sh);.    p->nPen
16bf0 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20  dingData = 0;.  
16c00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
16c10 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
16c20 65 20 70 72 65 66 69 78 2c 20 69 6e 20 62 79 74  e prefix, in byt
16c30 65 73 2c 20 74 68 61 74 20 62 75 66 66 65 72 20  es, that buffer 
16c40 28 6e 4e 65 77 2f 70 4e 65 77 29 20 73 68 61 72  (nNew/pNew) shar
16c50 65 73 0a 2a 2a 20 77 69 74 68 20 62 75 66 66 65  es.** with buffe
16c60 72 20 28 6e 4f 6c 64 2f 70 4f 6c 64 29 2e 0a 2a  r (nOld/pOld)..*
16c70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
16c80 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28  5PrefixCompress(
16c90 0a 20 20 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e  .  int nOld, con
16ca0 73 74 20 75 38 20 2a 70 4f 6c 64 2c 0a 20 20 69  st u8 *pOld,.  i
16cb0 6e 74 20 6e 4e 65 77 2c 20 63 6f 6e 73 74 20 75  nt nNew, const u
16cc0 38 20 2a 70 4e 65 77 0a 29 7b 0a 20 20 69 6e 74  8 *pNew.){.  int
16cd0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 66 74   i;.  assert( ft
16ce0 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4f  s5BlobCompare(pO
16cf0 6c 64 2c 20 6e 4f 6c 64 2c 20 70 4e 65 77 2c 20  ld, nOld, pNew, 
16d00 6e 4e 65 77 29 3c 30 20 29 3b 0a 20 20 66 6f 72  nNew)<0 );.  for
16d10 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b  (i=0; i<nOld; i+
16d20 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  +){.    if( pOld
16d30 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20 62  [i]!=pNew[i] ) b
16d40 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
16d50 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  rn i;.}..static 
16d60 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c  void fts5WriteDl
16d70 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73 35  idxClear(.  Fts5
16d80 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
16d90 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
16da0 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75 73  ter,.  int bFlus
16db0 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h               
16dc0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
16dd0 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20 74  e, write dlidx t
16de0 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20 69  o disk */.){.  i
16df0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
16e00 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70 57  bFlush==0 || (pW
16e10 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20  riter->nDlidx>0 
16e20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  && pWriter->aDli
16e30 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20 29  dx[0].buf.n>0) )
16e40 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16e50 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20  Writer->nDlidx; 
16e60 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 6c  i++){.    Fts5Dl
16e70 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64  idxWriter *pDlid
16e80 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44  x = &pWriter->aD
16e90 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66 28  lidx[i];.    if(
16ea0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d   pDlidx->buf.n==
16eb0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69  0 ) break;.    i
16ec0 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20 20  f( bFlush ){.   
16ed0 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64     assert( pDlid
16ee0 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  x->pgno!=0 );.  
16ef0 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
16f00 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(p, .          
16f10 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
16f20 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64  (pWriter->iSegid
16f30 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  , i, pDlidx->pgn
16f40 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  o),.          pD
16f50 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c  lidx->buf.p, pDl
16f60 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20  idx->buf.n.     
16f70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
16f80 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 5a  lite3Fts5BufferZ
16f90 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  ero(&pDlidx->buf
16fa0 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  );.    pDlidx->b
16fb0 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20  PrevValid = 0;. 
16fc0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f 77   }.}../*.** Grow
16fd0 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61 44   the pWriter->aD
16fe0 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f 20  lidx[] array to 
16ff0 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65 6c  at least nLvl el
17000 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e 0a  ements in size..
17010 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61 79  ** Any new array
17020 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a 65   elements are ze
17030 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  roed before retu
17040 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
17050 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 44 6c   int fts5WriteDl
17060 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35 49  idxGrow(.  Fts5I
17070 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
17080 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
17090 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29 7b  r,.  int nLvl.){
170a0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
170b0 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c 3e  LITE_OK && nLvl>
170c0 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  =pWriter->nDlidx
170d0 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64   ){.    Fts5Dlid
170e0 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78 20  xWriter *aDlidx 
170f0 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72 69 74  = (Fts5DlidxWrit
17100 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  er*)sqlite3_real
17110 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 57 72  loc(.        pWr
17120 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69  iter->aDlidx, si
17130 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72  zeof(Fts5DlidxWr
17140 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20  iter) * nLvl.   
17150 20 29 3b 0a 20 20 20 20 69 66 28 20 61 44 6c 69   );.    if( aDli
17160 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  dx==0 ){.      p
17170 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
17180 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
17190 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
171a0 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  = sizeof(Fts5Dli
171b0 64 78 57 72 69 74 65 72 29 20 2a 20 28 6e 4c 76  dxWriter) * (nLv
171c0 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c  l - pWriter->nDl
171d0 69 64 78 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  idx);.      mems
171e0 65 74 28 26 61 44 6c 69 64 78 5b 70 57 72 69 74  et(&aDlidx[pWrit
171f0 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20  er->nDlidx], 0, 
17200 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 70 57  nByte);.      pW
17210 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20  riter->aDlidx = 
17220 61 44 6c 69 64 78 3b 0a 20 20 20 20 20 20 70 57  aDlidx;.      pW
17230 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20  riter->nDlidx = 
17240 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nLvl;.    }.  }.
17250 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a    return p->rc;.
17260 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
17270 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d  current doclist-
17280 69 6e 64 65 78 20 61 63 63 75 6d 75 6c 61 74 69  index accumulati
17290 6e 67 20 69 6e 20 70 57 72 69 74 65 72 2d 3e 61  ng in pWriter->a
172a0 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61 72 67 65  Dlidx[] is large
172b0 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73  .** enough, flus
172c0 68 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e 64  h it to disk and
172d0 20 72 65 74 75 72 6e 20 31 2e 20 4f 74 68 65 72   return 1. Other
172e0 77 69 73 65 20 64 69 73 63 61 72 64 20 69 74 20  wise discard it 
172f0 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65  and return.** ze
17300 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
17310 74 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68  t fts5WriteFlush
17320 44 6c 69 64 78 28 46 74 73 35 49 6e 64 65 78 20  Dlidx(Fts5Index 
17330 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
17340 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69  r *pWriter){.  i
17350 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20  nt bFlag = 0;.. 
17360 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   /* If there wer
17370 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58  e FTS5_MIN_DLIDX
17380 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d  _SIZE or more em
17390 70 74 79 20 6c 65 61 66 20 70 61 67 65 73 20 77  pty leaf pages w
173a0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
173b0 68 65 20 64 61 74 61 62 61 73 65 2c 20 61 6c 73  he database, als
173c0 6f 20 77 72 69 74 65 20 74 68 65 20 64 6f 63 6c  o write the docl
173d0 69 73 74 2d 69 6e 64 65 78 20 74 6f 20 64 69 73  ist-index to dis
173e0 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57 72  k.  */.  if( pWr
173f0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
17400 62 75 66 2e 6e 3e 30 20 26 26 20 70 57 72 69 74  buf.n>0 && pWrit
17410 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35  er->nEmpty>=FTS5
17420 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20  _MIN_DLIDX_SIZE 
17430 29 7b 0a 20 20 20 20 62 46 6c 61 67 20 3d 20 31  ){.    bFlag = 1
17440 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57 72 69 74  ;.  }.  fts5Writ
17450 65 44 6c 69 64 78 43 6c 65 61 72 28 70 2c 20 70  eDlidxClear(p, p
17460 57 72 69 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a  Writer, bFlag);.
17470 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74    pWriter->nEmpt
17480 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  y = 0;.  return 
17490 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bFlag;.}../*.** 
174a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
174b0 20 63 61 6c 6c 65 64 20 77 68 65 6e 65 76 65 72   called whenever
174c0 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 74   processing of t
174d0 68 65 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  he doclist for t
174e0 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d  he .** last term
174f0 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 20 28 70   on leaf page (p
17500 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 29  Writer->iBtPage)
17510 20 69 73 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a   is completed. .
17520 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73  **.** The doclis
17530 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 61 74  t-index for that
17540 20 74 65 72 6d 20 69 73 20 63 75 72 72 65 6e 74   term is current
17550 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d  ly stored in-mem
17560 6f 72 79 20 77 69 74 68 69 6e 20 74 68 65 0a 2a  ory within the.*
17570 2a 20 46 74 73 35 53 65 67 57 72 69 74 65 72 2e  * Fts5SegWriter.
17580 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 2e 20  aDlidx[] array. 
17590 49 66 20 69 74 20 69 73 20 6c 61 72 67 65 20 65  If it is large e
175a0 6e 6f 75 67 68 2c 20 74 68 69 73 20 66 75 6e 63  nough, this func
175b0 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69  tion.** writes i
175c0 74 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f  t out to disk. O
175d0 72 2c 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  r, if it is too 
175e0 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20  small to bother 
175f0 77 69 74 68 2c 20 64 69 73 63 61 72 64 73 0a 2a  with, discards.*
17600 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35  * it..**.** Fts5
17610 53 65 67 57 72 69 74 65 72 2e 62 74 74 65 72 6d  SegWriter.btterm
17620 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
17630 69 6e 73 20 74 68 65 20 66 69 72 73 74 20 74 65  ins the first te
17640 72 6d 20 6f 6e 20 70 61 67 65 20 69 42 74 50 61  rm on page iBtPa
17650 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
17660 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
17670 68 42 74 72 65 65 28 46 74 73 35 49 6e 64 65 78  hBtree(Fts5Index
17680 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74   *p, Fts5SegWrit
17690 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20  er *pWriter){.  
176a0 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73  int bFlag;..  as
176b0 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 69  sert( pWriter->i
176c0 42 74 50 61 67 65 20 7c 7c 20 70 57 72 69 74 65  BtPage || pWrite
176d0 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a  r->nEmpty==0 );.
176e0 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 69    if( pWriter->i
176f0 42 74 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75  BtPage==0 ) retu
17700 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d 20 66 74  rn;.  bFlag = ft
17710 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64  s5WriteFlushDlid
17720 78 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a  x(p, pWriter);..
17730 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
17740 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
17750 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 70  nst char *z = (p
17760 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e  Writer->btterm.n
17770 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  >0?(const char*)
17780 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e  pWriter->btterm.
17790 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68  p:"");.    /* Th
177a0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20  e following was 
177b0 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 69 6e 20  already done in 
177c0 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 29 3a  fts5WriteInit():
177d0 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74   */.    /* sqlit
177e0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
177f0 49 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57  IdxWriter, 1, pW
17800 72 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 20  riter->iSegid); 
17810 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  */.    sqlite3_b
17820 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78  ind_blob(p->pIdx
17830 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57  Writer, 2, z, pW
17840 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c  riter->btterm.n,
17850 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
17860 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  .    sqlite3_bin
17870 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49 64 78 57  d_int64(p->pIdxW
17880 72 69 74 65 72 2c 20 33 2c 20 62 46 6c 61 67 20  riter, 3, bFlag 
17890 2b 20 28 28 69 36 34 29 70 57 72 69 74 65 72 2d  + ((i64)pWriter-
178a0 3e 69 42 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20  >iBtPage<<1));. 
178b0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
178c0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a  p->pIdxWriter);.
178d0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
178e0 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64  te3_reset(p->pId
178f0 78 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20  xWriter);.  }.  
17900 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
17910 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   = 0;.}../*.** T
17920 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  his is called on
17930 63 65 20 66 6f 72 20 65 61 63 68 20 6c 65 61 66  ce for each leaf
17940 20 70 61 67 65 20 65 78 63 65 70 74 20 74 68 65   page except the
17950 20 66 69 72 73 74 20 74 68 61 74 20 63 6f 6e 74   first that cont
17960 61 69 6e 73 0a 2a 2a 20 61 74 20 6c 65 61 73 74  ains.** at least
17970 20 6f 6e 65 20 74 65 72 6d 2e 20 41 72 67 75 6d   one term. Argum
17980 65 6e 74 20 28 6e 54 65 72 6d 2f 70 54 65 72 6d  ent (nTerm/pTerm
17990 29 20 69 73 20 74 68 65 20 73 70 6c 69 74 2d 6b  ) is the split-k
179a0 65 79 20 2d 20 61 20 74 65 72 6d 20 74 68 61 74  ey - a term that
179b0 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
179c0 61 6e 20 61 6c 6c 20 74 65 72 6d 73 20 77 72 69  an all terms wri
179d0 74 74 65 6e 20 74 6f 20 65 61 72 6c 69 65 72 20  tten to earlier 
179e0 6c 65 61 76 65 73 2c 20 61 6e 64 20 65 71 75 61  leaves, and equa
179f0 6c 20 74 6f 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c  l to or.** small
17a00 65 72 20 74 68 61 6e 20 74 68 65 20 66 69 72 73  er than the firs
17a10 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 6e 65  t term on the ne
17a20 77 20 6c 65 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66  w leaf..**.** If
17a30 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
17a40 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
17a50 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49  is left in Fts5I
17a60 6e 64 65 78 2e 72 63 2e 20 49 66 20 61 6e 20 65  ndex.rc. If an e
17a70 72 72 6f 72 0a 2a 2a 20 68 61 73 20 61 6c 72 65  rror.** has alre
17a80 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
17a90 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
17aa0 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
17ab0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
17ac0 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
17ad0 74 65 42 74 72 65 65 54 65 72 6d 28 0a 20 20 46  teBtreeTerm(.  F
17ae0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17b00 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
17b10 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
17b20 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
17b30 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r,         /* Wr
17b40 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  iter object */. 
17b50 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73   int nTerm, cons
17b60 74 20 75 38 20 2a 70 54 65 72 6d 20 20 20 20 20  t u8 *pTerm     
17b70 20 2f 2a 20 46 69 72 73 74 20 74 65 72 6d 20 6f   /* First term o
17b80 6e 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 29 7b  n new page */.){
17b90 0a 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  .  fts5WriteFlus
17ba0 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74 65  hBtree(p, pWrite
17bb0 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  r);.  fts5Buffer
17bc0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  Set(&p->rc, &pWr
17bd0 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20 6e 54  iter->btterm, nT
17be0 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70  erm, pTerm);.  p
17bf0 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
17c00 3d 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65  = pWriter->write
17c10 72 2e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  r.pgno;.}../*.**
17c20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
17c30 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c  s called when fl
17c40 75 73 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61  ushing a leaf pa
17c50 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
17c60 20 6e 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20   no.** terms at 
17c70 61 6c 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a  all to disk..*/.
17c80 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
17c90 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
17ca0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
17cb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17cc0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
17cd0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
17ce0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
17cf0 57 72 69 74 65 72 20 20 20 20 20 20 20 20 20 20  Writer          
17d00 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74  /* Writer object
17d10 20 2a 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74   */.){.  /* If t
17d20 68 65 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77  here were no row
17d30 69 64 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20  ids on the leaf 
17d40 70 61 67 65 20 65 69 74 68 65 72 20 61 6e 64 20  page either and 
17d50 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  the doclist-inde
17d60 78 0a 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61  x.  ** has alrea
17d70 64 79 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c  dy been started,
17d80 20 61 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20   append an 0x00 
17d90 62 79 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a  byte to it.  */.
17da0 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
17db0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
17dc0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
17dd0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29  idx[0].buf.n>0 )
17de0 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57  {.    Fts5DlidxW
17df0 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  riter *pDlidx = 
17e00 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
17e10 5b 30 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [0];.    assert(
17e20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
17e30 6c 69 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  lid );.    sqlit
17e40 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
17e50 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
17e60 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30   &pDlidx->buf, 0
17e70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
17e80 72 65 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62  rement the "numb
17e90 65 72 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c  er of sequential
17ea0 20 6c 65 61 76 65 73 20 77 69 74 68 6f 75 74 20   leaves without 
17eb0 61 20 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e  a term" counter.
17ec0 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e   */.  pWriter->n
17ed0 45 6d 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74  Empty++;.}..stat
17ee0 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64 78  ic i64 fts5Dlidx
17ef0 45 78 74 72 61 63 74 46 69 72 73 74 52 6f 77 69  ExtractFirstRowi
17f00 64 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  d(Fts5Buffer *pB
17f10 75 66 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  uf){.  i64 iRowi
17f20 64 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a  d;.  int iOff;..
17f30 20 20 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73    iOff = 1 + fts
17f40 35 47 65 74 56 61 72 69 6e 74 28 26 70 42 75 66  5GetVarint(&pBuf
17f50 2d 3e 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69  ->p[1], (u64*)&i
17f60 52 6f 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65  Rowid);.  fts5Ge
17f70 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
17f80 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
17f90 52 6f 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e  Rowid);.  return
17fa0 20 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a   iRowid;.}../*.*
17fb0 2a 20 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68  * Rowid iRowid h
17fc0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70  as just been app
17fd0 65 6e 64 65 64 20 74 6f 20 74 68 65 20 63 75 72  ended to the cur
17fe0 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20  rent leaf page. 
17ff0 49 74 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72  It is the.** fir
18000 73 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20  st on the page. 
18010 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
18020 70 65 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72  pends an appropr
18030 69 61 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68  iate entry to th
18040 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63  e current.** doc
18050 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73  list-index..*/.s
18060 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
18070 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
18080 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
18090 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
180a0 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69  r *pWriter, .  i
180b0 36 34 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69  64 iRowid.){.  i
180c0 6e 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e  nt i;.  int bDon
180d0 65 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d  e = 0;..  for(i=
180e0 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
180f0 5f 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b  _OK && bDone==0;
18100 20 69 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69   i++){.    i64 i
18110 56 61 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  Val;.    Fts5Dli
18120 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78  dxWriter *pDlidx
18130 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
18140 69 64 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28  idx[i];..    if(
18150 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d   pDlidx->buf.n>=
18160 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
18170 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
18180 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74   current doclist
18190 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 66  -index page is f
181a0 75 6c 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f  ull. Write it to
181b0 20 64 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20   disk and push. 
181c0 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f       ** a copy o
181d0 66 20 69 52 6f 77 69 64 20 28 77 68 69 63 68 20  f iRowid (which 
181e0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
181f0 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74  first rowid on t
18200 68 65 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a  he next.      **
18210 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c   doclist-index l
18220 65 61 66 20 70 61 67 65 29 20 75 70 20 69 6e 74  eaf page) up int
18230 6f 20 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c  o the next level
18240 20 6f 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a   of the b-tree .
18250 20 20 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63        ** hierarc
18260 68 79 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20  hy. If the node 
18270 62 65 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73  being flushed is
18280 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72   currently the r
18290 6f 6f 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20  oot node,.      
182a0 2a 2a 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73  ** also push its
182b0 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 77   first rowid upw
182c0 61 72 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70  ards. */.      p
182d0 44 6c 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20  Dlidx->buf.p[0] 
182e0 3d 20 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f  = 0x01;    /* No
182f0 74 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20  t the root node 
18300 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 44 61 74  */.      fts5Dat
18310 61 57 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20  aWrite(p, .     
18320 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
18330 52 4f 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69  ROWID(pWriter->i
18340 53 65 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78  Segid, i, pDlidx
18350 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20  ->pgno),.       
18360 20 20 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70     pDlidx->buf.p
18370 2c 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a  , pDlidx->buf.n.
18380 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66        );.      f
18390 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f  ts5WriteDlidxGro
183a0 77 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b  w(p, pWriter, i+
183b0 32 29 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78  2);.      pDlidx
183c0 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c   = &pWriter->aDl
183d0 69 64 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  idx[i];.      if
183e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
183f0 4f 4b 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e  OK && pDlidx[1].
18400 62 75 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  buf.n==0 ){.    
18410 20 20 20 20 69 36 34 20 69 46 69 72 73 74 20 3d      i64 iFirst =
18420 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63   fts5DlidxExtrac
18430 74 46 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c  tFirstRowid(&pDl
18440 69 64 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20  idx->buf);..    
18450 20 20 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20      /* This was 
18460 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50  the root node. P
18470 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72 6f  ush its first ro
18480 77 69 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  wid up to the ne
18490 77 20 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  w root. */.     
184a0 20 20 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e     pDlidx[1].pgn
184b0 6f 20 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  o = pDlidx->pgno
184c0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
184d0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
184e0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
184f0 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
18500 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
18510 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
18520 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
18530 2c 20 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66  , &pDlidx[1].buf
18540 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b  , pDlidx->pgno);
18550 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18560 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
18570 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
18580 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69  pDlidx[1].buf, i
18590 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
185a0 70 44 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56  pDlidx[1].bPrevV
185b0 61 6c 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  alid = 1;.      
185c0 20 20 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65    pDlidx[1].iPre
185d0 76 20 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20  v = iFirst;.    
185e0 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
185f0 65 33 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f  e3Fts5BufferZero
18600 28 26 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a  (&pDlidx->buf);.
18610 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50        pDlidx->bP
18620 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  revValid = 0;.  
18630 20 20 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f      pDlidx->pgno
18640 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
18650 20 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a       bDone = 1;.
18660 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
18670 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
18680 64 20 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20  d ){.      iVal 
18690 3d 20 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64  = iRowid - pDlid
186a0 78 2d 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65  x->iPrev;.    }e
186b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69  lse{.      i64 i
186c0 50 67 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70  Pgno = (i==0 ? p
186d0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
186e0 67 6e 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d  gno : pDlidx[-1]
186f0 2e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73  .pgno);.      as
18700 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75  sert( pDlidx->bu
18710 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  f.n==0 );.      
18720 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
18730 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
18740 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62  ->rc, &pDlidx->b
18750 75 66 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20  uf, !bDone);.   
18760 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18770 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18780 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
18790 2d 3e 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20  ->buf, iPgno);. 
187a0 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77       iVal = iRow
187b0 69 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  id;.    }..    s
187c0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
187d0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
187e0 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75  >rc, &pDlidx->bu
187f0 66 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44  f, iVal);.    pD
18800 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
18810 20 3d 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78   = 1;.    pDlidx
18820 2d 3e 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64  ->iPrev = iRowid
18830 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
18840 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 6c  void fts5WriteFl
18850 75 73 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65  ushLeaf(Fts5Inde
18860 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69  x *p, Fts5SegWri
18870 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20  ter *pWriter){. 
18880 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
18890 20 7a 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30   zero[] = { 0x00
188a0 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
188b0 30 30 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65  00 };.  Fts5Page
188c0 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
188d0 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
188e0 3b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a  ;.  i64 iRowid;.
188f0 0a 20 20 61 73 73 65 72 74 28 20 28 70 50 61 67  .  assert( (pPag
18900 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d  e->pgidx.n==0)==
18910 28 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74  (pWriter->bFirst
18920 54 65 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a  TermInPage) );..
18930 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c    /* Set the szL
18940 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64  eaf header field
18950 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  . */.  assert( 0
18960 3d 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 50  ==fts5GetU16(&pP
18970 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29  age->buf.p[2]) )
18980 3b 0a 20 20 66 74 73 35 50 75 74 55 31 36 28 26  ;.  fts5PutU16(&
18990 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c  pPage->buf.p[2],
189a0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
189b0 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e  .  if( pWriter->
189c0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
189d0 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65   ){.    /* No te
189e0 72 6d 20 77 61 73 20 77 72 69 74 74 65 6e 20 74  rm was written t
189f0 6f 20 74 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a  o this page. */.
18a00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18a10 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b  e->pgidx.n==0 );
18a20 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74  .    fts5WriteBt
18a30 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72  reeNoTerm(p, pWr
18a40 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iter);.  }else{.
18a50 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
18a60 65 20 70 67 69 64 78 20 74 6f 20 74 68 65 20 70  e pgidx to the p
18a70 61 67 65 20 62 75 66 66 65 72 2e 20 53 65 74 20  age buffer. Set 
18a80 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64 65  the szLeaf heade
18a90 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20  r field. */.    
18aa0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
18ab0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
18ac0 61 67 65 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d  age->buf, pPage-
18ad0 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d  >pgidx.n, pPage-
18ae0 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a  >pgidx.p);.  }..
18af0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
18b00 61 67 65 20 6f 75 74 20 74 6f 20 64 69 73 6b 20  age out to disk 
18b10 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d 20 46 54  */.  iRowid = FT
18b20 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
18b30 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64  (pWriter->iSegid
18b40 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
18b50 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
18b60 70 2c 20 69 52 6f 77 69 64 2c 20 70 50 61 67 65  p, iRowid, pPage
18b70 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e  ->buf.p, pPage->
18b80 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e  buf.n);..  /* In
18b90 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 78  itialize the nex
18ba0 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  t page. */.  fts
18bb0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61  5BufferZero(&pPa
18bc0 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35  ge->buf);.  fts5
18bd0 42 75 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67  BufferZero(&pPag
18be0 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73  e->pgidx);.  fts
18bf0 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
18c00 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
18c10 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b  ->buf, 4, zero);
18c20 0a 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50  .  pPage->iPrevP
18c30 67 69 64 78 20 3d 20 30 3b 0a 20 20 70 50 61 67  gidx = 0;.  pPag
18c40 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a  e->pgno++;..  /*
18c50 20 49 6e 63 72 65 61 73 65 20 74 68 65 20 6c 65   Increase the le
18c60 61 76 65 73 20 77 72 69 74 74 65 6e 20 63 6f 75  aves written cou
18c70 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72 69 74 65  nter */.  pWrite
18c80 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b  r->nLeafWritten+
18c90 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77  +;..  /* The new
18ca0 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74   leaf holds no t
18cb0 65 72 6d 73 20 6f 72 20 72 6f 77 69 64 73 20 2a  erms or rowids *
18cc0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  /.  pWriter->bFi
18cd0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
18ce0 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
18cf0 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
18d00 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70  = 1;.}../*.** Ap
18d10 70 65 6e 64 20 74 65 72 6d 20 70 54 65 72 6d 2f  pend term pTerm/
18d20 6e 54 65 72 6d 20 74 6f 20 74 68 65 20 73 65 67  nTerm to the seg
18d30 6d 65 6e 74 20 62 65 69 6e 67 20 77 72 69 74 74  ment being writt
18d40 65 6e 20 62 79 20 74 68 65 20 77 72 69 74 65 72  en by the writer
18d50 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
18d60 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
18d70 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  t..**.** If an e
18d80 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
18d90 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
18da0 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
18db0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
18dc0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
18dd0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
18de0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
18df0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18e00 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
18e10 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
18e20 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  , .  Fts5SegWrit
18e30 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69  er *pWriter,.  i
18e40 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20  nt nTerm, const 
18e50 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20  u8 *pTerm .){.  
18e60 69 6e 74 20 6e 50 72 65 66 69 78 3b 20 20 20 20  int nPrefix;    
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 2f 2a 20 42 79 74 65 73 20 6f 66 20 70 72 65 66  /* Bytes of pref
18e90 69 78 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66  ix compression f
18ea0 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73  or term */.  Fts
18eb0 35 50 61 67 65 57 72 69 74 65 72 20 2a 70 50 61  5PageWriter *pPa
18ec0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
18ed0 72 69 74 65 72 3b 0a 20 20 46 74 73 35 42 75 66  riter;.  Fts5Buf
18ee0 66 65 72 20 2a 70 50 67 69 64 78 20 3d 20 26 70  fer *pPgidx = &p
18ef0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
18f00 67 69 64 78 3b 0a 0a 20 20 61 73 73 65 72 74 28  gidx;..  assert(
18f10 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
18f20 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
18f30 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 3d 34 20 29  Page->buf.n>=4 )
18f40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
18f50 65 2d 3e 62 75 66 2e 6e 3e 34 20 7c 7c 20 70 57  e->buf.n>4 || pW
18f60 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
18f70 6d 49 6e 50 61 67 65 20 29 3b 0a 0a 20 20 2f 2a  mInPage );..  /*
18f80 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
18f90 6c 65 61 66 20 70 61 67 65 20 69 73 20 66 75 6c  leaf page is ful
18fa0 6c 2c 20 66 6c 75 73 68 20 69 74 20 74 6f 20 64  l, flush it to d
18fb0 69 73 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 28 70  isk. */.  if( (p
18fc0 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50  Page->buf.n + pP
18fd0 67 69 64 78 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20  gidx->n + nTerm 
18fe0 2b 20 32 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67  + 2)>=p->pConfig
18ff0 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 69 66  ->pgsz ){.    if
19000 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34  ( pPage->buf.n>4
19010 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72   ){.      fts5Wr
19020 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
19030 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a  pWriter);.    }.
19040 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
19050 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ow(&p->rc, &pPag
19060 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54  e->buf, nTerm+FT
19070 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
19080 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f  ;.  }.  .  /* TO
19090 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20 70 67  DO1: Updating pg
190a0 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70  idx here. */.  p
190b0 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69  Pgidx->n += sqli
190c0 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
190d0 28 0a 20 20 20 20 20 20 26 70 50 67 69 64 78 2d  (.      &pPgidx-
190e0 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70  >p[pPgidx->n], p
190f0 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50  Page->buf.n - pP
19100 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 0a  age->iPrevPgidx.
19110 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50    );.  pPage->iP
19120 72 65 76 50 67 69 64 78 20 3d 20 70 50 61 67 65  revPgidx = pPage
19130 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20  ->buf.n;.#if 0. 
19140 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50 67   fts5PutU16(&pPg
19150 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e  idx->p[pPgidx->n
19160 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  ], pPage->buf.n)
19170 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d  ;.  pPgidx->n +=
19180 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66   2;.#endif..  if
19190 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
191a0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
191b0 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a     nPrefix = 0;.
191c0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
191d0 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno!=1 ){.      
191e0 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
191f0 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c  irst term on a l
19200 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f 74 20  eaf that is not 
19210 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61  the leftmost lea
19220 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  f in.      ** th
19230 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
19240 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
19250 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
19260 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74 6f 0a  o add a term to.
19270 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74        ** the b-t
19280 72 65 65 20 68 69 65 72 61 72 63 68 79 20 74 68  ree hierarchy th
19290 61 74 20 69 73 20 28 61 29 20 6c 61 72 67 65 72  at is (a) larger
192a0 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
192b0 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a  t term .      **
192c0 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
192d0 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
192e0 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65 72 20  and (b) smaller 
192f0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
19300 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 74  .      ** this t
19310 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  erm. In other wo
19320 72 64 73 2c 20 61 20 70 72 65 66 69 78 20 6f 66  rds, a prefix of
19330 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74   (pTerm/nTerm) t
19340 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20 20 20  hat is one.     
19350 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65 72 20   ** byte longer 
19360 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74  than the longest
19370 20 70 72 65 66 69 78 20 28 70 54 65 72 6d 2f 6e   prefix (pTerm/n
19380 54 65 72 6d 29 20 73 68 61 72 65 73 20 77 69 74  Term) shares wit
19390 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  h the.      ** p
193a0 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20  revious term. . 
193b0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
193c0 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 72   Usually, the pr
193d0 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 61  evious term is a
193e0 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50 61 67  vailable in pPag
193f0 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65 78 63  e->term. The exc
19400 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  eption.      ** 
19410 69 73 20 69 66 20 74 68 69 73 20 69 73 20 74 68  is if this is th
19420 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69  e first term wri
19430 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65  tten in an incre
19440 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73 74 65  mental-merge ste
19450 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  p..      ** In t
19460 68 69 73 20 63 61 73 65 20 74 68 65 20 70 72 65  his case the pre
19470 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 6e 6f  vious term is no
19480 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20  t available, so 
19490 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20 20 20  just write a.   
194a0 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70     ** copy of (p
194b0 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f  Term/nTerm) into
194c0 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
194d0 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74  . This is slight
194e0 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 65 66  ly.      ** inef
194f0 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73 74 69  ficient, but sti
19500 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a  ll correct.  */.
19510 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54        int n = nT
19520 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  erm;.      if( p
19530 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a  Page->term.n ){.
19540 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20 2b 20          n = 1 + 
19550 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
19560 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  ss(pPage->term.n
19570 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
19580 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
19590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
195a0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
195b0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20  (p, pWriter, n, 
195c0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 70 50  pTerm);.      pP
195d0 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e  age = &pWriter->
195e0 77 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20  writer;.    }.  
195f0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66  }else{.    nPref
19600 69 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43  ix = fts5PrefixC
19610 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d 3e 74  ompress(pPage->t
19620 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e 74 65  erm.n, pPage->te
19630 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70 54 65  rm.p, nTerm, pTe
19640 72 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  rm);.    fts5Buf
19650 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19660 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
19670 62 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20  buf, nPrefix);. 
19680 20 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20   }..  /* Append 
19690 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
196a0 74 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c  tes of new data,
196b0 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64   then the term d
196c0 61 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20  ata itself.  ** 
196d0 74 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a  to the page. */.
196e0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
196f0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
19700 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54   &pPage->buf, nT
19710 65 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a  erm - nPrefix);.
19720 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
19730 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
19740 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72  pPage->buf, nTer
19750 6d 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54  m - nPrefix, &pT
19760 65 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a  erm[nPrefix]);..
19770 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
19780 46 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74  Fts5PageWriter.t
19790 65 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  erm field. */.  
197a0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
197b0 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65  ->rc, &pPage->te
197c0 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d  rm, nTerm, pTerm
197d0 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  );.  pWriter->bF
197e0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
197f0 20 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e   0;..  pWriter->
19800 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
19810 65 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72  e = 0;.  pWriter
19820 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
19830 6f 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61  oclist = 1;..  a
19840 73 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20  ssert( p->rc || 
19850 28 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  (pWriter->nDlidx
19860 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61  >0 && pWriter->a
19870 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d  Dlidx[0].buf.n==
19880 30 29 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  0) );.  pWriter-
19890 3e 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20  >aDlidx[0].pgno 
198a0 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d  = pPage->pgno;.}
198b0 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
198c0 20 72 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74   rowid and posit
198d0 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69  ion-list size fi
198e0 65 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65  eld to the write
198f0 72 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73  rs output. .*/.s
19900 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
19910 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
19920 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19930 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
19940 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36  r *pWriter,.  i6
19950 34 20 69 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20  4 iRowid,.  int 
19960 6e 50 6f 73 0a 29 7b 0a 20 20 69 66 28 20 70 2d  nPos.){.  if( p-
19970 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
19980 7b 0a 20 20 20 20 46 74 73 35 50 61 67 65 57 72  {.    Fts5PageWr
19990 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
199a0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
199b0 0a 20 20 20 20 69 66 28 20 28 70 50 61 67 65 2d  .    if( (pPage-
199c0 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e  >buf.n + pPage->
199d0 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e 70 43 6f  pgidx.n)>=p->pCo
199e0 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20  nfig->pgsz ){.  
199f0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
19a00 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
19a10 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
19a20 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 6f 20  * If this is to 
19a30 62 65 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  be the first row
19a40 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  id written to th
19a50 65 20 70 61 67 65 2c 20 73 65 74 20 74 68 65 20  e page, set the 
19a60 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 2d 70 6f  .    ** rowid-po
19a70 69 6e 74 65 72 20 69 6e 20 74 68 65 20 70 61 67  inter in the pag
19a80 65 2d 68 65 61 64 65 72 2e 20 41 6c 73 6f 20 61  e-header. Also a
19a90 70 70 65 6e 64 20 61 20 76 61 6c 75 65 20 74 6f  ppend a value to
19aa0 20 74 68 65 20 64 6c 69 64 78 0a 20 20 20 20 2a   the dlidx.    *
19ab0 2a 20 62 75 66 66 65 72 2c 20 69 6e 20 63 61 73  * buffer, in cas
19ac0 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  e a doclist-inde
19ad0 78 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  x is required.  
19ae0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
19af0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
19b00 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
19b10 74 73 35 50 75 74 55 31 36 28 70 50 61 67 65 2d  ts5PutU16(pPage-
19b20 3e 62 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62  >buf.p, pPage->b
19b30 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73  uf.n);.      fts
19b40 35 57 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e  5WriteDlidxAppen
19b50 64 28 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52  d(p, pWriter, iR
19b60 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  owid);.    }..  
19b70 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72    /* Write the r
19b80 6f 77 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28  owid. */.    if(
19b90 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
19ba0 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c  RowidInDoclist |
19bb0 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  | pWriter->bFirs
19bc0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
19bd0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
19be0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
19bf0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
19c00 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d  , iRowid);.    }
19c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
19c20 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52 6f  rt( p->rc || iRo
19c30 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50 72  wid>pWriter->iPr
19c40 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  evRowid );.     
19c50 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19c60 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
19c70 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
19c80 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e 69  wid - pWriter->i
19c90 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20 20  PrevRowid);.    
19ca0 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 69  }.    pWriter->i
19cb0 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f 77  PrevRowid = iRow
19cc0 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d  id;.    pWriter-
19cd0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
19ce0 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 70  clist = 0;.    p
19cf0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
19d00 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  widInPage = 0;..
19d10 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
19d20 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
19d30 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
19d40 6e 50 6f 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  nPos);.  }.}..st
19d50 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
19d60 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  iteAppendPoslist
19d70 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64 65  Data(.  Fts5Inde
19d80 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
19d90 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
19da0 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 44   .  const u8 *aD
19db0 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61 74  ata, .  int nDat
19dc0 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67 65 57  a.){.  Fts5PageW
19dd0 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26  riter *pPage = &
19de0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
19df0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d  .  const u8 *a =
19e00 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 20   aData;.  int n 
19e10 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61 73  = nData;.  .  as
19e20 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69 67  sert( p->pConfig
19e30 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77 68  ->pgsz>0 );.  wh
19e40 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
19e50 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26 26 20 28  TE_OK .     && (
19e60 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70  pPage->buf.n + p
19e70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 20 2b 20  Page->pgidx.n + 
19e80 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n)>=p->pConfig->
19e90 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20 20 20 69  pgsz .  ){.    i
19ea0 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e 70 43 6f  nt nReq = p->pCo
19eb0 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20 70 50 61  nfig->pgsz - pPa
19ec0 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67  ge->buf.n - pPag
19ed0 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20 20 20 20  e->pgidx.n;.    
19ee0 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30 3b 0a 20  int nCopy = 0;. 
19ef0 20 20 20 77 68 69 6c 65 28 20 6e 43 6f 70 79 3c     while( nCopy<
19f00 6e 52 65 71 20 29 7b 0a 20 20 20 20 20 20 69 36  nReq ){.      i6
19f10 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20 6e  4 dummy;.      n
19f20 43 6f 70 79 20 2b 3d 20 66 74 73 35 47 65 74 56  Copy += fts5GetV
19f30 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70 79 5d 2c  arint(&a[nCopy],
19f40 20 28 75 36 34 2a 29 26 64 75 6d 6d 79 29 3b 0a   (u64*)&dummy);.
19f50 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75      }.    fts5Bu
19f60 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
19f70 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
19f80 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29 3b 0a 20  uf, nCopy, a);. 
19f90 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20     a += nCopy;. 
19fa0 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20     n -= nCopy;. 
19fb0 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
19fc0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
19fd0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 30  );.  }.  if( n>0
19fe0 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
19ff0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1a000 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1a010 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a 7d 0a 0a  , n, a);.  }.}..
1a020 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
1a030 64 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74  data cached by t
1a040 68 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74  he writer object
1a050 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a060 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c  . Free any.** al
1a070 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69  locations associ
1a080 61 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72  ated with the wr
1a090 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iter..*/.static 
1a0a0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69  void fts5WriteFi
1a0b0 6e 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65  nish(.  Fts5Inde
1a0c0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1a0d0 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1a0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1a0f0 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
1a100 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20 20  nt *pnLeaf      
1a110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a120 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f 66  * OUT: Number of
1a130 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20 62   leaf pages in b
1a140 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  -tree */.){.  in
1a150 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67 65 57  t i;.  Fts5PageW
1a160 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d 20 26  riter *pLeaf = &
1a170 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
1a180 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1a190 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
1a1a0 73 73 65 72 74 28 20 70 4c 65 61 66 2d 3e 70 67  ssert( pLeaf->pg
1a1b0 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20 69 66 28  no>=1 );.    if(
1a1c0 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e 3e 34 20   pLeaf->buf.n>4 
1a1d0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  ){.      fts5Wri
1a1e0 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1a1f0 57 72 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  Writer);.    }. 
1a200 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20 70 4c 65     *pnLeaf = pLe
1a210 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20 20 20 20  af->pgno-1;.    
1a220 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
1a230 72 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b  ree(p, pWriter);
1a240 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65  .  }.  fts5Buffe
1a250 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 74 65  rFree(&pLeaf->te
1a260 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
1a270 72 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 62 75  rFree(&pLeaf->bu
1a280 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  f);.  fts5Buffer
1a290 46 72 65 65 28 26 70 4c 65 61 66 2d 3e 70 67 69  Free(&pLeaf->pgi
1a2a0 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  dx);.  fts5Buffe
1a2b0 72 46 72 65 65 28 26 70 57 72 69 74 65 72 2d 3e  rFree(&pWriter->
1a2c0 62 74 74 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28  btterm);..  for(
1a2d0 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d 3e  i=0; i<pWriter->
1a2e0 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20 20  nDlidx; i++){.  
1a2f0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1a300 66 65 72 46 72 65 65 28 26 70 57 72 69 74 65 72  ferFree(&pWriter
1a310 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e 62 75 66 29  ->aDlidx[i].buf)
1a320 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1a330 66 72 65 65 28 70 57 72 69 74 65 72 2d 3e 61 44  free(pWriter->aD
1a340 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  lidx);.}..static
1a350 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 49   void fts5WriteI
1a360 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
1a370 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1a380 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
1a390 0a 20 20 69 6e 74 20 69 53 65 67 69 64 0a 29 7b  .  int iSegid.){
1a3a0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
1a3b0 66 66 65 72 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  ffer = p->pConfi
1a3c0 67 2d 3e 70 67 73 7a 20 2b 20 46 54 53 35 5f 44  g->pgsz + FTS5_D
1a3d0 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 0a 20 20  ATA_PADDING;..  
1a3e0 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2c 20  memset(pWriter, 
1a3f0 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65  0, sizeof(Fts5Se
1a400 67 57 72 69 74 65 72 29 29 3b 0a 20 20 70 57 72  gWriter));.  pWr
1a410 69 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69  iter->iSegid = i
1a420 53 65 67 69 64 3b 0a 0a 20 20 66 74 73 35 57 72  Segid;..  fts5Wr
1a430 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20  iteDlidxGrow(p, 
1a440 70 57 72 69 74 65 72 2c 20 31 29 3b 0a 20 20 70  pWriter, 1);.  p
1a450 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70  Writer->writer.p
1a460 67 6e 6f 20 3d 20 31 3b 0a 20 20 70 57 72 69 74  gno = 1;.  pWrit
1a470 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
1a480 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57 72 69  Page = 1;.  pWri
1a490 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 31  ter->iBtPage = 1
1a4a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  ;..  assert( pWr
1a4b0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1a4c0 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  .n==0 );.  asser
1a4d0 74 28 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  t( pWriter->writ
1a4e0 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b  er.pgidx.n==0 );
1a4f0 0a 0a 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20  ..  /* Grow the 
1a500 74 77 6f 20 62 75 66 66 65 72 73 20 74 6f 20 70  two buffers to p
1a510 67 73 7a 20 2b 20 70 61 64 64 69 6e 67 20 62 79  gsz + padding by
1a520 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a  tes in size. */.
1a530 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1a540 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20  ferSize(&p->rc, 
1a550 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1a560 2e 70 67 69 64 78 2c 20 6e 42 75 66 66 65 72 29  .pgidx, nBuffer)
1a570 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 42  ;.  sqlite3Fts5B
1a580 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
1a590 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  , &pWriter->writ
1a5a0 65 72 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29  er.buf, nBuffer)
1a5b0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78  ;..  if( p->pIdx
1a5c0 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20  Writer==0 ){.   
1a5d0 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
1a5e0 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
1a5f0 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  g;.    fts5Index
1a600 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
1a610 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73  p->pIdxWriter, s
1a620 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1a630 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52            "INSER
1a640 54 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f  T INTO '%q'.'%q_
1a650 69 64 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c  idx'(segid,term,
1a660 70 67 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f  pgno) VALUES(?,?
1a670 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  ,?)", .         
1a680 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
1a690 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
1a6a0 20 20 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28    ));.  }..  if(
1a6b0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1a6c0 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  K ){.    /* Init
1a6d0 69 61 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74  ialize the 4-byt
1a6e0 65 20 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64  e leaf-page head
1a6f0 65 72 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20  er to 0x00. */. 
1a700 20 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65     memset(pWrite
1a710 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c  r->writer.buf.p,
1a720 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69   0, 4);.    pWri
1a730 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e  ter->writer.buf.
1a740 6e 20 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42  n = 4;..    /* B
1a750 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
1a760 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69  output segment i
1a770 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77  d to the index-w
1a780 72 69 74 65 72 2e 20 54 68 69 73 20 69 73 20 61  riter. This is a
1a790 6e 0a 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a  n.    ** optimiz
1a7a0 61 74 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69  ation over bindi
1a7b0 6e 67 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  ng the same valu
1a7c0 65 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20  e over and over 
1a7d0 61 73 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20  as rows are.    
1a7e0 2a 2a 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ** inserted into
1a7f0 20 25 5f 69 64 78 20 62 79 20 74 68 65 20 63 75   %_idx by the cu
1a800 72 72 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a  rrent writer.  *
1a810 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69  /.    sqlite3_bi
1a820 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72  nd_int(p->pIdxWr
1a830 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72  iter, 1, pWriter
1a840 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d  ->iSegid);.  }.}
1a850 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
1a860 20 70 49 74 65 72 20 77 61 73 20 75 73 65 64 20   pIter was used 
1a870 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
1a880 67 68 20 74 68 65 20 69 6e 70 75 74 20 73 65 67  gh the input seg
1a890 6d 65 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a  ments of on an.*
1a8a0 2a 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65  * incremental me
1a8b0 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54  rge operation. T
1a8c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1a8d0 63 61 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e  called if the in
1a8e0 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72  cremental.** mer
1a8f0 67 65 20 73 74 65 70 20 68 61 73 20 66 69 6e 69  ge step has fini
1a900 73 68 65 64 20 62 75 74 20 74 68 65 20 69 6e 70  shed but the inp
1a910 75 74 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ut has not been 
1a920 63 6f 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75  completely exhau
1a930 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
1a940 76 6f 69 64 20 66 74 73 35 54 72 69 6d 53 65 67  void fts5TrimSeg
1a950 6d 65 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20  ments(Fts5Index 
1a960 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65  *p, Fts5IndexIte
1a970 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74  r *pIter){.  int
1a980 20 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   i;.  Fts5Buffer
1a990 20 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26   buf;.  memset(&
1a9a0 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  buf, 0, sizeof(F
1a9b0 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66  ts5Buffer));.  f
1a9c0 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
1a9d0 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
1a9e0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1a9f0 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
1aa00 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  g[i];.    if( pS
1aa10 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20  eg->pSeg==0 ){. 
1aa20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f       /* no-op */
1aa30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
1aa40 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b  Seg->pLeaf==0 ){
1aa50 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65  .      /* All ke
1aa60 79 73 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70  ys from this inp
1aa70 75 74 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20  ut segment have 
1aa80 62 65 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20  been transfered 
1aa90 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20  to the output.. 
1aaa0 20 20 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68       ** Set both
1aab0 20 74 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c   the first and l
1aac0 61 73 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73  ast page-numbers
1aad0 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
1aae0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
1aaf0 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e   ** segment is n
1ab00 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20  ow empty. */.   
1ab10 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1ab20 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20  gnoLast = 0;.   
1ab30 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70     pSeg->pSeg->p
1ab40 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  gnoFirst = 0;.  
1ab50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1ab60 6e 74 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e  nt iOff = pSeg->
1ab70 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
1ab80 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
1ab90 6e 20 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66  n new first leaf
1aba0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
1abb0 36 34 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20  64 iLeafRowid;. 
1abc0 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70       Fts5Data *p
1abd0 44 61 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20  Data;.      int 
1abe0 69 49 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67  iId = pSeg->pSeg
1abf0 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ->iSegid;.      
1ac00 75 38 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78  u8 aHdr[4] = {0x
1ac10 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20  00, 0x00, 0x00, 
1ac20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c  0x00};..      iL
1ac30 65 61 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f  eafRowid = FTS5_
1ac40 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1ac50 64 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65  d, pSeg->iTermLe
1ac60 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70  afPgno);.      p
1ac70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
1ac80 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69  ead(p, iLeafRowi
1ac90 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  d);.      if( pD
1aca0 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ata ){.        f
1acb0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62  ts5BufferZero(&b
1acc0 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  uf);.        fts
1acd0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1ace0 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1acf0 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74  >nn);.        ft
1ad00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1ad10 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1ad20 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
1ad30 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
1ad40 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1ad50 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1ad60 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
1ad70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1ad80 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ad90 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1ada0 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
1adb0 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
1adc0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1add0 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1ade0 62 75 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65  buf, pData->szLe
1adf0 61 66 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d  af-iOff, &pData-
1ae00 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  >p[iOff]);.     
1ae10 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
1ae20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ae30 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20       /* Set the 
1ae40 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a  szLeaf field */.
1ae50 20 20 20 20 20 20 20 20 20 20 66 74 73 35 50 75            fts5Pu
1ae60 74 55 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20  tU16(&buf.p[2], 
1ae70 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20  buf.n);.        
1ae80 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  }..        /* Se
1ae90 74 20 75 70 20 74 68 65 20 6e 65 77 20 70 61 67  t up the new pag
1aea0 65 2d 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f  e-index array */
1aeb0 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1aec0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1aed0 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29  &p->rc, &buf, 4)
1aee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
1aef0 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  eg->iLeafPgno==p
1af00 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
1af10 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 26 26 20  no .         && 
1af20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  pSeg->iEndofDocl
1af30 69 73 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61  ist<pData->szLea
1af40 66 20 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  f .        ){.  
1af50 20 20 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66          int nDif
1af60 66 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61  f = pData->szLea
1af70 66 20 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66  f - pSeg->iEndof
1af80 44 6f 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20  Doclist;.       
1af90 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1afa0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1afb0 2c 20 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20  , &buf, buf.n - 
1afc0 31 20 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a  1 - nDiff - 4);.
1afd0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1afe0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1aff0 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20  p->rc, &buf, .  
1b000 20 20 20 20 20 20 20 20 20 20 20 20 70 44 61 74              pDat
1b010 61 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50  a->nn - pSeg->iP
1b020 67 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d  gidxOff, &pData-
1b030 3e 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f  >p[pSeg->iPgidxO
1b040 66 66 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b  ff].          );
1b050 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1b060 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
1b070 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20  ase(pData);.    
1b080 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e      pSeg->pSeg->
1b090 70 67 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67  pgnoFirst = pSeg
1b0a0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  ->iTermLeafPgno;
1b0b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
1b0c0 61 44 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f  aDelete(p, FTS5_
1b0d0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49  SEGMENT_ROWID(iI
1b0e0 64 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69  d, 1), iLeafRowi
1b0f0 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  d);.        fts5
1b100 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65  DataWrite(p, iLe
1b110 61 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20  afRowid, buf.p, 
1b120 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  buf.n);.      }.
1b130 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
1b140 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29  BufferFree(&buf)
1b150 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
1b160 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43   fts5MergeChunkC
1b170 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49  allback(.  Fts5I
1b180 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64  ndex *p, .  void
1b190 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74   *pCtx, .  const
1b1a0 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
1b1b0 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73   nChunk.){.  Fts
1b1c0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
1b1d0 74 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72  ter = (Fts5SegWr
1b1e0 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74  iter*)pCtx;.  ft
1b1f0 73 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73  s5WriteAppendPos
1b200 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69  listData(p, pWri
1b210 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68  ter, pChunk, nCh
1b220 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a  unk);.}../*.**.*
1b230 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1b240 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65  s5IndexMergeLeve
1b250 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  l(.  Fts5Index *
1b260 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1b270 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1b280 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1b290 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1b2a0 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20  *ppStruct,      
1b2b0 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63   /* IN/OUT: Stuc
1b2c0 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1b2d0 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20  .  int iLvl,    
1b2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b2f0 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72     /* Level to r
1b300 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a  ead input from *
1b310 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20  /.  int *pnRem  
1b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b330 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20      /* Write up 
1b340 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74  to this many out
1b350 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b  put leaves */.){
1b360 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1b370 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
1b380 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72  truct;.  Fts5Str
1b390 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
1b3a0 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
1b3b0 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74  evel[iLvl];.  Ft
1b3c0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1b3d0 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73   *pLvlOut;.  Fts
1b3e0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
1b3f0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
1b400 49 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64  Iterator to read
1b410 20 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20   input data */. 
1b420 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65   int nRem = pnRe
1b430 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20  m ? *pnRem : 0; 
1b440 20 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20   /* Output leaf 
1b450 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72  pages left to wr
1b460 69 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ite */.  int nIn
1b470 70 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  put;            
1b480 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b490 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
1b4a0 65 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65  ents */.  Fts5Se
1b4b0 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
1b4c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
1b4d0 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
1b4e0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1b4f0 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
1b500 2f 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e  /* Output segmen
1b510 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
1b520 72 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f  r term;.  int bO
1b530 6c 64 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  ldest;          
1b540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
1b550 65 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  e if the output 
1b560 73 65 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f  segment is the o
1b570 6c 64 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ldest */..  asse
1b580 72 74 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  rt( iLvl<pStruct
1b590 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73  ->nLevel );.  as
1b5a0 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72  sert( pLvl->nMer
1b5b0 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29  ge<=pLvl->nSeg )
1b5c0 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69  ;..  memset(&wri
1b5d0 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
1b5e0 74 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a  ts5SegWriter));.
1b5f0 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
1b600 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
1b610 66 66 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c  ffer));.  if( pL
1b620 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20  vl->nMerge ){.  
1b630 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1b640 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b650 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  l+1];.    assert
1b660 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e  ( pLvlOut->nSeg>
1b670 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20  0 );.    nInput 
1b680 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a  = pLvl->nMerge;.
1b690 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
1b6a0 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
1b6b0 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20  t->nSeg-1];..   
1b6c0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
1b6d0 2c 20 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d  , &writer, pSeg-
1b6e0 3e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72  >iSegid);.    wr
1b6f0 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f  iter.writer.pgno
1b700 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73   = pSeg->pgnoLas
1b710 74 2b 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e  t+1;.    writer.
1b720 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d  iBtPage = 0;.  }
1b730 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53  else{.    int iS
1b740 65 67 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63  egid = fts5Alloc
1b750 61 74 65 53 65 67 69 64 28 70 2c 20 70 53 74 72  ateSegid(p, pStr
1b760 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78  uct);..    /* Ex
1b770 74 65 6e 64 20 74 68 65 20 46 74 73 35 53 74 72  tend the Fts5Str
1b780 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73  ucture object as
1b790 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73   required to ens
1b7a0 75 72 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20  ure the output. 
1b7b0 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78     ** segment ex
1b7c0 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ists. */.    if(
1b7d0 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e   iLvl==pStruct->
1b7e0 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20  nLevel-1 ){.    
1b7f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 41    fts5StructureA
1b800 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ddLevel(&p->rc, 
1b810 70 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20  ppStruct);.     
1b820 20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74   pStruct = *ppSt
1b830 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ruct;.    }.    
1b840 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
1b850 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
1b860 20 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31   pStruct, iLvl+1
1b870 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 1, 0);.    if(
1b880 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
1b890 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74  .    pLvl = &pSt
1b8a0 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b8b0 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20  l];.    pLvlOut 
1b8c0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1b8d0 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20  el[iLvl+1];..   
1b8e0 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70   fts5WriteInit(p
1b8f0 2c 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69  , &writer, iSegi
1b900 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20  d);..    /* Add 
1b910 74 68 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20  the new segment 
1b920 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65  to the output le
1b930 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20  vel */.    pSeg 
1b940 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67  = &pLvlOut->aSeg
1b950 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b  [pLvlOut->nSeg];
1b960 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53  .    pLvlOut->nS
1b970 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e  eg++;.    pSeg->
1b980 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20  pgnoFirst = 1;. 
1b990 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20     pSeg->iSegid 
1b9a0 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53  = iSegid;.    pS
1b9b0 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b  truct->nSegment+
1b9c0 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  +;..    /* Read 
1b9d0 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73  input from all s
1b9e0 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69  egments in the i
1b9f0 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  nput level */.  
1ba00 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
1ba10 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c  >nSeg;.  }.  bOl
1ba20 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d  dest = (pLvlOut-
1ba30 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72  >nSeg==1 && pStr
1ba40 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76  uct->nLevel==iLv
1ba50 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  l+2);..  assert(
1ba60 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f   iLvl>=0 );.  fo
1ba70 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  r(fts5MultiIterN
1ba80 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30  ew(p, pStruct, 0
1ba90 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c  , 0, 0, 0, iLvl,
1baa0 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29   nInput, &pIter)
1bab0 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
1bac0 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
1bad0 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
1bae0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
1baf0 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
1bb00 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
1bb10 74 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20  ter *pSegIter = 
1bb20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
1bb30 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1bb40 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74  First ];.    int
1bb50 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   nPos;          
1bb60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f             /* po
1bb70 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
1bb80 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a   field value */.
1bb90 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20      int nTerm;. 
1bba0 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
1bbb0 72 6d 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  rm;..    /* Chec
1bbc0 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69  k for key annihi
1bbd0 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  lation. */.    i
1bbe0 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f  f( pSegIter->nPo
1bbf0 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74  s==0 && (bOldest
1bc00 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44   || pSegIter->bD
1bc10 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75  el==0) ) continu
1bc20 65 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20  e;..    pTerm = 
1bc30 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
1bc40 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29  m(pIter, &nTerm)
1bc50 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21  ;.    if( nTerm!
1bc60 3d 74 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d  =term.n || memcm
1bc70 70 28 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c  p(pTerm, term.p,
1bc80 20 6e 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20   nTerm) ){.     
1bc90 20 69 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72   if( pnRem && wr
1bca0 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
1bcb0 6e 3e 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20  n>nRem ){.      
1bcc0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1bcd0 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
1bce0 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41  is a new term. A
1bcf0 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20  ppend a term to 
1bd00 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
1bd10 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74 73  nt. */.      fts
1bd20 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
1bd30 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65  (p, &writer, nTe
1bd40 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1bd50 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
1bd60 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
1bd70 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1bd80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65    }..    /* Appe
1bd90 6e 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20  nd the rowid to 
1bda0 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
1bdb0 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
1bdc0 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f  TSIZE */.    nPo
1bdd0 73 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50  s = pSegIter->nP
1bde0 6f 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d  os*2 + pSegIter-
1bdf0 3e 62 44 65 6c 3b 0a 20 20 20 20 66 74 73 35 57  >bDel;.    fts5W
1be00 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28  riteAppendRowid(
1be10 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35  p, &writer, fts5
1be20 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
1be30 49 74 65 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20  Iter), nPos);.. 
1be40 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65     /* Append the
1be50 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64   position-list d
1be60 61 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ata to the outpu
1be70 74 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75  t */.    fts5Chu
1be80 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
1be90 67 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77  gIter, (void*)&w
1bea0 72 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65  riter, fts5Merge
1beb0 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a  ChunkCallback);.
1bec0 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20    }..  /* Flush 
1bed0 74 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61  the last leaf pa
1bee0 67 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20  ge to disk. Set 
1bef0 74 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65  the output segme
1bf00 6e 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74  nt b-tree height
1bf10 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c  .  ** and last l
1bf20 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1bf30 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
1bf40 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74  .  */.  fts5Writ
1bf50 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74  eFinish(p, &writ
1bf60 65 72 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c  er, &pSeg->pgnoL
1bf70 61 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73  ast);..  if( fts
1bf80 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
1bf90 20 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69   pIter) ){.    i
1bfa0 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  nt i;..    /* Re
1bfb0 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61  move the redunda
1bfc0 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d  nt segments from
1bfd0 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
1bfe0 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  e */.    for(i=0
1bff0 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29  ; i<nInput; i++)
1c000 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
1c010 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c  RemoveSegment(p,
1c020 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69   pLvl->aSeg[i].i
1c030 53 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  Segid);.    }.. 
1c040 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65     /* Remove the
1c050 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65   redundant segme
1c060 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  nts from the inp
1c070 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1c080 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d  if( pLvl->nSeg!=
1c090 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20  nInput ){.      
1c0a0 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76  int nMove = (pLv
1c0b0 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74  l->nSeg - nInput
1c0c0 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  ) * sizeof(Fts5S
1c0d0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
1c0e0 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;.      memmove(
1c0f0 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76  pLvl->aSeg, &pLv
1c100 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c  l->aSeg[nInput],
1c110 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20   nMove);.    }. 
1c120 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1c130 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a  ment -= nInput;.
1c140 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d      pLvl->nSeg -
1c150 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c  = nInput;.    pL
1c160 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a  vl->nMerge = 0;.
1c170 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
1c180 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20  noLast==0 ){.   
1c190 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
1c1a0 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  --;.      pStruc
1c1b0 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20  t->nSegment--;. 
1c1c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1c1d0 20 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e    assert( pSeg->
1c1e0 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20  pgnoLast>0 );.  
1c1f0 20 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e    fts5TrimSegmen
1c200 74 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ts(p, pIter);.  
1c210 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d    pLvl->nMerge =
1c220 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20   nInput;.  }..  
1c230 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
1c240 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66  e(p, pIter);.  f
1c250 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
1c260 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65  erm);.  if( pnRe
1c270 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72  m ) *pnRem -= wr
1c280 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
1c290 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75  n;.}../*.** Do u
1c2a0 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f  p to nPg pages o
1c2b0 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b  f automerge work
1c2c0 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   on the index..*
1c2d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1c2e0 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20  s5IndexMerge(.  
1c2f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
1c320 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
1c330 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74  Structure **ppSt
1c340 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49  ruct,       /* I
1c350 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73  N/OUT: Current s
1c360 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65  tructure of inde
1c370 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20  x */.  int nPg  
1c380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c390 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20         /* Pages 
1c3a0 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f  of work to do */
1c3b0 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
1c3c0 20 6e 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75   nPg;.  Fts5Stru
1c3d0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
1c3e0 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68   *ppStruct;.  wh
1c3f0 69 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70  ile( nRem>0 && p
1c400 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1c410 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b  ){.    int iLvl;
1c420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c430 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65     /* To iterate
1c440 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
1c450 2a 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74  */.    int iBest
1c460 4c 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Lvl = 0;        
1c470 20 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65     /* Level offe
1c480 72 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e  ring the most in
1c490 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  put segments */.
1c4a0 20 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20      int nBest = 
1c4b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1c4c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70  /* Number of inp
1c4d0 75 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62  ut segments on b
1c4e0 65 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20  est level */..  
1c4f0 20 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76    /* Set iBestLv
1c500 6c 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74  l to the level t
1c510 6f 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67  o read input seg
1c520 6d 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20  ments from. */. 
1c530 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
1c540 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a  ct->nLevel>0 );.
1c550 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1c560 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1c570 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1c580 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
1c590 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
1c5a0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1c5b0 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iLvl];.      if
1c5c0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
1c5d0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  {.        if( pL
1c5e0 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74  vl->nMerge>nBest
1c5f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42   ){.          iB
1c600 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20  estLvl = iLvl;. 
1c610 20 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d           nBest =
1c620 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20   pLvl->nMerge;. 
1c630 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c640 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c650 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
1c660 6e 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20  nSeg>nBest ){.  
1c670 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
1c680 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20  vl->nSeg;.      
1c690 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76    iBestLvl = iLv
1c6a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  l;.      }.    }
1c6b0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73  ..    /* If nBes
1c6c0 74 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68  t is still 0, th
1c6d0 65 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73  en the index mus
1c6e0 74 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23  t be empty. */.#
1c6f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1c700 55 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  UG.    for(iLvl=
1c710 30 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69  0; nBest==0 && i
1c720 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1c730 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1c740 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
1c750 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1c760 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20  ].nSeg==0 );.   
1c770 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69   }.#endif..    i
1c780 66 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e  f( nBest<p->pCon
1c790 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20  fig->nAutomerge 
1c7a0 0a 20 20 20 20 20 20 20 20 26 26 20 70 53 74 72  .        && pStr
1c7b0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73  uct->aLevel[iBes
1c7c0 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20  tLvl].nMerge==0 
1c7d0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
1c7e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1c7f0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1c800 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
1c810 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65  , iBestLvl, &nRe
1c820 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  m);.    if( p->r
1c830 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c840 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1c850 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65  iBestLvl].nMerge
1c860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
1c870 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
1c880 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c  e(p, iBestLvl+1,
1c890 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d   pStruct);.    }
1c8a0 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
1c8b0 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f   = pStruct;.}../
1c8c0 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20  *.** A total of 
1c8d0 6e 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73  nLeaf leaf pages
1c8e0 20 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73   of data has jus
1c8f0 74 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74  t been flushed t
1c900 6f 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73  o a level-0.** s
1c910 65 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  egment. This fun
1c920 63 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68  ction updates th
1c930 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20  e write-counter 
1c940 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c  accordingly and,
1c950 20 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79   if.** necessary
1c960 2c 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65  , performs incre
1c970 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72  mental merge wor
1c980 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  k..**.** If an e
1c990 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
1c9a0 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72   the Fts5Index.r
1c9b0 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  c error code. If
1c9c0 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
1c9d0 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
1c9e0 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ed, this functio
1c9f0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  n is a no-op..*/
1ca00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1ca10 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28  5IndexAutomerge(
1ca20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1ca50 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1ca60 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1ca70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1ca80 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e  * IN/OUT: Curren
1ca90 74 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69  t structure of i
1caa0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  ndex */.  int nL
1cab0 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1cac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1cad0 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65  ber of output le
1cae0 61 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65  aves just writte
1caf0 6e 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d  n */.){.  if( p-
1cb00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
1cb10 26 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  & p->pConfig->nA
1cb20 75 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20  utomerge>0 ){.  
1cb30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1cb40 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1cb50 72 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57  ruct;.    u64 nW
1cb60 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
1cb70 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69          /* Initi
1cb80 61 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74  al value of writ
1cb90 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  e-counter */.   
1cba0 20 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20   int nWork;     
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cbc0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b  * Number of work
1cbd0 2d 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f  -quanta to perfo
1cbe0 72 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52  rm */.    int nR
1cbf0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
1cc00 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cc10 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20  r of leaf pages 
1cc20 6c 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f  left to write */
1cc30 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  ..    /* Update 
1cc40 74 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65  the write-counte
1cc50 72 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73  r. While doing s
1cc60 6f 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f  o, set nWork. */
1cc70 0a 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53  .    nWrite = pS
1cc80 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75  truct->nWriteCou
1cc90 6e 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20  nter;.    nWork 
1cca0 3d 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65  = (int)(((nWrite
1ccb0 20 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e   + nLeaf) / p->n
1ccc0 57 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72  WorkUnit) - (nWr
1ccd0 69 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e  ite / p->nWorkUn
1cce0 69 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63  it));.    pStruc
1ccf0 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72  t->nWriteCounter
1cd00 20 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e   += nLeaf;.    n
1cd10 52 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e  Rem = (int)(p->n
1cd20 57 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b  WorkUnit * nWork
1cd30 20 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76   * pStruct->nLev
1cd40 65 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e  el);..    fts5In
1cd50 64 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74  dexMerge(p, ppSt
1cd60 72 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d  ruct, nRem);.  }
1cd70 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1cd80 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
1cd90 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erge(.  Fts5Inde
1cda0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
1cdb0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
1cdc0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
1cdd0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
1cde0 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20  e **ppStruct    
1cdf0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
1ce00 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65  urrent structure
1ce10 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a   of index */.){.
1ce20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69    const int nCri
1ce30 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  sis = p->pConfig
1ce40 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a  ->nCrisisMerge;.
1ce50 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1ce60 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1ce70 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c  ruct;.  int iLvl
1ce80 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1ce90 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
1cea0 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  K || pStruct->nL
1ceb0 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  evel>0 );.  whil
1cec0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1ced0 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
1cee0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
1cef0 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20  g>=nCrisis ){.  
1cf00 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
1cf10 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63  Level(p, &pStruc
1cf20 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20  t, iLvl, 0);.   
1cf30 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
1cf40 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
1cf50 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c  ruct->nLevel>(iL
1cf60 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73  vl+1) );.    fts
1cf70 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
1cf80 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74  e(p, iLvl+1, pSt
1cf90 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b  ruct);.    iLvl+
1cfa0 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75  +;.  }.  *ppStru
1cfb0 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a  ct = pStruct;.}.
1cfc0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1cfd0 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73 35  IndexReturn(Fts5
1cfe0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
1cff0 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70   rc = p->rc;.  p
1d000 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
1d010 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1d020 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
1d030 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46 74   Fts5FlushCtx Ft
1d040 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75  s5FlushCtx;.stru
1d050 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20  ct Fts5FlushCtx 
1d060 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
1d070 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72  Idx;.  Fts5SegWr
1d080 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b  iter writer; .};
1d090 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61  ../*.** Buffer a
1d0a0 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61  Buf[] contains a
1d0b0 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
1d0c0 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75  , all small enou
1d0d0 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20  gh to fit.** in 
1d0e0 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
1d0f0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  . Return the siz
1d100 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  e of the largest
1d110 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20   prefix of this 
1d120 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79  .** list nMax by
1d130 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73  tes or less in s
1d140 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
1d150 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72  nt fts5PoslistPr
1d160 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61  efix(const u8 *a
1d170 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a  Buf, int nMax){.
1d180 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32    int ret;.  u32
1d190 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20   dummy;.  ret = 
1d1a0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
1d1b0 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  aBuf, dummy);.  
1d1c0 69 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a  if( ret<nMax ){.
1d1d0 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
1d1e0 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74        int i = ft
1d1f0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
1d200 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29  Buf[ret], dummy)
1d210 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 74  ;.      if( (ret
1d220 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62   + i) > nMax ) b
1d230 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20  reak;.      ret 
1d240 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += i;.    }.  }.
1d250 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
1d260 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  ./*.** Flush the
1d270 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d   contents of in-
1d280 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
1d290 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77  e iHash to a new
1d2a0 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67   level-0 .** seg
1d2b0 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c  ment on disk. Al
1d2c0 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  so update the co
1d2d0 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75  rresponding stru
1d2e0 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
1d2f0 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1d300 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
1d310 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
1d320 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
1d330 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
1d340 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
1d350 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d360 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
1d370 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73  ic void fts5Flus
1d380 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64  hOneHash(Fts5Ind
1d390 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61  ex *p){.  Fts5Ha
1d3a0 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70  sh *pHash = p->p
1d3b0 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75  Hash;.  Fts5Stru
1d3c0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
1d3d0 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
1d3e0 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
1d3f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d400 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70    /* Last leaf p
1d410 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
1d420 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  gment */..  /* O
1d430 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
1d440 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73  e to the index s
1d450 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
1d460 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
1d470 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20  ent-id.  ** for 
1d480 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  the new level-0 
1d490 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70  segment.  */.  p
1d4a0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
1d4b0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
1d4c0 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
1d4d0 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
1d4e0 53 74 72 75 63 74 29 3b 0a 0a 20 20 69 66 28 20  Struct);..  if( 
1d4f0 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f  iSegid ){.    co
1d500 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70  nst int pgsz = p
1d510 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b  ->pConfig->pgsz;
1d520 0a 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  ..    Fts5Struct
1d530 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
1d540 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65 67 6d 65  ;   /* New segme
1d550 6e 74 20 77 69 74 68 69 6e 20 70 53 74 72 75 63  nt within pStruc
1d560 74 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66  t */.    Fts5Buf
1d570 66 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20  fer *pBuf;      
1d580 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
1d590 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73   in which to ass
1d5a0 65 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20  emble leaf page 
1d5b0 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  */.    Fts5Buffe
1d5c0 72 20 2a 70 50 67 69 64 78 3b 20 20 20 20 20 20  r *pPgidx;      
1d5d0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 69       /* Buffer i
1d5e0 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65 6d  n which to assem
1d5f0 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a 0a 20 20  ble pgidx */..  
1d600 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1d610 77 72 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35  writer;.    fts5
1d620 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72  WriteInit(p, &wr
1d630 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a  iter, iSegid);..
1d640 20 20 20 20 70 42 75 66 20 3d 20 26 77 72 69 74      pBuf = &writ
1d650 65 72 2e 77 72 69 74 65 72 2e 62 75 66 3b 0a 20  er.writer.buf;. 
1d660 20 20 20 70 50 67 69 64 78 20 3d 20 26 77 72 69     pPgidx = &wri
1d670 74 65 72 2e 77 72 69 74 65 72 2e 70 67 69 64 78  ter.writer.pgidx
1d680 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73 35 57 72  ;..    /* fts5Wr
1d690 69 74 65 49 6e 69 74 28 29 20 73 68 6f 75 6c 64  iteInit() should
1d6a0 20 68 61 76 65 20 69 6e 69 74 69 61 6c 69 7a 65   have initialize
1d6b0 64 20 74 68 65 20 62 75 66 66 65 72 73 20 74 6f  d the buffers to
1d6c0 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79 29 0a 20   (most likely). 
1d6d0 20 20 20 2a 2a 20 74 68 65 20 6d 61 78 69 6d 75     ** the maximu
1d6e0 6d 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64  m space required
1d6f0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1d700 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75 66 2d 3e   p->rc || pBuf->
1d710 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20  nSpace>=(pgsz + 
1d720 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e  FTS5_DATA_PADDIN
1d730 47 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  G) );.    assert
1d740 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50 67 69 64  ( p->rc || pPgid
1d750 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  x->nSpace>=(pgsz
1d760 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
1d770 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20 20 2f 2a  DING) );..    /*
1d780 20 42 65 67 69 6e 20 73 63 61 6e 6e 69 6e 67 20   Begin scanning 
1d790 74 68 72 6f 75 67 68 20 68 61 73 68 20 74 61 62  through hash tab
1d7a0 6c 65 20 65 6e 74 72 69 65 73 2e 20 54 68 69 73  le entries. This
1d7b0 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e 63 65 20   loop runs once 
1d7c0 66 6f 72 20 65 61 63 68 0a 20 20 20 20 2a 2a 20  for each.    ** 
1d7d0 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 63 75 72  term/doclist cur
1d7e0 72 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 77 69  rently stored wi
1d7f0 74 68 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  thin the hash ta
1d800 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ble. */.    if( 
1d810 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d820 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
1d830 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
1d840 68 53 63 61 6e 49 6e 69 74 28 70 48 61 73 68 2c  hScanInit(pHash,
1d850 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
1d860 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1d870 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1d880 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
1d890 63 61 6e 45 6f 66 28 70 48 61 73 68 29 20 29 7b  canEof(pHash) ){
1d8a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d8b0 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20 20 20 20  r *zTerm;       
1d8c0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
1d8d0 74 61 69 6e 69 6e 67 20 74 65 72 6d 20 2a 2f 0a  taining term */.
1d8e0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
1d8f0 70 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  pDoclist;       
1d900 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1d910 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 69 73  doclist for this
1d920 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69   term */.      i
1d930 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20  nt nDoclist;    
1d940 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d950 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74 20 69 6e  ze of doclist in
1d960 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 20 20 20   bytes */..     
1d970 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 74 65   /* Write the te
1d980 72 6d 20 66 6f 72 20 74 68 69 73 20 65 6e 74 72  rm for this entr
1d990 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20  y to disk. */.  
1d9a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
1d9b0 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61  ashScanEntry(pHa
1d9c0 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f  sh, &zTerm, &pDo
1d9d0 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74  clist, &nDoclist
1d9e0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69  );.      fts5Wri
1d9f0 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20  teAppendTerm(p, 
1da00 26 77 72 69 74 65 72 2c 20 28 69 6e 74 29 73 74  &writer, (int)st
1da10 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f  rlen(zTerm), (co
1da20 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a  nst u8*)zTerm);.
1da30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77  .      assert( w
1da40 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
1da50 64 49 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  dInPage==0 );.  
1da60 20 20 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70      if( pgsz>=(p
1da70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d  Buf->n + pPgidx-
1da80 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20  >n + nDoclist + 
1da90 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
1daa0 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c   The entire docl
1dab0 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ist will fit on 
1dac0 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1dad0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  . */.        fts
1dae0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1daf0 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63  dBlob(pBuf, pDoc
1db00 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
1db10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1db20 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
1db30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36   = 0;.        i6
1db40 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20  4 iDelta = 0;.  
1db50 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1db60 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20   0;..        /* 
1db70 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
1db80 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  st will not fit 
1db90 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68  on this leaf. Th
1dba0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20  e following .   
1dbb0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65       ** loop ite
1dbc0 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
1dbd0 65 20 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20  e poslists that 
1dbe0 6d 61 6b 65 20 75 70 20 74 68 65 20 63 75 72 72  make up the curr
1dbf0 65 6e 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ent .        ** 
1dc00 64 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20  doclist.  */.   
1dc10 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
1dc20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1dc30 69 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b  iOff<nDoclist ){
1dc40 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1dc50 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Pos;.          i
1dc60 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  nt nCopy;.      
1dc70 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
1dc80 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
1dc90 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
1dca0 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
1dcb0 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79  .          nCopy
1dcd0 20 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73   = fts5GetPoslis
1dce0 74 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b  tSize(&pDoclist[
1dcf0 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62  iOff], &nPos, &b
1dd00 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  Dummy);.        
1dd10 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b    nCopy += nPos;
1dd20 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69  .          iRowi
1dd30 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
1dd40 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
1dd50 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69    if( writer.bFi
1dd60 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1dd70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1dd80 73 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e  s5PutU16(&pBuf->
1dd90 70 5b 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20  p[0], pBuf->n); 
1dda0 20 20 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64    /* first rowid
1ddb0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
1ddc0 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
1ddd0 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
1dde0 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
1ddf0 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69  [pBuf->n], iRowi
1de00 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
1de10 77 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77  writer.bFirstRow
1de20 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
1de30 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
1de40 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70  iteDlidxAppend(p
1de50 2c 20 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69  , &writer, iRowi
1de60 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  d);.          }e
1de70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
1de80 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
1de90 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
1dea0 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1deb0 6e 5d 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20  n], iDelta);.   
1dec0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ded0 20 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d     assert( pBuf-
1dee0 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65  >n<=pBuf->nSpace
1def0 20 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69   );..          i
1df00 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50  f( (pBuf->n + pP
1df10 67 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29  gidx->n + nCopy)
1df20 20 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20   <= pgsz ){.    
1df30 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65          /* The e
1df40 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69  ntire poslist wi
1df50 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75  ll fit on the cu
1df60 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63  rrent leaf. So c
1df70 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20 20  opy.            
1df80 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e  ** it in one go.
1df90 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1dfa0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
1dfb0 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26  pendBlob(pBuf, &
1dfc0 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
1dfd0 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20  nCopy);.        
1dfe0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1dff0 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
1e000 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20  re poslist will 
1e010 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
1e020 6c 65 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64  leaf. So it need
1e030 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
1e040 20 74 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e   to be broken in
1e050 74 6f 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65  to sections. The
1e060 20 6f 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74   only qualificat
1e070 69 6f 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20  ion being.      
1e080 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61        ** that ea
1e090 63 68 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62  ch varint must b
1e0a0 65 20 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75  e stored contigu
1e0b0 6f 75 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20  ously.  */.     
1e0c0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20         const u8 
1e0d0 2a 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f  *pPoslist = &pDo
1e0e0 63 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20  clist[iOff];.   
1e0f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f           int iPo
1e100 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  s = 0;.         
1e110 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1e120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e130 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1e140 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20  nSpace = pgsz - 
1e150 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78  pBuf->n - pPgidx
1e160 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ->n;.           
1e170 20 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20     int n = 0;.  
1e180 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1e190 28 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d  (nCopy - iPos)<=
1e1a0 6e 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20  nSpace ){.      
1e1b0 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43            n = nC
1e1c0 6f 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20  opy - iPos;.    
1e1d0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1e1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e1f0 20 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74   n = fts5Poslist
1e200 50 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74  Prefix(&pPoslist
1e210 5b 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b  [iPos], nSpace);
1e220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
1e230 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
1e240 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
1e250 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1e260 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1e270 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73  Blob(pBuf, &pPos
1e280 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a  list[iPos], n);.
1e290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50                iP
1e2a0 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20  os += n;.       
1e2b0 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66         if( (pBuf
1e2c0 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29  ->n + pPgidx->n)
1e2d0 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  >=pgsz ){.      
1e2e0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
1e2f0 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
1e300 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  &writer);.      
1e310 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e320 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
1e330 3e 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b  >=nCopy ) break;
1e340 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1e350 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e360 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f       iOff += nCo
1e370 70 79 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  py;.        }.  
1e380 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
1e390 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74  TODO2: Doclist t
1e3a0 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74 74 65  erminator writte
1e3b0 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20  n here. */.     
1e3c0 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75 66   /* pBuf->p[pBuf
1e3d0 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a  ->n++] = '\0'; *
1e3e0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
1e3f0 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e  pBuf->n<=pBuf->n
1e400 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20 73  Space );.      s
1e410 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
1e420 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20  anNext(pHash);. 
1e430 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1e440 46 74 73 35 48 61 73 68 43 6c 65 61 72 28 70 48  Fts5HashClear(pH
1e450 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72  ash);.    fts5Wr
1e460 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72  iteFinish(p, &wr
1e470 69 74 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29  iter, &pgnoLast)
1e480 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  ;..    /* Update
1e490 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75   the Fts5Structu
1e4a0 72 65 2e 20 49 74 20 69 73 20 77 72 69 74 74 65  re. It is writte
1e4b0 6e 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61  n back to the da
1e4c0 74 61 62 61 73 65 20 62 79 20 74 68 65 0a 20 20  tabase by the.  
1e4d0 20 20 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75    ** fts5Structu
1e4e0 72 65 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c  reRelease() call
1e4f0 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20   below.  */.    
1e500 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  if( pStruct->nLe
1e510 76 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  vel==0 ){.      
1e520 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
1e530 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70  Level(&p->rc, &p
1e540 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
1e550 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1e560 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
1e570 72 63 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  rc, pStruct, 0, 
1e580 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1e590 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e5a0 29 7b 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20  ){.      pSeg = 
1e5b0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1e5c0 5b 30 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63  [0].aSeg[ pStruc
1e5d0 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65  t->aLevel[0].nSe
1e5e0 67 2b 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65  g++ ];.      pSe
1e5f0 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1e600 69 64 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  id;.      pSeg->
1e610 70 67 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20  pgnoFirst = 1;. 
1e620 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c       pSeg->pgnoL
1e630 61 73 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a  ast = pgnoLast;.
1e640 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e        pStruct->n
1e650 53 65 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d  Segment++;.    }
1e660 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1e670 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20  rePromote(p, 0, 
1e680 70 53 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20  pStruct);.  }.. 
1e690 20 66 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65   fts5IndexAutome
1e6a0 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c  rge(p, &pStruct,
1e6b0 20 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74   pgnoLast);.  ft
1e6c0 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72  s5IndexCrisismer
1e6d0 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b  ge(p, &pStruct);
1e6e0 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1e6f0 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
1e700 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  );.  fts5Structu
1e710 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
1e720 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75  t);.}../*.** Flu
1e730 73 68 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72  sh any data stor
1e740 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ed in the in-mem
1e750 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
1e760 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1e770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e780 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46  fts5IndexFlush(F
1e790 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1e7a0 2f 2a 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  /* Unless it is 
1e7b0 65 6d 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65  empty, flush the
1e7c0 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64   hash table to d
1e7d0 69 73 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  isk */.  if( p->
1e7e0 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a  nPendingData ){.
1e7f0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70      assert( p->p
1e800 48 61 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e  Hash );.    p->n
1e810 50 65 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b  PendingData = 0;
1e820 0a 20 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e  .    fts5FlushOn
1e830 65 48 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a  eHash(p);.  }.}.
1e840 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
1e850 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46  5IndexOptimize(F
1e860 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1e870 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1e880 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74  Struct;.  Fts5St
1e890 72 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20  ructure *pNew = 
1e8a0 30 3b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20  0;.  int nSeg = 
1e8b0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
1e8c0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1e8d0 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75  ;.  fts5IndexFlu
1e8e0 73 68 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74  sh(p);.  pStruct
1e8f0 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1e900 52 65 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20  Read(p);..  if( 
1e910 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61  pStruct ){.    a
1e920 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e  ssert( pStruct->
1e930 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74  nSegment==fts5St
1e940 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d  ructureCountSegm
1e950 65 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b  ents(pStruct) );
1e960 0a 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72  .    nSeg = pStr
1e970 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
1e980 20 20 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b     if( nSeg>1 ){
1e990 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
1e9a0 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   = sizeof(Fts5St
1e9b0 72 75 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20  ructure);.      
1e9c0 6e 42 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63  nByte += (pStruc
1e9d0 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73  t->nLevel+1) * s
1e9e0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
1e9f0 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  ureLevel);.     
1ea00 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72   pNew = (Fts5Str
1ea10 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46  ucture*)sqlite3F
1ea20 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
1ea30 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->rc, nByte);.  
1ea40 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e    }.  }.  if( pN
1ea50 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  ew ){.    Fts5St
1ea60 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
1ea70 76 6c 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74  vl;.    int nByt
1ea80 65 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f  e = nSeg * sizeo
1ea90 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
1eaa0 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65  egment);.    pNe
1eab0 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72  w->nLevel = pStr
1eac0 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20  uct->nLevel+1;. 
1ead0 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20     pNew->nRef = 
1eae0 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72  1;.    pNew->nWr
1eaf0 69 74 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74  iteCounter = pSt
1eb00 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
1eb10 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20  ter;.    pLvl = 
1eb20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53  &pNew->aLevel[pS
1eb30 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a  truct->nLevel];.
1eb40 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
1eb50 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
1eb60 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
1eb70 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70  ts5MallocZero(&p
1eb80 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->rc, nByte);.  
1eb90 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67    if( pLvl->aSeg
1eba0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c   ){.      int iL
1ebb0 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
1ebc0 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b  int iSegOut = 0;
1ebd0 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
1ebe0 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
1ebf0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
1ec00 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53  {.        for(iS
1ec10 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
1ec20 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1ec30 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
1ec40 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e            pLvl->
1ec50 61 53 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20  aSeg[iSegOut] = 
1ec60 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1ec70 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
1ec80 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 65 67  ;.          iSeg
1ec90 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Out++;.        }
1eca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ecb0 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20  New->nSegment = 
1ecc0 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65  pLvl->nSeg = nSe
1ecd0 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
1ece0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1ecf0 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e  (pNew);.      pN
1ed00 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ew = 0;.    }.  
1ed10 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  }..  if( pNew ){
1ed20 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20  .    int iLvl = 
1ed30 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a  pNew->nLevel-1;.
1ed40 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
1ed50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1ed60 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  New->aLevel[iLvl
1ed70 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20  ].nSeg>0 ){.    
1ed80 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53    int nRem = FTS
1ed90 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b  5_OPT_WORK_UNIT;
1eda0 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65 78  .      fts5Index
1edb0 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70  MergeLevel(p, &p
1edc0 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d  New, iLvl, &nRem
1edd0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  );.    }..    ft
1ede0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
1edf0 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66  (p, pNew);.    f
1ee00 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
1ee10 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a  ase(pNew);.  }..
1ee20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
1ee30 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
1ee40 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
1ee50 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d  dexReturn(p); .}
1ee60 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
1ee70 35 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35  5IndexMerge(Fts5
1ee80 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d  Index *p, int nM
1ee90 65 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72  erge){.  Fts5Str
1eea0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
1eeb0 0a 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ..  pStruct = ft
1eec0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1eed0 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63  p);.  if( pStruc
1eee0 74 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  t && pStruct->nL
1eef0 65 76 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35  evel ){.    fts5
1ef00 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70  IndexMerge(p, &p
1ef10 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b  Struct, nMerge);
1ef20 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
1ef30 72 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75  reWrite(p, pStru
1ef40 63 74 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53  ct);.  }.  fts5S
1ef50 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
1ef60 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74  pStruct);..  ret
1ef70 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
1ef80 75 72 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69  urn(p);.}..stati
1ef90 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
1efa0 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  stCallback(.  Ft
1efb0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76  s5Index *p, .  v
1efc0 6f 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a  oid *pContext, .
1efd0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75    const u8 *pChu
1efe0 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29  nk, int nChunk.)
1eff0 7b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e  {.  assert_nc( n
1f000 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66  Chunk>=0 );.  if
1f010 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  ( nChunk>0 ){.  
1f020 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1f030 41 70 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35  AppendBlob((Fts5
1f040 42 75 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74  Buffer*)pContext
1f050 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b  , pChunk, nChunk
1f060 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65  );.  }.}..typede
1f070 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  f struct Poslist
1f080 43 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c  CallbackCtx Posl
1f090 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a  istCallbackCtx;.
1f0a0 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61  struct PoslistCa
1f0b0 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74  llbackCtx {.  Ft
1f0c0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f0e0 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
1f0f0 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35  buffer */.  Fts5
1f100 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b  Colset *pColset;
1f110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1f120 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
1f130 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a  to this column *
1f140 2f 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20  /.  int eState; 
1f150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f160 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65      /* See above
1f170 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 4f   */.};../*.** TO
1f180 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20 6d 6f  DO: Make this mo
1f190 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a 2a 2f  re efficient!.*/
1f1a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1f1b0 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28  IndexColsetTest(
1f1c0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
1f1d0 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a  set, int iCol){.
1f1e0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
1f1f0 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e  =0; i<pColset->n
1f200 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Col; i++){.    i
1f210 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  f( pColset->aiCo
1f220 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20 72 65 74  l[i]==iCol ) ret
1f230 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
1f240 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
1f250 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73   void fts5Poslis
1f260 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 28  tFilterCallback(
1f270 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1f280 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65   .  void *pConte
1f290 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
1f2a0 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
1f2b0 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
1f2c0 43 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74  CallbackCtx *pCt
1f2d0 78 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c  x = (PoslistCall
1f2e0 62 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78  backCtx*)pContex
1f2f0 74 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20  t;.  assert_nc( 
1f300 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69  nChunk>=0 );.  i
1f310 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20  f( nChunk>0 ){. 
1f320 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 72     /* Search thr
1f330 6f 75 67 68 20 74 6f 20 66 69 6e 64 20 74 68 65  ough to find the
1f340 20 66 69 72 73 74 20 76 61 72 69 6e 74 20 77 69   first varint wi
1f350 74 68 20 76 61 6c 75 65 20 31 2e 20 54 68 69 73  th value 1. This
1f360 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 73   is the.    ** s
1f370 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
1f380 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e 20 2a   columns hits. *
1f390 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b  /.    int i = 0;
1f3a0 0a 20 20 20 20 69 6e 74 20 69 53 74 61 72 74 20  .    int iStart 
1f3b0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 43  = 0;..    if( pC
1f3c0 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20 29 7b  tx->eState==2 ){
1f3d0 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b  .      int iCol;
1f3e0 0a 20 20 20 20 20 20 66 74 73 35 46 61 73 74 47  .      fts5FastG
1f3f0 65 74 56 61 72 69 6e 74 33 32 28 70 43 68 75 6e  etVarint32(pChun
1f400 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20 20 20  k, i, iCol);.   
1f410 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78     if( fts5Index
1f420 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
1f430 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29 20  >pColset, iCol) 
1f440 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d  ){.        pCtx-
1f450 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a 20 20 20  >eState = 1;.   
1f460 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1f470 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
1f480 70 43 74 78 2d 3e 70 42 75 66 2c 20 31 29 3b 0a  pCtx->pBuf, 1);.
1f490 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f4a0 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74       pCtx->eStat
1f4b0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
1f4c0 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b 0a 20     }..    do {. 
1f4d0 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43       while( i<nC
1f4e0 68 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b 5b 69  hunk && pChunk[i
1f4f0 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20  ]!=0x01 ){.     
1f500 20 20 20 77 68 69 6c 65 28 20 70 43 68 75 6e 6b     while( pChunk
1f510 5b 69 5d 20 26 20 30 78 38 30 20 29 20 69 2b 2b  [i] & 0x80 ) i++
1f520 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20  ;.        i++;. 
1f530 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1f540 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b   pCtx->eState ){
1f550 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
1f560 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1f570 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 26 70  b(pCtx->pBuf, &p
1f580 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c 20 69  Chunk[iStart], i
1f590 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20 20 20  -iStart);.      
1f5a0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43  }.      if( i<nC
1f5b0 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  hunk ){.        
1f5c0 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
1f5d0 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20    iStart = i;.  
1f5e0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
1f5f0 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b     if( i>=nChunk
1f600 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
1f610 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a  tx->eState = 2;.
1f620 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f630 20 20 20 20 20 20 20 20 20 66 74 73 35 46 61 73           fts5Fas
1f640 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68  tGetVarint32(pCh
1f650 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20  unk, i, iCol);. 
1f660 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65           pCtx->e
1f670 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65  State = fts5Inde
1f680 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78  xColsetTest(pCtx
1f690 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29  ->pColset, iCol)
1f6a0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f6b0 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCtx->eState ){.
1f6c0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1f6d0 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1f6e0 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c  Blob(pCtx->pBuf,
1f6f0 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d   &pChunk[iStart]
1f700 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20  , i-iStart);.   
1f710 20 20 20 20 20 20 20 20 20 69 53 74 61 72 74 20           iStart 
1f720 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = i;.          }
1f730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1f740 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69   }.    }while( i
1f750 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d 0a 7d  <nChunk );.  }.}
1f760 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
1f770 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
1f780 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
1f790 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f  id entry (not EO
1f7a0 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  F). This.** func
1f7b0 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65  tion appends the
1f7c0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
1f7d0 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
1f7e0 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  ent entry to.** 
1f7f0 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20  buffer pBuf. It 
1f800 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
1f810 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
1f820 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a  tion-list size.*
1f830 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  * field..*/.stat
1f840 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69  ic void fts5Segi
1f850 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
1f860 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
1f870 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
1f880 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
1f890 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75  Colset,.  Fts5Bu
1f8a0 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
1f8b0 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65  if( 0==fts5Buffe
1f8c0 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
1f8d0 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 29 20  uf, pSeg->nPos) 
1f8e0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73  ){.    if( pCols
1f8f0 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  et==0 ){.      f
1f900 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
1f910 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
1f920 70 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73  pBuf, fts5Poslis
1f930 74 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  tCallback);.    
1f940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 6f 73  }else{.      Pos
1f950 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20  listCallbackCtx 
1f960 73 43 74 78 3b 0a 20 20 20 20 20 20 73 43 74 78  sCtx;.      sCtx
1f970 2e 70 42 75 66 20 3d 20 70 42 75 66 3b 0a 20 20  .pBuf = pBuf;.  
1f980 20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74      sCtx.pColset
1f990 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20   = pColset;.    
1f9a0 20 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d 20    sCtx.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 6f 6c 73 65 74 2c 20 30 29 3b  est(pColset, 0);
1f9d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
1f9e0 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c 7c  Ctx.eState==0 ||
1f9f0 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31 20   sCtx.eState==1 
1fa00 29 3b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75  );.      fts5Chu
1fa10 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
1fa20 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
1fa30 20 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74   fts5PoslistFilt
1fa40 65 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  erCallback);.   
1fa50 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1fa60 49 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65 72  IN/OUT parameter
1fa70 20 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74 6f   (*pa) points to
1fa80 20 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74   a position list
1fa90 20 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65   n bytes in size
1faa0 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69  . If.** the posi
1fab0 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69  tion list contai
1fac0 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63  ns entries for c
1fad0 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e  olumn iCol, then
1fae0 20 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a 2a   (*pa) is set.**
1faf0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
1fb00 20 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69   sub-position-li
1fb10 73 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75  st for that colu
1fb20 6d 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  mn and the numbe
1fb30 72 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e  r of.** bytes in
1fb40 20 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f 72   it returned. Or
1fb50 2c 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  , if the argumen
1fb60 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  t position list 
1fb70 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74  does not.** cont
1fb80 61 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73 20  ain any entries 
1fb90 66 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c  for column iCol,
1fba0 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74   return 0..*/.st
1fbb0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
1fbc0 65 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20 20  exExtractCol(.  
1fbd0 63 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20 20  const u8 **pa,  
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74  /* IN/OUT: Point
1fc00 65 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f  er to poslist */
1fc10 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
1fc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc30 20 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f     /* IN: Size o
1fc40 66 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74  f poslist in byt
1fc50 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c  es */.  int iCol
1fc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc70 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d          /* Colum
1fc80 6e 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f  n to extract fro
1fc90 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a  m poslist */.){.
1fca0 20 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d    int iCurrent =
1fcb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1fcc0 20 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62 65    /* Anything be
1fcd0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 30  fore the first 0
1fce0 78 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a  x01 is col 0 */.
1fcf0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20    const u8 *p = 
1fd00 2a 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  *pa;.  const u8 
1fd10 2a 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20  *pEnd = &p[n];  
1fd20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79         /* One by
1fd30 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70  te past end of p
1fd40 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a  osition list */.
1fd50 20 20 75 38 20 70 72 65 76 20 3d 20 30 3b 0a 0a    u8 prev = 0;..
1fd60 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43    while( iCol>iC
1fd70 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  urrent ){.    /*
1fd80 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72   Advance pointer
1fd90 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e   p until it poin
1fda0 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e  ts to pEnd or an
1fdb0 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20   0x01 byte that 
1fdc0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61  is.    ** not pa
1fdd0 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a  rt of a varint *
1fde0 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 72  /.    while( (pr
1fdf0 65 76 20 26 20 30 78 38 30 29 20 7c 7c 20 2a 70  ev & 0x80) || *p
1fe00 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20  !=0x01 ){.      
1fe10 70 72 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20  prev = *p++;.   
1fe20 20 20 20 69 66 28 20 70 3d 3d 70 45 6e 64 20 29     if( p==pEnd )
1fe30 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1fe40 0a 20 20 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a  .    *pa = p++;.
1fe50 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74      p += fts5Get
1fe60 56 61 72 69 6e 74 33 32 28 70 2c 20 69 43 75 72  Varint32(p, iCur
1fe70 72 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28  rent);.  }.  if(
1fe80 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20   iCol!=iCurrent 
1fe90 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
1fea0 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  * Advance pointe
1feb0 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  r p until it poi
1fec0 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61  nts to pEnd or a
1fed0 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74  n 0x01 byte that
1fee0 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72   is.  ** not par
1fef0 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f  t of a varint */
1ff00 0a 20 20 61 73 73 65 72 74 28 20 28 70 72 65 76  .  assert( (prev
1ff10 20 26 20 30 78 38 30 29 3d 3d 30 20 29 3b 0a 20   & 0x80)==0 );. 
1ff20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64 20 26   while( p<pEnd &
1ff30 26 20 28 28 70 72 65 76 20 26 20 30 78 38 30 29  & ((prev & 0x80)
1ff40 20 7c 7c 20 2a 70 21 3d 30 78 30 31 29 20 29 7b   || *p!=0x01) ){
1ff50 0a 20 20 20 20 70 72 65 76 20 3d 20 2a 70 2b 2b  .    prev = *p++
1ff60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1ff70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a 0a 2f 2a   - (*pa);.}.../*
1ff80 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 4d 75  .** Iterator pMu
1ff90 6c 74 69 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  lti currently po
1ffa0 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
1ffb0 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e  entry (not EOF).
1ffc0 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
1ffd0 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 66 6f  n appends the fo
1ffe0 6c 6c 6f 77 69 6e 67 20 74 6f 20 62 75 66 66 65  llowing to buffe
1fff0 72 20 70 42 75 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  r pBuf:.**.**   
20000 2a 20 54 68 65 20 76 61 72 69 6e 74 20 69 44 65  * The varint iDe
20010 6c 74 61 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  lta, and.**   * 
20020 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
20030 74 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  t that currently
20040 20 70 6f 69 6e 74 73 20 74 6f 2c 20 69 6e 63 6c   points to, incl
20050 75 64 69 6e 67 20 74 68 65 20 73 69 7a 65 20 66  uding the size f
20060 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ield..**.** If a
20070 72 67 75 6d 65 6e 74 20 70 43 6f 6c 73 65 74 20  rgument pColset 
20080 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
20090 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
200a0 69 73 20 66 69 6c 74 65 72 65 64 20 61 63 63 6f  is filtered acco
200b0 72 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 43 6f 6c  rding.** to pCol
200c0 73 65 74 20 62 65 66 6f 72 65 20 62 65 69 6e 67  set before being
200d0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
200e0 20 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73   buffer. If this
200f0 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
20100 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65 73 20 69  .** no entries i
20110 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c  n the position l
20120 69 73 74 2c 20 6e 6f 74 68 69 6e 67 20 69 73 20  ist, nothing is 
20130 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
20140 62 75 66 66 65 72 20 28 6e 6f 74 0a 2a 2a 20 65  buffer (not.** e
20150 76 65 6e 20 69 44 65 6c 74 61 29 2e 0a 2a 2a 0a  ven iDelta)..**.
20160 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
20170 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
20180 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20  code is left in 
20190 70 2d 3e 72 63 2e 20 0a 2a 2f 0a 73 74 61 74 69  p->rc. .*/.stati
201a0 63 20 69 6e 74 20 66 74 73 35 41 70 70 65 6e 64  c int fts5Append
201b0 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
201c0 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69  ndex *p,.  i64 i
201d0 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 6e 64  Delta,.  Fts5Ind
201e0 65 78 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a  exIter *pMulti,.
201f0 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
20200 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75 66  olset,.  Fts5Buf
20210 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 69  fer *pBuf.){.  i
20220 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
20230 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
20240 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
20250 70 4d 75 6c 74 69 2d 3e 61 53 65 67 5b 20 70 4d  pMulti->aSeg[ pM
20260 75 6c 74 69 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  ulti->aFirst[1].
20270 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 61 73  iFirst ];.    as
20280 73 65 72 74 28 20 66 74 73 35 4d 75 6c 74 69 49  sert( fts5MultiI
20290 74 65 72 45 6f 66 28 70 2c 20 70 4d 75 6c 74 69  terEof(p, pMulti
202a0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
202b0 72 74 28 20 70 53 65 67 2d 3e 6e 50 6f 73 3e 30  rt( pSeg->nPos>0
202c0 20 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 66   );.    if( 0==f
202d0 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
202e0 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65 67  ->rc, pBuf, pSeg
202f0 2d 3e 6e 50 6f 73 2b 39 2b 39 29 20 29 7b 0a 0a  ->nPos+9+9) ){..
20300 20 20 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e        if( pSeg->
20310 69 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67  iLeafOffset+pSeg
20320 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c  ->nPos<=pSeg->pL
20330 65 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20  eaf->szLeaf .   
20340 20 20 20 20 26 26 20 28 70 43 6f 6c 73 65 74 3d      && (pColset=
20350 3d 30 20 7c 7c 20 70 43 6f 6c 73 65 74 2d 3e 6e  =0 || pColset->n
20360 43 6f 6c 3d 3d 31 29 0a 20 20 20 20 20 20 29 7b  Col==1).      ){
20370 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75  .        const u
20380 38 20 2a 70 50 6f 73 20 3d 20 26 70 53 65 67 2d  8 *pPos = &pSeg-
20390 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
203a0 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
203b0 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
203c0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
203d0 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
203e0 20 6e 50 6f 73 20 3d 20 66 74 73 35 49 6e 64 65   nPos = fts5Inde
203f0 78 45 78 74 72 61 63 74 43 6f 6c 28 26 70 50 6f  xExtractCol(&pPo
20400 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70  s, pSeg->nPos, p
20410 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d  Colset->aiCol[0]
20420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
20430 20 6e 50 6f 73 3d 3d 30 20 29 20 72 65 74 75 72   nPos==0 ) retur
20440 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  n 1;.        }el
20450 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 50  se{.          nP
20460 6f 73 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73 3b  os = pSeg->nPos;
20470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20480 20 20 20 61 73 73 65 72 74 28 20 6e 50 6f 73 3e     assert( nPos>
20490 30 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  0 );.        fts
204a0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
204b0 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69 44  dVarint(pBuf, iD
204c0 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 66  elta);.        f
204d0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
204e0 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
204f0 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20 20  nPos*2);.       
20500 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
20510 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
20520 70 50 6f 73 2c 20 6e 50 6f 73 29 3b 0a 20 20 20  pPos, nPos);.   
20530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20540 20 20 69 6e 74 20 69 53 76 31 3b 0a 20 20 20 20    int iSv1;.    
20550 20 20 20 20 69 6e 74 20 69 53 76 32 3b 0a 20 20      int iSv2;.  
20560 20 20 20 20 20 20 69 6e 74 20 69 44 61 74 61 3b        int iData;
20570 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70  ..        /* App
20580 65 6e 64 20 69 44 65 6c 74 61 20 2a 2f 0a 20 20  end iDelta */.  
20590 20 20 20 20 20 20 69 53 76 31 20 3d 20 70 42 75        iSv1 = pBu
205a0 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 66 74  f->n;.        ft
205b0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
205c0 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
205d0 44 65 6c 74 61 29 3b 0a 0a 20 20 20 20 20 20 20  Delta);..       
205e0 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
205f0 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  SIZE */.        
20600 69 53 76 32 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a  iSv2 = pBuf->n;.
20610 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20620 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
20630 6e 74 28 70 42 75 66 2c 20 70 53 65 67 2d 3e 6e  nt(pBuf, pSeg->n
20640 50 6f 73 2a 32 29 3b 0a 20 20 20 20 20 20 20 20  Pos*2);.        
20650 69 44 61 74 61 20 3d 20 70 42 75 66 2d 3e 6e 3b  iData = pBuf->n;
20660 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ..        fts5Se
20670 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c 20  giterPoslist(p, 
20680 70 53 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 70  pSeg, pColset, p
20690 42 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 69  Buf);..        i
206a0 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 0a 20 20  f( pColset ){.  
206b0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 41 63 74          int nAct
206c0 75 61 6c 20 3d 20 70 42 75 66 2d 3e 6e 20 2d 20  ual = pBuf->n - 
206d0 69 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 20  iData;.         
206e0 20 69 66 28 20 6e 41 63 74 75 61 6c 21 3d 70 53   if( nActual!=pS
206f0 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20  eg->nPos ){.    
20700 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 63 74          if( nAct
20710 75 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ual==0 ){.      
20720 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
20730 3d 20 69 53 76 31 3b 0a 20 20 20 20 20 20 20 20  = iSv1;.        
20740 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
20750 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
20760 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
20770 20 69 6e 74 20 6e 52 65 71 20 3d 20 73 71 6c 69   int nReq = sqli
20780 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
20790 4c 65 6e 28 28 75 33 32 29 28 6e 41 63 74 75 61  Len((u32)(nActua
207a0 6c 2a 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20  l*2));.         
207b0 20 20 20 20 20 77 68 69 6c 65 28 20 69 53 76 32       while( iSv2
207c0 3c 28 69 44 61 74 61 2d 6e 52 65 71 29 20 29 7b  <(iData-nReq) ){
207d0 20 70 42 75 66 2d 3e 70 5b 69 53 76 32 2b 2b 5d   pBuf->p[iSv2++]
207e0 20 3d 20 30 78 38 30 3b 20 7d 0a 20 20 20 20 20   = 0x80; }.     
207f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
20800 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70  Fts5PutVarint(&p
20810 42 75 66 2d 3e 70 5b 69 53 76 32 5d 2c 20 6e 41  Buf->p[iSv2], nA
20820 63 74 75 61 6c 2a 32 29 3b 0a 20 20 20 20 20 20  ctual*2);.      
20830 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20840 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
20850 20 20 20 20 7d 0a 0a 20 20 20 20 7d 0a 20 20 7d      }..    }.  }
20860 0a 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ..  return 0;.}.
20870 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20880 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
20890 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72  (Fts5DoclistIter
208a0 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a   *pIter){.  u8 *
208b0 70 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  p = pIter->aPosl
208c0 69 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69  ist + pIter->nSi
208d0 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73  ze + pIter->nPos
208e0 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  list;..  assert(
208f0 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
20900 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74   );.  if( p>=pIt
20910 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20  er->aEof ){.    
20920 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
20930 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
20940 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
20950 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
20960 61 72 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26  arint(p, (u64*)&
20970 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
20980 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
20990 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  elta;..    /* Re
209a0 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ad position list
209b0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28   size */.    if(
209c0 20 70 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a   p[0] & 0x80 ){.
209d0 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
209e0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69        pIter->nSi
209f0 7a 65 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  ze = fts5GetVari
20a00 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20  nt32(p, nPos);. 
20a10 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
20a20 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29  list = (nPos>>1)
20a30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20a40 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69     pIter->nPosli
20a50 73 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d  st = ((int)(p[0]
20a60 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70  )) >> 1;.      p
20a70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b  Iter->nSize = 1;
20a80 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
20a90 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b  r->aPoslist = p;
20aa0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
20ab0 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
20ac0 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42  terInit(.  Fts5B
20ad0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
20ae0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
20af0 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73  *pIter.){.  mems
20b00 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
20b10 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
20b20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
20b30 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74  = pBuf->p;.  pIt
20b40 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66  er->aEof = &pBuf
20b50 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20  ->p[pBuf->n];.  
20b60 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
20b70 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23  ext(pIter);.}..#
20b80 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  if 0./*.** Appen
20b90 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62  d a doclist to b
20ba0 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
20bb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
20bc0 61 73 73 75 6d 65 73 20 74 68 61 74 20 73 70 61  assumes that spa
20bd0 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 62 75  ce within the bu
20be0 66 66 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ffer has already
20bf0 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74   been.** allocat
20c00 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
20c10 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65  id fts5MergeAppe
20c20 6e 64 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42  ndDocid(.  Fts5B
20c30 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20  uffer *pBuf,    
20c40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
20c50 66 66 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ffer to write to
20c60 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73   */.  i64 *piLas
20c70 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  tRowid,         
20c80 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
20c90 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20   Previous rowid 
20ca0 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29  written (if any)
20cb0 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20cd0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74        /* Rowid t
20ce0 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  o append */.){. 
20cf0 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
20d00 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52  !=0 || (*piLastR
20d10 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74  owid)==0 );.  ft
20d20 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
20d30 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
20d40 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52  Rowid - *piLastR
20d50 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74  owid);.  *piLast
20d60 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
20d70 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  }.#endif..#defin
20d80 65 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  e fts5MergeAppen
20d90 64 44 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61  dDocid(pBuf, iLa
20da0 73 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29  stRowid, iRowid)
20db0 20 7b 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73   {       \.  ass
20dc0 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d  ert( (pBuf)->n!=
20dd0 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64  0 || (iLastRowid
20de0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  )==0 );         
20df0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74            \.  ft
20e00 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
20e10 6e 64 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c  ndVarint((pBuf),
20e20 20 28 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61   (iRowid) - (iLa
20e30 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28  stRowid)); \.  (
20e40 69 4c 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69  iLastRowid) = (i
20e50 52 6f 77 69 64 29 3b 20 20 20 20 20 20 20 20 20  Rowid);         
20e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
20e80 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73 20 70  ./*.** Buffers p
20e90 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61 69 6e  1 and p2 contain
20ea0 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69 73 20   doclists. This 
20eb0 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65 73 20  function merges 
20ec0 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 6f  the content.** o
20ed0 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c 69 73  f the two doclis
20ee0 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e 64 20  ts together and 
20ef0 73 65 74 73 20 62 75 66 66 65 72 20 70 31 20 74  sets buffer p1 t
20f00 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62 65 66  o the result bef
20f10 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67  ore.** returning
20f20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
20f30 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65  ror occurs, an e
20f40 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66  rror code is lef
20f50 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66 20 61  t in p->rc. If a
20f60 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a 20 61  n error has.** a
20f70 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
20f80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
20f90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
20fa0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
20fb0 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 0a  rgePrefixLists(.
20fc0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
20fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fe0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
20ff0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
21000 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20 20 20  s5Buffer *p1,   
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21020 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f 20 6d   First list to m
21030 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  erge */.  Fts5Bu
21040 66 66 65 72 20 2a 70 32 20 20 20 20 20 20 20 20  ffer *p2        
21050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
21060 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65 72 67  ond list to merg
21070 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 32  e */.){.  if( p2
21080 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34 20 69  ->n ){.    i64 i
21090 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20  LastRowid = 0;. 
210a0 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74     Fts5DoclistIt
210b0 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73 35 44  er i1;.    Fts5D
210c0 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b 0a 20  oclistIter i2;. 
210d0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 6f 75     Fts5Buffer ou
210e0 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  t;.    Fts5Buffe
210f0 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d 73 65  r tmp;.    memse
21100 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a 65 6f  t(&out, 0, sizeo
21110 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d 65 6d  f(out));.    mem
21120 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73 69 7a  set(&tmp, 0, siz
21130 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20 20 20  eof(tmp));..    
21140 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
21150 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 6f  rSize(&p->rc, &o
21160 75 74 2c 20 70 31 2d 3e 6e 20 2b 20 70 32 2d 3e  ut, p1->n + p2->
21170 6e 29 3b 0a 20 20 20 20 66 74 73 35 44 6f 63 6c  n);.    fts5Docl
21180 69 73 74 49 74 65 72 49 6e 69 74 28 70 31 2c 20  istIterInit(p1, 
21190 26 69 31 29 3b 0a 20 20 20 20 66 74 73 35 44 6f  &i1);.    fts5Do
211a0 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28 70 32  clistIterInit(p2
211b0 2c 20 26 69 32 29 3b 0a 20 20 20 20 77 68 69 6c  , &i2);.    whil
211c0 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
211d0 5f 4f 4b 20 26 26 20 28 69 31 2e 61 50 6f 73 6c  _OK && (i1.aPosl
211e0 69 73 74 21 3d 30 20 7c 7c 20 69 32 2e 61 50 6f  ist!=0 || i2.aPo
211f0 73 6c 69 73 74 21 3d 30 29 20 29 7b 0a 20 20 20  slist!=0) ){.   
21200 20 20 20 69 66 28 20 69 32 2e 61 50 6f 73 6c 69     if( i2.aPosli
21210 73 74 3d 3d 30 20 7c 7c 20 28 69 31 2e 61 50 6f  st==0 || (i1.aPo
21220 73 6c 69 73 74 20 26 26 20 69 31 2e 69 52 6f 77  slist && i1.iRow
21230 69 64 3c 69 32 2e 69 52 6f 77 69 64 29 20 29 7b  id<i2.iRowid) ){
21240 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
21250 20 65 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a   entry from i1 *
21260 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65  /.        fts5Me
21270 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26  rgeAppendDocid(&
21280 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c  out, iLastRowid,
21290 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20   i1.iRowid);.   
212a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
212b0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
212c0 75 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c  ut, i1.aPoslist,
212d0 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31 2e   i1.nPoslist+i1.
212e0 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  nSize);.        
212f0 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
21300 65 78 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20  ext(&i1);.      
21310 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
21320 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i1.aPoslist==0 
21330 7c 7c 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31  || i2.iRowid!=i1
21340 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  .iRowid ){.     
21350 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
21360 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20   from i2 */.    
21370 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
21380 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
21390 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
213a0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
213b0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
213c0 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32  endBlob(&out, i2
213d0 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50  .aPoslist, i2.nP
213e0 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29  oslist+i2.nSize)
213f0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
21400 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
21410 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  2);.      }.    
21420 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
21430 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20  i64 iPos1 = 0;. 
21440 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 32         i64 iPos2
21450 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
21460 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20  t iOff1 = 0;.   
21470 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20 3d       int iOff2 =
21480 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   0;.        u8 *
21490 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73  a1 = &i1.aPoslis
214a0 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20  t[i1.nSize];.   
214b0 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26 69       u8 *a2 = &i
214c0 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53  2.aPoslist[i2.nS
214d0 69 7a 65 5d 3b 0a 0a 20 20 20 20 20 20 20 20 46  ize];..        F
214e0 74 73 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72  ts5PoslistWriter
214f0 20 77 72 69 74 65 72 3b 0a 20 20 20 20 20 20 20   writer;.       
21500 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
21510 20 30 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65   0, sizeof(write
21520 72 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r));..        /*
21530 20 4d 65 72 67 65 20 74 68 65 20 74 77 6f 20 70   Merge the two p
21540 6f 73 69 74 69 6f 6e 20 6c 69 73 74 73 2e 20 2a  osition lists. *
21550 2f 20 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  / .        fts5M
21560 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
21570 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
21580 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
21590 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
215a0 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 0a 20 20 20  Zero(&tmp);..   
215b0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
215c0 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31  PoslistNext64(a1
215d0 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
215e0 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a  iOff1, &iPos1);.
215f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
21600 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
21610 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  (a2, i2.nPoslist
21620 2c 20 26 69 4f 66 66 32 2c 20 26 69 50 6f 73 32  , &iOff2, &iPos2
21630 29 3b 0a 0a 20 20 20 20 20 20 20 20 77 68 69 6c  );..        whil
21640 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
21650 5f 4f 4b 20 26 26 20 28 69 50 6f 73 31 3e 3d 30  _OK && (iPos1>=0
21660 20 7c 7c 20 69 50 6f 73 32 3e 3d 30 29 20 29 7b   || iPos2>=0) ){
21670 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20 69  .          i64 i
21680 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 69  New;.          i
21690 66 28 20 69 50 6f 73 32 3c 30 20 7c 7c 20 28 69  f( iPos2<0 || (i
216a0 50 6f 73 31 3e 3d 30 20 26 26 20 69 50 6f 73 31  Pos1>=0 && iPos1
216b0 3c 69 50 6f 73 32 29 20 29 7b 0a 20 20 20 20 20  <iPos2) ){.     
216c0 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 69 50         iNew = iP
216d0 6f 73 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  os1;.           
216e0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
216f0 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
21700 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
21710 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
21720 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
21730 20 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20           iNew = 
21740 69 50 6f 73 32 3b 0a 20 20 20 20 20 20 20 20 20  iPos2;.         
21750 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
21760 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
21770 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
21780 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20  ff2, &iPos2);.  
21790 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 50            if( iP
217a0 6f 73 31 3d 3d 69 50 6f 73 32 20 29 7b 0a 20 20  os1==iPos2 ){.  
217b0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
217c0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
217d0 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73  xt64(a1, i1.nPos
217e0 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 26 69 50  list, &iOff1,&iP
217f0 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
21800 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
21810 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
21820 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  = sqlite3Fts5Pos
21830 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e 64  listWriterAppend
21840 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c 20  (&tmp, &writer, 
21850 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 7d  iNew);.        }
21860 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
21870 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
21880 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
21890 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72  ferSafeAppendVar
218a0 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e 20  int(&out, tmp.n 
218b0 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
218c0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
218d0 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d 70  ndBlob(&out, tmp
218e0 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20 20  .p, tmp.n);.    
218f0 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
21900 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20 20  terNext(&i1);.  
21910 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73        fts5Doclis
21920 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b 0a  tIterNext(&i2);.
21930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21940 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
21950 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75 74  (&p->rc, p1, out
21960 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20 20  .n, out.p);.    
21970 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
21980 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75  tmp);.    fts5Bu
21990 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b 0a  fferFree(&out);.
219a0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
219b0 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77 61  id fts5BufferSwa
219c0 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70 31  p(Fts5Buffer *p1
219d0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32  , Fts5Buffer *p2
219e0 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ){.  Fts5Buffer 
219f0 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70 31  tmp = *p1;.  *p1
21a00 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d 20   = *p2;.  *p2 = 
21a10 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  tmp;.}..static v
21a20 6f 69 64 20 66 74 73 35 53 65 74 75 70 50 72 65  oid fts5SetupPre
21a30 66 69 78 49 74 65 72 28 0a 20 20 46 74 73 35 49  fixIter(.  Fts5I
21a40 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
21a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
21a60 64 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  dex to read from
21a70 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
21a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
21aa0 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69  r "ORDER BY rowi
21ab0 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f 6e  d DESC" */.  con
21ac0 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20 20  st u8 *pToken,  
21ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21ae0 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
21af0 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74 63  g prefix to matc
21b00 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b 65  h */.  int nToke
21b10 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
21b20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
21b30 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e 20  f buffer pToken 
21b40 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46 74  in bytes */.  Ft
21b50 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  s5Colset *pColse
21b60 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
21b70 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65   Restrict matche
21b80 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d  s to these colum
21b90 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  ns */.  Fts5Inde
21ba0 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20  xIter **ppIter  
21bb0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
21bc0 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  New iterator */.
21bd0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
21be0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46  re *pStruct;.  F
21bf0 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b  ts5Buffer *aBuf;
21c00 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75  .  const int nBu
21c10 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66 20  f = 32;..  aBuf 
21c20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29 66  = (Fts5Buffer*)f
21c30 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
21c40 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65  sizeof(Fts5Buffe
21c50 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74 72  r)*nBuf);.  pStr
21c60 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
21c70 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 69  ureRead(p);..  i
21c80 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72 75  f( aBuf && pStru
21c90 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ct ){.    const 
21ca0 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53 35  int flags = FTS5
21cb0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
21cc0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
21cd0 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
21ce0 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 49 6e 64  = 0;.    Fts5Ind
21cf0 65 78 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20  exIter *p1 = 0; 
21d00 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
21d10 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64  used to gather d
21d20 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a  ata from index *
21d30 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
21d40 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42  pData;.    Fts5B
21d50 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20  uffer doclist;. 
21d60 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
21d70 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = 1;..    memset
21d80 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69  (&doclist, 0, si
21d90 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a  zeof(doclist));.
21da0 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74      for(fts5Mult
21db0 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
21dc0 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c 20 70  uct, 1, flags, p
21dd0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 2d  Token, nToken, -
21de0 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20 20  1, 0, &p1);.    
21df0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
21e00 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a  rEof(p, p1)==0;.
21e10 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
21e20 69 49 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31  iIterNext2(p, p1
21e30 2c 20 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20  , &bNewTerm).   
21e40 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52   ){.      i64 iR
21e50 6f 77 69 64 20 3d 20 66 74 73 35 4d 75 6c 74 69  owid = fts5Multi
21e60 49 74 65 72 52 6f 77 69 64 28 70 31 29 3b 0a 20  IterRowid(p1);. 
21e70 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a       int nTerm;.
21e80 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
21e90 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
21ea0 69 49 74 65 72 54 65 72 6d 28 70 31 2c 20 26 6e  iIterTerm(p1, &n
21eb0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 61 73 73  Term);.      ass
21ec0 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70  ert_nc( memcmp(p
21ed0 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49  Token, pTerm, MI
21ee0 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29  N(nToken, nTerm)
21ef0 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )<=0 );.      if
21f00 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20  ( bNewTerm ){.  
21f10 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c        if( nTerm<
21f20 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70  nToken || memcmp
21f30 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
21f40 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b  nToken) ) break;
21f50 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
21f60 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 3e 30 20  if( doclist.n>0 
21f70 26 26 20 69 52 6f 77 69 64 3c 3d 69 4c 61 73 74  && iRowid<=iLast
21f80 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20  Rowid ){.       
21f90 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63 3d   for(i=0; p->rc=
21fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 6f  =SQLITE_OK && do
21fb0 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a 20  clist.n; i++){. 
21fc0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
21fd0 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20 20   i<nBuf );.     
21fe0 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69 5d       if( aBuf[i]
21ff0 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  .n==0 ){.       
22000 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
22010 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26 61  wap(&doclist, &a
22020 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
22030 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
22040 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ero(&doclist);. 
22050 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
22060 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
22070 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
22080 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c 20 26 61  (p, &doclist, &a
22090 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Buf[i]);.       
220a0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a       fts5BufferZ
220b0 65 72 6f 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ero(&aBuf[i]);. 
220c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
220d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 4c 61     }.        iLa
220e0 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
220f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
22100 21 66 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69  !fts5AppendPosli
22110 73 74 28 70 2c 20 69 52 6f 77 69 64 2d 69 4c 61  st(p, iRowid-iLa
22120 73 74 52 6f 77 69 64 2c 20 70 31 2c 20 70 43 6f  stRowid, p1, pCo
22130 6c 73 65 74 2c 20 26 64 6f 63 6c 69 73 74 29 20  lset, &doclist) 
22140 29 7b 0a 20 20 20 20 20 20 20 20 69 4c 61 73 74  ){.        iLast
22150 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
22160 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
22170 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42     for(i=0; i<nB
22180 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  uf; i++){.      
22190 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
221a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
221b0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
221c0 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74  ists(p, &doclist
221d0 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
221e0 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42     }.      fts5B
221f0 75 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b  ufferFree(&aBuf[
22200 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  i]);.    }.    f
22210 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
22220 28 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44  (p, p1);..    pD
22230 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  ata = fts5IdxMal
22240 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
22250 73 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73  s5Data) + doclis
22260 74 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44  t.n);.    if( pD
22270 61 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61  ata ){.      pDa
22280 74 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44  ta->p = (u8*)&pD
22290 61 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44  ata[1];.      pD
222a0 61 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d  ata->nn = pData-
222b0 3e 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73  >szLeaf = doclis
222c0 74 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  t.n;.      memcp
222d0 79 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c  y(pData->p, docl
222e0 69 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e  ist.p, doclist.n
222f0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
22300 74 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44  tiIterNew2(p, pD
22310 61 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74  ata, bDesc, ppIt
22320 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
22330 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64  ts5BufferFree(&d
22340 6f 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  oclist);.  }..  
22350 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
22360 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
22370 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42   sqlite3_free(aB
22380 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  uf);.}.../*.** I
22390 6e 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c  ndicate that all
223a0 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   subsequent call
223b0 73 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  s to sqlite3Fts5
223c0 49 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72  IndexWrite() per
223d0 74 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tain.** to the d
223e0 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77  ocument with row
223f0 69 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e  id iRowid..*/.in
22400 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
22410 65 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73  exBeginWrite(Fts
22420 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62  5Index *p, int b
22430 44 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77  Delete, i64 iRow
22440 69 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  id){.  assert( p
22450 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
22460 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
22470 65 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  e the hash table
22480 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
22490 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
224a0 63 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70  cated */.  if( p
224b0 2d 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->pHash==0 ){.  
224c0 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
224d0 33 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d  3Fts5HashNew(&p-
224e0 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e  >pHash, &p->nPen
224f0 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a  dingData);.  }..
22500 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68    /* Flush the h
22510 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
22520 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f  k if required */
22530 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d  .  if( iRowid<p-
22540 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20  >iWriteRowid .  
22550 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e   || (iRowid==p->
22560 69 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70  iWriteRowid && p
22570 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20  ->bDelete==0).  
22580 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67   || (p->nPending
22590 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66 69  Data > p->pConfi
225a0 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a 20  g->nHashSize) . 
225b0 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65   ){.    fts5Inde
225c0 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a 0a  xFlush(p);.  }..
225d0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
225e0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d 3e   = iRowid;.  p->
225f0 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65 74  bDelete = bDelet
22600 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  e;.  return fts5
22610 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
22620 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
22630 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f  data to disk..*/
22640 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22650 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49 6e  IndexSync(Fts5In
22660 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 43 6f 6d  dex *p, int bCom
22670 6d 69 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  mit){.  assert( 
22680 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
22690 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 46   );.  fts5IndexF
226a0 6c 75 73 68 28 70 29 3b 0a 20 20 69 66 28 20 62  lush(p);.  if( b
226b0 43 6f 6d 6d 69 74 20 29 20 66 74 73 35 43 6c 6f  Commit ) fts5Clo
226c0 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 72  seReader(p);.  r
226d0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
226e0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
226f0 2a 2a 20 44 69 73 63 61 72 64 20 61 6e 79 20 64  ** Discard any d
22700 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
22710 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
22720 20 74 61 62 6c 65 73 2e 20 44 6f 20 6e 6f 74 20   tables. Do not 
22730 77 72 69 74 65 20 69 74 0a 2a 2a 20 74 6f 20 74  write it.** to t
22740 68 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64  he database. Add
22750 69 74 69 6f 6e 61 6c 6c 79 2c 20 61 73 73 75 6d  itionally, assum
22760 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  e that the conte
22770 6e 74 73 20 6f 66 20 74 68 65 20 25 5f 64 61 74  nts of the %_dat
22780 61 0a 2a 2a 20 74 61 62 6c 65 20 6d 61 79 20 68  a.** table may h
22790 61 76 65 20 63 68 61 6e 67 65 64 20 6f 6e 20 64  ave changed on d
227a0 69 73 6b 2e 20 53 6f 20 61 6e 79 20 69 6e 2d 6d  isk. So any in-m
227b0 65 6d 6f 72 79 20 63 61 63 68 65 73 20 6f 66 20  emory caches of 
227c0 25 5f 64 61 74 61 20 0a 2a 2a 20 72 65 63 6f 72  %_data .** recor
227d0 64 73 20 6d 75 73 74 20 62 65 20 69 6e 76 61 6c  ds must be inval
227e0 69 64 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  idated..*/.int s
227f0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52  qlite3Fts5IndexR
22800 6f 6c 6c 62 61 63 6b 28 46 74 73 35 49 6e 64 65  ollback(Fts5Inde
22810 78 20 2a 70 29 7b 0a 20 20 66 74 73 35 43 6c 6f  x *p){.  fts5Clo
22820 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 66  seReader(p);.  f
22830 74 73 35 49 6e 64 65 78 44 69 73 63 61 72 64 44  ts5IndexDiscardD
22840 61 74 61 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ata(p);.  assert
22850 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
22860 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  OK );.  return S
22870 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
22880 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20 74 61  ** The %_data ta
22890 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c  ble is completel
228a0 79 20 65 6d 70 74 79 20 77 68 65 6e 20 74 68 69  y empty when thi
228b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
228c0 6c 6c 65 64 2e 20 54 68 69 73 0a 2a 2a 20 66 75  lled. This.** fu
228d0 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73  nction populates
228e0 20 69 74 20 77 69 74 68 20 74 68 65 20 69 6e 69   it with the ini
228f0 74 69 61 6c 20 73 74 72 75 63 74 75 72 65 20 6f  tial structure o
22900 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20  bjects for each 
22910 69 6e 64 65 78 2c 0a 2a 2a 20 61 6e 64 20 74 68  index,.** and th
22920 65 20 69 6e 69 74 69 61 6c 20 76 65 72 73 69 6f  e initial versio
22930 6e 20 6f 66 20 74 68 65 20 22 61 76 65 72 61 67  n of the "averag
22940 65 73 22 20 72 65 63 6f 72 64 20 28 61 20 7a 65  es" record (a ze
22950 72 6f 2d 62 79 74 65 20 62 6c 6f 62 29 2e 0a 2a  ro-byte blob)..*
22960 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
22970 35 49 6e 64 65 78 52 65 69 6e 69 74 28 46 74 73  5IndexReinit(Fts
22980 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
22990 73 35 53 74 72 75 63 74 75 72 65 20 73 3b 0a 20  s5Structure s;. 
229a0 20 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73   memset(&s, 0, s
229b0 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
229c0 75 72 65 29 29 3b 0a 20 20 66 74 73 35 44 61 74  ure));.  fts5Dat
229d0 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
229e0 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 28  VERAGES_ROWID, (
229f0 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20 30 29  const u8*)"", 0)
22a00 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
22a10 65 57 72 69 74 65 28 70 2c 20 26 73 29 3b 0a 20  eWrite(p, &s);. 
22a20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
22a30 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
22a40 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
22a50 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65  Fts5Index handle
22a60 2e 20 49 66 20 74 68 65 20 62 43 72 65 61 74 65  . If the bCreate
22a70 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
22a80 65 2c 20 63 72 65 61 74 65 0a 2a 2a 20 61 6e 64  e, create.** and
22a90 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
22aa0 75 6e 64 65 72 6c 79 69 6e 67 20 25 5f 64 61 74  underlying %_dat
22ab0 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  a table..**.** I
22ac0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 65  f successful, se
22ad0 74 20 2a 70 70 20 74 6f 20 70 6f 69 6e 74 20 74  t *pp to point t
22ae0 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65 63 74  o the new object
22af0 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
22b00 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77  TE_OK..** Otherw
22b10 69 73 65 2c 20 73 65 74 20 2a 70 70 20 74 6f 20  ise, set *pp to 
22b20 4e 55 4c 4c 20 61 6e 64 20 72 65 74 75 72 6e 20  NULL and return 
22b30 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
22b40 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
22b50 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 65  ite3Fts5IndexOpe
22b60 6e 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  n(.  Fts5Config 
22b70 2a 70 43 6f 6e 66 69 67 2c 20 0a 20 20 69 6e 74  *pConfig, .  int
22b80 20 62 43 72 65 61 74 65 2c 20 0a 20 20 46 74 73   bCreate, .  Fts
22b90 35 49 6e 64 65 78 20 2a 2a 70 70 2c 0a 20 20 63  5Index **pp,.  c
22ba0 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20  har **pzErr.){. 
22bb0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
22bc0 5f 4f 4b 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  _OK;.  Fts5Index
22bd0 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
22be0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62         /* New ob
22bf0 6a 65 63 74 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d  ject */..  *pp =
22c00 20 70 20 3d 20 28 46 74 73 35 49 6e 64 65 78 2a   p = (Fts5Index*
22c10 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
22c20 6f 63 5a 65 72 6f 28 26 72 63 2c 20 73 69 7a 65  ocZero(&rc, size
22c30 6f 66 28 46 74 73 35 49 6e 64 65 78 29 29 3b 0a  of(Fts5Index));.
22c40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22c50 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 2d 3e 70 43  _OK ){.    p->pC
22c60 6f 6e 66 69 67 20 3d 20 70 43 6f 6e 66 69 67 3b  onfig = pConfig;
22c70 0a 20 20 20 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  .    p->nWorkUni
22c80 74 20 3d 20 46 54 53 35 5f 57 4f 52 4b 5f 55 4e  t = FTS5_WORK_UN
22c90 49 54 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  IT;.    p->zData
22ca0 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
22cb0 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
22cc0 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
22cd0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
22ce0 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
22cf0 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
22d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
22d10 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
22d20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
22d30 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
22d40 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
22d50 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
22d60 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
22d70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22d90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22da0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
22db0 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
22dc0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
22dd0 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
22de0 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
22df0 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
22e00 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
22e10 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
22e20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22e30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22e40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
22e50 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
22e60 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
22e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
22e80 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22e90 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
22ea0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
22eb0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
22ec0 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
22ed0 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
22ee0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22ef0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
22f00 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
22f10 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
22f20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
22f30 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
22f40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22f50 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
22f60 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
22f70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22f80 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
22f90 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
22fa0 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  der==0 );.    sq
22fb0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22fc0 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
22fd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22fe0 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
22ff0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
23000 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
23010 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
23020 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
23030 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
23040 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
23050 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
23060 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
23070 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
23080 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
23090 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
230a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
230b0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
230c0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
230d0 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
230e0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
230f0 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
23100 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
23110 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
23120 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
23130 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
23140 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
23150 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
23160 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
23170 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
23180 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
23190 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
231a0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
231b0 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
231c0 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74  nToBytelen(const
231d0 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42   char *p, int nB
231e0 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b  yte, int nChar){
231f0 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
23200 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
23210 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
23220 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74  .    if( n>=nByt
23230 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
23240 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74     /* Input cont
23250 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
23260 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20  nChar chars */. 
23270 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
23280 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78   char)p[n++]>=0x
23290 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
232a0 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29  e( (p[n] & 0xc0)
232b0 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20  ==0x80 ) n++;.  
232c0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
232d0 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
232e0 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
232f0 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
23300 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
23310 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
23320 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
23330 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
23340 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
23350 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
23360 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Charlen(const ch
23370 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
23380 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d  ){.  int nChar =
23390 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a   0;            .
233a0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77    int i = 0;.  w
233b0 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20  hile( i<nIn ){. 
233c0 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
233d0 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d   char)pIn[i++]>=
233e0 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
233f0 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70  ile( i<nIn && (p
23400 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30  In[i] & 0xc0)==0
23410 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d  x80 ) i++;.    }
23420 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20  .    nChar++;.  
23430 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72  }.  return nChar
23440 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
23450 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
23460 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
23470 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
23480 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
23490 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
234a0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
234b0 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
234c0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
234d0 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
234e0 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
234f0 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
23500 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
23510 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
23520 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
23530 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
23540 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
23550 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
23560 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
23570 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
23580 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
23590 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
235a0 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
235b0 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
235c0 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
235d0 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
235e0 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
235f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23600 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a  Fts5IndexWrite(.
23610 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
23620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23630 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
23640 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
23650 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
23660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
23670 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
23680 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
23690 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
236a0 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
236b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
236c0 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
236d0 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
236e0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
236f0 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
23700 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
23710 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
23720 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
23730 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
23740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23750 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
23760 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
23770 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
23780 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
23790 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
237a0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
237b0 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
237c0 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
237d0 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fig;..  assert( 
237e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
237f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69   );.  assert( (i
23800 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65  Col<0)==p->bDele
23810 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  te );..  /* Add 
23820 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
23830 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65   main terms inde
23840 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  x. */.  rc = sql
23850 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
23860 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73  e(.      p->pHas
23870 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  h, p->iWriteRowi
23880 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
23890 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c  TS5_MAIN_PREFIX,
238a0 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a   pToken, nToken.
238b0 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b    );..  for(i=0;
238c0 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   i<pConfig->nPre
238d0 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  fix && rc==SQLIT
238e0 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
238f0 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35  int nByte = fts5
23900 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79  IndexCharlenToBy
23910 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  telen(pToken, nT
23920 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61  oken, pConfig->a
23930 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20  Prefix[i]);.    
23940 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
23950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
23960 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e  ts5HashWrite(p->
23970 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  pHash, .        
23980 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
23990 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54  , iCol, iPos, FT
239a0 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69  S5_MAIN_PREFIX+i
239b0 2b 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79 74  +1, pToken, nByt
239c0 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
239d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
239e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
239f0 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
23a00 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
23a10 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74  h all rowid that
23a20 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
23a30 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
23a40 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
23a50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
23a60 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20  s5IndexQuery(.  
23a70 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
23a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a90 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
23aa0 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  query */.  const
23ab0 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
23ac0 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f  nt nToken, /* To
23ad0 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20  ken (or prefix) 
23ae0 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
23af0 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
23b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23b10 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
23b20 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66  5INDEX_QUERY_X f
23b30 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
23b40 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
23b50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74            /* Mat
23b60 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  ch these columns
23b70 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49   only */.  Fts5I
23b80 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
23b90 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
23ba0 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
23bb0 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
23bc0 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
23bd0 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
23be0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
23bf0 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *pRet = 0;.  in
23c00 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46 74  t iIdx = 0;.  Ft
23c10 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b  s5Buffer buf = {
23c20 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20  0, 0, 0};..  /* 
23c30 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43 41  If the QUERY_SCA
23c40 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  N flag is set, a
23c50 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20 6d  ll other flags m
23c60 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f  ust be clear. */
23c70 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
23c80 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
23c90 45 52 59 5f 53 43 41 4e 29 3d 3d 30 20 7c 7c 20  ERY_SCAN)==0 || 
23ca0 66 6c 61 67 73 3d 3d 46 54 53 35 49 4e 44 45 58  flags==FTS5INDEX
23cb0 5f 51 55 45 52 59 5f 53 43 41 4e 20 29 3b 0a 0a  _QUERY_SCAN );..
23cc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74 73    if( sqlite3Fts
23cd0 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
23ce0 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b 65 6e  rc, &buf, nToken
23cf0 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  +1)==0 ){.    me
23d00 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20  mcpy(&buf.p[1], 
23d10 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b  pToken, nToken);
23d20 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
23d30 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20  DEBUG.    /* If 
23d40 74 68 65 20 51 55 45 52 59 5f 54 45 53 54 5f 4e  the QUERY_TEST_N
23d50 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20 73 70  OIDX flag was sp
23d60 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20 74 68  ecified, then th
23d70 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20 20 20  is must be a.   
23d80 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65 72 79   ** prefix-query
23d90 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75 73 69  . Instead of usi
23da0 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e 64 65  ng a prefix-inde
23db0 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73 74 73  x (if one exists
23dc0 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61 6c 75  ), .    ** evalu
23dd0 61 74 65 20 74 68 65 20 70 72 65 66 69 78 20 71  ate the prefix q
23de0 75 65 72 79 20 75 73 69 6e 67 20 74 68 65 20 6d  uery using the m
23df0 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e 20 54  ain FTS index. T
23e00 68 69 73 20 69 73 20 75 73 65 64 0a 20 20 20 20  his is used.    
23e10 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20  ** for internal 
23e20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
23e30 62 79 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  by the integrity
23e40 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75 67 20  -check in debug 
23e50 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c  .    ** mode onl
23e60 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  y.  */.    if( p
23e70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49  Config->bPrefixI
23e80 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  ndex==0 || (flag
23e90 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
23ea0 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20  ERY_TEST_NOIDX) 
23eb0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
23ec0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
23ed0 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
23ee0 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  );.      iIdx = 
23ef0 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  1+pConfig->nPref
23f00 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  ix;.    }else.#e
23f10 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61  ndif.    if( fla
23f20 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
23f30 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20  UERY_PREFIX ){. 
23f40 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d       int nChar =
23f50 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
23f60 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
23f70 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64  );.      for(iId
23f80 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66  x=1; iIdx<=pConf
23f90 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
23fa0 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  x++){.        if
23fb0 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  ( pConfig->aPref
23fc0 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61  ix[iIdx-1]==nCha
23fd0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
23fe0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
23ff0 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ( iIdx<=pConfig-
24000 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >nPrefix ){.    
24010 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
24020 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53  *pStruct = fts5S
24030 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b  tructureRead(p);
24040 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20  .      buf.p[0] 
24050 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  = FTS5_MAIN_PREF
24060 49 58 20 2b 20 69 49 64 78 3b 0a 20 20 20 20 20  IX + iIdx;.     
24070 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
24080 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
24090 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72  iIterNew(p, pStr
240a0 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c 20 62  uct, 1, flags, b
240b0 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
240c0 2d 31 2c 20 30 2c 20 26 70 52 65 74 29 3b 0a 20  -1, 0, &pRet);. 
240d0 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
240e0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
240f0 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uct);.      }.  
24100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
24110 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61 67  nt bDesc = (flag
24120 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
24130 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20 20  ERY_DESC)!=0;.  
24140 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46      buf.p[0] = F
24150 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 3b  TS5_MAIN_PREFIX;
24160 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75 70  .      fts5Setup
24170 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62 44  PrefixIter(p, bD
24180 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b  esc, buf.p, nTok
24190 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26  en+1, pColset, &
241a0 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pRet);.    }..  
241b0 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20    if( p->rc ){. 
241c0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
241d0 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b  IterClose(pRet);
241e0 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
241f0 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65  .      fts5Close
24200 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d  Reader(p);.    }
24210 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70  .    *ppIter = p
24220 52 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ret;.    sqlite3
24230 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
24240 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  buf);.  }.  retu
24250 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24260 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
24270 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
24280 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
24290 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
242a0 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f  rgument is at EO
242b0 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  F..*/.int sqlite
242c0 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73  3Fts5IterEof(Fts
242d0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
242e0 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
242f0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
24300 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
24310 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45  return pIter->bE
24320 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  of;.}../*.** Mov
24330 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
24340 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a  tching rowid. .*
24350 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
24360 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  5IterNext(Fts5In
24370 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
24380 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
24390 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
243a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
243b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
243c0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
243d0 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  ter, 0, 0);.  re
243e0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
243f0 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
24400 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
24410 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
24420 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77  atching term/row
24430 69 64 2e 20 55 73 65 64 20 62 79 20 74 68 65 20  id. Used by the 
24440 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65  fts5vocab module
24450 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24460 46 74 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e  Fts5IterNextScan
24470 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
24480 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e  pIter){.  Fts5In
24490 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
244a0 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72  pIndex;..  asser
244b0 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
244c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
244d0 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
244e0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
244f0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  , 0, 0);.  if( p
24500 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
24510 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
24520 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
24530 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
24540 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
24550 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67   ];.    if( pSeg
24560 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d  ->pLeaf && pSeg-
24570 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35  >term.p[0]!=FTS5
24580 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a  _MAIN_PREFIX ){.
24590 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
245a0 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61  lease(pSeg->pLea
245b0 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  f);.      pSeg->
245c0 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  pLeaf = 0;.     
245d0 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
245e0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
245f0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
24600 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
24610 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
24620 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
24630 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
24640 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
24650 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
24660 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
24670 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
24680 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
24690 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
246a0 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
246b0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
246c0 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
246d0 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  order..*/.int sq
246e0 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
246f0 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
24700 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20  ter *pIter, i64 
24710 69 4d 61 74 63 68 29 7b 0a 20 20 66 74 73 35 4d  iMatch){.  fts5M
24720 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
24730 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
24740 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a  pIter, iMatch);.
24750 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24760 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
24770 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
24780 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
24790 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69  rent rowid..*/.i
247a0 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  64 sqlite3Fts5It
247b0 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65  erRowid(Fts5Inde
247c0 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
247d0 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74   return fts5Mult
247e0 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
247f0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
24800 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
24810 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  erm..*/.const ch
24820 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49  ar *sqlite3Fts5I
24830 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65  terTerm(Fts5Inde
24840 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
24850 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b  t *pn){.  int n;
24860 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24870 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
24880 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
24890 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20  m(pIter, &n);.  
248a0 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74  *pn = n-1;.  ret
248b0 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 73  urn &z[1];.}...s
248c0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
248d0 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74  dexExtractColset
248e0 20 28 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20   (.  Fts5Colset 
248f0 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20  *pColset,       
24900 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74       /* Colset t
24910 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20  o filter on */. 
24920 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c   const u8 *pPos,
24930 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20 20 20 20   int nPos,      
24940 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73   /* Position lis
24950 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
24960 72 20 2a 70 42 75 66 20 20 20 20 20 20 20 20 20  r *pBuf         
24970 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
24980 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20   buffer */.){.  
24990 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
249a0 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  OK;.  int i;..  
249b0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 70  fts5BufferZero(p
249c0 42 75 66 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Buf);.  for(i=0;
249d0 20 69 3c 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c   i<pColset->nCol
249e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73  ; i++){.    cons
249f0 74 20 75 38 20 2a 70 53 75 62 20 3d 20 70 50 6f  t u8 *pSub = pPo
24a00 73 3b 0a 20 20 20 20 69 6e 74 20 6e 53 75 62 20  s;.    int nSub 
24a10 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  = fts5IndexExtra
24a20 63 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f  ctCol(&pSub, nPo
24a30 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  s, pColset->aiCo
24a40 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  l[i]);.    if( n
24a50 53 75 62 20 29 7b 0a 20 20 20 20 20 20 66 74 73  Sub ){.      fts
24a60 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
24a70 62 28 26 72 63 2c 20 70 42 75 66 2c 20 6e 53 75  b(&rc, pBuf, nSu
24a80 62 2c 20 70 53 75 62 29 3b 0a 20 20 20 20 7d 0a  b, pSub);.    }.
24a90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
24aa0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
24ab0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
24ac0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
24ad0 6e 67 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ng a copy of the
24ae0 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 66   position list f
24af0 6f 72 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e  or.** the curren
24b00 74 20 65 6e 74 72 79 2e 20 4f 75 74 70 75 74 20  t entry. Output 
24b10 76 61 72 69 61 62 6c 65 20 2a 70 6e 20 69 73 20  variable *pn is 
24b20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
24b30 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
24b40 2a 20 69 6e 20 62 79 74 65 73 20 62 65 66 6f 72  * in bytes befor
24b50 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
24b60 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
24b70 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 6f  position list do
24b80 65 73 20 6e 6f 74 20 69 6e 63 6c 75 64 65 20 74  es not include t
24b90 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 62 79  he "number of by
24ba0 74 65 73 22 20 76 61 72 69 6e 74 0a 2a 2a 20 66  tes" varint.** f
24bb0 69 65 6c 64 20 74 68 61 74 20 73 74 61 72 74 73  ield that starts
24bc0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
24bd0 73 74 20 6f 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69  st on disk..*/.i
24be0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
24bf0 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73  erPoslist(.  Fts
24c00 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
24c10 72 2c 20 0a 20 20 46 74 73 35 43 6f 6c 73 65 74  r, .  Fts5Colset
24c20 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20   *pColset,      
24c30 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
24c40 66 69 6c 74 65 72 20 28 6f 72 20 4e 55 4c 4c 29  filter (or NULL)
24c50 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
24c60 2a 70 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pp,            
24c70 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50 6f        /* OUT: Po
24c80 69 6e 74 65 72 20 74 6f 20 70 6f 73 69 74 69 6f  inter to positio
24c90 6e 2d 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a 20  n-list data */. 
24ca0 20 69 6e 74 20 2a 70 6e 2c 20 20 20 20 20 20 20   int *pn,       
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24cc0 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
24cd0 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 69   position-list i
24ce0 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 36 34  n bytes */.  i64
24cf0 20 2a 70 69 52 6f 77 69 64 20 20 20 20 20 20 20   *piRowid       
24d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d10 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 72 6f 77  OUT: Current row
24d20 69 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53  id */.){.  Fts5S
24d30 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26  egIter *pSeg = &
24d40 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
24d50 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
24d60 69 72 73 74 20 5d 3b 0a 20 20 61 73 73 65 72 74  irst ];.  assert
24d70 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d  ( pIter->pIndex-
24d80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
24d90 3b 0a 20 20 2a 70 69 52 6f 77 69 64 20 3d 20 70  ;.  *piRowid = p
24da0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 69  Seg->iRowid;.  i
24db0 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
24dc0 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c  fset+pSeg->nPos<
24dd0 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  =pSeg->pLeaf->sz
24de0 4c 65 61 66 20 29 7b 0a 20 20 20 20 75 38 20 2a  Leaf ){.    u8 *
24df0 70 50 6f 73 20 3d 20 26 70 53 65 67 2d 3e 70 4c  pPos = &pSeg->pL
24e00 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
24e10 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 69  afOffset];.    i
24e20 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c  f( pColset==0 ||
24e30 20 70 49 74 65 72 2d 3e 62 46 69 6c 74 65 72 65   pIter->bFiltere
24e40 64 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 20 3d  d ){.      *pn =
24e50 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20   pSeg->nPos;.   
24e60 20 20 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20     *pp = pPos;. 
24e70 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 6f     }else if( pCo
24e80 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b  lset->nCol==1 ){
24e90 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 50 6f  .      *pp = pPo
24ea0 73 3b 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 66  s;.      *pn = f
24eb0 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
24ec0 6f 6c 28 70 70 2c 20 70 53 65 67 2d 3e 6e 50 6f  ol(pp, pSeg->nPo
24ed0 73 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f  s, pColset->aiCo
24ee0 6c 5b 30 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  l[0]);.    }else
24ef0 7b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  {.      fts5Buff
24f00 65 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70  erZero(&pIter->p
24f10 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66  oslist);.      f
24f20 74 73 35 49 6e 64 65 78 45 78 74 72 61 63 74 43  ts5IndexExtractC
24f30 6f 6c 73 65 74 28 70 43 6f 6c 73 65 74 2c 20 70  olset(pColset, p
24f40 50 6f 73 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c  Pos, pSeg->nPos,
24f50 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74   &pIter->poslist
24f60 29 3b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70  );.      *pp = p
24f70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
24f80 0a 20 20 20 20 20 20 2a 70 6e 20 3d 20 70 49 74  .      *pn = pIt
24f90 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20  er->poslist.n;. 
24fa0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
24fb0 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
24fc0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
24fd0 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74  );.    fts5Segit
24fe0 65 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d  erPoslist(pIter-
24ff0 3e 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70  >pIndex, pSeg, p
25000 43 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e  Colset, &pIter->
25010 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70  poslist);.    *p
25020 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  p = pIter->posli
25030 73 74 2e 70 3b 0a 20 20 20 20 2a 70 6e 20 3d 20  st.p;.    *pn = 
25040 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 6e  pIter->poslist.n
25050 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
25060 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
25070 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
25080 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
25090 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
250a0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
250b0 74 65 72 50 6f 73 6c 69 73 74 28 29 2c 20 65 78  terPoslist(), ex
250c0 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a 20  cept that it.** 
250d0 63 6f 70 69 65 73 20 74 68 65 20 70 6f 73 69 74  copies the posit
250e0 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 74 68  ion list into th
250f0 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69 65  e buffer supplie
25100 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
25110 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
25120 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25130 49 74 65 72 50 6f 73 6c 69 73 74 42 75 66 66 65  IterPoslistBuffe
25140 72 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  r(Fts5IndexIter 
25150 2a 70 49 74 65 72 2c 20 46 74 73 35 42 75 66 66  *pIter, Fts5Buff
25160 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 46 74 73  er *pBuf){.  Fts
25170 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65  5Index *p = pIte
25180 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 46 74 73  r->pIndex;.  Fts
25190 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
251a0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
251b0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
251c0 69 46 69 72 73 74 20 5d 3b 0a 20 20 61 73 73 65  iFirst ];.  asse
251d0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
251e0 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 42 75  E_OK );.  fts5Bu
251f0 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a  fferZero(pBuf);.
25200 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73    fts5SegiterPos
25210 6c 69 73 74 28 70 2c 20 70 53 65 67 2c 20 30 2c  list(p, pSeg, 0,
25220 20 70 42 75 66 29 3b 0a 20 20 72 65 74 75 72 6e   pBuf);.  return
25230 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
25240 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  (p);.}../*.** Cl
25250 6f 73 65 20 61 6e 20 69 74 65 72 61 74 6f 72 20  ose an iterator 
25260 6f 70 65 6e 65 64 20 62 79 20 61 6e 20 65 61 72  opened by an ear
25270 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  lier call to sql
25280 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75 65  ite3Fts5IndexQue
25290 72 79 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ry()..*/.void sq
252a0 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
252b0 73 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  se(Fts5IndexIter
252c0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
252d0 70 49 74 65 72 20 29 7b 0a 20 20 20 20 46 74 73  pIter ){.    Fts
252e0 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d  5Index *pIndex =
252f0 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a   pIter->pIndex;.
25300 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
25310 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70 49 6e  rFree(pIter->pIn
25320 64 65 78 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  dex, pIter);.   
25330 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
25340 28 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a  (pIndex);.  }.}.
25350 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20  ./*.** Read and 
25360 64 65 63 6f 64 65 20 74 68 65 20 22 61 76 65 72  decode the "aver
25370 61 67 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f  ages" record fro
25380 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
25390 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
253a0 20 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69   anSize must poi
253b0 6e 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f  nt to an array o
253c0 66 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65  f size nCol, whe
253d0 72 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68  re nCol is.** th
253e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72  e number of user
253f0 20 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73   defined columns
25400 20 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c   in the FTS tabl
25410 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
25420 33 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65  3Fts5IndexGetAve
25430 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
25440 2a 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20  *p, i64 *pnRow, 
25450 69 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20  i64 *anSize){.  
25460 69 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43  int nCol = p->pC
25470 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46  onfig->nCol;.  F
25480 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
25490 0a 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20  .  *pnRow = 0;. 
254a0 20 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20   memset(anSize, 
254b0 30 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a  0, sizeof(i64) *
254c0 20 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20   nCol);.  pData 
254d0 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
254e0 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
254f0 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d  ROWID);.  if( p-
25500 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
25510 26 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  & pData->nn ){. 
25520 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20     int i = 0;.  
25530 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
25540 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
25550 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c  nt(&pData->p[i],
25560 20 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20   (u64*)pnRow);. 
25570 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
25580 3c 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43  <pData->nn && iC
25590 6f 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  ol<nCol; iCol++)
255a0 7b 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73  {.      i += fts
255b0 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74  5GetVarint(&pDat
255c0 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26  a->p[i], (u64*)&
255d0 61 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20  anSize[iCol]);. 
255e0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35     }.  }..  fts5
255f0 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74  DataRelease(pDat
25600 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  a);.  return fts
25610 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
25620 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  .}../*.** Replac
25630 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61  e the current "a
25640 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20  verages" record 
25650 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  with the content
25660 73 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  s of the buffer 
25670 0a 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20  .** supplied as 
25680 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
25690 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
256a0 74 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41  te3Fts5IndexSetA
256b0 76 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65  verages(Fts5Inde
256c0 78 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a  x *p, const u8 *
256d0 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
256e0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
256f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
25700 0a 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65  .  fts5DataWrite
25710 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  (p, FTS5_AVERAGE
25720 53 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20  S_ROWID, pData, 
25730 6e 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  nData);.  return
25740 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
25750 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (p);.}../*.** Re
25760 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
25770 75 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20  umber of blocks 
25780 74 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20  this module has 
25790 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  read from the %_
257a0 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69  data.** table si
257b0 6e 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74  nce it was creat
257c0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
257d0 65 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73  e3Fts5IndexReads
257e0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
257f0 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61    return p->nRea
25800 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  d;.}../*.** Set 
25810 74 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69  the 32-bit cooki
25820 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61  e value stored a
25830 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  t the start of a
25840 6c 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a  ll structure .**
25850 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
25860 76 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20  value passed as 
25870 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
25880 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ent..**.** Retur
25890 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
258a0 75 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e  uccessful, or an
258b0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
258c0 64 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a  de if an error.*
258d0 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74  * occurs..*/.int
258e0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
258f0 78 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49  xSetCookie(Fts5I
25900 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65  ndex *p, int iNe
25910 77 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  w){.  int rc;   
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
25940 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46  turn code */.  F
25950 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
25960 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
25970 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61      /* Configura
25980 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  tion object */. 
25990 20 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20   u8 aCookie[4]; 
259a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259b0 20 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20        /* Binary 
259c0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
259d0 66 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69  f iNew */.  sqli
259e0 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20  te3_blob *pBlob 
259f0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
25a00 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
25a10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73   );.  sqlite3Fts
25a20 35 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20  5Put32(aCookie, 
25a30 69 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73  iNew);..  rc = s
25a40 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e  qlite3_blob_open
25a50 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43  (pConfig->db, pC
25a60 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a  onfig->zDb, p->z
25a70 44 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20  DataTbl, .      
25a80 22 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54  "block", FTS5_ST
25a90 52 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31  RUCTURE_ROWID, 1
25aa0 2c 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20  , &pBlob.  );.  
25ab0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
25ac0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
25ad0 5f 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f  _blob_write(pBlo
25ae0 62 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30  b, aCookie, 4, 0
25af0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
25b00 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70  te3_blob_close(p
25b10 42 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  Blob);.  }..  re
25b20 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20  turn rc;.}..int 
25b30 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
25b40 4c 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49  LoadConfig(Fts5I
25b50 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
25b60 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
25b70 63 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20  ct;.  pStruct = 
25b80 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
25b90 64 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75  d(p);.  fts5Stru
25ba0 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74  ctureRelease(pSt
25bb0 72 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  ruct);.  return 
25bc0 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
25bd0 70 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  p);.}.../*******
25be0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25bf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c20 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
25c30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
25c70 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
25c80 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
25c90 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69  ntation of the i
25ca0 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a  ntegrity-check .
25cb0 2a 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  ** functionality
25cc0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
25cd0 72 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63  rn a simple chec
25ce0 6b 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64  ksum value based
25cf0 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   on the argument
25d00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 36 34  s..*/.static u64
25d10 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
25d20 6b 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77  ksum(.  i64 iRow
25d30 69 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c  id, .  int iCol,
25d40 20 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20   .  int iPos, . 
25d50 20 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e   int iIdx,.  con
25d60 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a  st char *pTerm,.
25d70 20 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20    int nTerm.){. 
25d80 20 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65   int i;.  u64 re
25d90 74 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65  t = iRowid;.  re
25da0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
25db0 69 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28  iCol;.  ret += (
25dc0 72 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a  ret<<3) + iPos;.
25dd0 20 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20    if( iIdx>=0 ) 
25de0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
25df0 2b 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45  + (FTS5_MAIN_PRE
25e00 46 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66  FIX + iIdx);.  f
25e10 6f 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b  or(i=0; i<nTerm;
25e20 20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65   i++) ret += (re
25e30 74 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d  t<<3) + pTerm[i]
25e40 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a  ;.  return ret;.
25e50 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
25e60 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
25e70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75  s function is pu
25e80 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c  rely an internal
25e90 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e   test. It does n
25ea0 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f  ot contribute to
25eb0 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f   .** FTS functio
25ec0 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20  nality, or even 
25ed0 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68  the integrity-ch
25ee0 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e  eck, in any way.
25ef0 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  .**.** Instead, 
25f00 69 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68  it tests that th
25f10 65 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67  e same set of pg
25f20 6e 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61  no/rowid combina
25f30 74 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69  tions are .** vi
25f40 73 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73  sited regardless
25f50 20 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20   of whether the 
25f60 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64  doclist-index id
25f70 65 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61  entified by para
25f80 6d 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64  meters.** iSegid
25f90 2f 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74  /iLeaf is iterat
25fa0 65 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f  ed in forwards o
25fb0 72 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  r reverse order.
25fc0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25fd0 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
25fe0 65 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erse(.  Fts5Inde
25ff0 78 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65  x *p, .  int iSe
26000 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
26010 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d           /* Segm
26020 65 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66  ent id to load f
26030 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65  rom */.  int iLe
26040 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
26050 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64           /* Load
26060 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
26070 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a  or this leaf */.
26080 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74  ){.  Fts5DlidxIt
26090 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a  er *pDlidx = 0;.
260a0 20 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31    u64 cksum1 = 1
260b0 33 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20  3;.  u64 cksum2 
260c0 3d 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c  = 13;..  for(pDl
260d0 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
260e0 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
260f0 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20  id, iLeaf);.    
26100 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45    fts5DlidxIterE
26110 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30  of(p, pDlidx)==0
26120 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
26130 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c  xIterNext(p, pDl
26140 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36  idx).  ){.    i6
26150 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44  4 iRowid = fts5D
26160 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
26170 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70  lidx);.    int p
26180 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49  gno = fts5DlidxI
26190 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b  terPgno(pDlidx);
261a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
261b0 6f 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  o>iLeaf );.    c
261c0 6b 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20  ksum1 += iRowid 
261d0 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32  + ((i64)pgno<<32
261e0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
261f0 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
26200 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
26210 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d  ;..  for(pDlidx=
26220 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69  fts5DlidxIterIni
26230 74 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20  t(p, 1, iSegid, 
26240 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74  iLeaf);.      ft
26250 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
26260 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20  , pDlidx)==0;.  
26270 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
26280 72 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29  rPrev(p, pDlidx)
26290 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52  .  ){.    i64 iR
262a0 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78  owid = fts5Dlidx
262b0 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78  IterRowid(pDlidx
262c0 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20  );.    int pgno 
262d0 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
262e0 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
262f0 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69   assert( fts5Dli
26300 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
26310 78 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20  x)>iLeaf );.    
26320 63 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64  cksum2 += iRowid
26330 20 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33   + ((i64)pgno<<3
26340 32 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c  2);.  }.  fts5Dl
26350 69 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69  idxIterFree(pDli
26360 64 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20  dx);.  pDlidx = 
26370 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
26380 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b  =SQLITE_OK && ck
26390 73 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70  sum1!=cksum2 ) p
263a0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
263b0 55 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  UPT;.}..static i
263c0 6e 74 20 66 74 73 35 51 75 65 72 79 43 6b 73 75  nt fts5QueryCksu
263d0 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
263e0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
263f0 20 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64       /* Fts5 ind
26400 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  ex object */.  i
26410 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
26420 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
26430 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
26440 64 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79  dex key to query
26450 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c   for */.  int n,
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26470 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26480 65 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69  e of index key i
26490 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74  n bytes */.  int
264a0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
264b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
264c0 46 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e  Flags for Fts5In
264d0 64 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36  dexQuery */.  u6
264e0 34 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20  4 *pCksum       
264f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26500 20 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75   IN/OUT: Checksu
26510 6d 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  m value */.){.  
26520 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a 70 43 6b  u64 cksum = *pCk
26530 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e 64 65 78  sum;.  Fts5Index
26540 49 74 65 72 20 2a 70 49 64 78 49 74 65 72 20 3d  Iter *pIdxIter =
26550 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73   0;.  int rc = s
26560 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
26570 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c  uery(p, z, n, fl
26580 61 67 73 2c 20 30 2c 20 26 70 49 64 78 49 74 65  ags, 0, &pIdxIte
26590 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63  r);..  while( rc
265a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
265b0 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 49 74 65  ==sqlite3Fts5Ite
265c0 72 45 6f 66 28 70 49 64 78 49 74 65 72 29 20 29  rEof(pIdxIter) )
265d0 7b 0a 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b  {.    i64 dummy;
265e0 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  .    const u8 *p
265f0 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f  Pos;.    int nPo
26600 73 3b 0a 20 20 20 20 69 36 34 20 72 6f 77 69 64  s;.    i64 rowid
26610 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 74   = sqlite3Fts5It
26620 65 72 52 6f 77 69 64 28 70 49 64 78 49 74 65 72  erRowid(pIdxIter
26630 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
26640 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
26650 73 74 28 70 49 64 78 49 74 65 72 2c 20 30 2c 20  st(pIdxIter, 0, 
26660 26 70 50 6f 73 2c 20 26 6e 50 6f 73 2c 20 26 64  &pPos, &nPos, &d
26670 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
26680 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
26690 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
266a0 74 52 65 61 64 65 72 20 73 52 65 61 64 65 72 3b  tReader sReader;
266b0 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74  .      for(sqlit
266c0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
266d0 64 65 72 49 6e 69 74 28 70 50 6f 73 2c 20 6e 50  derInit(pPos, nP
266e0 6f 73 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20  os, &sReader);. 
266f0 20 20 20 20 20 20 20 20 20 73 52 65 61 64 65 72           sReader
26700 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20  .bEof==0;.      
26710 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26720 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
26730 28 26 73 52 65 61 64 65 72 29 0a 20 20 20 20 20  (&sReader).     
26740 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26750 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32  iCol = FTS5_POS2
26760 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69  COLUMN(sReader.i
26770 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  Pos);.        in
26780 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  t iOff = FTS5_PO
26790 53 32 4f 46 46 53 45 54 28 73 52 65 61 64 65 72  S2OFFSET(sReader
267a0 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  .iPos);.        
267b0 63 6b 73 75 6d 20 5e 3d 20 66 74 73 35 49 6e 64  cksum ^= fts5Ind
267c0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77  exEntryCksum(row
267d0 69 64 2c 20 69 43 6f 6c 2c 20 69 4f 66 66 2c 20  id, iCol, iOff, 
267e0 69 49 64 78 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20  iIdx, z, n);.   
267f0 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
26800 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
26810 65 78 74 28 70 49 64 78 49 74 65 72 29 3b 0a 20  ext(pIdxIter);. 
26820 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
26830 65 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28  e3Fts5IterClose(
26840 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20 2a 70  pIdxIter);..  *p
26850 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20  Cksum = cksum;. 
26860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
26870 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26880 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65  ion is also pure
26890 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
268a0 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
268b0 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
268c0 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
268d0 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
268e0 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
268f0 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
26900 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
26910 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74  s5TestTerm(.  Ft
26920 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
26930 74 73 35 42 75 66 66 65 72 20 2a 70 50 72 65 76  ts5Buffer *pPrev
26940 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
26950 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20  * Previous term 
26960 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
26970 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  *z, int n,      
26980 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
26990 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73   new term to tes
269a0 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63  t */.  u64 expec
269b0 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73  ted,.  u64 *pCks
269c0 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  um.){.  int rc =
269d0 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50   p->rc;.  if( pP
269e0 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  rev->n==0 ){.   
269f0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
26a00 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
26a10 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d  onst u8*)z);.  }
26a20 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53  else.  if( rc==S
26a30 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72  QLITE_OK && (pPr
26a40 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63  ev->n!=n || memc
26a50 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20  mp(pPrev->p, z, 
26a60 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63  n)) ){.    u64 c
26a70 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b  ksum3 = *pCksum;
26a80 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
26a90 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20  *zTerm = (const 
26aa0 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b  char*)&pPrev->p[
26ab0 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e  1];  /* term san
26ac0 73 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f  s prefix-byte */
26ad0 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d  .    int nTerm =
26ae0 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20   pPrev->n-1;    
26af0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
26b00 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
26b10 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  s */.    int iId
26b20 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d  x = (pPrev->p[0]
26b30 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45   - FTS5_MAIN_PRE
26b40 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c  FIX);.    int fl
26b50 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f  ags = (iIdx==0 ?
26b60 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51   0 : FTS5INDEX_Q
26b70 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20  UERY_PREFIX);.  
26b80 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20    u64 ck1 = 0;. 
26b90 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a     u64 ck2 = 0;.
26ba0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
26bb0 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72  at the results r
26bc0 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20  eturned for ASC 
26bd0 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65 73  and DESC queries
26be0 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
26bf0 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61  same. If not, ca
26c00 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74 69  ll this corrupti
26c10 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  on.  */.    rc =
26c20 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
26c30 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
26c40 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63  nTerm, flags, &c
26c50 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  k1);.    if( rc=
26c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
26c70 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
26c80 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
26c90 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63  Y_DESC;.      rc
26ca0 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
26cb0 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
26cc0 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
26cd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
26ce0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26cf0 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
26d00 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26d10 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
26d20 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72  is a prefix quer
26d30 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  y, check that th
26d40 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
26d50 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  ed if the.    **
26d60 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69   the index is di
26d70 73 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73  sabled are the s
26d80 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43  ame. In both ASC
26d90 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e   and DESC order.
26da0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
26db0 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f  This check may o
26dc0 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
26dd0 20 69 66 20 74 68 65 20 68 61 73 68 20 74 61 62   if the hash tab
26de0 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69  le is empty. Thi
26df0 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61  s.    ** is beca
26e00 75 73 65 20 74 68 65 20 68 61 73 68 20 74 61 62  use the hash tab
26e10 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73  le only supports
26e20 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71   a single scan q
26e30 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61  uery at.    ** a
26e40 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d   time, and the m
26e50 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66  ulti-iter loop f
26e60 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 66  rom which this f
26e70 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
26e80 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65  d.    ** is alre
26e90 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73  ady performing s
26ea0 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20  uch a scan. */. 
26eb0 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69     if( p->nPendi
26ec0 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20  ngData==0 ){.   
26ed0 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26     if( iIdx>0 &&
26ee0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26ef0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20  {.        int f 
26f00 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45  = flags|FTS5INDE
26f10 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
26f20 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20  DX;.        ck2 
26f30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
26f40 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
26f50 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
26f60 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
26f70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
26f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
26f90 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
26fa0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
26fb0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
26fc0 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c  Idx>0 && rc==SQL
26fd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26fe0 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
26ff0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
27000 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49  TEST_NOIDX|FTS5I
27010 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
27020 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30  .        ck2 = 0
27030 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
27040 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
27050 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
27060 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
27070 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
27080 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
27090 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
270a0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
270b0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73  }.    }..    cks
270c0 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20  um3 ^= ck1;.    
270d0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  fts5BufferSet(&r
270e0 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f  c, pPrev, n, (co
270f0 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20  nst u8*)z);..   
27100 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27110 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78  OK && cksum3!=ex
27120 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20  pected ){.      
27130 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
27140 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43  T;.    }.    *pC
27150 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20  ksum = cksum3;. 
27160 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b   }.  p->rc = rc;
27170 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}. .#else.# def
27180 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69 64  ine fts5TestDlid
27190 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a  xReverse(x,y,z).
271a0 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73  # define fts5Tes
271b0 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c  tTerm(u,v,w,x,y,
271c0 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
271d0 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a   Check that:.**.
271e0 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76  **   1) All leav
271f0 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
27200 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c  en iFirst and iL
27210 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20  ast (inclusive) 
27220 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20  exist and.**    
27230 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74    contain zero t
27240 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c  erms..**   2) Al
27250 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67  l leaves of pSeg
27260 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69   between iNoRowi
27270 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63  d and iLast (inc
27280 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61 6e  lusive) exist an
27290 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69  d.**      contai
272a0 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a  n zero rowids..*
272b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
272c0 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
272d0 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74  CheckEmpty(.  Ft
272e0 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
272f0 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
27300 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
27310 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63   Segment to chec
27320 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69  k internal consi
27330 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20  stency */.  int 
27340 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e  iFirst,.  int iN
27350 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c  oRowid,.  int iL
27360 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ast.){.  int i;.
27370 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20  .  /* Now check 
27380 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
27390 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
273a0 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
273b0 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20  t leaf.  ** (a) 
273c0 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f  exist and (b) co
273d0 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20  ntain no terms. 
273e0 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73  */.  for(i=iFirs
273f0 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t; p->rc==SQLITE
27400 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b  _OK && i<=iLast;
27410 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44   i++){.    Fts5D
27420 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73  ata *pLeaf = fts
27430 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
27440 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
27450 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29  pSeg->iSegid, i)
27460 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
27470 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66   ){.      if( !f
27480 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
27490 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63  s(pLeaf) ) p->rc
274a0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
274b0 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e  .      if( i>=iN
274c0 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73  oRowid && 0!=fts
274d0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
274e0 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72  ff(pLeaf) ) p->r
274f0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
27500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
27510 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
27520 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
27530 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67  c void fts5Integ
27540 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28 46  rityCheckPgidx(F
27550 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
27560 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20  5Data *pLeaf){. 
27570 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
27580 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  0;.  int ii;..  
27590 46 74 73 35 42 75 66 66 65 72 20 62 75 66 31 20  Fts5Buffer buf1 
275a0 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73  = {0,0,0};.  Fts
275b0 35 42 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b  5Buffer buf2 = {
275c0 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20  0,0,0};..  ii = 
275d0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
275e0 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66   while( ii<pLeaf
275f0 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53  ->nn && p->rc==S
27600 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27610 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
27620 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e   iOff;.    int n
27630 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d  Incr;..    ii +=
27640 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
27650 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20  (&pLeaf->p[ii], 
27660 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72  nIncr);.    iTer
27670 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20  mOff += nIncr;. 
27680 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
27690 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66  ff;..    if( iOf
276a0 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  f>=pLeaf->szLeaf
276b0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
276c0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
276d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54      }else if( iT
276e0 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b  ermOff==nIncr ){
276f0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
27700 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
27710 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
27720 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
27730 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
27740 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e  f( (iOff+nByte)>
27750 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
27760 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
27770 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
27780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27790 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
277a0 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c  t(&p->rc, &buf1,
277b0 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e   nByte, &pLeaf->
277c0 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  p[iOff]);.      
277d0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
277e0 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42     int nKeep, nB
277f0 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  yte;.      iOff 
27800 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
27810 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
27820 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
27830 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
27840 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
27850 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
27860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65  );.      if( nKe
27870 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f  ep>buf1.n || (iO
27880 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
27890 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
278a0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
278b0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
278c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75  else{.        bu
278d0 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  f1.n = nKeep;.  
278e0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
278f0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
27900 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c  c, &buf1, nByte,
27910 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d   &pLeaf->p[iOff]
27920 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
27930 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
27940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27950 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66    res = fts5Buff
27960 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c  erCompare(&buf1,
27970 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20   &buf2);.       
27980 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d   if( res<=0 ) p-
27990 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
279a0 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
279b0 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
279c0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  Set(&p->rc, &buf
279d0 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e  2, buf1.n, buf1.
279e0 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42  p);.  }..  fts5B
279f0 75 66 66 65 72 46 72 65 65 28 26 62 75 66 31 29  ufferFree(&buf1)
27a00 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
27a10 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74  ee(&buf2);.}..st
27a20 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
27a30 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
27a40 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35  kSegment(.  Fts5
27a50 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
27a60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27a70 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
27a80 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
27a90 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
27aa0 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg      /* Segme
27ab0 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
27ac0 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
27ad0 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
27ae0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
27af0 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c  ->pConfig;.  sql
27b00 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
27b10 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b   = 0;.  int rc2;
27b20 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c  .  int iIdxPrevL
27b30 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
27b40 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69  First-1;.  int i
27b50 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20  DlidxPrevLeaf = 
27b60 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a  pSeg->pgnoLast;.
27b70 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e  .  if( pSeg->pgn
27b80 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75  oFirst==0 ) retu
27b90 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78  rn;..  fts5Index
27ba0 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
27bb0 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d  pStmt, sqlite3_m
27bc0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53  printf(.      "S
27bd0 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65 72  ELECT segid, ter
27be0 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70  m, (pgno>>1), (p
27bf0 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27  gno&1) FROM %Q.'
27c00 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
27c10 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70  gid=%d",.      p
27c20 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
27c30 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65  nfig->zName, pSe
27c40 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a  g->iSegid.  ));.
27c50 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68  .  /* Iterate th
27c60 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65  rough the b-tree
27c70 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a   hierarchy.  */.
27c80 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
27c90 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
27ca0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
27cb0 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
27cc0 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20      i64 iRow;   
27cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ce0 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
27cf0 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20  his leaf */.    
27d00 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
27d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27d20 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c   Data for this l
27d30 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  eaf */..    int 
27d40 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74  nIdxTerm = sqlit
27d50 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
27d60 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63  pStmt, 1);.    c
27d70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54  onst char *zIdxT
27d80 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  erm = (const cha
27d90 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
27da0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
27db0 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65  ;.    int iIdxLe
27dc0 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  af = sqlite3_col
27dd0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  umn_int(pStmt, 2
27de0 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44  );.    int bIdxD
27df0 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63  lidx = sqlite3_c
27e00 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
27e10 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   3);..    /* If 
27e20 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73  the leaf in ques
27e30 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
27e40 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72   been trimmed fr
27e50 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20  om the segment, 
27e60 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74  .    ** ignore t
27e70 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79  his b-tree entry
27e80 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61  . Otherwise, loa
27e90 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  d it into memory
27ea0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64  . */.    if( iId
27eb0 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f  xLeaf<pSeg->pgno
27ec0 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  First ) continue
27ed0 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53  ;.    iRow = FTS
27ee0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
27ef0 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49  pSeg->iSegid, iI
27f00 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65  dxLeaf);.    pLe
27f10 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
27f20 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20  d(p, iRow);.    
27f30 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62  if( pLeaf==0 ) b
27f40 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  reak;..    /* Ch
27f50 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
27f60 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  f contains at le
27f70 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e  ast one term, an
27f80 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  d that it is equ
27f90 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20  al.    ** to or 
27fa0 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
27fb0 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64  split-key in zId
27fc0 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65  xTerm.  Also che
27fd0 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ck that if there
27fe0 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20  .    ** is also 
27ff0 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20  a rowid pointer 
28000 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20  within the leaf 
28010 70 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20  page header, it 
28020 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20  points to a.    
28030 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ** location befo
28040 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f  re the term.  */
28050 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
28060 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  nn<=pLeaf->szLea
28070 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  f ){.      p->rc
28080 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
28090 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
280a0 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
280b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
280c0 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
280d0 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f   term on leaf */
280e0 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69  .      int iRowi
280f0 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dOff;           
28100 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
28110 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c  first rowid on l
28120 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  eaf */.      int
28130 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
28140 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
28150 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
28160 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
28170 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28190 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
281a0 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
281b0 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66  ey */..      iOf
281c0 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
281d0 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b  tTermOff(pLeaf);
281e0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
281f0 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
28200 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b  RowidOff(pLeaf);
28210 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
28220 64 4f 66 66 3e 3d 69 4f 66 66 20 29 7b 0a 20 20  dOff>=iOff ){.  
28230 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54        p->rc = FT
28240 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
28250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28260 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
28270 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
28280 3e 70 5b 69 4f 66 66 5d 2c 20 6e 54 65 72 6d 29  >p[iOff], nTerm)
28290 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  ;.        res = 
282a0 6d 65 6d 63 6d 70 28 26 70 4c 65 61 66 2d 3e 70  memcmp(&pLeaf->p
282b0 5b 69 4f 66 66 5d 2c 20 7a 49 64 78 54 65 72 6d  [iOff], zIdxTerm
282c0 2c 20 4d 49 4e 28 6e 54 65 72 6d 2c 20 6e 49 64  , MIN(nTerm, nId
282d0 78 54 65 72 6d 29 29 3b 0a 20 20 20 20 20 20 20  xTerm));.       
282e0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65   if( res==0 ) re
282f0 73 20 3d 20 6e 54 65 72 6d 20 2d 20 6e 49 64 78  s = nTerm - nIdx
28300 54 65 72 6d 3b 0a 20 20 20 20 20 20 20 20 69 66  Term;.        if
28310 28 20 72 65 73 3c 30 20 29 20 70 2d 3e 72 63 20  ( res<0 ) p->rc 
28320 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
28330 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
28340 74 73 35 49 6e 74 65 67 72 69 74 79 43 68 65 63  ts5IntegrityChec
28350 6b 50 67 69 64 78 28 70 2c 20 70 4c 65 61 66 29  kPgidx(p, pLeaf)
28360 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
28370 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
28380 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  f);.    if( p->r
28390 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
283a0 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
283b0 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
283c0 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
283d0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
283e0 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20 65  eaf.    ** (a) e
283f0 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e  xist and (b) con
28400 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a  tain no terms. *
28410 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 49  /.    fts5IndexI
28420 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d 70  ntegrityCheckEmp
28430 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20 70  ty(.        p, p
28440 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65 61  Seg, iIdxPrevLea
28450 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76 4c  f+1, iDlidxPrevL
28460 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66 2d  eaf+1, iIdxLeaf-
28470 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  1.    );.    if(
28480 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
28490 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
284a0 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e   is a doclist-in
284b0 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74 20  dex, check that 
284c0 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e 20  it looks right. 
284d0 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78 44  */.    if( bIdxD
284e0 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46 74  lidx ){.      Ft
284f0 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
28500 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f 72  idx = 0;  /* For
28510 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75   iterating throu
28520 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  gh doclist index
28530 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 50   */.      int iP
28540 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65  revLeaf = iIdxLe
28550 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  af;.      int iS
28560 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53 65  egid = pSeg->iSe
28570 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  gid;.      int i
28580 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 36  Pg = 0;.      i6
28590 34 20 69 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66  4 iKey;..      f
285a0 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
285b0 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30  idxIterInit(p, 0
285c0 2c 20 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65  , iSegid, iIdxLe
285d0 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  af);.          f
285e0 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
285f0 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20  p, pDlidx)==0;. 
28600 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
28610 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44  dxIterNext(p, pD
28620 6c 69 64 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a  lidx).      ){..
28630 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
28640 20 61 6e 79 20 72 6f 77 69 64 2d 6c 65 73 73 20   any rowid-less 
28650 70 61 67 65 73 20 74 68 61 74 20 6f 63 63 75 72  pages that occur
28660 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
28670 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
28680 20 20 20 20 20 66 6f 72 28 69 50 67 3d 69 50 72       for(iPg=iPr
28690 65 76 4c 65 61 66 2b 31 3b 20 69 50 67 3c 66 74  evLeaf+1; iPg<ft
286a0 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
286b0 70 44 6c 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b  pDlidx); iPg++){
286c0 0a 20 20 20 20 20 20 20 20 20 20 69 4b 65 79 20  .          iKey 
286d0 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
286e0 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 67  OWID(iSegid, iPg
286f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65  );.          pLe
28700 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
28710 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
28720 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
28730 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
28740 66 28 20 66 74 73 35 4c 65 61 66 46 69 72 73 74  f( fts5LeafFirst
28750 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 21  RowidOff(pLeaf)!
28760 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  =0 ) p->rc = FTS
28770 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
28780 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
28790 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
287a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
287b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 50 72     }.        iPr
287c0 65 76 4c 65 61 66 20 3d 20 66 74 73 35 44 6c 69  evLeaf = fts5Dli
287d0 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
287e0 78 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  x);..        /* 
287f0 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  Check that the l
28800 65 61 66 20 70 61 67 65 20 69 6e 64 69 63 61 74  eaf page indicat
28810 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
28820 6f 72 20 72 65 61 6c 6c 79 20 64 6f 65 73 0a 20  or really does. 
28830 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69         ** contai
28840 6e 20 74 68 65 20 72 6f 77 69 64 20 73 75 67 67  n the rowid sugg
28850 65 73 74 65 64 20 62 79 20 74 68 65 20 73 61 6d  ested by the sam
28860 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 4b  e. */.        iK
28870 65 79 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  ey = FTS5_SEGMEN
28880 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20  T_ROWID(iSegid, 
28890 69 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20  iPrevLeaf);.    
288a0 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
288b0 44 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79  DataRead(p, iKey
288c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
288d0 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20  Leaf ){.        
288e0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
288f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
28900 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66  idOff = fts5Leaf
28910 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c  FirstRowidOff(pL
28920 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20  eaf);.          
28930 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
28940 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
28950 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66     if( iRowidOff
28960 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
28970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
28980 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
28990 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  UPT;.          }
289a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
289b0 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
289c0 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f 77 69 64  &pLeaf->p[iRowid
289d0 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
289e0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  wid);.          
289f0 20 20 69 66 28 20 69 52 6f 77 69 64 21 3d 66 74    if( iRowid!=ft
28a00 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64  s5DlidxIterRowid
28a10 28 70 44 6c 69 64 78 29 20 29 20 70 2d 3e 72 63  (pDlidx) ) p->rc
28a20 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
28a30 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
28a40 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
28a50 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
28a60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
28a70 0a 0a 20 20 20 20 20 20 69 44 6c 69 64 78 50 72  ..      iDlidxPr
28a80 65 76 4c 65 61 66 20 3d 20 69 50 67 3b 0a 20 20  evLeaf = iPg;.  
28a90 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
28aa0 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
28ab0 20 20 20 20 20 66 74 73 35 54 65 73 74 44 6c 69       fts5TestDli
28ac0 64 78 52 65 76 65 72 73 65 28 70 2c 20 69 53 65  dxReverse(p, iSe
28ad0 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a  gid, iIdxLeaf);.
28ae0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28af0 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20   iDlidxPrevLeaf 
28b00 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  = pSeg->pgnoLast
28b10 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a  ;.      /* TODO:
28b20 20 43 68 65 63 6b 20 74 68 65 72 65 20 69 73 20   Check there is 
28b30 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e 64 65 78  no doclist index
28b40 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   */.    }..    i
28b50 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20 69 49  IdxPrevLeaf = iI
28b60 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a 20 20 72  dxLeaf;.  }..  r
28b70 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  c2 = sqlite3_fin
28b80 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
28b90 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
28ba0 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72  E_OK ) p->rc = r
28bb0 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67 65 20 69  c2;..  /* Page i
28bc0 74 65 72 2e 69 4c 65 61 66 20 6d 75 73 74 20 6e  ter.iLeaf must n
28bd0 6f 77 20 62 65 20 74 68 65 20 72 69 67 68 74 6d  ow be the rightm
28be0 6f 73 74 20 6c 65 61 66 2d 70 61 67 65 20 69 6e  ost leaf-page in
28bf0 20 74 68 65 20 73 65 67 6d 65 6e 74 20 2a 2f 0a   the segment */.
28c00 23 69 66 20 30 0a 20 20 69 66 28 20 70 2d 3e 72  #if 0.  if( p->r
28c10 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
28c20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70 53 65 67  iter.iLeaf!=pSeg
28c30 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
28c40 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
28c50 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23 65 6e 64  ORRUPT;.  }.#end
28c60 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  if.}.../*.** Run
28c70 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63 6b 73   internal checks
28c80 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
28c90 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 28 61  the FTS index (a
28ca0 29 20 69 73 20 69 6e 74 65 72 6e 61 6c 6c 79 20  ) is internally 
28cb0 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 61  .** consistent a
28cc0 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 73 20  nd (b) contains 
28cd0 65 6e 74 72 69 65 73 20 66 6f 72 20 77 68 69 63  entries for whic
28ce0 68 20 74 68 65 20 58 4f 52 20 6f 66 20 74 68 65  h the XOR of the
28cf0 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 73   checksums.** as
28d00 20 63 61 6c 63 75 6c 61 74 65 64 20 62 79 20 66   calculated by f
28d10 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
28d20 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e 0a 2a  um() is cksum..*
28d30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
28d40 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 6e  TE_CORRUPT if an
28d50 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e 61  y of the interna
28d60 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c 20 6f  l checks fail, o
28d70 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68 65 63  r if the.** chec
28d80 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ksum does not ma
28d90 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  tch. Return SQLI
28da0 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63 68 65  TE_OK if all che
28db0 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f 75 74  cks pass without
28dc0 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20 73 6f  .** error, or so
28dd0 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74 65 20  me other SQLite 
28de0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
28df0 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65 2e 67  other error (e.g
28e00 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75 72 73  . OOM).** occurs
28e10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28e20 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  Fts5IndexIntegri
28e30 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e 64 65  tyCheck(Fts5Inde
28e40 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75 6d 29  x *p, u64 cksum)
28e50 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  {.  u64 cksum2 =
28e60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28e70 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
28e80 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74  based on content
28e90 73 20 6f 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a  s of indexes */.
28ea0 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
28eb0 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20  list = {0,0,0}; 
28ec0 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64    /* Buffer used
28ed0 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f 73 6c 69   to hold a posli
28ee0 73 74 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  st */.  Fts5Inde
28ef0 78 49 74 65 72 20 2a 70 49 74 65 72 3b 20 20 20  xIter *pIter;   
28f00 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
28f10 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
28f20 67 68 20 65 6e 74 69 72 65 20 69 6e 64 65 78 20  gh entire index 
28f30 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
28f40 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
28f50 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
28f60 72 75 63 74 75 72 65 20 2a 2f 0a 0a 23 69 66 64  ructure */..#ifd
28f70 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
28f80 20 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74    /* Used by ext
28f90 72 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74  ra internal test
28fa0 73 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44  s only run if ND
28fb0 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
28fc0 6e 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73  ned */.  u64 cks
28fd0 75 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20  um3 = 0;        
28fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
28ff0 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f  ksum based on co
29000 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65  ntents of indexe
29010 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  s */.  Fts5Buffe
29020 72 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d  r term = {0,0,0}
29030 3b 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  ;      /* Buffer
29040 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f   used to hold mo
29050 73 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a  st recent term *
29060 2f 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a  /.#endif.  .  /*
29070 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e   Load the FTS in
29080 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
29090 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
290a0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
290b0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
290c0 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
290d0 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
290e0 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
290f0 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28   leaves */.  if(
29100 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
29110 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
29120 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
29130 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
29140 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
29150 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
29160 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
29170 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
29180 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
29190 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
291a0 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
291b0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
291c0 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
291d0 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49  ];.        fts5I
291e0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
291f0 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  ckSegment(p, pSe
29200 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
29210 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
29220 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
29230 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
29240 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
29250 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
29260 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
29270 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
29280 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
29290 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
292a0 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
292b0 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
292c0 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
292d0 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
292e0 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
292f0 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
29300 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
29310 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
29320 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
29330 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
29340 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
29350 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
29360 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
29370 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
29380 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
29390 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
293a0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
293b0 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
293c0 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
293d0 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
293e0 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
293f0 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
29400 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
29410 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
29420 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
29430 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
29440 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
29450 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
29460 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
29470 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
29480 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
29490 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
294a0 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
294b0 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  s..  */.  for(ft
294c0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
294d0 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c  , pStruct, 0, 0,
294e0 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
294f0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
29500 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
29510 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
29520 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
29530 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
29540 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
29550 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
29560 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
29570 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
29580 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
29590 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
295a0 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
295b0 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
295c0 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
295d0 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
295e0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
295f0 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
29600 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
29610 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
29620 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
29630 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
29640 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
29650 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
29660 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
29670 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
29680 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
29690 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
296a0 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
296b0 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72  .    fts5TestTer
296c0 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e  m(p, &term, z, n
296d0 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
296e0 33 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69 73 74  3);..    poslist
296f0 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  .n = 0;.    fts5
29700 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
29710 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  , &pIter->aSeg[p
29720 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
29730 69 46 69 72 73 74 5d 20 2c 20 30 2c 20 26 70 6f  iFirst] , 0, &po
29740 73 6c 69 73 74 29 3b 0a 20 20 20 20 77 68 69 6c  slist);.    whil
29750 65 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  e( 0==sqlite3Fts
29760 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70  5PoslistNext64(p
29770 6f 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73  oslist.p, poslis
29780 74 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f  t.n, &iOff, &iPo
29790 73 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  s) ){.      int 
297a0 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32  iCol = FTS5_POS2
297b0 43 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20  COLUMN(iPos);.  
297c0 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20      int iTokOff 
297d0 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  = FTS5_POS2OFFSE
297e0 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 63  T(iPos);.      c
297f0 6b 73 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64  ksum2 ^= fts5Ind
29800 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
29810 77 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f  wid, iCol, iTokO
29820 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20  ff, -1, z, n);. 
29830 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54     }.  }.  fts5T
29840 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d  estTerm(p, &term
29850 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20  , 0, 0, cksum2, 
29860 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73  &cksum3);..  fts
29870 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
29880 2c 20 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20  , pIter);.  if( 
29890 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
298a0 20 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d   && cksum!=cksum
298b0 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  2 ) p->rc = FTS5
298c0 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73  _CORRUPT;..  fts
298d0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
298e0 65 28 70 53 74 72 75 63 74 29 3b 0a 23 69 66 64  e(pStruct);.#ifd
298f0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29900 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
29910 28 26 74 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a  (&term);.#endif.
29920 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
29930 28 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65  (&poslist);.  re
29940 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
29950 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn(p);.}.../*.
29960 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64  ** Calculate and
29970 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
29980 75 6d 20 74 68 61 74 20 69 73 20 74 68 65 20 58  um that is the X
29990 4f 52 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  OR of the index 
299a0 65 6e 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75  entry.** checksu
299b0 6d 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73  m of all entries
299c0 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67   that would be g
299d0 65 6e 65 72 61 74 65 64 20 62 79 20 74 68 65 20  enerated by the 
299e0 74 6f 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a  token specified.
299f0 2a 2a 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20  ** by the final 
29a00 35 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  5 arguments..*/.
29a10 75 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49  u64 sqlite3Fts5I
29a20 6e 64 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73  ndexCksum(.  Fts
29a30 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
29a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
29a50 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
29a60 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52  ject */.  i64 iR
29a70 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20  owid,           
29a80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63            /* Doc
29a90 75 6d 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61  ument term appea
29aa0 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69  rs in */.  int i
29ab0 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
29ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
29ad0 6c 75 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72  lumn term appear
29ae0 73 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50  s in */.  int iP
29af0 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  os,             
29b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73            /* Pos
29b10 69 74 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61  ition term appea
29b20 72 73 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  rs in */.  const
29b30 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e   char *pTerm, in
29b40 74 20 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65  t nTerm    /* Te
29b50 72 6d 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b  rm at iPos */.){
29b60 0a 20 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20  .  u64 ret = 0; 
29b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29b80 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c     /* Return val
29b90 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ue */.  int iIdx
29ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29bb0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69          /* For i
29bc0 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
29bd0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72   indexes */..  r
29be0 65 74 20 3d 20 66 74 73 35 49 6e 64 65 78 45 6e  et = fts5IndexEn
29bf0 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c  tryCksum(iRowid,
29c00 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 30 2c 20   iCol, iPos, 0, 
29c10 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 0a  pTerm, nTerm);..
29c20 20 20 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49    for(iIdx=0; iI
29c30 64 78 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65  dx<pConfig->nPre
29c40 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20  fix; iIdx++){.  
29c50 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74    int nByte = ft
29c60 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f  s5IndexCharlenTo
29c70 42 79 74 65 6c 65 6e 28 70 54 65 72 6d 2c 20 6e  Bytelen(pTerm, n
29c80 54 65 72 6d 2c 20 70 43 6f 6e 66 69 67 2d 3e 61  Term, pConfig->a
29c90 50 72 65 66 69 78 5b 69 49 64 78 5d 29 3b 0a 20  Prefix[iIdx]);. 
29ca0 20 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a     if( nByte ){.
29cb0 20 20 20 20 20 20 72 65 74 20 5e 3d 20 66 74 73        ret ^= fts
29cc0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
29cd0 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  (iRowid, iCol, i
29ce0 50 6f 73 2c 20 69 49 64 78 2b 31 2c 20 70 54 65  Pos, iIdx+1, pTe
29cf0 72 6d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rm, nByte);.    
29d00 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
29d10 72 65 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ret;.}../*******
29d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d60 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
29d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
29db0 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e   Below this poin
29dc0 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65  t is the impleme
29dd0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66  ntation of the f
29de0 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61  ts5_decode() sca
29df0 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  lar.** function 
29e00 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  only..*/../*.** 
29e10 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74  Decode a segment
29e20 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d  -data rowid from
29e30 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
29e40 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
29e50 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73   is.** the oppos
29e60 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53  ite of macro FTS
29e70 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
29e80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
29e90 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69  d fts5DecodeRowi
29ea0 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c  d(.  i64 iRowid,
29eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ec0 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72       /* Rowid fr
29ed0 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  om %_data table 
29ee0 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69  */.  int *piSegi
29ef0 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
29f00 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67       /* OUT: Seg
29f10 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74  ment id */.  int
29f20 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20   *pbDlidx,      
29f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f40 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20  OUT: Dlidx flag 
29f50 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67  */.  int *piHeig
29f60 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ht,             
29f70 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69       /* OUT: Hei
29f80 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ght */.  int *pi
29f90 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  Pgno            
29fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29fb0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   Page number */.
29fc0 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28  ){.  *piPgno = (
29fd0 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
29fe0 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
29ff0 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29  ATA_PAGE_B) - 1)
2a000 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20  );.  iRowid >>= 
2a010 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42  FTS5_DATA_PAGE_B
2a020 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d  ;..  *piHeight =
2a030 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2a040 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
2a050 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20  _DATA_HEIGHT_B) 
2a060 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
2a070 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45  >>= FTS5_DATA_HE
2a080 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c  IGHT_B;..  *pbDl
2a090 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77  idx = (int)(iRow
2a0a0 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  id & 0x0001);.  
2a0b0 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f  iRowid >>= FTS5_
2a0c0 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a  DATA_DLI_B;..  *
2a0d0 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28  piSegid = (int)(
2a0e0 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
2a0f0 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49  1 << FTS5_DATA_I
2a100 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73  D_B) - 1));.}..s
2a110 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2a120 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70  ebugRowid(int *p
2a130 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
2a140 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b  pBuf, i64 iKey){
2a150 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69  .  int iSegid, i
2a160 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62  Height, iPgno, b
2a170 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20  Dlidx;       /* 
2a180 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73  Rowid compenents
2a190 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65   */.  fts5Decode
2a1a0 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65  Rowid(iKey, &iSe
2a1b0 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69  gid, &bDlidx, &i
2a1c0 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b  Height, &iPgno);
2a1d0 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d  ..  if( iSegid==
2a1e0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65  0 ){.    if( iKe
2a1f0 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  y==FTS5_AVERAGES
2a200 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
2a210 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2a220 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2a230 63 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72 61  c, pBuf, "{avera
2a240 67 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65 6c  ges} ");.    }el
2a250 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
2a260 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2a270 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2a280 66 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d 22  f, "{structure}"
2a290 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65  );.    }.  }.  e
2a2a0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
2a2b0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2a2c0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2a2d0 2c 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20 68  , "{%ssegid=%d h
2a2e0 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a 20  =%d pgno=%d}",. 
2a2f0 20 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20         bDlidx ? 
2a300 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69  "dlidx " : "", i
2a310 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20  Segid, iHeight, 
2a320 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d  iPgno.    );.  }
2a330 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
2a340 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
2a350 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  re(.  int *pRc, 
2a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a370 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
2a380 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   error code */. 
2a390 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
2a3a0 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  f,.  Fts5Structu
2a3b0 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69  re *p.){.  int i
2a3c0 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20  Lvl, iSeg;      
2a3d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
2a3e0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
2a3f0 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a  vels, segments *
2a400 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  /..  for(iLvl=0;
2a410 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b   iLvl<p->nLevel;
2a420 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74   iLvl++){.    Ft
2a430 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
2a440 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65   *pLvl = &p->aLe
2a450 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73  vel[iLvl];.    s
2a460 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2a470 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2a480 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20  , pBuf, .       
2a490 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67   " {lvl=%d nMerg
2a4a0 65 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20 69  e=%d nSeg=%d", i
2a4b0 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  Lvl, pLvl->nMerg
2a4c0 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20  e, pLvl->nSeg.  
2a4d0 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65    );.    for(iSe
2a4e0 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e  g=0; iSeg<pLvl->
2a4f0 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
2a500 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
2a510 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
2a520 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
2a530 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eg];.      sqlit
2a540 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2a550 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2a560 75 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65 61  uf, " {id=%d lea
2a570 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a 20  ves=%d..%d}", . 
2a580 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 69           pSeg->i
2a590 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67 6e  Segid, pSeg->pgn
2a5a0 6f 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70 67  oFirst, pSeg->pg
2a5b0 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b 0a  noLast.      );.
2a5c0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2a5d0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2a5e0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2a5f0 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a  f, "}");.  }.}..
2a600 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61  /*.** This is pa
2a610 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  rt of the fts5_d
2a620 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e  ecode() debuggin
2a630 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  g aid..**.** Arg
2a640 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c  uments pBlob/nBl
2a650 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65 72  ob contain a ser
2a660 69 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72 75  ialized Fts5Stru
2a670 63 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54 68  cture object. Th
2a680 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
2a690 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72  ppends a human-r
2a6a0 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65 6e  eadable represen
2a6b0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  tation of the sa
2a6c0 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20  me object.** to 
2a6d0 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65  the buffer passe
2a6e0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
2a6f0 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74  argument. .*/.st
2a700 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65  atic void fts5De
2a710 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a 20  codeStructure(. 
2a720 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20   int *pRc,      
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a740 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f   /* IN/OUT: erro
2a750 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  r code */.  Fts5
2a760 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20  Buffer *pBuf,.  
2a770 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c  const u8 *pBlob,
2a780 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20   int nBlob.){.  
2a790 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2a7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a7b0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a7c0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
2a7d0 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20 20  e *p = 0;       
2a7e0 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20 73      /* Decoded s
2a7f0 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20  tructure object 
2a800 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35 53  */..  rc = fts5S
2a810 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70  tructureDecode(p
2a820 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20  Blob, nBlob, 0, 
2a830 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  &p);.  if( rc!=S
2a840 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2a850 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 72  *pRc = rc;.    r
2a860 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74  eturn;.  }..  ft
2a870 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
2a880 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a  (pRc, pBuf, p);.
2a890 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
2a8a0 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a  elease(p);.}../*
2a8b0 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74  .** This is part
2a8c0 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
2a8d0 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20  ode() debugging 
2a8e0 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  aid..**.** Argum
2a8f0 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62  ents pBlob/nBlob
2a900 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76 65   contain an "ave
2a910 72 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20 54  rages" record. T
2a920 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
2a930 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e   appends a human
2a940 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73  -readable repres
2a950 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63 6f  entation of reco
2a960 72 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  rd to the buffer
2a970 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20 74   passed .** as t
2a980 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a990 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nt. .*/.static v
2a9a0 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 41 76  oid fts5DecodeAv
2a9b0 65 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a 70  erages(.  int *p
2a9c0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2a9d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2a9e0 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2a9f0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2aa00 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75  *pBuf,.  const u
2aa10 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *pBlob, int nB
2aa20 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20 3d  lob.){.  int i =
2aa30 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   0;.  const char
2aa40 20 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a 0a   *zSpace = "";..
2aa50 20 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f 62    while( i<nBlob
2aa60 20 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c   ){.    u64 iVal
2aa70 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
2aa80 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2aa90 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61 6c  &pBlob[i], &iVal
2aaa0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2aab0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2aac0 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2aad0 22 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c 20  "%s%d", zSpace, 
2aae0 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20 20  (int)iVal);.    
2aaf0 7a 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20 20  zSpace = " ";.  
2ab00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  }.}../*.** Buffe
2ab10 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75 6d  r (a/n) is assum
2ab20 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61 20  ed to contain a 
2ab30 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69 7a  list of serializ
2ab40 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61 64  ed varints. Read
2ab50 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74 20  .** each varint 
2ab60 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20 73  and append its s
2ab70 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
2ab80 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20 70  tion to buffer p
2ab90 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61  Buf. Return.** a
2aba0 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65 20  fter either the 
2abb0 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73 20  input buffer is 
2abc0 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20 30  exhausted or a 0
2abd0 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e 0a   value is read..
2abe0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  **.** The return
2abf0 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
2ac00 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
2ac10 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ad from the inpu
2ac20 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74 61  t buffer..*/.sta
2ac30 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63 6f  tic int fts5Deco
2ac40 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a 70  dePoslist(int *p
2ac50 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a  Rc, Fts5Buffer *
2ac60 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20 2a  pBuf, const u8 *
2ac70 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  a, int n){.  int
2ac80 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68 69   iOff = 0;.  whi
2ac90 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20  le( iOff<n ){.  
2aca0 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
2acb0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2acc0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
2acd0 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c  , iVal);.    sql
2ace0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2acf0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2ad00 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56 61  pBuf, " %d", iVa
2ad10 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  l);.  }.  return
2ad20 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
2ad30 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75 66  The start of buf
2ad40 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61 69  fer (a/n) contai
2ad50 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ns the start of 
2ad60 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20 64  a doclist. The d
2ad70 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f 72  oclist.** may or
2ad80 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68 20   may not finish 
2ad90 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66 65  within the buffe
2ada0 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  r. This function
2adb0 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74 0a   appends a text.
2adc0 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ** representatio
2add0 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f 66  n of the part of
2ade0 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68 61   the doclist tha
2adf0 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f 20  t is present to 
2ae00 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e 20  buffer.** pBuf. 
2ae10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2ae20 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
2ae30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2ae40 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
2ae50 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
2ae60 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
2ae70 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20 2a  odeDoclist(int *
2ae80 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2ae90 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
2aea0 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 36  *a, int n){.  i6
2aeb0 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20 20  4 iDocid = 0;.  
2aec0 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20  int iOff = 0;.. 
2aed0 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20   if( n>0 ){.    
2aee0 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46 74  iOff = sqlite3Ft
2aef0 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28  s5GetVarint(a, (
2af00 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a 20  u64*)&iDocid);. 
2af10 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2af20 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2af30 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64  (pRc, pBuf, " id
2af40 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
2af50 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69 4f  .  }.  while( iO
2af60 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ff<n ){.    int 
2af70 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62 44  nPos;.    int bD
2af80 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  el;.    iOff += 
2af90 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
2afa0 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50  ze(&a[iOff], &nP
2afb0 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20 20  os, &bDel);.    
2afc0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2afd0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2afe0 63 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73 3d  c, pBuf, " nPos=
2aff0 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44 65  %d%s", nPos, bDe
2b000 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20 69  l?"*":"");.    i
2b010 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64  Off += fts5Decod
2b020 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42  ePoslist(pRc, pB
2b030 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49  uf, &a[iOff], MI
2b040 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29  N(n-iOff, nPos))
2b050 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e  ;.    if( iOff<n
2b060 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44   ){.      i64 iD
2b070 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66  elta;.      iOff
2b080 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
2b090 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
2b0a0 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61  ], (u64*)&iDelta
2b0b0 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20  );.      iDocid 
2b0c0 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
2b0d0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2b0e0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2b0f0 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25  Rc, pBuf, " id=%
2b100 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20  lld", iDocid);. 
2b110 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
2b120 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iOff;.}../*.*
2b130 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  * The implementa
2b140 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66  tion of user-def
2b150 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63  ined scalar func
2b160 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65  tion fts5_decode
2b170 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
2b180 69 64 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e  id fts5DecodeFun
2b190 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
2b1a0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
2b1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2b1c0 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78  tion call contex
2b1d0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  t */.  int nArg,
2b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2b200 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61 79 73   of args (always
2b210 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33   2) */.  sqlite3
2b220 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20  _value **apVal  
2b230 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63           /* Func
2b240 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
2b250 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69  /.){.  i64 iRowi
2b260 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2b270 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2b280 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67  for record being
2b290 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e   decoded */.  in
2b2a0 74 20 69 53 65 67 69 64 2c 69 48 65 69 67 68 74  t iSegid,iHeight
2b2b0 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a  ,iPgno,bDlidx;/*
2b2c0 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74   Rowid component
2b2d0 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  s */.  const u8 
2b2e0 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20  *aBlob; int n;  
2b2f0 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64         /* Record
2b300 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20   to decode */.  
2b310 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73  u8 *a = 0;.  Fts
2b320 35 42 75 66 66 65 72 20 73 3b 20 20 20 20 20 20  5Buffer s;      
2b330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b340 42 75 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f  Build up text to
2b350 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a   return here */.
2b360 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b370 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
2b380 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2b390 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65   */.  int nSpace
2b3a0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2b3b0 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65   nArg==2 );.  me
2b3c0 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65  mset(&s, 0, size
2b3d0 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
2b3e0 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69  .  iRowid = sqli
2b3f0 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
2b400 61 70 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a  apVal[0]);..  /*
2b410 20 4d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20   Make a copy of 
2b420 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2b430 65 6e 74 20 28 61 20 62 6c 6f 62 29 20 69 6e 20  ent (a blob) in 
2b440 61 42 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c  aBlob[]. The aBl
2b450 6f 62 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69  ob[].  ** copy i
2b460 73 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54  s followed by FT
2b470 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
2b480 44 49 4e 47 20 30 78 30 30 20 62 79 74 65 73 2c  DING 0x00 bytes,
2b490 20 77 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a   which prevents.
2b4a0 20 20 2a 2a 20 62 75 66 66 65 72 20 6f 76 65 72    ** buffer over
2b4b0 72 65 61 64 73 20 65 76 65 6e 20 69 66 20 74 68  reads even if th
2b4c0 65 20 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72  e record is corr
2b4d0 75 70 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73  upt.  */.  n = s
2b4e0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
2b4f0 65 73 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  es(apVal[1]);.  
2b500 61 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  aBlob = sqlite3_
2b510 76 61 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c  value_blob(apVal
2b520 5b 31 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d  [1]);.  nSpace =
2b530 20 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a   n + FTS5_DATA_Z
2b540 45 52 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61  ERO_PADDING;.  a
2b550 20 3d 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46   = (u8*)sqlite3F
2b560 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
2b570 63 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66  c, nSpace);.  if
2b580 28 20 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65  ( a==0 ) goto de
2b590 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63  code_out;.  memc
2b5a0 70 79 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b  py(a, aBlob, n);
2b5b0 0a 0a 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52  ...  fts5DecodeR
2b5c0 6f 77 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53  owid(iRowid, &iS
2b5d0 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26  egid, &bDlidx, &
2b5e0 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
2b5f0 3b 0a 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f  ;..  fts5DebugRo
2b600 77 69 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f  wid(&rc, &s, iRo
2b610 77 69 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69  wid);.  if( bDli
2b620 64 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  dx ){.    Fts5Da
2b630 74 61 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74  ta dlidx;.    Ft
2b640 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a  s5DlidxLvl lvl;.
2b650 0a 20 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61  .    dlidx.p = a
2b660 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d  ;.    dlidx.nn =
2b670 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   n;..    memset(
2b680 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &lvl, 0, sizeof(
2b690 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a  Fts5DlidxLvl));.
2b6a0 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20      lvl.pData = 
2b6b0 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e  &dlidx;.    lvl.
2b6c0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e  iLeafPgno = iPgn
2b6d0 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35  o;..    for(fts5
2b6e0 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76  DlidxLvlNext(&lv
2b6f0 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b  l); lvl.bEof==0;
2b700 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
2b710 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20  t(&lvl)){.      
2b720 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2b730 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72  rAppendPrintf(&r
2b740 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20  c, &s, .        
2b750 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c    " %d(%lld)", l
2b760 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76  vl.iLeafPgno, lv
2b770 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29  l.iRowid.      )
2b780 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
2b790 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b  if( iSegid==0 ){
2b7a0 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d  .    if( iRowid=
2b7b0 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52  =FTS5_AVERAGES_R
2b7c0 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74  OWID ){.      ft
2b7d0 73 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73  s5DecodeAverages
2b7e0 28 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b  (&rc, &s, a, n);
2b7f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b800 20 20 66 74 73 35 44 65 63 6f 64 65 53 74 72 75    fts5DecodeStru
2b810 63 74 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61  cture(&rc, &s, a
2b820 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , n);.    }.  }e
2b830 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66  lse{.    Fts5Buf
2b840 66 65 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20  fer term;       
2b850 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
2b860 74 20 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d  t term read from
2b870 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74   page */.    int
2b880 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20   szLeaf;        
2b890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
2b8a0 66 73 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e  fset of pgidx in
2b8b0 20 61 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20   a[] */.    int 
2b8c0 69 50 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69  iPgidxOff;.    i
2b8d0 6e 74 20 69 50 67 69 64 78 50 72 65 76 20 3d 20  nt iPgidxPrev = 
2b8e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
2b8f0 50 72 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72  Previous value r
2b900 65 61 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a  ead from pgidx *
2b910 2f 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f  /.    int iTermO
2b920 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ff = 0;.    int 
2b930 69 52 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20  iRowidOff = 0;. 
2b940 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
2b950 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a   int nDoclist;..
2b960 20 20 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d      memset(&term
2b970 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
2b980 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69  Buffer));..    i
2b990 66 28 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20  f( n<4 ){.      
2b9a0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2b9b0 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c  rSet(&rc, &s, 7,
2b9c0 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72   (const u8*)"cor
2b9d0 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f  rupt");.      go
2b9e0 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20  to decode_out;. 
2b9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ba00 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35  iRowidOff = fts5
2ba10 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20  GetU16(&a[0]);. 
2ba20 20 20 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d       iPgidxOff =
2ba30 20 73 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65   szLeaf = fts5Ge
2ba40 74 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20  tU16(&a[2]);.   
2ba50 20 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66     if( iPgidxOff
2ba60 3c 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  <n ){.        ft
2ba70 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
2ba80 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65  [iPgidxOff], iTe
2ba90 72 6d 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a  rmOff);.      }.
2baa0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
2bab0 63 6f 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f  code the positio
2bac0 6e 20 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74  n list tail at t
2bad0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
2bae0 70 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  page */.    if( 
2baf0 69 52 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a  iRowidOff!=0 ){.
2bb00 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f        iOff = iRo
2bb10 77 69 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73  widOff;.    }els
2bb20 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d  e if( iTermOff!=
2bb30 30 20 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  0 ){.      iOff 
2bb40 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20  = iTermOff;.    
2bb50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66  }else{.      iOf
2bb60 66 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20  f = szLeaf;.    
2bb70 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64 65  }.    fts5Decode
2bb80 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c  Poslist(&rc, &s,
2bb90 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b   &a[4], iOff-4);
2bba0 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
2bbb0 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74  any more doclist
2bbc0 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65 61   data that appea
2bbd0 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62  rs on the page b
2bbe0 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  efore the.    **
2bbf0 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a   first term. */.
2bc00 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28      nDoclist = (
2bc10 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d  iTermOff ? iTerm
2bc20 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20  Off : szLeaf) - 
2bc30 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65  iOff;.    fts5De
2bc40 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c  codeDoclist(&rc,
2bc50 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e   &s, &a[iOff], n
2bc60 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77  Doclist);..    w
2bc70 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c  hile( iPgidxOff<
2bc80 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62  n ){.      int b
2bc90 46 69 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f  First = (iPgidxO
2bca0 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20  ff==szLeaf);    
2bcb0 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72   /* True for fir
2bcc0 73 74 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20  st term on page 
2bcd0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  */.      int nBy
2bce0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bd00 2a 20 42 79 74 65 73 20 6f 66 20 64 61 74 61 20  * Bytes of data 
2bd10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e  */.      int iEn
2bd20 64 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  d;.      .      
2bd30 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
2bd40 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
2bd50 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74  iPgidxOff], nByt
2bd60 65 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78  e);.      iPgidx
2bd70 50 72 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  Prev += nByte;. 
2bd80 20 20 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69       iOff = iPgi
2bd90 64 78 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69  dxPrev;..      i
2bda0 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29  f( iPgidxOff<n )
2bdb0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65  {.        fts5Ge
2bdc0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
2bdd0 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b  idxOff], nByte);
2bde0 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20  .        iEnd = 
2bdf0 69 50 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79  iPgidxPrev + nBy
2be00 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  te;.      }else{
2be10 0a 20 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20  .        iEnd = 
2be20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a  szLeaf;.      }.
2be30 0a 20 20 20 20 20 20 69 66 28 20 62 46 69 72 73  .      if( bFirs
2be40 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2be50 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2be60 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
2be70 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2be80 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65    term.n = nByte
2be90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2bea0 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
2beb0 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
2bec0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2bed0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
2bee0 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c  Blob(&rc, &term,
2bef0 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d   nByte, &a[iOff]
2bf00 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  );.      iOff +=
2bf10 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73   nByte;..      s
2bf20 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2bf30 41 70 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20  AppendPrintf(.  
2bf40 20 20 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c          &rc, &s,
2bf50 20 22 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74   " term=%.*s", t
2bf60 65 72 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68  erm.n, (const ch
2bf70 61 72 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20  ar*)term.p.     
2bf80 20 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   );.      iOff +
2bf90 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  = fts5DecodeDocl
2bfa0 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
2bfb0 69 4f 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66  iOff], iEnd-iOff
2bfc0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  );.    }..    ft
2bfd0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
2bfe0 72 6d 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63  rm);.  }.  . dec
2bff0 6f 64 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ode_out:.  sqlit
2c000 65 33 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66  e3_free(a);.  if
2c010 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2c020 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
2c030 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c  esult_text(pCtx,
2c040 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e   (const char*)s.
2c050 70 2c 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54  p, s.n, SQLITE_T
2c060 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
2c070 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
2c080 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
2c090 65 28 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d  e(pCtx, rc);.  }
2c0a0 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
2c0b0 65 28 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(&s);.}../*.** 
2c0c0 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
2c0d0 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
2c0e0 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
2c0f0 6f 6e 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e  on fts5_rowid().
2c100 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2c110 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f  fts5RowidFunctio
2c120 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
2c130 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
2c140 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2c150 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
2c160 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c180 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c190 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20  args (always 2) 
2c1a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
2c1b0 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
2c1c0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2c1d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2c1e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2c1f0 41 72 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d  Arg;.  if( nArg=
2c200 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2c210 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70  3_result_error(p
2c220 43 74 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a  Ctx, "should be:
2c230 20 66 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a   fts5_rowid(subj
2c240 65 63 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29  ect, ....)", -1)
2c250 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
2c260 41 72 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Arg = (const cha
2c270 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
2c280 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
2c290 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
2c2a0 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
2c2b0 2c 20 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a  , "segment") ){.
2c2c0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
2c2d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 65 67 69  ;.      int segi
2c2e0 64 2c 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69  d, pgno;.      i
2c2f0 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
2c300 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
2c310 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c  sult_error(pCtx,
2c320 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
2c330 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72  hould be: fts5_r
2c340 6f 77 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20  owid('segment', 
2c350 73 65 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20  segid, pgno))", 
2c360 2d 31 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  -1.        );.  
2c370 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c380 20 20 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74     segid = sqlit
2c390 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
2c3a0 61 6c 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[1]);.        
2c3b0 70 67 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76  pgno = sqlite3_v
2c3c0 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32  alue_int(apVal[2
2c3d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77  ]);.        iRow
2c3e0 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e  id = FTS5_SEGMEN
2c3f0 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70  T_ROWID(segid, p
2c400 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71  gno);.        sq
2c410 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
2c420 36 34 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29  64(pCtx, iRowid)
2c430 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
2c440 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2c450 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
2c460 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22  pCtx, .        "
2c470 66 69 72 73 74 20 61 72 67 20 74 6f 20 66 74 73  first arg to fts
2c480 35 5f 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62  5_rowid() must b
2c490 65 20 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d  e 'segment'" , -
2c4a0 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  1.      );.    }
2c4b0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
2c4c0 69 73 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20  is is called as 
2c4d0 70 61 72 74 20 6f 66 20 72 65 67 69 73 74 65 72  part of register
2c4e0 69 6e 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64  ing the FTS5 mod
2c4f0 75 6c 65 20 77 69 74 68 20 64 61 74 61 62 61 73  ule with databas
2c500 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
2c510 64 62 2e 20 49 74 20 72 65 67 69 73 74 65 72 73  db. It registers
2c520 20 73 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65   several user-de
2c530 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e  fined scalar fun
2c540 63 74 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a  ctions useful.**
2c550 20 77 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a   with FTS5..**.*
2c560 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2c570 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
2c580 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
2c590 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65  ror occurs, some
2c5a0 20 6f 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65   other.** SQLite
2c5b0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2c5c0 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e  eturned instead.
2c5d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2c5e0 74 73 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c  ts5IndexInit(sql
2c5f0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
2c600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
2c610 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
2c620 20 20 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64       db, "fts5_d
2c630 65 63 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54  ecode", 2, SQLIT
2c640 45 5f 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44  E_UTF8, 0, fts5D
2c650 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30  ecodeFunction, 0
2c660 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
2c670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c690 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
2c6a0 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66  (.        db, "f
2c6b0 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20  ts5_rowid", -1, 
2c6c0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
2c6d0 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f  fts5RowidFunctio
2c6e0 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20  n, 0, 0.    );. 
2c6f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2c700 7d 0a 0a                                         }..