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

Artifact ffb95101cab310700ccedd641f4ac8a92b1bace8:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
28e0: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
28f0: 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e     /* Max pendin
2900: 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c  g data before fl
2910: 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ush to disk */. 
2920: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74   int nPendingDat
2930: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2940: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2950: 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74  s of pending dat
2960: 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74  a */.  i64 iWrit
2970: 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  eRowid;         
2980: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2990: 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20  for current doc 
29a0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
29b0: 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 3b 20  .  int bDelete; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
29e0: 69 74 65 20 69 73 20 61 20 64 65 6c 65 74 65 20  ite is a delete 
29f0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2a00: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a30: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2a40: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2a50: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2a60: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2a70: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2a80: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2aa0: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2ab0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2ac0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2ad0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2ae0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2af0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2b00: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
2b10: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2b20: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
2b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
2b40: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
2b50: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c   id<=?" */.  sql
2b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 57  ite3_stmt *pIdxW
2b70: 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  riter;       /* 
2b80: 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64  "INSERT ... %_id
2b90: 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  x VALUES(?,?,?,?
2ba0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2bb0: 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65 74 65  stmt *pIdxDelete
2bc0: 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45  r;      /* "DELE
2bd0: 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20 57 48  TE FROM %_idx WH
2be0: 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20  ERE segid=? */. 
2bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c00: 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74  IdxSelect;.  int
2c10: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2c40: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
2c50: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
2c60: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38  clistIter {.  u8
2c70: 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20 20   *aEof;         
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
2ca0: 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64  te past end of d
2cb0: 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20  oclist */..  /* 
2cc0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
2cd0: 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74  . aPoslist==0 at
2ce0: 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52   EOF */.  i64 iR
2cf0: 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73  owid;.  u8 *aPos
2d00: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73  list;.  int nPos
2d10: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69 7a  list;.  int nSiz
2d20: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  e;.};../*.** The
2d30: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
2d40: 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63   "structure" rec
2d50: 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64  ord for each ind
2d60: 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74  ex are represent
2d70: 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46  ed.** using an F
2d80: 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63  ts5Structure rec
2d90: 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57  ord in memory. W
2da0: 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e  hich uses instan
2db0: 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f  ces of the .** o
2dc0: 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75  ther Fts5Structu
2dd0: 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63  reXXX types as c
2de0: 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74  omponents..*/.st
2df0: 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75  ruct Fts5Structu
2e00: 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e  reSegment {.  in
2e10: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e30: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
2e40: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
2e70: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
2e80: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
2e90: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
2ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
2eb0: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
2ec0: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
2ed0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2ee0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
2ef0: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2f20: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
2f30: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
2f40: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
2f70: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
2f80: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2f90: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
2fa0: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
2fb0: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
2fc0: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
2fd0: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
2fe0: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e  Structure {.  in
2ff0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   Object referenc
3020: 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34  e count */.  u64
3030: 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20   nWriteCounter; 
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69  Total leaves wri
3060: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20  tten to level 0 
3070: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
3080: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3090: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65       /* Total se
30a0: 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73  gments in this s
30b0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
30c0: 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20  t nLevel;       
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30e0: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   Number of level
30f0: 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20  s in this index 
3100: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
3110: 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31  reLevel aLevel[1
3120: 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  ];   /* Array of
3130: 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62   nLevel level ob
3140: 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  jects */.};../*.
3150: 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20  ** An object of 
3160: 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69 74  type Fts5SegWrit
3170: 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  er is used to wr
3180: 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e  ite to segments.
3190: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
31a0: 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  ageWriter {.  in
31b0: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
31e0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
31f0: 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b 20  int iPrevPgidx; 
3200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3210: 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c 75  /* Previous valu
3220: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 70  e written into p
3230: 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42 75  gidx */.  Fts5Bu
3240: 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20 20  ffer buf;       
3250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
3260: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c  fer containing l
3270: 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46 74  eaf data */.  Ft
3280: 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b 20  s5Buffer pgidx; 
3290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
32b0: 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a 2f  ng page-index */
32c0: 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65  .  Fts5Buffer te
32d0: 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rm;             
32e0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
32f0: 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75 73  taining previous
3300: 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
3310: 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 44  .};.struct Fts5D
3320: 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20 69  lidxWriter {.  i
3330: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3350: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3360: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3370: 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64 3b   int bPrevValid;
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72 65   /* True if iPre
33a0: 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  v is valid */.  
33b0: 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20 20  i64 iPrev;      
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
33e0: 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e 20  d value written 
33f0: 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74 73  to page */.  Fts
3400: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3420: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3430: 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  g page data */.}
3440: 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65 67  ;.struct Fts5Seg
3450: 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20 69  Writer {.  int i
3460: 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  Segid;          
3470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
3480: 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  gid to write to 
3490: 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72 69  */.  Fts5PageWri
34a0: 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20 20  ter writer;     
34b0: 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69 74       /* PageWrit
34c0: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69  er object */.  i
34d0: 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20 20  64 iPrevRowid;  
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
34f0: 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  * Previous rowid
3500: 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72 72   written to curr
3510: 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75 38  ent leaf */.  u8
3520: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f   bFirstRowidInDo
3530: 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f 2a  clist;        /*
3540: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3550: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3560: 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20  doclist */.  u8 
3570: 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
3580: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3590: 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f 77  True if next row
35a0: 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20 70  id is first in p
35b0: 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44 4f  age */.  /* TODO
35c0: 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69 74  1: Can use (writ
35d0: 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20 69  er.pgidx.n==0) i
35e0: 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73 74  nstead of bFirst
35f0: 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20 20  TermInPage */.  
3600: 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e 50  u8 bFirstTermInP
3610: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
3620: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3630: 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69 72  term will be fir
3640: 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20 20  st in leaf */.  
3650: 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65 6e  int nLeafWritten
3660: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3670: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
3680: 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 20  f pages written 
3690: 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79 3b  */.  int nEmpty;
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36c0: 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65 72  f contiguous ter
36d0: 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f 0a  m-less nodes */.
36e0: 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20 20  .  int nDlidx;  
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3700: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
3710: 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b 5d  size of aDlidx[]
3720: 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73 35   array */.  Fts5
3730: 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44 6c  DlidxWriter *aDl
3740: 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 41  idx;        /* A
3750: 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69 64  rray of Fts5Dlid
3760: 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73 20  xWriter objects 
3770: 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73 20  */..  /* Values 
3780: 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20 74  to insert into t
3790: 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a  he %_idx table *
37a0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  /.  Fts5Buffer b
37b0: 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  tterm;          
37c0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72 6d      /* Next term
37d0: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
37e0: 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a 20  %_idx table */. 
37f0: 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20 20   int iBtPage;   
3800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3810: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
3820: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
3830: 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a 74   btterm */.};..t
3840: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
3850: 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43 52  s5CResult Fts5CR
3860: 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46 74  esult;.struct Ft
3870: 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75 31  s5CResult {.  u1
3880: 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20  6 iFirst;       
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
38a0: 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66   aSeg[] index of
38b0: 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61 74   firstest iterat
38c0: 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d  or */.  u8 bTerm
38d0: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
38f0: 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72 65  if the terms are
3900: 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   equal */.};../*
3910: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
3920: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
3930: 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
3940: 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  t, visiting each
3950: 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20 70   term/rowid.** p
3960: 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65  air in the segme
3970: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a  nt..**.** pSeg:.
3980: 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74  **   The segment
3990: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
39a0: 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ugh..**.** iLeaf
39b0: 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65  Pgno:.**   Curre
39c0: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
39d0: 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65  ber within segme
39e0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f  nt..**.** iLeafO
39f0: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65  ffset:.**   Byte
3a00: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
3a10: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
3a20: 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72 73  that is the firs
3a30: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
3a40: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
3a50: 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74 65  t data (one byte
3a60: 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73 69   passed the posi
3a70: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
3a80: 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69  ield)..**   rowi
3a90: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
3aa0: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
3ab0: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
3ac0: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
3ad0: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
3ae0: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
3af0: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
3b00: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
3b10: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3b20: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
3b30: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
3b40: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
3b50: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
3b60: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
3b70: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
3b80: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
3b90: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
3ba0: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
3bb0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
3bc0: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
3bd0: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
3be0: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
3bf0: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
3c00: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
3c10: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
3c20: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
3c30: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
3c40: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
3c50: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
3c60: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
3c70: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
3c80: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
3c90: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
3ca0: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
3cb0: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
3cc0: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
3cd0: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
3ce0: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
3cf0: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
3d00: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
3d10: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
3d20: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
3d30: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
3d40: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
3d50: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
3d60: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
3d70: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
3d80: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
3d90: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
3da0: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
3db0: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
3dc0: 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20 69   through rowid i
3dd0: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  n descending ord
3de0: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  er instead of th
3df0: 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74  e.**     default
3e00: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
3e10: 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66  ..**.** iRowidOf
3e20: 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65  fset/nRowidOffse
3e30: 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a  t/aRowidOffset:.
3e40: 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72 65  **     These are
3e50: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
3e60: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
3e70: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  E flag is set..*
3e80: 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61 63  *.**     For eac
3e90: 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  h rowid on the p
3ea0: 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  age correspondin
3eb0: 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
3ec0: 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20 20   term, the.**   
3ed0: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
3ee0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 65  aRowidOffset[] e
3ef0: 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 74  ntry is set to t
3f00: 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 6f  he byte offset o
3f10: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74 61  f the.**     sta
3f20: 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69 74  rt of the "posit
3f30: 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20 66  ion-list-size" f
3f40: 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20  ield within the 
3f50: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72  page..**.** iTer
3f60: 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e 64  mIdx:.**     Ind
3f70: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  ex of current te
3f80: 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66 50  rm on iTermLeafP
3f90: 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  gno..*/.struct F
3fa0: 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20 46  ts5SegIter {.  F
3fb0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
3fc0: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
3fd0: 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74 65  * Segment to ite
3fe0: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
3ff0: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
4000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4010: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e    /* Mask of con
4020: 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73  figuration flags
4030: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
4040: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
4050: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
4060: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
4070: 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  r */.  Fts5Data 
4080: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
4090: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40a0: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
40b0: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78 74   Fts5Data *pNext
40c0: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
40d0: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28 69   /* Leaf page (i
40e0: 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20  LeafPgno+1) */. 
40f0: 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74   int iLeafOffset
4100: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4110: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
4120: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
4130: 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  eaf */..  /* The
4140: 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74   page and offset
4150: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20   from which the 
4160: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73  current term was
4170: 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65   read. The offse
4180: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f  t .  ** is the o
4190: 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69 72  ffset of the fir
41a0: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
41b0: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e  current doclist.
41c0: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d    */.  int iTerm
41d0: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
41e0: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
41f0: 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66  ..  int iPgidxOf
4200: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
4210: 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
4220: 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20  et in pgidx */. 
4230: 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63 6c 69   int iEndofDocli
4240: 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  st;..  /* The fo
4250: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
4260: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
4270: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4280: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a  E flag is set. *
4290: 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  /.  int iRowidOf
42a0: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
42b0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65      /* Current e
42c0: 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66  ntry in aRowidOf
42d0: 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  fset[] */.  int 
42e0: 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  nRowidOffset;   
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4300: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
4310: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
4320: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
4330: 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  aRowidOffset;   
4340: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4350: 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f  ray of offset to
4360: 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f   rowid fields */
4370: 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ..  Fts5DlidxIte
4380: 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20  r *pDlidx;      
4390: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
43a0: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
43b0: 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69  ex */..  /* Vari
43c0: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
43d0: 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74  based on current
43e0: 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73   entry. */.  Fts
43f0: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4410: 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  Current term */.
4420: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
4450: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73  id */.  int nPos
4460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4470: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4480: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75  r of bytes in cu
4490: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
44a0: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ist */.  int bDe
44b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
44c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
44d0: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
44e0: 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b  lag is set */.};
44f0: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
4500: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
4510: 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72   an Fts5Data str
4520: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
4530: 61 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20  ains a .** leaf 
4540: 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  page..*/.#define
4550: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
4560: 4b 28 78 29 20 61 73 73 65 72 74 28 20 5c 0a 20  K(x) assert( \. 
4570: 20 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d     (x)->szLeaf==
4580: 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28 78 29 2d 3e  (x)->nn || (x)->
4590: 73 7a 4c 65 61 66 3d 3d 66 74 73 35 47 65 74 55  szLeaf==fts5GetU
45a0: 31 36 28 26 28 78 29 2d 3e 70 5b 32 5d 29 20 5c  16(&(x)->p[2]) \
45b0: 0a 29 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .)..#define FTS5
45c0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
45d0: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54   0x01.#define FT
45e0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
45f0: 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a  SE 0x02.../* .**
4600: 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   Argument is a p
4610: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73  ointer to an Fts
4620: 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  5Data structure 
4630: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
4640: 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68  leaf.** page. Th
4650: 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74  is macro evaluat
4660: 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  es to true if th
4670: 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20  e leaf contains 
4680: 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20  no terms, or.** 
4690: 66 61 6c 73 65 20 69 66 20 69 74 20 63 6f 6e 74  false if it cont
46a0: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
46b0: 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69  e term..*/.#defi
46c0: 6e 65 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  ne fts5LeafIsTer
46d0: 6d 6c 65 73 73 28 78 29 20 28 28 78 29 2d 3e 73  mless(x) ((x)->s
46e0: 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e  zLeaf >= (x)->nn
46f0: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4700: 65 61 66 54 65 72 6d 4f 66 66 28 78 2c 20 69 29  eafTermOff(x, i)
4710: 20 28 66 74 73 35 47 65 74 55 31 36 28 26 28 78   (fts5GetU16(&(x
4720: 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65 61 66  )->p[(x)->szLeaf
4730: 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a 23 64 65   + (i)*2]))..#de
4740: 66 69 6e 65 20 66 74 73 35 4c 65 61 66 46 69 72  fine fts5LeafFir
4750: 73 74 52 6f 77 69 64 4f 66 66 28 78 29 20 28 66  stRowidOff(x) (f
4760: 74 73 35 47 65 74 55 31 36 28 28 78 29 2d 3e 70  ts5GetU16((x)->p
4770: 29 29 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74  ))../*.** Object
4780: 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74   for iterating t
4790: 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65  hrough the merge
47a0: 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65  d results of one
47b0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
47c0: 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65  s,.** visiting e
47d0: 61 63 68 20 74 65 72 6d 2f 72 6f 77 69 64 20 70  ach term/rowid p
47e0: 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65  air in the merge
47f0: 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53  d data..**.** nS
4800: 65 67 20 69 73 20 61 6c 77 61 79 73 20 61 20 70  eg is always a p
4810: 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61  ower of two grea
4820: 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
4830: 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  l to the number 
4840: 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74  of.** segments t
4850: 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hat this object 
4860: 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20  is merging data 
4870: 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61  from. Both the a
4880: 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69  Seg[] and.** aFi
4890: 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65  rst[] arrays are
48a0: 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65   sized at nSeg e
48b0: 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53 65 67  ntries. The aSeg
48c0: 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61 64 64  [] array is padd
48d0: 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65  ed.** with zeroe
48e0: 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73  d objects - thes
48f0: 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73  e are handled as
4900: 20 69 66 20 74 68 65 79 20 77 65 72 65 20 69 74   if they were it
4910: 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a  erators opened.*
4920: 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65  * on empty segme
4930: 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  nts..**.** The r
4940: 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
4950: 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65  ing segments aSe
4960: 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b  g[N] and aSeg[N+
4970: 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61  1], where N is a
4980: 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72  n.** even number
4990: 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  , is stored in a
49a0: 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32  First[(nSeg+N)/2
49b0: 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74 22 20  ]. The "result" 
49c0: 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61  of the .** compa
49d0: 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f  rison in this co
49e0: 6e 74 65 78 74 20 69 73 20 74 68 65 20 69 6e 64  ntext is the ind
49f0: 65 78 20 6f 66 20 74 68 65 20 69 74 65 72 61 74  ex of the iterat
4a00: 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  or that currentl
4a10: 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74  y.** points to t
4a20: 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f  he smaller term/
4a30: 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f  rowid combinatio
4a40: 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61 74 20  n. Iterators at 
4a50: 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69  EOF are.** consi
4a60: 64 65 72 65 64 20 74 6f 20 62 65 20 67 72 65 61  dered to be grea
4a70: 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68  ter than all oth
4a80: 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a  er iterators..**
4a90: 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f  .** aFirst[1] co
4aa0: 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78  ntains the index
4ab0: 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68   in aSeg[] of th
4ac0: 65 20 69 74 65 72 61 74 6f 72 20 74 68 61 74 20  e iterator that 
4ad0: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65  points to.** the
4ae0: 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76   smallest key ov
4af0: 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d  erall. aFirst[0]
4b00: 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2a 0a   is unused. .**.
4b10: 2a 2a 20 70 6f 73 6c 69 73 74 3a 0a 2a 2a 20 20  ** poslist:.**  
4b20: 20 55 73 65 64 20 62 79 20 73 71 6c 69 74 65 33   Used by sqlite3
4b30: 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28  Fts5IterPoslist(
4b40: 29 20 77 68 65 6e 20 74 68 65 20 70 6f 73 6c 69  ) when the posli
4b50: 73 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62  st needs to be b
4b60: 75 66 66 65 72 65 64 2e 0a 2a 2a 20 20 20 54 68  uffered..**   Th
4b70: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
4b80: 20 74 65 6c 6c 20 69 66 20 74 68 69 73 20 69 73   tell if this is
4b90: 20 70 6f 70 75 6c 61 74 65 64 20 6f 72 20 6e 6f   populated or no
4ba0: 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73  t..*/.struct Fts
4bb0: 35 49 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46  5IndexIter {.  F
4bc0: 74 73 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78  ts5Index *pIndex
4bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
4be0: 2a 20 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e  * Index that own
4bf0: 73 20 74 68 69 73 20 69 74 65 72 61 74 6f 72 20  s this iterator 
4c00: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
4c10: 72 65 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20  re *pStruct;    
4c20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
4c30: 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 74   structure for t
4c40: 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a  his iterator */.
4c50: 20 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73    Fts5Buffer pos
4c60: 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
4c70: 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
4c80: 61 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70  aining current p
4c90: 6f 73 6c 69 73 74 20 2a 2f 0a 0a 20 20 69 6e 74  oslist */..  int
4ca0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cc0: 53 69 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61  Size of aSeg[] a
4cd0: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52  rray */.  int bR
4ce0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
4cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d00: 65 20 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20  e to iterate in 
4d10: 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f  reverse order */
4d20: 0a 20 20 75 38 20 62 53 6b 69 70 45 6d 70 74 79  .  u8 bSkipEmpty
4d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4d40: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b     /* True to sk
4d50: 69 70 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69  ip deleted entri
4d60: 65 73 20 2a 2f 0a 20 20 75 38 20 62 45 6f 66 3b  es */.  u8 bEof;
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4d80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4d90: 61 74 20 45 4f 46 20 2a 2f 0a 20 20 75 38 20 62  at EOF */.  u8 b
4da0: 46 69 6c 74 65 72 65 64 3b 20 20 20 20 20 20 20  Filtered;       
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4dc0: 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 2d 66 69  rue if column-fi
4dd0: 6c 74 65 72 20 61 6c 72 65 61 64 79 20 61 70 70  lter already app
4de0: 6c 69 65 64 20 2a 2f 0a 0a 20 20 69 36 34 20 69  lied */..  i64 i
4df0: 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20  SwitchRowid;    
4e00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4e10: 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20  rstest rowid of 
4e20: 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72 73  other than aFirs
4e30: 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52  t[1] */.  Fts5CR
4e40: 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20  esult *aFirst;  
4e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4e60: 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65  rent merge state
4e70: 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
4e80: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61 53    Fts5SegIter aS
4e90: 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  eg[1];          
4ea0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
4eb0: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  gment iterators 
4ec0: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6e  */.};.../*.** An
4ed0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
4ee0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20   following type 
4ef0: 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72 61  is used to itera
4f00: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  te through the c
4f10: 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61 20  ontents.** of a 
4f20: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65  doclist-index re
4f30: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61 74  cord..**.** pDat
4f40: 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20 63  a:.**   Record c
4f50: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64 6f  ontaining the do
4f60: 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74 61  clist-index data
4f70: 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a 2a  ..**.** bEof:.**
4f80: 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20 6f     Set to true o
4f90: 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61 73  nce iterator has
4fa0: 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a 2a   reached EOF..**
4fb0: 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20 53  .** iOff:.**   S
4fc0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  et to the curren
4fd0: 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  t offset within 
4fe0: 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a 2f  record pData..*/
4ff0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
5000: 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61 74  xLvl {.  Fts5Dat
5010: 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20  a *pData;       
5020: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
5030: 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  or current page 
5040: 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a 2f  of this level */
5050: 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20  .  int iOff;    
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73   /* Current offs
5080: 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a 2f  et into pData */
5090: 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20 20  .  int bEof;    
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65 61   /* At EOF alrea
50c0: 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72  dy */.  int iFir
50d0: 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  stOff;          
50e0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79        /* Used by
50f0: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
5100: 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74 70  rs */..  /* Outp
5110: 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f 0a  ut variables */.
5120: 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 3b    int iLeafPgno;
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
5150: 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70  f current leaf p
5160: 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  age */.  i64 iRo
5170: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
5180: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
5190: 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69 4c  rowid on leaf iL
51a0: 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73 74  eafPgno */.};.st
51b0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49 74  ruct Fts5DlidxIt
51c0: 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c 3b  er {.  int nLvl;
51d0: 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20  .  int iSegid;. 
51e0: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61 4c   Fts5DlidxLvl aL
51f0: 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74 69  vl[1];.};..stati
5200: 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55 31  c void fts5PutU1
5210: 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36 20  6(u8 *aOut, u16 
5220: 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30 5d  iVal){.  aOut[0]
5230: 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20 20   = (iVal>>8);.  
5240: 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c 26  aOut[1] = (iVal&
5250: 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69 63  0xFF);.}..static
5260: 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36 28   u16 fts5GetU16(
5270: 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b 0a  const u8 *aIn){.
5280: 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29 61    return ((u16)a
5290: 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61 49  In[0] << 8) + aI
52a0: 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a 20  n[1];.} ../*.** 
52b0: 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65 74  Allocate and ret
52c0: 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74 20  urn a buffer at 
52d0: 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74 65  least nByte byte
52e0: 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  s in size..**.**
52f0: 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
5300: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
5310: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e 64   return NULL and
5320: 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20 63   set the error c
5330: 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46 74  ode in.** the Ft
5340: 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20 70  s5Index handle p
5350: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
5360: 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  st argument..*/.
5370: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74 73  static void *fts
5380: 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35 49  5IdxMalloc(Fts5I
5390: 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 42 79  ndex *p, int nBy
53a0: 74 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  te){.  return sq
53b0: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
53c0: 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74  ero(&p->rc, nByt
53d0: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  e);.}../*.** Com
53e0: 70 61 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  pare the content
53f0: 73 20 6f 66 20 74 68 65 20 70 4c 65 66 74 20 62  s of the pLeft b
5400: 75 66 66 65 72 20 77 69 74 68 20 74 68 65 20 70  uffer with the p
5410: 52 69 67 68 74 2f 6e 52 69 67 68 74 20 62 6c 6f  Right/nRight blo
5420: 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  b..**.** Return 
5430: 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73 20  -ve if pLeft is 
5440: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52 69  smaller than pRi
5450: 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20 61  ght, 0 if they a
5460: 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20 2b  re equal or.** +
5470: 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73 20  ve if pRight is 
5480: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c 65  smaller than pLe
5490: 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ft. In other wor
54a0: 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72 65  ds:.**.**     re
54b0: 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70 52  s = *pLeft - *pR
54c0: 69 67 68 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ight.*/.#ifdef S
54d0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74  QLITE_DEBUG.stat
54e0: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
54f0: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
5500: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
5510: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5520: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
5530: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
5540: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
5550: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
5560: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
5570: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
5580: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
5590: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
55a0: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
55b0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
55c0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
55d0: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
55e0: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
55f0: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
5600: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 23 65 6e  t) : res);.}.#en
5610: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  dif../*.** Compa
5620: 72 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  re the contents 
5630: 6f 66 20 74 68 65 20 74 77 6f 20 62 75 66 66 65  of the two buffe
5640: 72 73 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28  rs using memcmp(
5650: 29 2e 20 49 66 20 6f 6e 65 20 62 75 66 66 65 72  ). If one buffer
5660: 0a 2a 2a 20 69 73 20 61 20 70 72 65 66 69 78 20  .** is a prefix 
5670: 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 69 74  of the other, it
5680: 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 74   is considered t
5690: 68 65 20 6c 65 73 73 65 72 2e 0a 2a 2a 0a 2a 2a  he lesser..**.**
56a0: 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20 70   Return -ve if p
56b0: 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  Left is smaller 
56c0: 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20 69  than pRight, 0 i
56d0: 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61 6c  f they are equal
56e0: 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70 52   or.** +ve if pR
56f0: 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72 20  ight is smaller 
5700: 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20 6f  than pLeft. In o
5710: 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a  ther words:.**.*
5720: 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c 65  *     res = *pLe
5730: 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f 0a  ft - *pRight.*/.
5740: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 42  static int fts5B
5750: 75 66 66 65 72 43 6f 6d 70 61 72 65 28 46 74 73  ufferCompare(Fts
5760: 35 42 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20  5Buffer *pLeft, 
5770: 46 74 73 35 42 75 66 66 65 72 20 2a 70 52 69 67  Fts5Buffer *pRig
5780: 68 74 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  ht){.  int nCmp 
5790: 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20  = MIN(pLeft->n, 
57a0: 70 52 69 67 68 74 2d 3e 6e 29 3b 0a 20 20 69 6e  pRight->n);.  in
57b0: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
57c0: 4c 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d  Left->p, pRight-
57d0: 3e 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  >p, nCmp);.  ret
57e0: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70  urn (res==0 ? (p
57f0: 4c 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74  Left->n - pRight
5800: 2d 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a  ->n) : res);.}..
5810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
5820: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 66  BUG.static int f
5830: 74 73 35 42 6c 6f 62 43 6f 6d 70 61 72 65 28 0a  ts5BlobCompare(.
5840: 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 65 66    const u8 *pLef
5850: 74 2c 20 69 6e 74 20 6e 4c 65 66 74 2c 20 0a 20  t, int nLeft, . 
5860: 20 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68   const u8 *pRigh
5870: 74 2c 20 69 6e 74 20 6e 52 69 67 68 74 0a 29 7b  t, int nRight.){
5880: 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49  .  int nCmp = MI
5890: 4e 28 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 29  N(nLeft, nRight)
58a0: 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65  ;.  int res = me
58b0: 6d 63 6d 70 28 70 4c 65 66 74 2c 20 70 52 69 67  mcmp(pLeft, pRig
58c0: 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74  ht, nCmp);.  ret
58d0: 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 6e  urn (res==0 ? (n
58e0: 4c 65 66 74 20 2d 20 6e 52 69 67 68 74 29 20 3a  Left - nRight) :
58f0: 20 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a   res);.}.#endif.
5900: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
5910: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
5920: 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66  (Fts5Data *pLeaf
5930: 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
5940: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
5950: 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d  &pLeaf->p[pLeaf-
5960: 3e 73 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a  >szLeaf], ret);.
5970: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
5980: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65  ./*.** Close the
5990: 20 72 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20   read-only blob 
59a0: 68 61 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73  handle, if it is
59b0: 20 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63   open..*/.static
59c0: 20 76 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52   void fts5CloseR
59d0: 65 61 64 65 72 28 46 74 73 35 49 6e 64 65 78 20  eader(Fts5Index 
59e0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52  *p){.  if( p->pR
59f0: 65 61 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  eader ){.    sql
5a00: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64  ite3_blob *pRead
5a10: 65 72 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b  er = p->pReader;
5a20: 0a 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20  .    p->pReader 
5a30: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
5a40: 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61  _blob_close(pRea
5a50: 64 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  der);.  }.}.../*
5a60: 0a 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72  .** Retrieve a r
5a70: 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25  ecord from the %
5a80: 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a  _data table..**.
5a90: 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
5aa0: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
5ab0: 65 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65  eturned and an e
5ac0: 72 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65  rror left in the
5ad0: 20 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f   .** Fts5Index o
5ae0: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
5af0: 20 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44   Fts5Data *fts5D
5b00: 61 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65  ataRead(Fts5Inde
5b10: 78 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64  x *p, i64 iRowid
5b20: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
5b30: 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Ret = 0;.  if( p
5b40: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
5b50: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
5b60: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20  SQLITE_OK;..    
5b70: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
5b80: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
5b90: 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72 6e 20  call may return 
5ba0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69 66 20  SQLITE_ABORT if 
5bb0: 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20 61  there has been a
5bc0: 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 20   savepoint.     
5bd0: 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e   ** rollback sin
5be0: 63 65 20 69 74 20 77 61 73 20 6c 61 73 74 20 75  ce it was last u
5bf0: 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  sed. In this cas
5c00: 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e  e a new blob han
5c10: 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  dle.      ** is 
5c20: 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
5c30: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5c40: 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65   *pBlob = p->pRe
5c50: 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70  ader;.      p->p
5c60: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Reader = 0;.    
5c70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5c80: 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62  lob_reopen(pBlob
5c90: 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
5ca0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
5cb0: 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  der==0 );.      
5cc0: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70 42 6c  p->pReader = pBl
5cd0: 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ob;.      if( rc
5ce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5cf0: 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65         fts5Close
5d00: 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 20  Reader(p);.     
5d10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
5d20: 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 20  =SQLITE_ABORT ) 
5d30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5d40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
5d50: 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65   the blob handle
5d60: 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20   is not open at 
5d70: 74 68 69 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e  this point, open
5d80: 20 69 74 20 61 6e 64 20 73 65 65 6b 20 0a 20 20   it and seek .  
5d90: 20 20 2a 2a 20 74 6f 20 74 68 65 20 72 65 71 75    ** to the requ
5da0: 65 73 74 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f  ested entry.  */
5db0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 52 65 61  .    if( p->pRea
5dc0: 64 65 72 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  der==0 && rc==SQ
5dd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5de0: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
5df0: 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nfig = p->pConfi
5e00: 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  g;.      rc = sq
5e10: 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
5e20: 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20  pConfig->db, .  
5e30: 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d          pConfig-
5e40: 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
5e50: 6c 2c 20 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77  l, "block", iRow
5e60: 69 64 2c 20 30 2c 20 26 70 2d 3e 70 52 65 61 64  id, 0, &p->pRead
5e70: 65 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  er.      );.    
5e80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 65 69 74  }..    /* If eit
5e90: 68 65 72 20 6f 66 20 74 68 65 20 73 71 6c 69 74  her of the sqlit
5ea0: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f  e3_blob_open() o
5eb0: 72 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72  r sqlite3_blob_r
5ec0: 65 6f 70 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20  eopen() calls.  
5ed0: 20 20 2a 2a 20 61 62 6f 76 65 20 72 65 74 75 72    ** above retur
5ee0: 6e 65 64 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ned SQLITE_ERROR
5ef0: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
5f00: 43 4f 52 52 55 50 54 5f 56 54 41 42 20 69 6e 73  CORRUPT_VTAB ins
5f10: 74 65 61 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c  tead..    ** All
5f20: 20 74 68 65 20 72 65 61 73 6f 6e 73 20 74 68 6f   the reasons tho
5f30: 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67  se functions mig
5f40: 68 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ht return SQLITE
5f50: 5f 45 52 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67  _ERROR - missing
5f60: 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d  .    ** table, m
5f70: 69 73 73 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d  issing row, non-
5f80: 62 6c 6f 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f  blob/text in blo
5f90: 63 6b 20 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69  ck column - indi
5fa0: 63 61 74 65 20 0a 20 20 20 20 2a 2a 20 62 61 63  cate .    ** bac
5fb0: 6b 69 6e 67 20 73 74 6f 72 65 20 63 6f 72 72 75  king store corru
5fc0: 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69  ption.  */.    i
5fd0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  f( rc==SQLITE_ER
5fe0: 52 4f 52 20 29 20 72 63 20 3d 20 46 54 53 35 5f  ROR ) rc = FTS5_
5ff0: 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 69 66  CORRUPT;..    if
6000: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6010: 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 4f 75  ){.      u8 *aOu
6020: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
6030: 20 20 20 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f       /* Read blo
6040: 62 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69 73  b data into this
6050: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 20 20 20   buffer */.     
6060: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 71 6c   int nByte = sql
6070: 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28  ite3_blob_bytes(
6080: 70 2d 3e 70 52 65 61 64 65 72 29 3b 0a 20 20 20  p->pReader);.   
6090: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
60a0: 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
60b0: 20 2b 20 6e 42 79 74 65 20 2b 20 46 54 53 35 5f   + nByte + FTS5_
60c0: 44 41 54 41 5f 50 41 44 44 49 4e 47 3b 0a 20 20  DATA_PADDING;.  
60d0: 20 20 20 20 70 52 65 74 20 3d 20 28 46 74 73 35      pRet = (Fts5
60e0: 44 61 74 61 2a 29 73 71 6c 69 74 65 33 5f 6d 61  Data*)sqlite3_ma
60f0: 6c 6c 6f 63 28 6e 41 6c 6c 6f 63 29 3b 0a 20 20  lloc(nAlloc);.  
6100: 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
6110: 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 6e          pRet->nn
6120: 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20   = nByte;.      
6130: 20 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70    aOut = pRet->p
6140: 20 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d   = (u8*)&pRet[1]
6150: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6160: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
6170: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
6180: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  }..      if( rc=
6190: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
61a0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
61b0: 65 33 5f 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e  e3_blob_read(p->
61c0: 70 52 65 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e  pReader, aOut, n
61d0: 42 79 74 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Byte, 0);.      
61e0: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
61f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6200: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6210: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
6220: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
6230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6240: 2f 2a 20 54 4f 44 4f 31 3a 20 46 69 78 20 74 68  /* TODO1: Fix th
6250: 69 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 52  is */.        pR
6260: 65 74 2d 3e 73 7a 4c 65 61 66 20 3d 20 66 74 73  et->szLeaf = fts
6270: 35 47 65 74 55 31 36 28 26 70 52 65 74 2d 3e 70  5GetU16(&pRet->p
6280: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [2]);.      }.  
6290: 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20    }.    p->rc = 
62a0: 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65 61 64  rc;.    p->nRead
62b0: 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  ++;.  }..  asser
62c0: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
62d0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
62e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
62f0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  t;.}../*.** Rele
6300: 61 73 65 20 61 20 72 65 66 65 72 65 6e 63 65 20  ase a reference 
6310: 74 6f 20 64 61 74 61 20 72 65 63 6f 72 64 20 72  to data record r
6320: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6330: 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 0a 2a 2a  rlier call to.**
6340: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 29 2e   fts5DataRead().
6350: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6360: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
6370: 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 29  Fts5Data *pData)
6380: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
6390: 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 73 74 61 74  (pData);.}..stat
63a0: 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
63b0: 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20 46  PrepareStmt(.  F
63c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 73  ts5Index *p,.  s
63d0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
63e0: 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a 53  Stmt,.  char *zS
63f0: 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ql.){.  if( p->r
6400: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6410: 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b 0a      if( zSql ){.
6420: 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71        p->rc = sq
6430: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
6440: 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62 2c  (p->pConfig->db,
6450: 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d   zSql, -1, ppStm
6460: 74 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t, 0);.    }else
6470: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
6480: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
6490: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
64a0: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
64b0: 72 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a  return p->rc;.}.
64c0: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45 52 54 20 4f  ../*.** INSERT O
64d0: 52 20 52 45 50 4c 41 43 45 20 61 20 72 65 63 6f  R REPLACE a reco
64e0: 72 64 20 69 6e 74 6f 20 74 68 65 20 25 5f 64 61  rd into the %_da
64f0: 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ta table..*/.sta
6500: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6510: 61 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78  aWrite(Fts5Index
6520: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 2c   *p, i64 iRowid,
6530: 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61   const u8 *pData
6540: 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20  , int nData){.  
6550: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
6560: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a  E_OK ) return;..
6570: 20 20 69 66 28 20 70 2d 3e 70 57 72 69 74 65 72    if( p->pWriter
6580: 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
6590: 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
65a0: 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
65b0: 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
65c0: 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 57 72  eStmt(p, &p->pWr
65d0: 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70  iter, sqlite3_mp
65e0: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
65f0: 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 27   "REPLACE INTO '
6600: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 28 69 64  %q'.'%q_data'(id
6610: 2c 20 62 6c 6f 63 6b 29 20 56 41 4c 55 45 53 28  , block) VALUES(
6620: 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20 20 20 20  ?,?)", .        
6630: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6640: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6650: 20 20 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70     ));.    if( p
6660: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
6670: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69   }..  sqlite3_bi
6680: 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 57 72 69  nd_int64(p->pWri
6690: 74 65 72 2c 20 31 2c 20 69 52 6f 77 69 64 29 3b  ter, 1, iRowid);
66a0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
66b0: 62 6c 6f 62 28 70 2d 3e 70 57 72 69 74 65 72 2c  blob(p->pWriter,
66c0: 20 32 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61   2, pData, nData
66d0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
66e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
66f0: 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20  (p->pWriter);.  
6700: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  p->rc = sqlite3_
6710: 72 65 73 65 74 28 70 2d 3e 70 57 72 69 74 65 72  reset(p->pWriter
6720: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63  );.}../*.** Exec
6730: 75 74 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ute the followin
6740: 67 20 53 51 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  g SQL:.**.**    
6750: 20 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64   DELETE FROM %_d
6760: 61 74 61 20 57 48 45 52 45 20 69 64 20 42 45 54  ata WHERE id BET
6770: 57 45 45 4e 20 24 69 46 69 72 73 74 20 41 4e 44  WEEN $iFirst AND
6780: 20 24 69 4c 61 73 74 0a 2a 2f 0a 73 74 61 74 69   $iLast.*/.stati
6790: 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61 44  c void fts5DataD
67a0: 65 6c 65 74 65 28 46 74 73 35 49 6e 64 65 78 20  elete(Fts5Index 
67b0: 2a 70 2c 20 69 36 34 20 69 46 69 72 73 74 2c 20  *p, i64 iFirst, 
67c0: 69 36 34 20 69 4c 61 73 74 29 7b 0a 20 20 69 66  i64 iLast){.  if
67d0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
67e0: 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20  OK ) return;..  
67f0: 69 66 28 20 70 2d 3e 70 44 65 6c 65 74 65 72 3d  if( p->pDeleter=
6800: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  =0 ){.    int rc
6810: 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67  ;.    Fts5Config
6820: 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70   *pConfig = p->p
6830: 43 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72  Config;.    char
6840: 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33   *zSql = sqlite3
6850: 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
6860: 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27    "DELETE FROM '
6870: 25 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48  %q'.'%q_data' WH
6880: 45 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64  ERE id>=? AND id
6890: 3c 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20  <=?", .         
68a0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
68b0: 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20  Config->zName.  
68c0: 20 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71    );.    if( zSq
68d0: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  l==0 ){.      rc
68e0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
68f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6900: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
6910: 72 65 70 61 72 65 5f 76 32 28 70 43 6f 6e 66 69  repare_v2(pConfi
6920: 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  g->db, zSql, -1,
6930: 20 26 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20 30   &p->pDeleter, 0
6940: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
6950: 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
6960: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
6970: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6980: 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
6990: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
69a0: 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  }.  }..  sqlite3
69b0: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
69c0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
69d0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
69e0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
69f0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6a00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6a10: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
6a20: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6a30: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
6a40: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
6a50: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6a60: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6a70: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6a80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6a90: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6aa0: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6ab0: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6ac0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6ad0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6ae0: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6af0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6b00: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6b10: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6b20: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6b30: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6b40: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6b50: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6b60: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6b70: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6b80: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6b90: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6ba0: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6bb0: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6bc0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6bd0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6be0: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6bf0: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6c00: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6c10: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6c20: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6c30: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6c40: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6c50: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6c60: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6c70: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6c80: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6c90: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6ca0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6cb0: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6cc0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6cd0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6ce0: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6cf0: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6d00: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6d10: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6d20: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6d30: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6d40: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6d50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6d60: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6d70: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6d80: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6d90: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6da0: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6db0: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6dc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6dd0: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6de0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6df0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6e10: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6e20: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6e30: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6e40: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6e50: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6e60: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6e70: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6e80: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6e90: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6ea0: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6eb0: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6ec0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6ed0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6ee0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6ef0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6f00: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6f10: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
6f20: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
6f30: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
6f40: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
6f50: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
6f60: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
6f70: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
6f80: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
6f90: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
6fa0: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
6fb0: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
6fc0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
6fd0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
6fe0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
6ff0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
7000: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
7010: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7020: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7030: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7040: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7050: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7060: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7070: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7080: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7090: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
70a0: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
70b0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
70c0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
70d0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
70e0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
7110: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7120: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7130: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7140: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7150: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7160: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7170: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7190: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
71a0: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
71b0: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
71c0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
71d0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
71e0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
71f0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
7200: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  ;.  int nByte;  
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7230: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7240: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7250: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7260: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7270: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7280: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7290: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
72a0: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
72b0: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
72c0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
72d0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
72e0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
72f0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
7300: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
7310: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7320: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7330: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7340: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
7350: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
7360: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7370: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7380: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7390: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
73a0: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42 79 74  Segment);.  nByt
73b0: 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69 7a 65  e = (.      size
73c0: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
73d0: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
73e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73         /* Main s
73f0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20  tructure */.    
7400: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7410: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
7420: 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f 2a 20  nLevel-1)    /* 
7430: 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a  aLevel[] array *
7440: 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20 3d 20  /.  );.  pRet = 
7450: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a 29  (Fts5Structure*)
7460: 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f  sqlite3Fts5Mallo
7470: 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79 74 65  cZero(&rc, nByte
7480: 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74 20 29  );..  if( pRet )
7490: 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52 65 66  {.    pRet->nRef
74a0: 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74 2d 3e   = 1;.    pRet->
74b0: 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b  nLevel = nLevel;
74c0: 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65 67 6d  .    pRet->nSegm
74d0: 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a  ent = nSegment;.
74e0: 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74 65 33      i += sqlite3
74f0: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
7500: 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74 2d 3e  Data[i], &pRet->
7510: 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a  nWriteCounter);.
7520: 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
7530: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
7540: 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69  & iLvl<nLevel; i
7550: 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
7560: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7570: 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74 2d 3e   *pLvl = &pRet->
7580: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
7590: 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c 3b 0a      int nTotal;.
75a0: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
75b0: 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
75c0: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
75d0: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
75e0: 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20 2b 3d  rge);.      i +=
75f0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
7600: 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54 6f 74  (&pData[i], nTot
7610: 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  al);.      asser
7620: 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76 6c 2d  t( nTotal>=pLvl-
7630: 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20 20 20  >nMerge );.     
7640: 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46   pLvl->aSeg = (F
7650: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7660: 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35  ent*)sqlite3Fts5
7670: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
7680: 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f 74 61  .          nTota
7690: 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  l * sizeof(Fts5S
76a0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
76b0: 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20 20 20  .      );..     
76c0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
76d0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4c  OK ){.        pL
76e0: 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f 74 61  vl->nSeg = nTota
76f0: 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  l;.        for(i
7700: 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54 6f 74  Seg=0; iSeg<nTot
7710: 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  al; iSeg++){.   
7720: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7730: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7740: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65  ta[i], pLvl->aSe
7750: 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 29 3b  g[iSeg].iSegid);
7760: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7770: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7780: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7790: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
77a0: 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20  First);.        
77b0: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
77c0: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
77d0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
77e0: 67 5d 2e 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20  g].pgnoLast);.  
77f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7800: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73  lse{.        fts
7810: 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
7820: 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20  e(pRet);.       
7830: 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
7840: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
7850: 2a 70 70 4f 75 74 20 3d 20 70 52 65 74 3b 0a 20  *ppOut = pRet;. 
7860: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7870: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
7880: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
7890: 65 41 64 64 4c 65 76 65 6c 28 69 6e 74 20 2a 70  eAddLevel(int *p
78a0: 52 63 2c 20 46 74 73 35 53 74 72 75 63 74 75 72  Rc, Fts5Structur
78b0: 65 20 2a 2a 70 70 53 74 72 75 63 74 29 7b 0a 20  e **ppStruct){. 
78c0: 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
78d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35  E_OK ){.    Fts5
78e0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
78f0: 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
7900: 20 20 20 20 69 6e 74 20 6e 4c 65 76 65 6c 20 3d      int nLevel =
7910: 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
7920: 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
7930: 3d 20 28 0a 20 20 20 20 20 20 20 20 73 69 7a 65  = (.        size
7940: 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
7950: 29 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  ) +             
7960: 20 20 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72       /* Main str
7970: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20  ucture */.      
7980: 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72    sizeof(Fts5Str
7990: 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a 20 28  uctureLevel) * (
79a0: 6e 4c 65 76 65 6c 2b 31 29 20 20 2f 2a 20 61 4c  nLevel+1)  /* aL
79b0: 65 76 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  evel[] array */.
79c0: 20 20 20 20 29 3b 0a 0a 20 20 20 20 70 53 74 72      );..    pStr
79d0: 75 63 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  uct = sqlite3_re
79e0: 61 6c 6c 6f 63 28 70 53 74 72 75 63 74 2c 20 6e  alloc(pStruct, n
79f0: 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
7a00: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
7a10: 6d 65 6d 73 65 74 28 26 70 53 74 72 75 63 74 2d  memset(&pStruct-
7a20: 3e 61 4c 65 76 65 6c 5b 6e 4c 65 76 65 6c 5d 2c  >aLevel[nLevel],
7a30: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
7a40: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 29 3b  tructureLevel));
7a50: 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e  .      pStruct->
7a60: 6e 4c 65 76 65 6c 2b 2b 3b 0a 20 20 20 20 20 20  nLevel++;.      
7a70: 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
7a80: 75 63 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  uct;.    }else{.
7a90: 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c        *pRc = SQL
7aa0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
7ab0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7ac0: 74 65 6e 64 20 6c 65 76 65 6c 20 69 4c 76 6c 20  tend level iLvl 
7ad0: 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 69 73  so that there is
7ae0: 20 72 6f 6f 6d 20 66 6f 72 20 61 74 20 6c 65 61   room for at lea
7af0: 73 74 20 6e 45 78 74 72 61 20 6d 6f 72 65 0a 2a  st nExtra more.*
7b00: 2a 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2f 0a 73  * segments..*/.s
7b10: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7b20: 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
7b30: 76 65 6c 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  vel(.  int *pRc,
7b40: 20 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72   .  Fts5Structur
7b50: 65 20 2a 70 53 74 72 75 63 74 2c 20 0a 20 20 69  e *pStruct, .  i
7b60: 6e 74 20 69 4c 76 6c 2c 20 0a 20 20 69 6e 74 20  nt iLvl, .  int 
7b70: 6e 45 78 74 72 61 2c 20 0a 20 20 69 6e 74 20 62  nExtra, .  int b
7b80: 49 6e 73 65 72 74 0a 29 7b 0a 20 20 69 66 28 20  Insert.){.  if( 
7b90: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7ba0: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7bb0: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
7bc0: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
7bd0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 46 74  el[iLvl];.    Ft
7be0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7bf0: 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 69 6e  nt *aNew;.    in
7c00: 74 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 42  t nByte;..    nB
7c10: 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65  yte = (pLvl->nSe
7c20: 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73 69  g + nExtra) * si
7c30: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7c40: 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
7c50: 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  aNew = sqlite3_r
7c60: 65 61 6c 6c 6f 63 28 70 4c 76 6c 2d 3e 61 53 65  ealloc(pLvl->aSe
7c70: 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  g, nByte);.    i
7c80: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( aNew ){.     
7c90: 20 69 66 28 20 62 49 6e 73 65 72 74 3d 3d 30 20   if( bInsert==0 
7ca0: 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  ){.        memse
7cb0: 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d 3e 6e 53  t(&aNew[pLvl->nS
7cc0: 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  eg], 0, sizeof(F
7cd0: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
7ce0: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
7cf0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7d00: 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d       int nMove =
7d10: 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a 20 73 69   pLvl->nSeg * si
7d20: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7d30: 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20  reSegment);.    
7d40: 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26 61 4e 65      memmove(&aNe
7d50: 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e 65 77 2c  w[nExtra], aNew,
7d60: 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20   nMove);.       
7d70: 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c 20 30 2c   memset(aNew, 0,
7d80: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7d90: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20  ctureSegment) * 
7da0: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
7db0: 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65  .      pLvl->aSe
7dc0: 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 7d 65  g = aNew;.    }e
7dd0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52 63 20  lse{.      *pRc 
7de0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
7df0: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
7e00: 2a 2a 20 52 65 61 64 2c 20 64 65 73 65 72 69 61  ** Read, deseria
7e10: 6c 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20  lize and return 
7e20: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  the structure re
7e30: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cord..**.** The 
7e40: 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c  Fts5Structure.aL
7e50: 65 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20  evel[] and each 
7e60: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7e70: 65 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a  el.aSeg[] array.
7e80: 2a 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f  ** are over-allo
7e90: 63 61 74 65 64 20 61 73 20 64 65 73 63 72 69 62  cated as describ
7ea0: 65 64 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ed for function 
7eb0: 66 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63  fts5StructureDec
7ec0: 6f 64 65 28 29 20 0a 2a 2a 20 61 62 6f 76 65 2e  ode() .** above.
7ed0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
7ee0: 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
7ef0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
7f00: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6c 65  an error code le
7f10: 66 74 20 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73  ft in the.** Fts
7f20: 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49  5Index handle. I
7f30: 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
7f40: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
7f50: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
7f60: 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c  on.** is called,
7f70: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
7f80: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 53 74  */.static Fts5St
7f90: 72 75 63 74 75 72 65 20 2a 66 74 73 35 53 74 72  ructure *fts5Str
7fa0: 75 63 74 75 72 65 52 65 61 64 28 46 74 73 35 49  uctureRead(Fts5I
7fb0: 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35  ndex *p){.  Fts5
7fc0: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
7fd0: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
7fe0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
7ff0: 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Ret = 0;        
8000: 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 72 65 74  /* Object to ret
8010: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  urn */.  int iCo
8020: 6f 6b 69 65 3b 20 20 20 20 20 20 20 20 20 20 20  okie;           
8030: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66           /* Conf
8040: 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65  iguration cookie
8050: 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20 2a   */.  Fts5Data *
8060: 70 44 61 74 61 3b 0a 0a 20 20 70 44 61 74 61 20  pData;..  pData 
8070: 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
8080: 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
8090: 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70  _ROWID);.  if( p
80a0: 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 20 30 3b  ->rc ) return 0;
80b0: 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 44 6f 20 77  .  /* TODO: Do w
80c0: 65 20 6e 65 65 64 20 74 68 69 73 20 69 66 20 74  e need this if t
80d0: 68 65 20 6c 65 61 66 2d 69 6e 64 65 78 20 69 73  he leaf-index is
80e0: 20 61 70 70 65 6e 64 65 64 3f 20 50 72 6f 62 61   appended? Proba
80f0: 62 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 6d 65 6d 73  bly... */.  mems
8100: 65 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 44 61  et(&pData->p[pDa
8110: 74 61 2d 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35  ta->nn], 0, FTS5
8120: 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a  _DATA_PADDING);.
8130: 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74    p->rc = fts5St
8140: 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44  ructureDecode(pD
8150: 61 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e  ata->p, pData->n
8160: 6e 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52  n, &iCookie, &pR
8170: 65 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63  et);.  if( p->rc
8180: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
8190: 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21  Config->iCookie!
81a0: 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20  =iCookie ){.    
81b0: 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
81c0: 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43  ts5ConfigLoad(pC
81d0: 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b  onfig, iCookie);
81e0: 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61  .  }..  fts5Data
81f0: 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a  Release(pData);.
8200: 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c    if( p->rc!=SQL
8210: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
8220: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8230: 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 70 52  se(pRet);.    pR
8240: 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  et = 0;.  }.  re
8250: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
8260: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
8270: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8280: 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 64 65 78  egments in index
8290: 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75   structure pStru
82a0: 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  ct. This.** func
82b0: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65  tion is only eve
82c0: 72 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  r used as part o
82d0: 66 20 61 73 73 65 72 74 28 29 20 63 6f 6e 64 69  f assert() condi
82e0: 74 69 6f 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tions..*/.#ifdef
82f0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
8300: 61 74 69 63 20 69 6e 74 20 66 74 73 35 53 74 72  atic int fts5Str
8310: 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
8320: 6e 74 73 28 46 74 73 35 53 74 72 75 63 74 75 72  nts(Fts5Structur
8330: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
8340: 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b  nt nSegment = 0;
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8360: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
8370: 66 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  f segments */.  
8380: 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20  if( pStruct ){. 
8390: 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20     int iLvl;    
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83b0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
83c0: 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
83d0: 6c 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c  ls */.    for(iL
83e0: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
83f0: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
8400: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d  ++){.      nSegm
8410: 65 6e 74 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e  ent += pStruct->
8420: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
8430: 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  g;.    }.  }..  
8440: 72 65 74 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b  return nSegment;
8450: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .}.#endif..#defi
8460: 6e 65 20 66 74 73 35 42 75 66 66 65 72 53 61 66  ne fts5BufferSaf
8470: 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66  eAppendBlob(pBuf
8480: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20  , pBlob, nBlob) 
8490: 7b 20 20 20 20 20 5c 0a 20 20 61 73 73 65 72 74  {     \.  assert
84a0: 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
84b0: 3e 3d 28 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c  >=((pBuf)->n+nBl
84c0: 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20 20 20  ob) );          
84d0: 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28     \.  memcpy(&(
84e0: 70 42 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d  pBuf)->p[(pBuf)-
84f0: 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  >n], pBlob, nBlo
8500: 62 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  b);             
8510: 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d  \.  (pBuf)->n +=
8520: 20 6e 42 6c 6f 62 3b 20 20 20 20 20 20 20 20 20   nBlob;         
8530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
8550: 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 42 75  ..#define fts5Bu
8560: 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
8570: 72 69 6e 74 28 70 42 75 66 2c 20 69 56 61 6c 29  rint(pBuf, iVal)
8580: 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
8590: 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20    \.  (pBuf)->n 
85a0: 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
85b0: 74 56 61 72 69 6e 74 28 26 28 70 42 75 66 29 2d  tVarint(&(pBuf)-
85c0: 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28  >p[(pBuf)->n], (
85d0: 69 56 61 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73  iVal));  \.  ass
85e0: 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53 70  ert( (pBuf)->nSp
85f0: 61 63 65 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29  ace>=(pBuf)->n )
8600: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8610: 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a             \.}..
8620: 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65  ./*.** Serialize
8630: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 22   and store the "
8640: 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f 72  structure" recor
8650: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
8660: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 6c 65 61  rror occurs, lea
8670: 76 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ve an error code
8680: 20 69 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65   in the Fts5Inde
8690: 78 20 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a  x object. If an.
86a0: 2a 2a 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  ** error has alr
86b0: 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
86c0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
86d0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
86e0: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
86f0: 63 74 75 72 65 57 72 69 74 65 28 46 74 73 35 49  ctureWrite(Fts5I
8700: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
8710: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
8720: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
8730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
8740: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20  Fts5Buffer buf; 
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8760: 20 42 75 66 66 65 72 20 74 6f 20 73 65 72 69 61   Buffer to seria
8770: 6c 69 7a 65 20 72 65 63 6f 72 64 20 69 6e 74 6f  lize record into
8780: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   */.    int iLvl
8790: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
87a0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
87b0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
87c0: 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69   levels */.    i
87d0: 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20  nt iCookie;     
87e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
87f0: 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20 74 6f 20  Cookie value to 
8800: 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73  store */..    as
8810: 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
8820: 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
8830: 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
8840: 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
8850: 20 20 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c      memset(&buf,
8860: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42   0, sizeof(Fts5B
8870: 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a  uffer));..    /*
8880: 20 41 70 70 65 6e 64 20 74 68 65 20 63 75 72 72   Append the curr
8890: 65 6e 74 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ent configuratio
88a0: 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20  n cookie */.    
88b0: 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f  iCookie = p->pCo
88c0: 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20  nfig->iCookie;. 
88d0: 20 20 20 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30     if( iCookie<0
88e0: 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a   ) iCookie = 0;.
88f0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  .    if( 0==sqli
8900: 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
8910: 65 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  e(&p->rc, &buf, 
8920: 34 2b 39 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20  4+9+9+9) ){.    
8930: 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74    sqlite3Fts5Put
8940: 33 32 28 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69  32(buf.p, iCooki
8950: 65 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 6e 20  e);.      buf.n 
8960: 3d 20 34 3b 0a 20 20 20 20 20 20 66 74 73 35 42  = 4;.      fts5B
8970: 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
8980: 61 72 69 6e 74 28 26 62 75 66 2c 20 70 53 74 72  arint(&buf, pStr
8990: 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20  uct->nLevel);.  
89a0: 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
89b0: 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  feAppendVarint(&
89c0: 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53  buf, pStruct->nS
89d0: 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 66  egment);.      f
89e0: 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
89f0: 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66 2c 20  endVarint(&buf, 
8a00: 28 69 36 34 29 70 53 74 72 75 63 74 2d 3e 6e 57  (i64)pStruct->nW
8a10: 72 69 74 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20  riteCounter);.  
8a20: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76    }..    for(iLv
8a30: 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
8a40: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
8a50: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53  +){.      int iS
8a60: 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
8a70: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
8a80: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
8a90: 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
8aa0: 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
8ab0: 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20  reLevel *pLvl = 
8ac0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
8ad0: 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74  [iLvl];.      ft
8ae0: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
8af0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
8b00: 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29  f, pLvl->nMerge)
8b10: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
8b20: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
8b30: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8b40: 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20  l->nSeg);.      
8b50: 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d  assert( pLvl->nM
8b60: 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67  erge<=pLvl->nSeg
8b70: 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69   );..      for(i
8b80: 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
8b90: 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
8ba0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
8bb0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8bc0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
8bd0: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69  vl->aSeg[iSeg].i
8be0: 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
8bf0: 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
8c00: 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
8c10: 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b  buf, pLvl->aSeg[
8c20: 69 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29  iSeg].pgnoFirst)
8c30: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
8c40: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8c50: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8c60: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
8c70: 70 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20  pgnoLast);.     
8c80: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74   }.    }..    ft
8c90: 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46  s5DataWrite(p, F
8ca0: 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
8cb0: 57 49 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e  WID, buf.p, buf.
8cc0: 6e 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  n);.    fts5Buff
8cd0: 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20  erFree(&buf);.  
8ce0: 7d 0a 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69  }.}..#if 0.stati
8cf0: 63 20 76 6f 69 64 20 66 74 73 35 44 65 62 75 67  c void fts5Debug
8d00: 53 74 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46  Structure(int*,F
8d10: 74 73 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53  ts5Buffer*,Fts5S
8d20: 74 72 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74  tructure*);.stat
8d30: 69 63 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e  ic void fts5Prin
8d40: 74 53 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74  tStructure(const
8d50: 20 63 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c   char *zCaption,
8d60: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8d70: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
8d80: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8d90: 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66    Fts5Buffer buf
8da0: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c  ;.  memset(&buf,
8db0: 20 30 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29   0, sizeof(buf))
8dc0: 3b 0a 20 20 66 74 73 35 44 65 62 75 67 53 74 72  ;.  fts5DebugStr
8dd0: 75 63 74 75 72 65 28 26 72 63 2c 20 26 62 75 66  ucture(&rc, &buf
8de0: 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70  , pStruct);.  fp
8df0: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25  rintf(stdout, "%
8e00: 73 3a 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69  s: %s\n", zCapti
8e10: 6f 6e 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66  on, buf.p);.  ff
8e20: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
8e30: 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
8e40: 62 75 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  buf);.}.#else.# 
8e50: 64 65 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74  define fts5Print
8e60: 53 74 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23  Structure(x,y).#
8e70: 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e  endif..static in
8e80: 74 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a  t fts5SegmentSiz
8e90: 65 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  e(Fts5StructureS
8ea0: 65 67 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20  egment *pSeg){. 
8eb0: 20 72 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67   return 1 + pSeg
8ec0: 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65  ->pgnoLast - pSe
8ed0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a  g->pgnoFirst;.}.
8ee0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
8ef0: 63 6f 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74  copy of index st
8f00: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
8f10: 20 45 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65   Except, promote
8f20: 20 61 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67   as many .** seg
8f30: 6d 65 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c  ments as possibl
8f40: 65 20 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d  e to level iProm
8f50: 6f 74 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  ote. If an OOM o
8f60: 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a  ccurs, NULL is .
8f70: 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  ** returned..*/.
8f80: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
8f90: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
8fa0: 54 6f 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  To(.  Fts5Index 
8fb0: 2a 70 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f  *p,.  int iPromo
8fc0: 74 65 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d  te,.  int szProm
8fd0: 6f 74 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63  ote,.  Fts5Struc
8fe0: 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b  ture *pStruct.){
8ff0: 0a 20 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20  .  int il, is;. 
9000: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65   Fts5StructureLe
9010: 76 65 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74  vel *pOut = &pSt
9020: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72  ruct->aLevel[iPr
9030: 6f 6d 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70  omote];..  if( p
9040: 4f 75 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29  Out->nMerge==0 )
9050: 7b 0a 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72  {.    for(il=iPr
9060: 6f 6d 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72  omote+1; il<pStr
9070: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b  uct->nLevel; il+
9080: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
9090: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
90a0: 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
90b0: 4c 65 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20  Level[il];.     
90c0: 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67   if( pLvl->nMerg
90d0: 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
90e0: 20 20 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e    for(is=pLvl->n
90f0: 53 65 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73  Seg-1; is>=0; is
9100: 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  --){.        int
9110: 20 73 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e   sz = fts5Segmen
9120: 74 53 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65  tSize(&pLvl->aSe
9130: 67 5b 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20  g[is]);.        
9140: 69 66 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65  if( sz>szPromote
9150: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
9160: 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
9170: 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
9180: 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72  rc, pStruct, iPr
9190: 6f 6d 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  omote, 1, 1);.  
91a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20        if( p->rc 
91b0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
91c0: 20 20 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61    memcpy(pOut->a
91d0: 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
91e0: 5b 69 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73  [is], sizeof(Fts
91f0: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
9200: 74 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75  t));.        pOu
9210: 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20  t->nSeg++;.     
9220: 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b     pLvl->nSeg--;
9230: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9240: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65   }.}../*.** A ne
9250: 77 20 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75  w segment has ju
9260: 73 74 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  st been written 
9270: 74 6f 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66  to level iLvl of
9280: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
9290: 0a 2a 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69  .** pStruct. Thi
92a0: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72  s function deter
92b0: 6d 69 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67  mines if any seg
92c0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
92d0: 70 72 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61  promoted.** as a
92e0: 20 72 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74   result. Segment
92f0: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69  s are promoted i
9300: 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
9310: 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74  .**.**   a) If t
9320: 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20  he segment just 
9330: 77 72 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c  written is small
9340: 65 72 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d  er than one or m
9350: 6f 72 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20  ore segments.** 
9360: 20 20 20 20 20 77 69 74 68 69 6e 20 74 68 65 20       within the 
9370: 70 72 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74  previous populat
9380: 65 64 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20  ed level, it is 
9390: 70 72 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20  promoted to the 
93a0: 70 72 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20  previous.**     
93b0: 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c   populated level
93c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20  ..**.**   b) If 
93d0: 74 68 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74  the segment just
93e0: 20 77 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67   written is larg
93f0: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65  er than the newe
9400: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a  st segment on.**
9410: 20 20 20 20 20 20 74 68 65 20 6e 65 78 74 20 70        the next p
9420: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20  opulated level, 
9430: 74 68 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e  then that segmen
9440: 74 2c 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72  t, and any other
9450: 20 61 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20   adjacent.**    
9460: 20 20 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20    segments that 
9470: 61 72 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72  are also smaller
9480: 20 74 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75   than the one ju
9490: 73 74 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20  st written, are 
94a0: 0a 2a 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65  .**      promote
94b0: 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65  d. .**.** If one
94c0: 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74   or more segment
94d0: 73 20 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20  s are promoted, 
94e0: 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 62  the structure ob
94f0: 6a 65 63 74 20 69 73 20 75 70 64 61 74 65 64 0a  ject is updated.
9500: 2a 2a 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ** to reflect th
9510: 69 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  is..*/.static vo
9520: 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65  id fts5Structure
9530: 50 72 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49  Promote(.  Fts5I
9540: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
9550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
9560: 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
9570: 74 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c  t */.  int iLvl,
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9590: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
95a0: 6c 65 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74  level just updat
95b0: 65 64 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ed */.  Fts5Stru
95c0: 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 20  cture *pStruct  
95d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
95e0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
95f0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
9600: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
9610: 6e 74 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74  nt iTst;.    int
9620: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a   iPromote = -1;.
9630: 20 20 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74      int szPromot
9640: 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
9650: 20 20 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79    /* Promote any
9660: 74 68 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20  thing this size 
9670: 6f 72 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  or smaller */.  
9680: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
9690: 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20  egment *pSeg;   
96a0: 2f 2a 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20  /* Segment just 
96b0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69  written */.    i
96c0: 6e 74 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20  nt szSeg;       
96d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
96e0: 53 69 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20  Size of segment 
96f0: 6a 75 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a  just written */.
9700: 20 20 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70      int nSeg = p
9710: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
9720: 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20  Lvl].nSeg;..    
9730: 69 66 28 20 6e 53 65 67 3d 3d 30 20 29 20 72 65  if( nSeg==0 ) re
9740: 74 75 72 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d  turn;.    pSeg =
9750: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
9760: 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74  l[iLvl].aSeg[pSt
9770: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
9780: 6c 5d 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20  l].nSeg-1];.    
9790: 73 7a 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65  szSeg = (1 + pSe
97a0: 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53  g->pgnoLast - pS
97b0: 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg->pgnoFirst);.
97c0: 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
97d0: 72 20 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  r condition (a) 
97e0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d  */.    for(iTst=
97f0: 69 4c 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20  iLvl-1; iTst>=0 
9800: 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  && pStruct->aLev
9810: 65 6c 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30  el[iTst].nSeg==0
9820: 3b 20 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69  ; iTst--);.    i
9830: 66 28 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20  f( iTst>=0 ){.  
9840: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
9850: 20 69 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a   int szMax = 0;.
9860: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
9870: 75 72 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d  ureLevel *pTst =
9880: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
9890: 6c 5b 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61  l[iTst];.      a
98a0: 73 73 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65  ssert( pTst->nMe
98b0: 72 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rge==0 );.      
98c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d  for(i=0; i<pTst-
98d0: 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSeg; i++){.   
98e0: 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54       int sz = pT
98f0: 73 74 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f  st->aSeg[i].pgno
9900: 4c 61 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65  Last - pTst->aSe
9910: 67 5b 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b  g[i].pgnoFirst +
9920: 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   1;.        if( 
9930: 73 7a 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78  sz>szMax ) szMax
9940: 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20   = sz;.      }. 
9950: 20 20 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d       if( szMax>=
9960: 73 7a 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20  szSeg ){.       
9970: 20 2f 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61   /* Condition (a
9980: 29 20 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f  ) is true. Promo
9990: 74 65 20 74 68 65 20 6e 65 77 65 73 74 20 73 65  te the newest se
99a0: 67 6d 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a  gment on level .
99b0: 20 20 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20          ** iLvl 
99c0: 74 6f 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20  to level iTst.  
99d0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d  */.        iProm
99e0: 6f 74 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20  ote = iTst;.    
99f0: 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20      szPromote = 
9a00: 73 7a 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20  szMax;.      }. 
9a10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
9a20: 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73  condition (a) is
9a30: 20 6e 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65   not met, assume
9a40: 20 28 62 29 20 69 73 20 74 72 75 65 2e 20 53 74   (b) is true. St
9a50: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
9a60: 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e  ().    ** is a n
9a70: 6f 2d 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f  o-op if it is no
9a80: 74 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  t.  */.    if( i
9a90: 50 72 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20  Promote<0 ){.   
9aa0: 20 20 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c     iPromote = iL
9ab0: 76 6c 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d  vl;.      szProm
9ac0: 6f 74 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20  ote = szSeg;.   
9ad0: 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63   }.    fts5Struc
9ae0: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c  turePromoteTo(p,
9af0: 20 69 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f   iPromote, szPro
9b00: 6d 6f 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a  mote, pStruct);.
9b10: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64    }.}.../*.** Ad
9b20: 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
9b30: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
9b40: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20   only argument. 
9b50: 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  If the end of th
9b60: 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  e .** doclist-in
9b70: 64 65 78 20 70 61 67 65 20 69 73 20 72 65 61 63  dex page is reac
9b80: 68 65 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d  hed, return non-
9b90: 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zero..*/.static 
9ba0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c  int fts5DlidxLvl
9bb0: 4e 65 78 74 28 46 74 73 35 44 6c 69 64 78 4c 76  Next(Fts5DlidxLv
9bc0: 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35  l *pLvl){.  Fts5
9bd0: 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 70 4c  Data *pData = pL
9be0: 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66  vl->pData;..  if
9bf0: 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20  ( pLvl->iOff==0 
9c00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
9c10: 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a  Lvl->bEof==0 );.
9c20: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
9c30: 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f   1;.    pLvl->iO
9c40: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
9c50: 69 6e 74 33 32 28 26 70 44 61 74 61 2d 3e 70 5b  int32(&pData->p[
9c60: 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50  1], pLvl->iLeafP
9c70: 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  gno);.    pLvl->
9c80: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
9c90: 61 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b  arint(&pData->p[
9ca0: 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36  pLvl->iOff], (u6
9cb0: 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64  4*)&pLvl->iRowid
9cc0: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69  );.    pLvl->iFi
9cd0: 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69  rstOff = pLvl->i
9ce0: 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Off;.  }else{.  
9cf0: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
9d00: 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69  for(iOff=pLvl->i
9d10: 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d  Off; iOff<pData-
9d20: 3e 6e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20  >nn; iOff++){.  
9d30: 20 20 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70      if( pData->p
9d40: 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20  [iOff] ) break; 
9d50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
9d60: 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29  iOff<pData->nn )
9d70: 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56 61 6c  {.      i64 iVal
9d80: 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c  ;.      pLvl->iL
9d90: 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66  eafPgno += (iOff
9da0: 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b   - pLvl->iOff) +
9db0: 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b   1;.      iOff +
9dc0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
9dd0: 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c  &pData->p[iOff],
9de0: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
9df0: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69       pLvl->iRowi
9e00: 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20  d += iVal;.     
9e10: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f   pLvl->iOff = iO
9e20: 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ff;.    }else{. 
9e30: 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20       pLvl->bEof 
9e40: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
9e50: 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62    return pLvl->b
9e60: 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  Eof;.}../*.** Ad
9e70: 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
9e80: 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
9e90: 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
9ea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
9eb0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
9ec0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
9ed0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
9ee0: 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a  ter, int iLvl){.
9ef0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
9f00: 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61  pLvl = &pIter->a
9f10: 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73  Lvl[iLvl];..  as
9f20: 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72  sert( iLvl<pIter
9f30: 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20  ->nLvl );.  if( 
9f40: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
9f50: 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66  (pLvl) ){.    if
9f60: 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74  ( (iLvl+1) < pIt
9f70: 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20  er->nLvl ){.    
9f80: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
9f90: 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69  extR(p, pIter, i
9fa0: 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66  Lvl+1);.      if
9fb0: 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d  ( pLvl[1].bEof==
9fc0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  0 ){.        fts
9fd0: 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76  5DataRelease(pLv
9fe0: 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20  l->pData);.     
9ff0: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
a000: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
a010: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
a020: 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20    pLvl->pData = 
a030: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
a040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54 53  .            FTS
a050: 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49  5_DLIDX_ROWID(pI
a060: 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76  ter->iSegid, iLv
a070: 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66  l, pLvl[1].iLeaf
a080: 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b  Pgno).        );
a090: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
a0a0: 6c 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35 44  l->pData ) fts5D
a0b0: 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c  lidxLvlNext(pLvl
a0c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
a0d0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70  .  }..  return p
a0e0: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
a0f0: 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  of;.}.static int
a100: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
a110: 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  xt(Fts5Index *p,
a120: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
a130: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
a140: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
a150: 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29  xtR(p, pIter, 0)
a160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
a170: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
a180: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
a190: 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c  ment has the fol
a1a0: 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65  lowing fields se
a1b0: 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e  t.** as follows.
a1c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
a1d0: 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74 20  ets up the rest 
a1e0: 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  of the iterator 
a1f0: 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f  so that it.** po
a200: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
a210: 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64  t rowid in the d
a220: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a  oclist-index..**
a230: 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20  .**   pData:.** 
a240: 20 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64      pointer to d
a250: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63  oclist-index rec
a260: 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ord, .**.** When
a270: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
a280: 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e  s called pIter->
a290: 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65  iLeafPgno is the
a2a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65   page number the
a2b0: 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61  .** doclist is a
a2c0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 28  ssociated with (
a2d0: 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e  the one featurin
a2e0: 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a  g the term)..*/.
a2f0: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a300: 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 46 74  lidxIterFirst(Ft
a310: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
a320: 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  er){.  int i;.  
a330: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
a340: 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nLvl; i++){.  
a350: 20 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65    fts5DlidxLvlNe
a360: 78 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  xt(&pIter->aLvl[
a370: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
a380: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
a390: 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69  .bEof;.}...stati
a3a0: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
a3b0: 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
a3c0: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
a3d0: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
a3e0: 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49  turn p->rc!=SQLI
a3f0: 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
a400: 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a  aLvl[0].bEof;.}.
a410: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
a420: 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46  5DlidxIterLast(F
a430: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
a440: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
a450: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  r){.  int i;..  
a460: 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68 20  /* Advance each 
a470: 6c 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73  level to the las
a480: 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c  t entry on the l
a490: 61 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f  ast page */.  fo
a4a0: 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d  r(i=pIter->nLvl-
a4b0: 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  1; p->rc==SQLITE
a4c0: 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d  _OK && i>=0; i--
a4d0: 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  ){.    Fts5Dlidx
a4e0: 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74  Lvl *pLvl = &pIt
a4f0: 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20  er->aLvl[i];.   
a500: 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64   while( fts5Dlid
a510: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d  xLvlNext(pLvl)==
a520: 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62  0 );.    pLvl->b
a530: 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66  Eof = 0;..    if
a540: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46  ( i>0 ){.      F
a550: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68  ts5DlidxLvl *pCh
a560: 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b  ild = &pLvl[-1];
a570: 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
a580: 65 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70  elease(pChild->p
a590: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Data);.      mem
a5a0: 73 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73  set(pChild, 0, s
a5b0: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
a5c0: 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69  vl));.      pChi
a5d0: 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  ld->pData = fts5
a5e0: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
a5f0: 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
a600: 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  X_ROWID(pIter->i
a610: 53 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c  Segid, i-1, pLvl
a620: 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20  ->iLeafPgno).   
a630: 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
a640: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
a650: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
a660: 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  d as the only ar
a670: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72  gument to the pr
a680: 65 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f  evious entry..*/
a690: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
a6a0: 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73  DlidxLvlPrev(Fts
a6b0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29  5DlidxLvl *pLvl)
a6c0: 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70  {.  int iOff = p
a6d0: 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73  Lvl->iOff;..  as
a6e0: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66  sert( pLvl->bEof
a6f0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66  ==0 );.  if( iOf
a700: 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  f<=pLvl->iFirstO
a710: 66 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e  ff ){.    pLvl->
a720: 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  bEof = 1;.  }els
a730: 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70  e{.    u8 *a = p
a740: 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20  Lvl->pData->p;. 
a750: 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
a760: 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20   int iLimit;.   
a770: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
a780: 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20   nZero = 0;..   
a790: 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f   /* Currently iO
a7a0: 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ff points to the
a7b0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61   first byte of a
a7c0: 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c   varint. This bl
a7d0: 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72  ock .    ** decr
a7e0: 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69  ements iOff unti
a7f0: 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  l it points to t
a800: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
a810: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20   the previous . 
a820: 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61     ** varint. Ta
a830: 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f  king care not to
a840: 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79   read any memory
a850: 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20   locations that 
a860: 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66  occur.    ** bef
a870: 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20 69  ore the buffer i
a880: 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20  n memory.  */.  
a890: 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66    iLimit = (iOff
a8a0: 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29  >9 ? iOff-9 : 0)
a8b0: 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d  ;.    for(iOff--
a8c0: 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69  ; iOff>iLimit; i
a8d0: 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66  Off--){.      if
a8e0: 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30  ( (a[iOff-1] & 0
a8f0: 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b  x80)==0 ) break;
a900: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
a910: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
a920: 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29  f], (u64*)&iVal)
a930: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77  ;.    pLvl->iRow
a940: 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20  id -= iVal;.    
a950: 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  pLvl->iLeafPgno-
a960: 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  -;..    /* Skip 
a970: 62 61 63 6b 77 61 72 64 73 20 70 61 73 74 20 61  backwards past a
a980: 6e 79 20 30 78 30 30 20 76 61 72 69 6e 74 73 2e  ny 0x00 varints.
a990: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 69   */.    for(ii=i
a9a0: 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d  Off-1; ii>=pLvl-
a9b0: 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 61 5b  >iFirstOff && a[
a9c0: 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29  ii]==0x00; ii--)
a9d0: 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b  {.      nZero++;
a9e0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
a9f0: 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f  i>=pLvl->iFirstO
aa00: 66 66 20 26 26 20 28 61 5b 69 69 5d 20 26 20 30  ff && (a[ii] & 0
aa10: 78 38 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  x80) ){.      /*
aa20: 20 54 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69   The byte immedi
aa30: 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65  ately before the
aa40: 20 6c 61 73 74 20 30 78 30 30 20 62 79 74 65 20   last 0x00 byte 
aa50: 68 61 73 20 74 68 65 20 30 78 38 30 20 62 69 74  has the 0x80 bit
aa60: 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 53  .      ** set. S
aa70: 6f 20 74 68 65 20 6c 61 73 74 20 30 78 30 30 20  o the last 0x00 
aa80: 69 73 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74  is only a varint
aa90: 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65 20   0 if there are 
aaa0: 38 20 6d 6f 72 65 20 30 78 38 30 0a 20 20 20 20  8 more 0x80.    
aab0: 20 20 2a 2a 20 62 79 74 65 73 20 62 65 66 6f 72    ** bytes befor
aac0: 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20  e a[ii]. */.    
aad0: 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b    int bZero = 0;
aae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aaf0: 20 54 72 75 65 20 69 66 20 6c 61 73 74 20 30 78   True if last 0x
ab00: 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20  00 counts */.   
ab10: 20 20 20 69 66 28 20 28 69 69 2d 38 29 3e 3d 70     if( (ii-8)>=p
ab20: 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29  Lvl->iFirstOff )
ab30: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  {.        int j;
ab40: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31  .        for(j=1
ab50: 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d  ; j<=8 && (a[ii-
ab60: 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29  j] & 0x80); j++)
ab70: 3b 0a 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20  ;.        bZero 
ab80: 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d  = (j>8);.      }
ab90: 0a 20 20 20 20 20 20 69 66 28 20 62 5a 65 72 6f  .      if( bZero
aba0: 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20  ==0 ) nZero--;. 
abb0: 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69     }.    pLvl->i
abc0: 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72  LeafPgno -= nZer
abd0: 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  o;.    pLvl->iOf
abe0: 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f  f = iOff - nZero
abf0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
ac00: 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73  pLvl->bEof;.}..s
ac10: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
ac20: 69 64 78 49 74 65 72 50 72 65 76 52 28 46 74 73  idxIterPrevR(Fts
ac30: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
ac40: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c  lidxIter *pIter,
ac50: 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74   int iLvl){.  Ft
ac60: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
ac70: 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b   = &pIter->aLvl[
ac80: 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iLvl];..  assert
ac90: 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c  ( iLvl<pIter->nL
aca0: 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35  vl );.  if( fts5
acb0: 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 70 4c 76  DlidxLvlPrev(pLv
acc0: 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69  l) ){.    if( (i
acd0: 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e  Lvl+1) < pIter->
ace0: 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74  nLvl ){.      ft
acf0: 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 52  s5DlidxIterPrevR
ad00: 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b  (p, pIter, iLvl+
ad10: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  1);.      if( pL
ad20: 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b  vl[1].bEof==0 ){
ad30: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
ad40: 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70  aRelease(pLvl->p
ad50: 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d  Data);.        m
ad60: 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73  emset(pLvl, 0, s
ad70: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
ad80: 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  vl));.        pL
ad90: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
ada0: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
adb0: 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
adc0: 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d  IDX_ROWID(pIter-
add0: 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70  >iSegid, iLvl, p
ade0: 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[1].iLeafPgno
adf0: 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
ae00: 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70       if( pLvl->p
ae10: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
ae20: 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69    while( fts5Dli
ae30: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d  dxLvlNext(pLvl)=
ae40: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
ae50: 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a  pLvl->bEof = 0;.
ae60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
ae70: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
ae80: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
ae90: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61  l[0].bEof;.}.sta
aea0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
aeb0: 78 49 74 65 72 50 72 65 76 28 46 74 73 35 49 6e  xIterPrev(Fts5In
aec0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
aed0: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
aee0: 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64   return fts5Dlid
aef0: 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70 49  xIterPrevR(p, pI
af00: 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ter, 0);.}../*.*
af10: 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74  * Free a doclist
af20: 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20  -index iterator 
af30: 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64  object allocated
af40: 20 62 79 20 66 74 73 35 44 6c 69 64 78 49 74 65   by fts5DlidxIte
af50: 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  rInit()..*/.stat
af60: 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64  ic void fts5Dlid
af70: 78 49 74 65 72 46 72 65 65 28 46 74 73 35 44 6c  xIterFree(Fts5Dl
af80: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
af90: 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a  .  if( pIter ){.
afa0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
afb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
afc0: 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nLvl; i++){.   
afd0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
afe0: 73 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69  se(pIter->aLvl[i
aff0: 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ].pData);.    }.
b000: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b010: 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a  (pIter);.  }.}..
b020: 73 74 61 74 69 63 20 46 74 73 35 44 6c 69 64 78  static Fts5Dlidx
b030: 49 74 65 72 20 2a 66 74 73 35 44 6c 69 64 78 49  Iter *fts5DlidxI
b040: 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49  terInit(.  Fts5I
b050: 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
b060: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
b070: 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74  s5 Backend to it
b080: 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
b090: 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20    int bRev,     
b0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0b0: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52    /* True for OR
b0c0: 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20  DER BY ASC */.  
b0d0: 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20  int iSegid,     
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0f0: 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f  /* Segment id */
b100: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 20 20  .  int iLeafPg  
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20     /* Leaf page 
b130: 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64  number to load d
b140: 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20  lidx for */.){. 
b150: 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a   Fts5DlidxIter *
b160: 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74  pIter = 0;.  int
b170: 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20   i;.  int bDone 
b180: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
b190: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b1a0: 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69  K && bDone==0; i
b1b0: 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79  ++){.    int nBy
b1c0: 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
b1d0: 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a  DlidxIter) + i *
b1e0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b1f0: 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44  xLvl);.    Fts5D
b200: 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a  lidxIter *pNew;.
b210: 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73  .    pNew = (Fts
b220: 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69  5DlidxIter*)sqli
b230: 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65  te3_realloc(pIte
b240: 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  r, nByte);.    i
b250: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
b260: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
b270: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
b280: 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69  lse{.      i64 i
b290: 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49  Rowid = FTS5_DLI
b2a0: 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  DX_ROWID(iSegid,
b2b0: 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20   i, iLeafPg);.  
b2c0: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
b2d0: 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e   *pLvl = &pNew->
b2e0: 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70  aLvl[i];.      p
b2f0: 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Iter = pNew;.   
b300: 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20     memset(pLvl, 
b310: 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c  0, sizeof(Fts5Dl
b320: 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20  idxLvl));.      
b330: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
b340: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69 52  s5DataRead(p, iR
b350: 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
b360: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20   pLvl->pData && 
b370: 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b  (pLvl->pData->p[
b380: 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20  0] & 0x0001)==0 
b390: 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65  ){.        bDone
b3a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
b3b0: 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20      pIter->nLvl 
b3c0: 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  = i+1;.    }.  }
b3d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
b3e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b3f0: 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20  pIter->iSegid = 
b400: 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20  iSegid;.    if( 
b410: 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bRev==0 ){.     
b420: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 69   fts5DlidxIterFi
b430: 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20  rst(pIter);.    
b440: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73  }else{.      fts
b450: 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70  5DlidxIterLast(p
b460: 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a  , pIter);.    }.
b470: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
b480: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b490: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
b4a0: 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20  Free(pIter);.   
b4b0: 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a   pIter = 0;.  }.
b4c0: 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b  .  return pIter;
b4d0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
b4e0: 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
b4f0: 64 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  d(Fts5DlidxIter 
b500: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
b510: 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d  n pIter->aLvl[0]
b520: 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69  .iRowid;.}.stati
b530: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
b540: 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64  terPgno(Fts5Dlid
b550: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
b560: 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
b570: 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f  Lvl[0].iLeafPgno
b580: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20  ;.}../*.** Load 
b590: 74 68 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61  the next leaf pa
b5a0: 67 65 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d  ge into the segm
b5b0: 65 6e 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f  ent iterator..*/
b5c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
b5d0: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
b5e0: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
b5f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
b600: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
b610: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
b620: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
b630: 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
b640: 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61  /* Iterator to a
b650: 64 76 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70  dvance to next p
b660: 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  age */.){.  Fts5
b670: 44 61 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46  Data *pLeaf;.  F
b680: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
b690: 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
b6a0: 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44  r->pSeg;.  fts5D
b6b0: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
b6c0: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
b6d0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a  r->iLeafPgno++;.
b6e0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65    if( pIter->pNe
b6f0: 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49  xtLeaf ){.    pI
b700: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74  ter->pLeaf = pIt
b710: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20  er->pNextLeaf;. 
b720: 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
b730: 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  eaf = 0;.  }else
b740: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
b750: 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e  fPgno<=pSeg->pgn
b760: 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74  oLast ){.    pIt
b770: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
b780: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
b790: 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e       FTS5_SEGMEN
b7a0: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
b7b0: 65 67 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65  egid, pIter->iLe
b7c0: 61 66 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20  afPgno).    );. 
b7d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65   }else{.    pIte
b7e0: 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
b7f0: 7d 0a 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65  }.  pLeaf = pIte
b800: 72 2d 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28  r->pLeaf;..  if(
b810: 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49   pLeaf ){.    pI
b820: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
b830: 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a   pLeaf->szLeaf;.
b840: 20 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66      if( fts5Leaf
b850: 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66  IsTermless(pLeaf
b860: 29 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72  ) ){.      pIter
b870: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
b880: 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20  = pLeaf->nn+1;. 
b890: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b8a0: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
b8b0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
b8c0: 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49  t32(&pLeaf->p[pI
b8d0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c  ter->iPgidxOff],
b8e0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
b8f0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a  ->iEndofDoclist.
b900: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
b910: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75   }.}../*.** Argu
b920: 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f  ment p points to
b930: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
b940: 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f  ning a varint to
b950: 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64 20   be interpreted 
b960: 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e  as a.** position
b970: 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64   list size field
b980: 2e 20 52 65 61 64 20 74 68 65 20 76 61 72 69 6e  . Read the varin
b990: 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  t and return the
b9a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b9b0: 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65  .** read. Before
b9c0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20   returning, set 
b9d0: 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d  *pnSz to the num
b9e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
b9f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20  the position.** 
ba00: 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c  list, and *pbDel
ba10: 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
ba20: 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73  delete flag is s
ba30: 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  et, or false oth
ba40: 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
ba50: 63 20 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73  c int fts5GetPos
ba60: 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75  listSize(const u
ba70: 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c  8 *p, int *pnSz,
ba80: 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20   int *pbDel){.  
ba90: 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e  int nSz;.  int n
baa0: 20 3d 20 30 3b 0a 20 20 66 74 73 35 46 61 73 74   = 0;.  fts5Fast
bab0: 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20 6e  GetVarint32(p, n
bac0: 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65 72 74  , nSz);.  assert
bad0: 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b 0a 20  _nc( nSz>=0 );. 
bae0: 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32 3b 0a   *pnSz = nSz/2;.
baf0: 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a 20 26    *pbDel = nSz &
bb00: 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74 75 72   0x0001;.  retur
bb10: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74  n n;.}../*.** Ft
bb20: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
bb30: 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c 79 20  ffset currently 
bb40: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
bb50: 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a 2a 2a  rst byte of a.**
bb60: 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73   position-list s
bb70: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
bb80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
bb90: 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f 72 65   field and store
bba0: 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20 66 6f   it.** in the fo
bbb0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
bbc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53  s:.**.**   Fts5S
bbd0: 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a 20 20  egIter.nPos.**  
bbe0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 62 44 65   Fts5SegIter.bDe
bbf0: 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20 46 74  l.**.** Leave Ft
bc00: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
bc10: 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67 20 74  ffset pointing t
bc20: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
bc30: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f 73 69   of the .** posi
bc40: 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e  tion list conten
bc50: 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f 0a 73  t (if any)..*/.s
bc60: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
bc70: 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 46  egIterLoadNPos(F
bc80: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
bc90: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
bca0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
bcb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bcc0: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
bcd0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
bce0: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
bcf0: 64 20 61 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  d at */.    int 
bd00: 6e 53 7a 3b 0a 20 20 20 20 41 53 53 45 52 54 5f  nSz;.    ASSERT_
bd10: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
bd20: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 66 74 73  >pLeaf);.    fts
bd30: 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33 32  5FastGetVarint32
bd40: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70  (pIter->pLeaf->p
bd50: 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b 0a 20 20  , iOff, nSz);.  
bd60: 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20    pIter->bDel = 
bd70: 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b 0a  (nSz & 0x0001);.
bd80: 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20      pIter->nPos 
bd90: 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20 20 70 49  = nSz>>1;.    pI
bda0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
bdb0: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a   = iOff;.  }.}..
bdc0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
bdd0: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
bde0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
bdf0: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
be00: 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  r){.  u8 *a = pI
be10: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
be20: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
be30: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
be40: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
be50: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
be60: 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f  fset;..  ASSERT_
be70: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
be80: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69  >pLeaf);.  if( i
be90: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
bea0: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
beb0: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
bec0: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
bed0: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
bee0: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
bef0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
bf00: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
bf10: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
bf20: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
bf30: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
bf40: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
bf50: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
bf60: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
bf70: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
bf80: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
bf90: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70  er->iRowid);.  p
bfa0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
bfb0: 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  t = iOff;.}../*.
bfc0: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
bfd0: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
bfe0: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
bff0: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
c000: 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69   the .** "nSuffi
c010: 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65  x" field of a te
c020: 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72  rm. Function par
c030: 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e  ameter nKeep con
c040: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a  tains the value.
c050: 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66  ** of the "nPref
c060: 69 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68  ix" field (if th
c070: 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74  ere was one - it
c080: 20 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20   is passed 0 if 
c090: 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  this is.** the f
c0a0: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  irst term in the
c0b0: 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a   segment)..**.**
c0c0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
c0d0: 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  opulates:.**.** 
c0e0: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65    Fts5SegIter.te
c0f0: 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  rm.**   Fts5SegI
c100: 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  ter.rowid.**.** 
c110: 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20  accordingly and 
c120: 6c 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49  leaves (Fts5SegI
c130: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29  ter.iLeafOffset)
c140: 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74   set to the cont
c150: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  ent of.** the fi
c160: 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  rst position lis
c170: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
c180: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
c190: 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28  o document .** (
c1a0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
c1b0: 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
c1c0: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
c1d0: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
c1e0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
c1f0: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
c200: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
c210: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
c220: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
c230: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
c240: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
c250: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
c260: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
c270: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
c280: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2a0: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
c2b0: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
c2c0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
c2d0: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
c2e0: 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65 72 2d 3e  nNew);.  pIter->
c2f0: 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a  term.n = nKeep;.
c300: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
c310: 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
c320: 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4e 65  pIter->term, nNe
c330: 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20  w, &a[iOff]);.  
c340: 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20  iOff += nNew;.  
c350: 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66  pIter->iTermLeaf
c360: 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20  Offset = iOff;. 
c370: 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61   pIter->iTermLea
c380: 66 50 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69  fPgno = pIter->i
c390: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70 49 74 65  LeafPgno;.  pIte
c3a0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
c3b0: 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28 20 70 49   iOff;..  if( pI
c3c0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 3e 3d  ter->iPgidxOff>=
c3d0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
c3e0: 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   ){.    pIter->i
c3f0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70  EndofDoclist = p
c400: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 2b  Iter->pLeaf->nn+
c410: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
c420: 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20 20 20  int nExtra;.    
c430: 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66  pIter->iPgidxOff
c440: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
c450: 74 33 32 28 26 61 5b 70 49 74 65 72 2d 3e 69 50  t32(&a[pIter->iP
c460: 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78 74 72 61  gidxOff], nExtra
c470: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45  );.    pIter->iE
c480: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b 3d 20 6e  ndofDoclist += n
c490: 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20 20 66 74  Extra;.  }..  ft
c4a0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77  s5SegIterLoadRow
c4b0: 69 64 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a  id(p, pIter);.}.
c4c0: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
c4d0: 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f  e the iterator o
c4e0: 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 69  bject pIter to i
c4f0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
c500: 68 65 20 65 6e 74 72 69 65 73 20 69 6e 0a 2a 2a  he entries in.**
c510: 20 73 65 67 6d 65 6e 74 20 70 53 65 67 2e 20 54   segment pSeg. T
c520: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c  he iterator is l
c530: 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  eft pointing to 
c540: 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
c550: 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75  when .** this fu
c560: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 0a  nction returns..
c570: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
c580: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
c590: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
c5a0: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
c5b0: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
c5c0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
c5d0: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
c5e0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c5f0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
c600: 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
c610: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
c620: 35 53 65 67 49 74 65 72 49 6e 69 74 28 0a 20 20  5SegIterInit(.  
c630: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 6f 62 6a  /* FTS index obj
c660: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
c670: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
c680: 53 65 67 2c 20 20 20 20 20 2f 2a 20 44 65 73 63  Seg,     /* Desc
c690: 72 69 70 74 69 6f 6e 20 6f 66 20 73 65 67 6d 65  ription of segme
c6a0: 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49  nt */.  Fts5SegI
c6b0: 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20  ter *pIter      
c6c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63          /* Objec
c6d0: 74 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f  t to populate */
c6e0: 0a 29 7b 0a 20 20 69 66 28 20 70 53 65 67 2d 3e  .){.  if( pSeg->
c6f0: 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20 29 7b 0a  pgnoFirst==0 ){.
c700: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
c710: 65 6e 73 20 69 66 20 74 68 65 20 73 65 67 6d 65  ens if the segme
c720: 6e 74 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  nt is being used
c730: 20 61 73 20 61 6e 20 69 6e 70 75 74 20 74 6f 20   as an input to 
c740: 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 20  an incremental. 
c750: 20 20 20 2a 2a 20 6d 65 72 67 65 20 61 6e 64 20     ** merge and 
c760: 61 6c 6c 20 64 61 74 61 20 68 61 73 20 61 6c 72  all data has alr
c770: 65 61 64 79 20 62 65 65 6e 20 22 74 72 69 6d 6d  eady been "trimm
c780: 65 64 22 2e 20 53 65 65 20 66 75 6e 63 74 69 6f  ed". See functio
c790: 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35 54 72 69  n.    ** fts5Tri
c7a0: 6d 53 65 67 6d 65 6e 74 73 28 29 20 66 6f 72 20  mSegments() for 
c7b0: 64 65 74 61 69 6c 73 2e 20 49 6e 20 74 68 69 73  details. In this
c7c0: 20 63 61 73 65 20 6c 65 61 76 65 20 74 68 65 20   case leave the 
c7d0: 69 74 65 72 61 74 6f 72 20 65 6d 70 74 79 2e 0a  iterator empty..
c7e0: 20 20 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 65      ** The calle
c7f0: 72 20 77 69 6c 6c 20 73 65 65 20 74 68 65 20 28  r will see the (
c800: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 29  pIter->pLeaf==0)
c810: 20 61 6e 64 20 61 73 73 75 6d 65 20 74 68 65 20   and assume the 
c820: 69 74 65 72 61 74 6f 72 20 69 73 0a 20 20 20 20  iterator is.    
c830: 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72 65 61 64  ** at EOF alread
c840: 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  y. */.    assert
c850: 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d  ( pIter->pLeaf==
c860: 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 );.    return;
c870: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
c880: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c890: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72      memset(pIter
c8a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
c8b0: 65 72 29 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  er));.    pIter-
c8c0: 3e 70 53 65 67 20 3d 20 70 53 65 67 3b 0a 20 20  >pSeg = pSeg;.  
c8d0: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
c8e0: 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46  no = pSeg->pgnoF
c8f0: 69 72 73 74 2d 31 3b 0a 20 20 20 20 66 74 73 35  irst-1;.    fts5
c900: 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
c910: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 0a  p, pIter);.  }..
c920: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
c930: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49  ITE_OK ){.    pI
c940: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
c950: 20 3d 20 34 3b 0a 20 20 20 20 61 73 73 65 72 74   = 4;.    assert
c960: 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  _nc( pIter->pLea
c970: 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20 20 20 61  f->nn>4 );.    a
c980: 73 73 65 72 74 28 20 66 74 73 35 4c 65 61 66 46  ssert( fts5LeafF
c990: 69 72 73 74 54 65 72 6d 4f 66 66 28 70 49 74 65  irstTermOff(pIte
c9a0: 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20 29 3b 0a  r->pLeaf)==4 );.
c9b0: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
c9c0: 78 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  xOff = pIter->pL
c9d0: 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31 3b 0a 20  eaf->szLeaf+1;. 
c9e0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
c9f0: 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c  adTerm(p, pIter,
ca00: 20 30 29 3b 0a 20 20 20 20 66 74 73 35 53 65 67   0);.    fts5Seg
ca10: 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20  IterLoadNPos(p, 
ca20: 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pIter);.  }.}../
ca30: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
ca40: 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  on is only ever 
ca50: 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65 72 61 74  called on iterat
ca60: 6f 72 73 20 63 72 65 61 74 65 64 20 62 79 20 63  ors created by c
ca70: 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74 73 35 49  alls to.** Fts5I
ca80: 6e 64 65 78 51 75 65 72 79 28 29 20 77 69 74 68  ndexQuery() with
ca90: 20 74 68 65 20 46 54 53 35 49 4e 44 45 58 5f 51   the FTS5INDEX_Q
caa0: 55 45 52 59 5f 44 45 53 43 20 66 6c 61 67 20 73  UERY_DESC flag s
cab0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  et..**.** The it
cac0: 65 72 61 74 6f 72 20 69 73 20 69 6e 20 61 6e 20  erator is in an 
cad0: 75 6e 75 73 75 61 6c 20 73 74 61 74 65 20 77 68  unusual state wh
cae0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
caf0: 20 69 73 20 63 61 6c 6c 65 64 3a 20 74 68 65 0a   is called: the.
cb00: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
cb10: 4c 65 61 66 4f 66 66 73 65 74 20 76 61 72 69 61  LeafOffset varia
cb20: 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ble is set to th
cb30: 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20  e offset of the 
cb40: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74 68 65 20  start of.** the 
cb50: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
cb60: 7a 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65  ze field for the
cb70: 20 66 69 72 73 74 20 72 65 6c 65 76 61 6e 74 20   first relevant 
cb80: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
cb90: 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  e..** Fts5SegIte
cba0: 72 2e 72 6f 77 69 64 20 69 73 20 73 65 74 2c 20  r.rowid is set, 
cbb0: 62 75 74 20 6e 50 6f 73 20 61 6e 64 20 62 44 65  but nPos and bDe
cbc0: 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  l are not..**.**
cbd0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
cbe0: 64 76 61 6e 63 65 73 20 74 68 65 20 69 74 65 72  dvances the iter
cbf0: 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  ator so that it 
cc00: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6c 61  points to the la
cc10: 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61 6e 74 20  st .** relevant 
cc20: 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67  rowid on the pag
cc30: 65 20 61 6e 64 2c 20 69 66 20 6e 65 63 65 73 73  e and, if necess
cc40: 61 72 79 2c 20 69 6e 69 74 69 61 6c 69 7a 65 73  ary, initializes
cc50: 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77 69 64 4f   the .** aRowidO
cc60: 66 66 73 65 74 5b 5d 20 61 6e 64 20 69 52 6f 77  ffset[] and iRow
cc70: 69 64 4f 66 66 73 65 74 20 76 61 72 69 61 62 6c  idOffset variabl
cc80: 65 73 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  es. At this poin
cc90: 74 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 2a  t the iterator.*
cca0: 2a 20 69 73 20 69 6e 20 69 74 73 20 72 65 67 75  * is in its regu
ccb0: 6c 61 72 20 73 74 61 74 65 20 2d 20 46 74 73 35  lar state - Fts5
ccc0: 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66  SegIter.iLeafOff
ccd0: 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  set points to th
cce0: 65 20 66 69 72 73 74 0a 2a 2a 20 62 79 74 65 20  e first.** byte 
ccf0: 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  of the position 
cd00: 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 61 73 73  list content ass
cd10: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 61 69  ociated with sai
cd20: 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73 74 61 74  d rowid..*/.stat
cd30: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
cd40: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
cd50: 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ge(Fts5Index *p,
cd60: 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
cd70: 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ter){.  int n = 
cd80: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a  pIter->pLeaf->sz
cd90: 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20  Leaf;.  int i = 
cda0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
cdb0: 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  et;.  u8 *a = pI
cdc0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
cdd0: 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65   int iRowidOffse
cde0: 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  t = 0;..  if( n>
cdf0: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
ce00: 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20  list ){.    n = 
ce10: 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63  pIter->iEndofDoc
ce20: 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53  list;.  }..  ASS
ce30: 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49  ERT_SZLEAF_OK(pI
ce40: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77  ter->pLeaf);.  w
ce50: 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
ce60: 36 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20  64 iDelta = 0;. 
ce70: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
ce80: 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20   int bDummy;..  
ce90: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 50 6f    i += fts5GetPo
cea0: 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c  slistSize(&a[i],
ceb0: 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29   &nPos, &bDummy)
cec0: 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b  ;.    i += nPos;
ced0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29 20  .    if( i>=n ) 
cee0: 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20  break;.    i += 
cef0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
cf00: 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  [i], (u64*)&iDel
cf10: 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  ta);.    pIter->
cf20: 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61  iRowid += iDelta
cf30: 3b 0a 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ;..    if( iRowi
cf40: 64 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e  dOffset>=pIter->
cf50: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a  nRowidOffset ){.
cf60: 20 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d        int nNew =
cf70: 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66   pIter->nRowidOf
cf80: 66 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20  fset + 8;.      
cf90: 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74  int *aNew = (int
cfa0: 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f  *)sqlite3_reallo
cfb0: 63 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  c(pIter->aRowidO
cfc0: 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73 69 7a 65  ffset, nNew*size
cfd0: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
cfe0: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
cff0: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
d000: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
d010: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d020: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
d030: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >aRowidOffset = 
d040: 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65  aNew;.      pIte
d050: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
d060: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20  = nNew;.    }.. 
d070: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
d080: 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66  Offset[iRowidOff
d090: 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e  set++] = pIter->
d0a0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
d0b0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d0c0: 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70  set = i;.  }.  p
d0d0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
d0e0: 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65  et = iRowidOffse
d0f0: 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  t;.  fts5SegIter
d100: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
d110: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  r);.}../*.**.*/.
d120: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d130: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
d140: 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  wPage(Fts5Index 
d150: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
d160: 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
d170: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
d180: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
d190: 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65  EVERSE );.  asse
d1a0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
d1b0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
d1c0: 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74  ONETERM );..  ft
d1d0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
d1e0: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
d1f0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
d200: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
d210: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
d220: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70  ter->iLeafPgno>p
d230: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
d240: 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44  gno ){.    Fts5D
d250: 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ata *pNew;.    p
d260: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
d270: 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74  -;.    pNew = ft
d280: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
d290: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
d2a0: 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  (.          pIte
d2b0: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
d2c0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
d2d0: 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  o.    ));.    if
d2e0: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
d2f0: 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  /* iTermLeafOffs
d300: 65 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20  et may be equal 
d310: 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65  to szLeaf if the
d320: 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73   term is the las
d330: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67  t.      ** thing
d340: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69   on the page - i
d350: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f  .e. the first ro
d360: 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f  wid is on the fo
d370: 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20  llowing page..  
d380: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
d390: 61 73 65 20 6c 65 61 66 20 70 49 74 65 72 2d 3e  ase leaf pIter->
d3a0: 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20 69  pLeaf==0, this i
d3b0: 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
d3c0: 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  F. */.      if( 
d3d0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
d3e0: 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  ==pIter->iTermLe
d3f0: 61 66 50 67 6e 6f 20 0a 20 20 20 20 20 20 20 26  afPgno .       &
d400: 26 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  & pIter->iTermLe
d410: 61 66 4f 66 66 73 65 74 3c 70 4e 65 77 2d 3e 73  afOffset<pNew->s
d420: 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 29 7b 0a  zLeaf .      ){.
d430: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70          pIter->p
d440: 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Leaf = pNew;.   
d450: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
d460: 66 4f 66 66 73 65 74 20 3d 20 70 49 74 65 72 2d  fOffset = pIter-
d470: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
d480: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
d490: 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
d4a0: 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52  dOff;.        iR
d4b0: 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65  owidOff = fts5Le
d4c0: 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28  afFirstRowidOff(
d4d0: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69  pNew);.        i
d4e0: 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a  f( iRowidOff ){.
d4f0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
d500: 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20  >pLeaf = pNew;. 
d510: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
d520: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52  iLeafOffset = iR
d530: 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20  owidOff;.       
d540: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
d550: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
d560: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  af ){.        u8
d570: 20 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c   *a = &pIter->pL
d580: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c  eaf->p[pIter->iL
d590: 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  eafOffset];.    
d5a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
d5b0: 4f 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65  Offset += fts5Ge
d5c0: 74 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a  tVarint(a, (u64*
d5d0: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
d5e0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
d5f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
d600: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
d610: 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
d620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d630: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
d640: 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  af ){.    pIter-
d650: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
d660: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
d670: 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67  n+1;.    fts5Seg
d680: 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
d690: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
d6a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
d6b0: 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
d6c0: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
d6d0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
d6e0: 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a  ument currently.
d6f0: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64  ** points to a d
d700: 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20  elete marker. A 
d710: 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73  delete marker is
d720: 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
d730: 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74   0 byte.** posit
d740: 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61  ion-list..*/.sta
d750: 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74  tic int fts5Mult
d760: 69 49 74 65 72 49 73 45 6d 70 74 79 28 46 74 73  iIterIsEmpty(Fts
d770: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
d780: 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
d790: 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  {.  Fts5SegIter 
d7a0: 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
d7b0: 61 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72  aSeg[pIter->aFir
d7c0: 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20  st[1].iFirst];. 
d7d0: 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
d7e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65  SQLITE_OK && pSe
d7f0: 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67  g->pLeaf && pSeg
d800: 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f  ->nPos==0);.}../
d810: 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65  *.** Advance ite
d820: 72 61 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74  rator pIter to t
d830: 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a  he next entry. .
d840: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
d850: 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
d860: 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
d870: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
d880: 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a  error code. It .
d890: 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64  ** is not consid
d8a0: 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66  ered an error if
d8b0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
d8c0: 61 63 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e  aches EOF. If an
d8d0: 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
d8e0: 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
d8f0: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
d900: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  on is called, it
d910: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
d920: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
d930: 53 65 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46  SegIterNext(.  F
d940: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d960: 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
d970: 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
d980: 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
d990: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
d9a0: 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
d9b0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65  e */.  int *pbNe
d9c0: 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  wTerm           
d9d0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
d9e0: 65 74 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20  et for new term 
d9f0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
da00: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20  pbNewTerm==0 || 
da10: 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b  *pbNewTerm==0 );
da20: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
da30: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
da40: 66 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  f( pIter->flags 
da50: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
da60: 45 56 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20  EVERSE ){.      
da70: 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
da80: 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
da90: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
daa0: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
dab0: 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61 20  {.        u8 *a 
dac0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
dad0: 70 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  p;.        int i
dae0: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Off;.        int
daf0: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69   nPos;.        i
db00: 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20  nt bDummy;.     
db10: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
db20: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
db30: 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20  RowidOffset--;. 
db40: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
db50: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
db60: 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64   = pIter->aRowid
db70: 4f 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52  Offset[pIter->iR
db80: 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20  owidOffset];.   
db90: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
dba0: 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28  5GetPoslistSize(
dbb0: 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c  &a[iOff], &nPos,
dbc0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
dbd0: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b     iOff += nPos;
dbe0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74  .        fts5Get
dbf0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
dc00: 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
dc10: 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
dc20: 69 52 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61  iRowid -= iDelta
dc30: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
dc40: 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
dc50: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
dc60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
dc70: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
dc80: 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72  NewPage(p, pIter
dc90: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
dca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35  else{.      Fts5
dcb0: 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49  Data *pLeaf = pI
dcc0: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
dcd0: 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20    int iOff;.    
dce0: 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
dcf0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b   0;.      int nK
dd00: 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20  eep = 0;..      
dd10: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 74 68  /* Search for th
dd20: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73  e end of the pos
dd30: 69 74 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69  ition list withi
dd40: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
dd50: 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20  ge. */.      u8 
dd60: 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20  *a = pLeaf->p;. 
dd70: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65       int n = pLe
dd80: 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20  af->szLeaf;..   
dd90: 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46     ASSERT_SZLEAF
dda0: 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20 20 20 20  _OK(pLeaf);.    
ddb0: 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e    iOff = pIter->
ddc0: 69 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49  iLeafOffset + pI
ddd0: 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 20 20  ter->nPos;..    
dde0: 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
ddf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e          /* The n
de00: 65 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20  ext entry is on 
de10: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
de20: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73  . */.        ass
de30: 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c 3d 70 49  ert_nc( iOff<=pI
de40: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
de50: 73 74 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  st );.        if
de60: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69  ( iOff>=pIter->i
de70: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a  EndofDoclist ){.
de80: 20 20 20 20 20 20 20 20 20 20 62 4e 65 77 54 65            bNewTe
de90: 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rm = 1;.        
dea0: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
deb0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
dec0: 28 70 4c 65 61 66 29 20 29 7b 0a 20 20 20 20 20  (pLeaf) ){.     
ded0: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
dee0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
def0: 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29 3b  a[iOff], nKeep);
df00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
df10: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
df20: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
df30: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
df40: 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
df50: 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66  etVarint(&a[iOff
df60: 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  ], &iDelta);.   
df70: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
df80: 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a  owid += iDelta;.
df90: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
dfa0: 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30 20 29 3b  _nc( iDelta>0 );
dfb0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
dfc0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
dfd0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
dfe0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
dff0: 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b  Iter->pSeg==0 ){
e000: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 75  .        const u
e010: 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  8 *pList = 0;.  
e020: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
e030: 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20   *zTerm = 0;.   
e040: 20 20 20 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d       int nList =
e050: 20 30 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   0;.        asse
e060: 72 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  rt( (pIter->flag
e070: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
e080: 5f 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e  _ONETERM) || pbN
e090: 65 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 20 20  ewTerm );.      
e0a0: 20 20 69 66 28 20 30 3d 3d 28 70 49 74 65 72 2d    if( 0==(pIter-
e0b0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
e0c0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29  GITER_ONETERM) )
e0d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
e0e0: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 4e  te3Fts5HashScanN
e0f0: 65 78 74 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20  ext(p->pHash);. 
e100: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e110: 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72  Fts5HashScanEntr
e120: 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65  y(p->pHash, &zTe
e130: 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69  rm, &pList, &nLi
e140: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
e150: 20 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74         if( pList
e160: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e170: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
e180: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
e190: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e1a0: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
e1b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
e1c0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e1d0: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
e1e0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  t;.          pIt
e1f0: 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20  er->pLeaf->nn = 
e200: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  nList;.         
e210: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
e220: 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20  zLeaf = nList;. 
e230: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e240: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
e250: 6e 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 20  nList+1;.       
e260: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
e270: 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20  fferSet(&p->rc, 
e280: 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69  &pIter->term, (i
e290: 6e 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29  nt)strlen(zTerm)
e2a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e2b0: 28 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20  (u8*)zTerm);.   
e2c0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e2d0: 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
e2e0: 47 65 74 56 61 72 69 6e 74 28 70 4c 69 73 74 2c  GetVarint(pList,
e2f0: 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69   (u64*)&pIter->i
e300: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Rowid);.        
e310: 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31    *pbNewTerm = 1
e320: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e330: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
e340: 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20   iOff = 0;.     
e350: 20 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79     /* Next entry
e360: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
e370: 75 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20  urrent page */. 
e380: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 4f         while( iO
e390: 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ff==0 ){.       
e3a0: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
e3b0: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
e3c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 61  ;.          pLea
e3d0: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
e3e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e3f0: 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b  pLeaf==0 ) break
e400: 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45  ;.          ASSE
e410: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
e420: 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  af);.          i
e430: 66 28 20 28 69 4f 66 66 20 3d 20 66 74 73 35 4c  f( (iOff = fts5L
e440: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
e450: 28 70 4c 65 61 66 29 29 20 26 26 20 69 4f 66 66  (pLeaf)) && iOff
e460: 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  <pLeaf->szLeaf )
e470: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4f  {.            iO
e480: 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
e490: 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  5GetVarint(&pLea
e4a0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
e4b0: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
e4c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e4d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e4e0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20  t = iOff;..     
e4f0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
e500: 2d 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ->nn>pLeaf->szLe
e510: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
e520: 20 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64      pIter->iPgid
e530: 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d 3e 73 7a  xOff = pLeaf->sz
e540: 4c 65 61 66 20 2b 20 66 74 73 35 47 65 74 56 61  Leaf + fts5GetVa
e550: 72 69 6e 74 33 32 28 0a 20 20 20 20 20 20 20 20  rint32(.        
e560: 20 20 20 20 20 20 20 20 20 20 26 70 4c 65 61 66            &pLeaf
e570: 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ->p[pLeaf->szLea
e580: 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f  f], pIter->iEndo
e590: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 20  fDoclist.       
e5a0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
e5b0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
e5c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 65     }.          e
e5d0: 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e  lse if( pLeaf->n
e5e0: 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  n>pLeaf->szLeaf 
e5f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
e600: 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20  Iter->iPgidxOff 
e610: 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  = pLeaf->szLeaf 
e620: 2b 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  + fts5GetVarint3
e630: 32 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2(.             
e640: 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c 65     &pLeaf->p[pLe
e650: 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66  af->szLeaf], iOf
e660: 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  f.            );
e670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
e680: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
e690: 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  = iOff;.        
e6a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
e6b0: 66 44 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b  fDoclist = iOff;
e6c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 4e 65  .            bNe
e6d0: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
e6e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
e6f0: 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66   if( iOff>=pLeaf
e700: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e710: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
e720: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
e730: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e740: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
e750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
e760: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
e770: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
e780: 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49  is now at EOF. I
e790: 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72  f so, return ear
e7a0: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
e7b0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
e7c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4e 65  .        if( bNe
e7d0: 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  wTerm ){.       
e7e0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
e7f0: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e800: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20  ER_ONETERM ){.  
e810: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
e820: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
e830: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
e840: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
e850: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  f = 0;.         
e860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e870: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
e880: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
e890: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
e8a0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
e8b0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
e8c0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
e8d0: 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29   if( pbNewTerm )
e8e0: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
e8f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
e900: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e910: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
e920: 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20  lowing could be 
e930: 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
e940: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e950: 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20  Pos(). But.     
e960: 20 20 20 20 20 2a 2a 20 74 68 69 73 20 62 6c 6f       ** this blo
e970: 63 6b 20 69 73 20 70 61 72 74 69 63 75 6c 61 72  ck is particular
e980: 6c 79 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 63  ly performance c
e990: 72 69 74 69 63 61 6c 2c 20 73 6f 20 65 71 75 69  ritical, so equi
e9a0: 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 20  valent.         
e9b0: 20 2a 2a 20 63 6f 64 65 20 69 73 20 69 6e 6c 69   ** code is inli
e9c0: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ned. */.        
e9d0: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20    int nSz;.     
e9e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
e9f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
ea00: 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 46  .          fts5F
ea10: 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
ea20: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 2c 20  Iter->pLeaf->p, 
ea30: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ea40: 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20 20 20 20  et, nSz);.      
ea50: 20 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20      pIter->bDel 
ea60: 3d 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29  = (nSz & 0x0001)
ea70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
ea80: 72 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31  r->nPos = nSz>>1
ea90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eaa0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
eab0: 0a 23 64 65 66 69 6e 65 20 53 57 41 50 56 41 4c  .#define SWAPVAL
eac0: 28 54 2c 20 61 2c 20 62 29 20 7b 20 54 20 74 6d  (T, a, b) { T tm
ead0: 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62  p; tmp=a; a=b; b
eae0: 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49  =tmp; }../*.** I
eaf0: 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
eb00: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
eb10: 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
eb20: 64 20 69 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20  d in a doclist. 
eb30: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
eb40: 20 73 65 74 73 20 74 68 65 20 69 74 65 72 61 74   sets the iterat
eb50: 6f 72 20 75 70 20 73 6f 20 74 68 61 74 20 69 74  or up so that it
eb60: 65 72 61 74 65 73 20 69 6e 20 72 65 76 65 72 73  erates in revers
eb70: 65 20 6f 72 64 65 72 20 74 68 72 6f 75 67 68 0a  e order through.
eb80: 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a  ** the doclist..
eb90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
eba0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
ebb0: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
ebc0: 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
ebd0: 65 72 29 7b 0a 20 20 46 74 73 35 44 6c 69 64 78  er){.  Fts5Dlidx
ebe0: 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 70  Iter *pDlidx = p
ebf0: 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20  Iter->pDlidx;.  
ec00: 46 74 73 35 44 61 74 61 20 2a 70 4c 61 73 74 20  Fts5Data *pLast 
ec10: 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  = 0;.  int pgnoL
ec20: 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ast = 0;..  if( 
ec30: 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 69 6e  pDlidx ){.    in
ec40: 74 20 69 53 65 67 69 64 20 3d 20 70 49 74 65 72  t iSegid = pIter
ec50: 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  ->pSeg->iSegid;.
ec60: 20 20 20 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66      pgnoLast = f
ec70: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
ec80: 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c  (pDlidx);.    pL
ec90: 61 73 74 20 3d 20 66 74 73 35 44 61 74 61 52 65  ast = fts5DataRe
eca0: 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
ecb0: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c  NT_ROWID(iSegid,
ecc0: 20 70 67 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d   pgnoLast));.  }
ecd0: 65 6c 73 65 7b 0a 20 20 20 20 46 74 73 35 44 61  else{.    Fts5Da
ece0: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
ecf0: 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20 20  r->pLeaf;       
ed00: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65 61    /* Current lea
ed10: 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f  f data */..    /
ed20: 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74 73  * Currently, Fts
ed30: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
ed40: 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  fset points to t
ed50: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
ed60: 0a 20 20 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e  .    ** position
ed70: 2d 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f  -list content fo
ed80: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  r the current ro
ed90: 77 69 64 2e 20 42 61 63 6b 20 69 74 20 75 70 20  wid. Back it up 
eda0: 73 6f 20 74 68 61 74 20 69 74 0a 20 20 20 20 2a  so that it.    *
edb0: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
edc0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 6f 73  start of the pos
edd0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
ede0: 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 70 49  field. */.    pI
edf0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ee00: 20 2d 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   -= sqlite3Fts5G
ee10: 65 74 56 61 72 69 6e 74 4c 65 6e 28 70 49 74 65  etVarintLen(pIte
ee20: 72 2d 3e 6e 50 6f 73 2a 32 2b 70 49 74 65 72 2d  r->nPos*2+pIter-
ee30: 3e 62 44 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20  >bDel);..    /* 
ee40: 49 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f  If this conditio
ee50: 6e 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74  n is true then t
ee60: 68 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64  he largest rowid
ee70: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
ee80: 0a 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79  .    ** term may
ee90: 20 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f   not be stored o
eea0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
eeb0: 67 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f  ge. So search fo
eec0: 72 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20  rward to.    ** 
eed0: 73 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72  see where said r
eee0: 6f 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20  owid really is. 
eef0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65   */.    if( pIte
ef00: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
ef10: 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  >=pLeaf->szLeaf 
ef20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e  ){.      int pgn
ef30: 6f 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  o;.      Fts5Str
ef40: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
ef50: 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  Seg = pIter->pSe
ef60: 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  g;..      /* The
ef70: 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74   last rowid in t
ef80: 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e  he doclist may n
ef90: 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72  ot be on the cur
efa0: 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63  rent page. Searc
efb0: 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61  h.      ** forwa
efc0: 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70  rd to find the p
efd0: 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  age containing t
efe0: 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20  he last rowid.  
eff0: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e  */.      for(pgn
f000: 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o=pIter->iLeafPg
f010: 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20  no+1; !p->rc && 
f020: 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f  pgno<=pSeg->pgno
f030: 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20  Last; pgno++){. 
f040: 20 20 20 20 20 20 20 69 36 34 20 69 41 62 73 20         i64 iAbs 
f050: 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  = FTS5_SEGMENT_R
f060: 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69  OWID(pSeg->iSegi
f070: 64 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  d, pgno);.      
f080: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77    Fts5Data *pNew
f090: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
f0a0: 70 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20  p, iAbs);.      
f0b0: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
f0c0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77          int iRow
f0d0: 69 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20  id, bTermless;. 
f0e0: 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20           iRowid 
f0f0: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
f100: 6f 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20  owidOff(pNew);. 
f110: 20 20 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65           bTermle
f120: 73 73 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54  ss = fts5LeafIsT
f130: 65 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20  ermless(pNew);. 
f140: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f           if( iRo
f150: 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  wid ){.         
f160: 20 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44     SWAPVAL(Fts5D
f170: 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73  ata*, pNew, pLas
f180: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
f190: 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b  pgnoLast = pgno;
f1a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
f1b0: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
f1c0: 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20  elease(pNew);.  
f1d0: 20 20 20 20 20 20 20 20 69 66 28 20 62 54 65 72          if( bTer
f1e0: 6d 6c 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b  mless==0 ) break
f1f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
f200: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
f210: 20 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20   /* If pLast is 
f220: 4e 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69  NULL at this poi
f230: 6e 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73  nt, then the las
f240: 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73  t rowid for this
f250: 20 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69   doclist.  ** li
f260: 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63  es on the page c
f270: 75 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74  urrently indicat
f280: 65 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74  ed by the iterat
f290: 6f 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  or. In this case
f2a0: 20 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c   .  ** pIter->iL
f2b0: 65 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72  eafOffset is alr
f2c0: 65 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e  eady set to poin
f2d0: 74 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  t to the positio
f2e0: 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a  n-list size.  **
f2f0: 20 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65   field associate
f300: 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
f310: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
f320: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a  on the page..  *
f330: 2a 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c  *.  ** Or, if pL
f340: 61 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ast is non-NULL,
f350: 20 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20   then it is the 
f360: 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69  page that contai
f370: 6e 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a  ns the last.  **
f380: 20 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20   rowid. In this 
f390: 63 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74  case configure t
f3a0: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
f3b0: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
f3c0: 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20   the.  ** first 
f3d0: 72 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61  rowid on this pa
f3e0: 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
f3f0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Last ){.    int 
f400: 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61  iOff;.    fts5Da
f410: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
f420: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74  >pLeaf);.    pIt
f430: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73  er->pLeaf = pLas
f440: 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  t;.    pIter->iL
f450: 65 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61  eafPgno = pgnoLa
f460: 73 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66  st;.    iOff = f
f470: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
f480: 64 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20  dOff(pLast);.   
f490: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
f4a0: 56 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70  Varint(&pLast->p
f4b0: 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
f4c0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
f4d0: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
f4e0: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
f4f0: 20 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49     if( fts5LeafI
f500: 73 54 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29  sTermless(pLast)
f510: 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
f520: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
f530: 20 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20   pLast->nn+1;.  
f540: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f550: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
f560: 69 73 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69  ist = fts5LeafFi
f570: 72 73 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74  rstTermOff(pLast
f580: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20  );.    }..  }.. 
f590: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
f5a0: 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
f5b0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
f5c0: 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63  Iterator pIter c
f5d0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
f5e0: 74 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  to the first row
f5f0: 69 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  id of a doclist.
f600: 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64  .** There is a d
f610: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73  oclist-index ass
f620: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
f630: 20 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74   final term on t
f640: 68 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70  he current .** p
f650: 61 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72  age. If the curr
f660: 65 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20  ent term is the 
f670: 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  last term on the
f680: 20 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20   page, load the 
f690: 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
f6a0: 78 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20  x from disk and 
f6b0: 69 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74  initialize an it
f6c0: 65 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72  erator at (pIter
f6d0: 2d 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74  ->pDlidx)..*/.st
f6e0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
f6f0: 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46  gIterLoadDlidx(F
f700: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
f710: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
f720: 7b 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70  {.  int iSeg = p
f730: 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
f740: 69 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d  id;.  int bRev =
f750: 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
f760: 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
f770: 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61  VERSE);.  Fts5Da
f780: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
f790: 72 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72  r->pLeaf; /* Cur
f7a0: 72 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a  rent leaf data *
f7b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  /..  assert( pIt
f7c0: 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35  er->flags & FTS5
f7d0: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
f7e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
f7f0: 74 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29  ter->pDlidx==0 )
f800: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
f810: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63   the current doc
f820: 6c 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69  list ends on thi
f830: 73 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f  s page. If it do
f840: 65 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20  es, return.  ** 
f850: 65 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f  early without lo
f860: 61 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73  ading the doclis
f870: 74 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62  t-index (as it b
f880: 65 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66  elongs to a diff
f890: 65 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e  erent.  ** term.
f8a0: 20 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d   */.  if( pIter-
f8b0: 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d  >iTermLeafPgno==
f8c0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
f8d0: 20 0a 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69   .   && pIter->i
f8e0: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65  EndofDoclist<pLe
f8f0: 61 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b  af->szLeaf .  ){
f900: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
f910: 0a 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64  ..  pIter->pDlid
f920: 78 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  x = fts5DlidxIte
f930: 72 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69  rInit(p, bRev, i
f940: 53 65 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72  Seg, pIter->iTer
f950: 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 23  mLeafPgno);.}..#
f960: 64 65 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78  define fts5Index
f970: 53 6b 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f  SkipVarint(a, iO
f980: 66 66 29 20 7b 20 20 20 20 20 20 20 20 20 20 20  ff) {           
f990: 20 5c 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20   \.  int iEnd = 
f9a0: 69 4f 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20  iOff+9;         
f9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9c0: 20 20 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20       \.  while( 
f9d0: 28 61 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38  (a[iOff++] & 0x8
f9e0: 30 29 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20  0) && iOff<iEnd 
f9f0: 29 3b 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a  );       \.}../*
fa00: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
fa10: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
fa20: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
fa30: 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ument currently 
fa40: 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76  contains.** no v
fa50: 61 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63 65  alid values exce
fa60: 70 74 20 66 6f 72 20 74 68 65 20 46 74 73 35 53  pt for the Fts5S
fa70: 65 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d  egIter.pLeaf mem
fa80: 62 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68  ber variable. Th
fa90: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
faa0: 65 61 72 63 68 65 73 20 74 68 65 20 6c 65 61 66  earches the leaf
fab0: 20 70 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d   page for a term
fac0: 20 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d   matching (pTerm
fad0: 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49  /nTerm)..**.** I
fae0: 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
faf0: 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e  term is found on
fb00: 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
fb10: 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
fb20: 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
fb30: 20 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d   to it. If argum
fb40: 65 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20  ent bGe is zero 
fb50: 61 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73 20  and the term is 
fb60: 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68  not found,.** th
fb70: 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
fb80: 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45  ft pointing at E
fb90: 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65  OF..**.** If bGe
fba0: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
fbb0: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
fbc0: 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  erm is not found
fbd0: 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74  , then the.** it
fbe0: 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
fbf0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73  ointing to the s
fc00: 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20  mallest term in 
fc10: 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74  the segment that
fc20: 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
fc30: 61 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  an the specified
fc40: 20 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74   term, even if t
fc50: 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
fc60: 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
fc70: 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  t page..*/.stati
fc80: 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53  c void fts5LeafS
fc90: 65 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  eek(.  Fts5Index
fca0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
fcb0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20         /* Leave 
fcc0: 61 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68  any error code h
fcd0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65  ere */.  int bGe
fce0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
fd00: 20 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68   for a >= search
fd10: 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
fd20: 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
fd30: 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
fd40: 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63  r to seek */.  c
fd50: 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
fd60: 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f  int nTerm      /
fd70: 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68  * Term to search
fd80: 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   for */.){.  int
fd90: 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75   iOff;.  const u
fda0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
fdb0: 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a  eaf->p;.  int sz
fdc0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
fdd0: 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
fde0: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
fdf0: 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 69 6e 74 20  eaf->nn;..  int 
fe00: 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 69 6e  nMatch = 0;.  in
fe10: 74 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 69  t nKeep = 0;.  i
fe20: 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 69  nt nNew = 0;.  i
fe30: 6e 74 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69  nt iTermOff;.  i
fe40: 6e 74 20 69 50 67 69 64 78 3b 20 20 20 20 20 20  nt iPgidx;      
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe60: 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
fe70: 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69   in pgidx */.  i
fe80: 6e 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20  nt bEndOfPage = 
fe90: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
fea0: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
feb0: 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73 7a  ;..  iPgidx = sz
fec0: 4c 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20 2b  Leaf;.  iPgidx +
fed0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
fee0: 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69 54  2(&a[iPgidx], iT
fef0: 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20  ermOff);.  iOff 
ff00: 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20 77  = iTermOff;..  w
ff10: 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20  hile( 1 ){..    
ff20: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
ff30: 77 20 6d 61 6e 79 20 6e 65 77 20 62 79 74 65 73  w many new bytes
ff40: 20 61 72 65 20 69 6e 20 74 68 69 73 20 74 65 72   are in this ter
ff50: 6d 20 2a 2f 0a 20 20 20 20 66 74 73 35 46 61 73  m */.    fts5Fas
ff60: 74 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  tGetVarint32(a, 
ff70: 69 4f 66 66 2c 20 6e 4e 65 77 29 3b 0a 20 20 20  iOff, nNew);.   
ff80: 20 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63   if( nKeep<nMatc
ff90: 68 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  h ){.      goto 
ffa0: 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
ffb0: 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
ffc0: 28 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20  ( nKeep>=nMatch 
ffd0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70  );.    if( nKeep
ffe0: 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
fff0: 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
10000 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 6e    int i;.      n
10010 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77 2c 20  Cmp = MIN(nNew, 
10020 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20  nTerm-nMatch);. 
10030 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
10040 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCmp; i++){.    
10050 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69      if( a[iOff+i
10060 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b  ]!=pTerm[nMatch+
10070 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  i] ) break;.    
10080 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68    }.      nMatch
10090 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66   += i;..      if
100a0 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63 68 20  ( nTerm==nMatch 
100b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  ){.        if( i
100c0 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ==nNew ){.      
100d0 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
100e0 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20 20 20  success;.       
100f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
10100 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61    goto search_fa
10110 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  iled;.        }.
10120 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
10130 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f 66 66  i<nNew && a[iOff
10140 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74 63 68  +i]>pTerm[nMatch
10150 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  ] ){.        got
10160 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b  o search_failed;
10170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10180 20 20 20 20 69 66 28 20 69 50 67 69 64 78 3e 3d      if( iPgidx>=
10190 6e 20 29 7b 0a 20 20 20 20 20 20 62 45 6e 64 4f  n ){.      bEndO
101a0 66 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 20  fPage = 1;.     
101b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
101c0 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73     iPgidx += fts
101d0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
101e0 69 50 67 69 64 78 5d 2c 20 6e 4b 65 65 70 29 3b  iPgidx], nKeep);
101f0 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d  .    iTermOff +=
10200 20 6e 4b 65 65 70 3b 0a 20 20 20 20 69 4f 66 66   nKeep;.    iOff
10210 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20 20   = iTermOff;..  
10220 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 4b    /* Read the nK
10230 65 65 70 20 66 69 65 6c 64 20 6f 66 20 74 68 65  eep field of the
10240 20 6e 65 78 74 20 74 65 72 6d 2e 20 2a 2f 0a 20   next term. */. 
10250 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
10260 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20  rint32(a, iOff, 
10270 6e 4b 65 65 70 29 3b 0a 20 20 7d 0a 0a 20 73 65  nKeep);.  }.. se
10280 61 72 63 68 5f 66 61 69 6c 65 64 3a 0a 20 20 69  arch_failed:.  i
10290 66 28 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20 20  f( bGe==0 ){.   
102a0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
102b0 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
102c0 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
102d0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
102e0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 62 45  ;.  }else if( bE
102f0 6e 64 4f 66 50 61 67 65 20 29 7b 0a 20 20 20 20  ndOfPage ){.    
10300 64 6f 20 7b 0a 20 20 20 20 20 20 66 74 73 35 53  do {.      fts5S
10310 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70  egIterNextPage(p
10320 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
10330 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
10340 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10350 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
10360 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69  Leaf->p;.      i
10370 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  f( fts5LeafIsTer
10380 6d 6c 65 73 73 28 70 49 74 65 72 2d 3e 70 4c 65  mless(pIter->pLe
10390 61 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  af)==0 ){.      
103a0 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33    fts5GetVarint3
103b0 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
103c0 3e 70 5b 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  >p[pIter->pLeaf-
103d0 3e 73 7a 4c 65 61 66 5d 2c 20 69 4f 66 66 29 3b  >szLeaf], iOff);
103e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
103f0 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d 70 49 74  f<4 || iOff>=pIt
10400 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
10410 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  f ){.          p
10420 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
10430 55 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  UPT;.        }el
10440 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 4b  se{.          nK
10450 65 65 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eep = 0;.       
10460 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
10470 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f  etVarint32(&a[iO
10480 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 20 20  ff], nNew);.    
10490 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
104a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
104b0 20 20 20 7d 77 68 69 6c 65 28 20 31 20 29 3b 0a     }while( 1 );.
104c0 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 73 75 63    }.. search_suc
104d0 63 65 73 73 3a 0a 0a 20 20 70 49 74 65 72 2d 3e  cess:..  pIter->
104e0 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
104f0 66 66 20 2b 20 6e 4e 65 77 3b 0a 20 20 70 49 74  ff + nNew;.  pIt
10500 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
10510 73 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  set = pIter->iLe
10520 61 66 4f 66 66 73 65 74 3b 0a 20 20 70 49 74 65  afOffset;.  pIte
10530 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  r->iTermLeafPgno
10540 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
10550 67 6e 6f 3b 0a 0a 20 20 66 74 73 35 42 75 66 66  gno;..  fts5Buff
10560 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
10570 49 74 65 72 2d 3e 74 65 72 6d 2c 20 6e 4b 65 65  Iter->term, nKee
10580 70 2c 20 70 54 65 72 6d 29 3b 0a 20 20 66 74 73  p, pTerm);.  fts
10590 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
105a0 62 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  b(&p->rc, &pIter
105b0 2d 3e 74 65 72 6d 2c 20 6e 4e 65 77 2c 20 26 61  ->term, nNew, &a
105c0 5b 69 4f 66 66 5d 29 3b 0a 0a 20 20 69 66 28 20  [iOff]);..  if( 
105d0 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20 20  iPgidx>=n ){.   
105e0 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f   pIter->iEndofDo
105f0 63 6c 69 73 74 20 3d 20 70 49 74 65 72 2d 3e 70  clist = pIter->p
10600 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 7d 65  Leaf->nn+1;.  }e
10610 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 45 78  lse{.    int nEx
10620 74 72 61 3b 0a 20 20 20 20 69 50 67 69 64 78 20  tra;.    iPgidx 
10630 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
10640 33 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e  32(&a[iPgidx], n
10650 45 78 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65  Extra);.    pIte
10660 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
10670 20 3d 20 69 54 65 72 6d 4f 66 66 20 2b 20 6e 45   = iTermOff + nE
10680 78 74 72 61 3b 0a 20 20 7d 0a 20 20 70 49 74 65  xtra;.  }.  pIte
10690 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 69  r->iPgidxOff = i
106a0 50 67 69 64 78 3b 0a 0a 20 20 66 74 73 35 53 65  Pgidx;..  fts5Se
106b0 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 70  gIterLoadRowid(p
106c0 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73 35  , pIter);.  fts5
106d0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
106e0 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
106f0 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  .** Initialize t
10700 68 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20  he object pIter 
10710 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d  to point to term
10720 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74   pTerm/nTerm wit
10730 68 69 6e 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 70  hin segment.** p
10740 53 65 67 2e 20 49 66 20 74 68 65 72 65 20 69 73  Seg. If there is
10750 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e   no such term in
10760 20 74 68 65 20 69 6e 64 65 78 2c 20 74 68 65 20   the index, the 
10770 69 74 65 72 61 74 6f 72 20 69 73 20 73 65 74 20  iterator is set 
10780 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66  to EOF..**.** If
10790 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
107a0 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 69  , Fts5Index.rc i
107b0 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70 70 72  s set to an appr
107c0 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
107d0 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  de. If .** an er
107e0 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
107f0 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
10800 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
10810 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
10820 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
10830 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
10840 53 65 65 6b 49 6e 69 74 28 0a 20 20 46 74 73 35  SeekInit(.  Fts5
10850 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
10860 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
10870 54 53 35 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 20  TS5 backend */. 
10880 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
10890 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
108a0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 75 73   /* Buffer to us
108b0 65 20 66 6f 72 20 6c 6f 61 64 69 6e 67 20 70 61  e for loading pa
108c0 67 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ges */.  const u
108d0 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
108e0 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
108f0 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
10900 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
10910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10920 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
10930 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
10940 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
10950 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
10960 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
10970 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
10980 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
10990 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
109a0 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
109b0 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
109c0 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
109d0 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67   int bGe = (flag
109e0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
109f0 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ERY_SCAN);.  int
10a00 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
10a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10a20 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
10a30 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
10a40 20 2a 2f 0a 0a 20 20 73 74 61 74 69 63 20 69 6e   */..  static in
10a50 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e  t nCall = 0;.  n
10a60 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 61 73 73 65 72  Call++;..  asser
10a70 74 28 20 62 47 65 3d 3d 30 20 7c 7c 20 28 66 6c  t( bGe==0 || (fl
10a80 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
10a90 51 55 45 52 59 5f 44 45 53 43 29 3d 3d 30 20 29  QUERY_DESC)==0 )
10aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 65 72  ;.  assert( pTer
10ab0 6d 20 26 26 20 6e 54 65 72 6d 20 29 3b 0a 20 20  m && nTerm );.  
10ac0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
10ad0 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
10ae0 3b 0a 20 20 70 49 74 65 72 2d 3e 70 53 65 67 20  ;.  pIter->pSeg 
10af0 3d 20 70 53 65 67 3b 0a 0a 20 20 2f 2a 20 54 68  = pSeg;..  /* Th
10b00 69 73 20 62 6c 6f 63 6b 20 73 65 74 73 20 73 74  is block sets st
10b10 61 63 6b 20 76 61 72 69 61 62 6c 65 20 69 50 67  ack variable iPg
10b20 20 74 6f 20 74 68 65 20 6c 65 61 66 20 70 61 67   to the leaf pag
10b30 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 6d 61  e number that ma
10b40 79 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74  y.  ** contain t
10b50 65 72 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d  erm (pTerm/nTerm
10b60 29 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  ), if it is pres
10b70 65 6e 74 20 69 6e 20 74 68 65 20 73 65 67 6d 65  ent in the segme
10b80 6e 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  nt. */.  if( p->
10b90 70 49 64 78 53 65 6c 65 63 74 3d 3d 30 20 29 7b  pIdxSelect==0 ){
10ba0 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
10bb0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
10bc0 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
10bd0 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
10be0 70 2c 20 26 70 2d 3e 70 49 64 78 53 65 6c 65 63  p, &p->pIdxSelec
10bf0 74 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  t, sqlite3_mprin
10c00 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 53  tf(.          "S
10c10 45 4c 45 43 54 20 70 67 6e 6f 20 46 52 4f 4d 20  ELECT pgno FROM 
10c20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48  '%q'.'%q_idx' WH
10c30 45 52 45 20 22 0a 20 20 20 20 20 20 20 20 20 20  ERE ".          
10c40 22 73 65 67 69 64 3d 3f 20 41 4e 44 20 74 65 72  "segid=? AND ter
10c50 6d 3c 3d 3f 20 4f 52 44 45 52 20 42 59 20 74 65  m<=? ORDER BY te
10c60 72 6d 20 44 45 53 43 20 4c 49 4d 49 54 20 31 22  rm DESC LIMIT 1"
10c70 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e  ,.          pCon
10c80 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
10c90 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
10ca0 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63  .  }.  if( p->rc
10cb0 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c   ) return;.  sql
10cc0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d  ite3_bind_int(p-
10cd0 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  >pIdxSelect, 1, 
10ce0 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
10cf0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
10d00 6f 62 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  ob(p->pIdxSelect
10d10 2c 20 32 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  , 2, pTerm, nTer
10d20 6d 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  m, SQLITE_STATIC
10d30 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
10d40 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
10d50 70 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 29  p(p->pIdxSelect)
10d60 20 29 7b 0a 20 20 20 20 69 36 34 20 76 61 6c 20   ){.    i64 val 
10d70 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
10d80 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53 65 6c 65  _int(p->pIdxSele
10d90 63 74 2c 20 30 29 3b 0a 20 20 20 20 69 50 67 20  ct, 0);.    iPg 
10da0 3d 20 28 69 6e 74 29 28 76 61 6c 3e 3e 31 29 3b  = (int)(val>>1);
10db0 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76  .    bDlidx = (v
10dc0 61 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20  al & 0x0001);.  
10dd0 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69  }.  p->rc = sqli
10de0 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64  te3_reset(p->pId
10df0 78 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28  xSelect);..  if(
10e00 20 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46   iPg<pSeg->pgnoF
10e10 69 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20  irst ){.    iPg 
10e20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  = pSeg->pgnoFirs
10e30 74 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20  t;.    bDlidx = 
10e40 30 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d  0;.  }..  pIter-
10e50 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67  >iLeafPgno = iPg
10e60 20 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49   - 1;.  fts5SegI
10e70 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
10e80 49 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49  Iter);..  if( pI
10e90 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20  ter->pLeaf ){.  
10ea0 20 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70    fts5LeafSeek(p
10eb0 2c 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54  , bGe, pIter, pT
10ec0 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d  erm, nTerm);.  }
10ed0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
10ee0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d  QLITE_OK && bGe=
10ef0 3d 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =0 ){.    pIter-
10f00 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
10f10 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
10f20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
10f30 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66  Leaf ){.      if
10f40 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e  ( flags & FTS5IN
10f50 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29  DEX_QUERY_DESC )
10f60 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  {.        pIter-
10f70 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
10f80 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a  EGITER_REVERSE;.
10f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10fa0 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
10fb0 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
10fc0 6f 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65  oadDlidx(p, pIte
10fd0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
10fe0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
10ff0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
11000 53 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  SC ){.        ft
11010 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
11020 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
11030 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
11040 20 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a   /* Either:.  **
11050 0a 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72  .  **   1) an er
11060 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64  ror has occurred
11070 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74  , or.  **   2) t
11080 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e  he iterator poin
11090 74 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20  ts to EOF, or.  
110a0 2a 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72  **   3) the iter
110b0 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61  ator points to a
110c0 6e 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72  n entry with ter
110d0 6d 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c  m (pTerm/nTerm),
110e0 20 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68   or.  **   4) th
110f0 65 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  e FTS5INDEX_QUER
11100 59 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20  Y_SCAN flag was 
11110 73 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72  set and the iter
11120 61 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a  ator points.  **
11130 20 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72        to an entr
11140 79 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72  y with a term gr
11150 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
11160 75 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  ual to (pTerm/nT
11170 65 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  erm)..  */.  ass
11180 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
11190 54 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20  TE_OK           
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
111c0 2a 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74  * 1 */.   || pIt
111d0 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20  er->pLeaf==0    
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20             /* 2 
11210 2a 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66  */.   || fts5Buf
11220 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26  ferCompareBlob(&
11230 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65  pIter->term, pTe
11240 72 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20  rm, nTerm)==0   
11250 20 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20         /* 3 */. 
11260 20 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73    || (bGe && fts
11270 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c  5BufferCompareBl
11280 6f 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  ob(&pIter->term,
11290 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30   pTerm, nTerm)>0
112a0 29 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a  )  /* 4 */.  );.
112b0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  }../*.** Initial
112c0 69 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70  ize the object p
112d0 49 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  Iter to point to
112e0 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72   term pTerm/nTer
112f0 6d 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20  m within the.** 
11300 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
11310 61 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69  able. If there i
11320 73 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69  s no such term i
11330 6e 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65  n the hash-table
11340 2c 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74  , the .** iterat
11350 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
11360 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
11370 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
11380 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
11390 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
113a0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
113b0 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
113c0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
113d0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
113e0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
113f0 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
11400 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11410 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e  ts5SegIterHashIn
11420 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
11430 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
11440 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
11450 63 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ckend */.  const
11460 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
11470 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
11480 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f  rm to seek to */
11490 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54     /* Mask of FT
114c0 53 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67  S5INDEX_XXX flag
114d0 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  s */.  Fts5SegIt
114e0 65 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20  er *pIter       
114f0 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
11500 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a   to populate */.
11510 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  ){.  const u8 *p
11520 4c 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  List = 0;.  int 
11530 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  nList = 0;.  con
11540 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20  st u8 *z = 0;.  
11550 69 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73  int n = 0;..  as
11560 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29  sert( p->pHash )
11570 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
11580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
11590 0a 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20  .  if( pTerm==0 
115a0 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35  || (flags & FTS5
115b0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
115c0 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  ) ){.    p->rc =
115d0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
115e0 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73  ScanInit(p->pHas
115f0 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
11600 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20  pTerm, nTerm);. 
11610 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
11620 73 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70  shScanEntry(p->p
11630 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
11640 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20  r**)&z, &pList, 
11650 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d  &nList);.    n =
11660 20 28 7a 20 3f 20 28 69 6e 74 29 73 74 72 6c 65   (z ? (int)strle
11670 6e 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  n((const char*)z
11680 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b  ) : 0);.  }else{
11690 0a 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67  .    pIter->flag
116a0 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45  s |= FTS5_SEGITE
116b0 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 73  R_ONETERM;.    s
116c0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 51 75  qlite3Fts5HashQu
116d0 65 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28 63  ery(p->pHash, (c
116e0 6f 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d  onst char*)pTerm
116f0 2c 20 6e 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c  , nTerm, &pList,
11700 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7a 20   &nList);.    z 
11710 3d 20 70 54 65 72 6d 3b 0a 20 20 20 20 6e 20 3d  = pTerm;.    n =
11720 20 6e 54 65 72 6d 3b 0a 20 20 7d 0a 0a 20 20 69   nTerm;.  }..  i
11730 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
11740 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
11750 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
11760 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
11770 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
11780 6e 2c 20 7a 29 3b 0a 20 20 20 20 70 4c 65 61 66  n, z);.    pLeaf
11790 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63   = fts5IdxMalloc
117a0 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44  (p, sizeof(Fts5D
117b0 61 74 61 29 29 3b 0a 20 20 20 20 69 66 28 20 70  ata));.    if( p
117c0 4c 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e  Leaf==0 ) return
117d0 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 70 20 3d  ;.    pLeaf->p =
117e0 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20 20   (u8*)pList;.   
117f0 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 70 4c 65   pLeaf->nn = pLe
11800 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69  af->szLeaf = nLi
11810 73 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  st;.    pIter->p
11820 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b 0a 20 20  Leaf = pLeaf;.  
11830 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
11840 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
11850 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70 2c 20 28  rint(pLeaf->p, (
11860 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
11870 77 69 64 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  wid);.    pIter-
11880 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
11890 20 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 0a 20   pLeaf->nn+1;.. 
118a0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
118b0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
118c0 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ESC ){.      pIt
118d0 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53  er->flags |= FTS
118e0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
118f0 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  E;.      fts5Seg
11900 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50  IterReverseInitP
11910 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
11920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11930 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
11940 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
11950 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
11960 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72 61  * Zero the itera
11970 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
11980 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
11990 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
119a0 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61 72  fts5SegIterClear
119b0 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49  (Fts5SegIter *pI
119c0 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66 66  ter){.  fts5Buff
119d0 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e 74  erFree(&pIter->t
119e0 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74 61  erm);.  fts5Data
119f0 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
11a00 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61 74  Leaf);.  fts5Dat
11a10 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
11a20 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66 74  pNextLeaf);.  ft
11a30 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
11a40 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b 0a  pIter->pDlidx);.
11a50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11a60 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73  Iter->aRowidOffs
11a70 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49  et);.  memset(pI
11a80 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  ter, 0, sizeof(F
11a90 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d 0a  ts5SegIter));.}.
11aa0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11ab0 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EBUG../*.** This
11ac0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
11ad0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
11ae0 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70 72   big assert() pr
11af0 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65 6e  ocedure implemen
11b00 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41 73  ted by.** fts5As
11b10 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
11b20 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65 73  up(). It ensures
11b30 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   that the result
11b40 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
11b50 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69 73  d.** in *pRes is
11b60 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65 73   the correct res
11b70 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  ult of comparing
11b80 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f 73   the current pos
11b90 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a 2a  itions of the.**
11ba0 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e 0a   two iterators..
11bb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
11bc0 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69  ts5AssertCompari
11bd0 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74 73  sonResult(.  Fts
11be0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
11bf0 72 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74 65  r, .  Fts5SegIte
11c00 72 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65 67  r *p1,.  Fts5Seg
11c10 49 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73 35  Iter *p2,.  Fts5
11c20 43 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b  CResult *pRes.){
11c30 0a 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20 2d  .  int i1 = p1 -
11c40 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20   pIter->aSeg;.  
11c50 69 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70 49  int i2 = p2 - pI
11c60 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66  ter->aSeg;..  if
11c70 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70  ( p1->pLeaf || p
11c80 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20  2->pLeaf ){.    
11c90 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30  if( p1->pLeaf==0
11ca0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11cb0 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
11cc0 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  i2 );.    }else 
11cd0 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30  if( p2->pLeaf==0
11ce0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
11cf0 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d  ( pRes->iFirst==
11d00 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  i1 );.    }else{
11d10 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20  .      int nMin 
11d20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e  = MIN(p1->term.n
11d30 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20  , p2->term.n);. 
11d40 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 6d       int res = m
11d50 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e 70  emcmp(p1->term.p
11d60 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e 4d  , p2->term.p, nM
11d70 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  in);.      if( r
11d80 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70 31  es==0 ) res = p1
11d90 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e 74  ->term.n - p2->t
11da0 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69 66  erm.n;..      if
11db0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
11dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65 73      assert( pRes
11dd0 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b 0a  ->bTermEq==1 );.
11de0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11df0 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d 3e  p1->iRowid!=p2->
11e00 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20  iRowid );.      
11e10 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69 52    res = ((p1->iR
11e20 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77 69  owid > p2->iRowi
11e30 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 29  d)==pIter->bRev)
11e40 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20 20   ? -1 : 1;.     
11e50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11e60 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
11e70 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20 20  ermEq==0 );.    
11e80 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
11e90 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  es<0 ){.        
11ea0 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46  assert( pRes->iF
11eb0 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20  irst==i1 );.    
11ec0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11ed0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
11ee0 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20  First==i2 );.   
11ef0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
11f00 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
11f10 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
11f20 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f 44   unless SQLITE_D
11f30 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 20  EBUG is defined 
11f40 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c 65  when this module
11f50 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 2e  .** is compiled.
11f60 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20 74   In that case, t
11f70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
11f80 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20 61  essentially an a
11f90 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74  ssert() .** stat
11fa0 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76 65  ement used to ve
11fb0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63 6f  rify that the co
11fc0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 49  ntents of the pI
11fd0 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61 72  ter->aFirst[] ar
11fe0 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72 65  ray.** are corre
11ff0 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ct..*/.static vo
12000 69 64 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c  id fts5AssertMul
12010 74 69 49 74 65 72 53 65 74 75 70 28 46 74 73 35  tiIterSetup(Fts5
12020 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e  Index *p, Fts5In
12030 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
12040 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
12050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
12060 74 73 35 53 65 67 49 74 65 72 20 2a 70 46 69 72  ts5SegIter *pFir
12070 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  st = &pIter->aSe
12080 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
12090 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
120a0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61 73    int i;..    as
120b0 73 65 72 74 28 20 28 70 46 69 72 73 74 2d 3e 70  sert( (pFirst->p
120c0 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72 2d  Leaf==0)==pIter-
120d0 3e 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f 2a  >bEof );..    /*
120e0 20 43 68 65 63 6b 20 74 68 61 74 20 70 49 74 65   Check that pIte
120f0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
12100 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79  is set correctly
12110 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30  . */.    for(i=0
12120 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b  ; i<pIter->nSeg;
12130 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74 73   i++){.      Fts
12140 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26  5SegIter *p1 = &
12150 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a  pIter->aSeg[i];.
12160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 31        assert( p1
12170 3d 3d 70 46 69 72 73 74 20 0a 20 20 20 20 20 20  ==pFirst .      
12180 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65 61       || p1->pLea
12190 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  f==0 .          
121a0 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f   || fts5BufferCo
121b0 6d 70 61 72 65 28 26 70 46 69 72 73 74 2d 3e 74  mpare(&pFirst->t
121c0 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29 20  erm, &p1->term) 
121d0 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
121e0 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72  1->iRowid==pIter
121f0 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20  ->iSwitchRowid. 
12200 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 31            || (p1
12210 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e  ->iRowid<pIter->
12220 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70  iSwitchRowid)==p
12230 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 20 20 20  Iter->bRev.     
12240 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66   );.    }..    f
12250 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d  or(i=0; i<pIter-
12260 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20 20  >nSeg; i+=2){.  
12270 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
12280 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
12290 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74 73  eg[i];.      Fts
122a0 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20 26  5SegIter *p2 = &
122b0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31 5d  pIter->aSeg[i+1]
122c0 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73  ;.      Fts5CRes
122d0 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
122e0 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74 65  er->aFirst[(pIte
122f0 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20 32  r->nSeg + i) / 2
12300 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73 73  ];.      fts5Ass
12310 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73  ertComparisonRes
12320 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20 70  ult(pIter, p1, p
12330 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a  2, pRes);.    }.
12340 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
12350 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20 32  (pIter->nSeg / 2
12360 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20 20  ); i+=2){.      
12370 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 20  Fts5SegIter *p1 
12380 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  = &pIter->aSeg[ 
12390 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 2a  pIter->aFirst[i*
123a0 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  2].iFirst ];.   
123b0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
123c0 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p2 = &pIter->aSe
123d0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
123e0 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20 5d  [i*2+1].iFirst ]
123f0 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65 73  ;.      Fts5CRes
12400 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
12410 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 20  er->aFirst[i];. 
12420 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74 43       fts5AssertC
12430 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28  omparisonResult(
12440 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20 70  pIter, p1, p2, p
12450 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Res);.    }.  }.
12460 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
12470 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
12480 49 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a 23  IterSetup(x,y).#
12490 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
124a0 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6e  the comparison n
124b0 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70 75  ecessary to popu
124c0 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69 72  late pIter->aFir
124d0 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a 20  st[iOut]..**.** 
124e0 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  If the returned 
124f0 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  value is non-zer
12500 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74 68  o, then it is th
12510 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65 6e  e index of an en
12520 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70 49  try.** in the pI
12530 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72 61  ter->aSeg[] arra
12540 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e 6f  y that is (a) no
12550 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28 62  t at EOF, and (b
12560 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  ) pointing.** to
12570 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20 61   a key that is a
12580 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61 6e   duplicate of an
12590 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70 72  other, higher pr
125a0 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67 6d  iority, .** segm
125b0 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e 20  ent-iterator in 
125c0 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b 5d  the pSeg->aSeg[]
125d0 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69   array..*/.stati
125e0 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
125f0 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74 73  terDoCompare(Fts
12600 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
12610 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20 20  r, int iOut){.  
12620 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20 20  int i1;         
12630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12640 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66 74  /* Index of left
12650 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74 65  -hand Fts5SegIte
12660 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20 20  r */.  int i2;  
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12680 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12690 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46 74  of right-hand Ft
126a0 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 69  s5SegIter */.  i
126b0 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35 53  nt iRes;.  Fts5S
126c0 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20 20  egIter *p1;     
126d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
126e0 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
126f0 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ter */.  Fts5Seg
12700 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20 20  Iter *p2;       
12710 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
12720 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
12730 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65 73  er */.  Fts5CRes
12740 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49 74  ult *pRes = &pIt
12750 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d  er->aFirst[iOut]
12760 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f 75  ;..  assert( iOu
12770 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26 26  t<pIter->nSeg &&
12780 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73 73   iOut>0 );.  ass
12790 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65 76  ert( pIter->bRev
127a0 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62 52  ==0 || pIter->bR
127b0 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28 20  ev==1 );..  if( 
127c0 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e 53  iOut>=(pIter->nS
127d0 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31 20  eg/2) ){.    i1 
127e0 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72 2d  = (iOut - pIter-
127f0 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20 20  >nSeg/2) * 2;.  
12800 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a 20    i2 = i1 + 1;. 
12810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20 3d   }else{.    i1 =
12820 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
12830 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a 20  Out*2].iFirst;. 
12840 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e 61     i2 = pIter->a
12850 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e  First[iOut*2+1].
12860 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70 31  iFirst;.  }.  p1
12870 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
12880 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49 74  i1];.  p2 = &pIt
12890 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a 20  er->aSeg[i2];.. 
128a0 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d   pRes->bTermEq =
128b0 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c   0;.  if( p1->pL
128c0 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  eaf==0 ){       
128d0 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73 20      /* If p1 is 
128e0 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69 52  at EOF */.    iR
128f0 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73 65  es = i2;.  }else
12900 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
12910 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20 70  0 ){     /* If p
12920 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  2 is at EOF */. 
12930 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20     iRes = i1;.  
12940 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
12950 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72 43  es = fts5BufferC
12960 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72 6d  ompare(&p1->term
12970 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20 20  , &p2->term);.  
12980 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
12990 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 32        assert( i2
129a0 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73 73  >i1 );.      ass
129b0 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20 20  ert( i2!=0 );.  
129c0 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45      pRes->bTermE
129d0 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  q = 1;.      if(
129e0 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32 2d   p1->iRowid==p2-
129f0 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
12a00 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70 32     p1->bDel = p2
12a10 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20 20  ->bDel;.        
12a20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20 20  return i2;.     
12a30 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20 28   }.      res = (
12a40 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
12a50 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
12a60 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 2b  ->bRev) ? -1 : +
12a70 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
12a80 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a 20  ert( res!=0 );. 
12a90 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
12aa0 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b        iRes = i1;
12ab0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12ac0 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 20    iRes = i2;.   
12ad0 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d 3e   }.  }..  pRes->
12ae0 69 46 69 72 73 74 20 3d 20 69 52 65 73 3b 0a 20  iFirst = iRes;. 
12af0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
12b00 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65 67  .** Move the seg
12b10 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69 74  -iter so that it
12b20 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
12b30 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61  irst rowid on pa
12b40 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a 2a  ge iLeafPgno..**
12b50 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72 20   It is an error 
12b60 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e  if leaf iLeafPgn
12b70 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  o does not exist
12b80 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20   or contains no 
12b90 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  rowids..*/.stati
12ba0 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12bb0 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46 74  erGotoPage(.  Ft
12bc0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12be0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12bf0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
12c00 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
12c10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
12c20 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
12c30 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
12c40 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  gno.){.  assert(
12c50 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72   iLeafPgno>pIter
12c60 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a  ->iLeafPgno );..
12c70 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e    if( iLeafPgno>
12c80 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67 6e  pIter->pSeg->pgn
12c90 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  oLast ){.    p->
12ca0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
12cb0 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  T;.  }else{.    
12cc0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
12cd0 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66  pIter->pNextLeaf
12ce0 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4e  );.    pIter->pN
12cf0 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  extLeaf = 0;.   
12d00 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
12d10 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31 3b  o = iLeafPgno-1;
12d20 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72  .    fts5SegIter
12d30 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
12d40 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
12d50 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
12d60 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   || pIter->iLeaf
12d70 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f 20  Pgno==iLeafPgno 
12d80 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  );..    if( p->r
12d90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12da0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a        int iOff;.
12db0 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49        u8 *a = pI
12dc0 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
12dd0 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49 74       int n = pIt
12de0 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
12df0 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20 3d  f;..      iOff =
12e00 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
12e10 77 69 64 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c  widOff(pIter->pL
12e20 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eaf);.      if( 
12e30 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e 3d  iOff<4 || iOff>=
12e40 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  n ){.        p->
12e50 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
12e60 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
12e70 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
12e80 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 61  fts5GetVarint(&a
12e90 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70  [iOff], (u64*)&p
12ea0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
12eb0 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
12ec0 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
12ed0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
12ee0 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
12ef0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
12f00 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
12f10 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20  .** Advance the 
12f20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
12f30 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
12f40 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74 20  gument until it 
12f50 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61 73  is at or .** pas
12f60 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20 52  t rowid iFrom. R
12f70 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
12f80 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d 2c   value of iFrom,
12f90 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
12fa0 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61 6e  .** always advan
12fb0 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ced at least onc
12fc0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
12fd0 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
12fe0 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
12ff0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
13000 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
13010 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
13020 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
13030 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
13040 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
13050 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
13060 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20 20   i64 iMatch     
13070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13080 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72   /* Advance iter
13090 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74 68  ator at least th
130a0 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20 69  is far */.){.  i
130b0 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65 72  nt bRev = (pIter
130c0 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
130d0 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3b  EGITER_REVERSE);
130e0 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
130f0 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72   *pDlidx = pIter
13100 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20  ->pDlidx;.  int 
13110 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  iLeafPgno = pIte
13120 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20  r->iLeafPgno;.  
13130 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 0a  int bMove = 1;..
13140 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
13150 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
13160 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
13170 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
13180 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61 73  ->pDlidx );.  as
13190 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65  sert( pIter->pLe
131a0 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52 65  af );..  if( bRe
131b0 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69 6c  v==0 ){.    whil
131c0 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74 65  e( !fts5DlidxIte
131d0 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20  rEof(p, pDlidx) 
131e0 26 26 20 69 4d 61 74 63 68 3e 66 74 73 35 44 6c  && iMatch>fts5Dl
131f0 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
13200 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69 4c  idx) ){.      iL
13210 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c  eafPgno = fts5Dl
13220 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
13230 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  dx);.      fts5D
13240 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c 20  lidxIterNext(p, 
13250 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20  pDlidx);.    }. 
13260 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4c     assert_nc( iL
13270 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d 3e  eafPgno>=pIter->
13280 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d 3e  iLeafPgno || p->
13290 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69 4c  rc );.    if( iL
132a0 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69  eafPgno>pIter->i
132b0 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20  LeafPgno ){.    
132c0 20 20 66 74 73 35 53 65 67 49 74 65 72 47 6f 74    fts5SegIterGot
132d0 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72 2c 20  oPage(p, pIter, 
132e0 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20  iLeafPgno);.    
132f0 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20    bMove = 0;.   
13300 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13310 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
13320 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20  NextLeaf==0 );. 
13330 20 20 20 61 73 73 65 72 74 28 20 69 4d 61 74 63     assert( iMatc
13340 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20  h<pIter->iRowid 
13350 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66  );.    while( !f
13360 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
13370 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d  p, pDlidx) && iM
13380 61 74 63 68 3c 66 74 73 35 44 6c 69 64 78 49 74  atch<fts5DlidxIt
13390 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20  erRowid(pDlidx) 
133a0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69  ){.      fts5Dli
133b0 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70 44  dxIterPrev(p, pD
133c0 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lidx);.    }.   
133d0 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73   iLeafPgno = fts
133e0 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70  5DlidxIterPgno(p
133f0 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61 73 73  Dlidx);..    ass
13400 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49 74  ert( fts5DlidxIt
13410 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
13420 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d 70   || iLeafPgno<=p
13430 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
13440 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65 61  );..    if( iLea
13450 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c 65  fPgno<pIter->iLe
13460 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  afPgno ){.      
13470 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
13480 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b 0a   = iLeafPgno+1;.
13490 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
134a0 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
134b0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
134c0 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20 20   bMove = 0;.    
134d0 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
134e0 20 69 66 28 20 62 4d 6f 76 65 20 29 20 66 74 73   if( bMove ) fts
134f0 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20  5SegIterNext(p, 
13500 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 69  pIter, 0);.    i
13510 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  f( pIter->pLeaf=
13520 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
13530 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20 70  if( bRev==0 && p
13540 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69 4d  Iter->iRowid>=iM
13550 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
13560 20 20 69 66 28 20 62 52 65 76 21 3d 30 20 26 26    if( bRev!=0 &&
13570 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c 3d   pIter->iRowid<=
13580 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
13590 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a 20      bMove = 1;. 
135a0 20 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d   }while( p->rc==
135b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d 0a 0a  SQLITE_OK );.}..
135c0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
135d0 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
135e0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
135f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
13600 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
13610 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
13620 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
13630 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
13640 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72  er){.  if( pIter
13650 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
13660 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49     for(i=0; i<pI
13670 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b  ter->nSeg; i++){
13680 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
13690 65 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e  erClear(&pIter->
136a0 61 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  aSeg[i]);.    }.
136b0 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
136c0 65 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  eRelease(pIter->
136d0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 66 74  pStruct);.    ft
136e0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49  s5BufferFree(&pI
136f0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
13700 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13710 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73  pIter);.  }.}..s
13720 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
13730 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
13740 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
13750 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13760 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
13770 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
13780 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49  ithin */.  Fts5I
13790 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
137a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
137b0 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65  erator to update
137c0 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20   aFirst[] array 
137d0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68  for */.  int iCh
137e0 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20 20 20  anged,          
137f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13800 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f  x of sub-iterato
13810 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20  r just advanced 
13820 2a 2f 0a 20 20 69 6e 74 20 69 4d 69 6e 73 65 74  */.  int iMinset
13830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13840 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20       /* Minimum 
13850 65 6e 74 72 79 20 69 6e 20 61 46 69 72 73 74 5b  entry in aFirst[
13860 5d 20 74 6f 20 73 65 74 20 2a 2f 0a 29 7b 0a 20  ] to set */.){. 
13870 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
13880 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
13890 61 6e 67 65 64 29 2f 32 3b 20 69 3e 3d 69 4d 69  anged)/2; i>=iMi
138a0 6e 73 65 74 20 26 26 20 70 2d 3e 72 63 3d 3d 53  nset && p->rc==S
138b0 51 4c 49 54 45 5f 4f 4b 3b 20 69 3d 69 2f 32 29  QLITE_OK; i=i/2)
138c0 7b 0a 20 20 20 20 69 6e 74 20 69 45 71 3b 0a 20  {.    int iEq;. 
138d0 20 20 20 69 66 28 20 28 69 45 71 20 3d 20 66 74     if( (iEq = ft
138e0 73 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d  s5MultiIterDoCom
138f0 70 61 72 65 28 70 49 74 65 72 2c 20 69 29 29 20  pare(pIter, i)) 
13900 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
13910 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 49 74  IterNext(p, &pIt
13920 65 72 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30  er->aSeg[iEq], 0
13930 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 70 49 74  );.      i = pIt
13940 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45 71 3b 0a  er->nSeg + iEq;.
13950 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
13960 2a 2a 20 53 75 62 2d 69 74 65 72 61 74 6f 72 20  ** Sub-iterator 
13970 69 43 68 61 6e 67 65 64 20 6f 66 20 69 74 65 72  iChanged of iter
13980 61 74 6f 72 20 70 49 74 65 72 20 68 61 73 20 6a  ator pIter has j
13990 75 73 74 20 62 65 65 6e 20 61 64 76 61 6e 63 65  ust been advance
139a0 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a 2a 20 70  d. It still.** p
139b0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 61 6d  oints to the sam
139c0 65 20 74 65 72 6d 20 74 68 6f 75 67 68 20 2d 20  e term though - 
139d0 6a 75 73 74 20 61 20 64 69 66 66 65 72 65 6e 74  just a different
139e0 20 72 6f 77 69 64 2e 20 54 68 69 73 20 66 75 6e   rowid. This fun
139f0 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65 6d 70 74  ction.** attempt
13a00 73 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  s to update the 
13a10 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
13a20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20  pIter->aFirst[] 
13a30 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 20  accordingly..** 
13a40 49 66 20 69 74 20 64 6f 65 73 20 73 6f 20 73 75  If it does so su
13a50 63 63 65 73 73 66 75 6c 6c 79 2c 20 30 20 69 73  ccessfully, 0 is
13a60 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
13a70 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a 20 49 66  wise 1..**.** If
13a80 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20 72 65 74   non-zero is ret
13a90 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
13aa0 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 66 74  r should call ft
13ab0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
13ac0 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20  ced().** on the 
13ad0 69 74 65 72 61 74 6f 72 20 69 6e 73 74 65 61 64  iterator instead
13ae0 2e 20 54 68 61 74 20 66 75 6e 63 74 69 6f 6e 20  . That function 
13af0 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 61 73  does the same as
13b00 20 74 68 69 73 20 6f 6e 65 2c 20 65 78 63 65 70   this one, excep
13b10 74 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 65 61  t.** that it dea
13b20 6c 73 20 77 69 74 68 20 6d 6f 72 65 20 63 6f 6d  ls with more com
13b30 70 6c 69 63 61 74 65 64 20 63 61 73 65 73 20 61  plicated cases a
13b40 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73 74 61 74  s well..*/ .stat
13b50 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
13b60 49 74 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64  IterAdvanceRowid
13b70 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
13b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13b90 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
13ba0 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
13bb0 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 49  ithin */.  Fts5I
13bc0 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c  ndexIter *pIter,
13bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
13be0 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61 74 65  erator to update
13bf0 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61 79 20   aFirst[] array 
13c00 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69 43 68  for */.  int iCh
13c10 61 6e 67 65 64 20 20 20 20 20 20 20 20 20 20 20  anged           
13c20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
13c30 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61 74 6f  x of sub-iterato
13c40 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65 64 20  r just advanced 
13c50 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49  */.){.  Fts5SegI
13c60 74 65 72 20 2a 70 4e 65 77 20 3d 20 26 70 49 74  ter *pNew = &pIt
13c70 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67 65  er->aSeg[iChange
13c80 64 5d 3b 0a 0a 20 20 69 66 28 20 70 4e 65 77 2d  d];..  if( pNew-
13c90 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65 72 2d 3e  >iRowid==pIter->
13ca0 69 53 77 69 74 63 68 52 6f 77 69 64 0a 20 20 20  iSwitchRowid.   
13cb0 7c 7c 20 28 70 4e 65 77 2d 3e 69 52 6f 77 69 64  || (pNew->iRowid
13cc0 3c 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  <pIter->iSwitchR
13cd0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
13ce0 65 76 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  ev.  ){.    int 
13cf0 69 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  i;.    Fts5SegIt
13d00 65 72 20 2a 70 4f 74 68 65 72 20 3d 20 26 70 49  er *pOther = &pI
13d10 74 65 72 2d 3e 61 53 65 67 5b 69 43 68 61 6e 67  ter->aSeg[iChang
13d20 65 64 20 5e 20 30 78 30 30 30 31 5d 3b 0a 20 20  ed ^ 0x0001];.  
13d30 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68    pIter->iSwitch
13d40 52 6f 77 69 64 20 3d 20 70 49 74 65 72 2d 3e 62  Rowid = pIter->b
13d50 52 65 76 20 3f 20 53 4d 41 4c 4c 45 53 54 5f 49  Rev ? SMALLEST_I
13d60 4e 54 36 34 20 3a 20 4c 41 52 47 45 53 54 5f 49  NT64 : LARGEST_I
13d70 4e 54 36 34 3b 0a 20 20 20 20 66 6f 72 28 69 3d  NT64;.    for(i=
13d80 28 70 49 74 65 72 2d 3e 6e 53 65 67 2b 69 43 68  (pIter->nSeg+iCh
13d90 61 6e 67 65 64 29 2f 32 3b 20 31 3b 20 69 3d 69  anged)/2; 1; i=i
13da0 2f 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43  /2){.      Fts5C
13db0 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26  Result *pRes = &
13dc0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d  pIter->aFirst[i]
13dd0 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
13de0 20 70 4e 65 77 2d 3e 70 4c 65 61 66 20 29 3b 0a   pNew->pLeaf );.
13df0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
13e00 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 7c  es->bTermEq==0 |
13e10 7c 20 70 4f 74 68 65 72 2d 3e 70 4c 65 61 66 20  | pOther->pLeaf 
13e20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 52  );..      if( pR
13e30 65 73 2d 3e 62 54 65 72 6d 45 71 20 29 7b 0a 20  es->bTermEq ){. 
13e40 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d         if( pNew-
13e50 3e 69 52 6f 77 69 64 3d 3d 70 4f 74 68 65 72 2d  >iRowid==pOther-
13e60 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  >iRowid ){.     
13e70 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
13e80 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
13e90 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
13ea0 3e 70 4e 65 77 2d 3e 69 52 6f 77 69 64 29 3d 3d  >pNew->iRowid)==
13eb0 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
13ec0 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
13ed0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
13ee0 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
13ef0 20 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20           pNew = 
13f00 70 4f 74 68 65 72 3b 0a 20 20 20 20 20 20 20 20  pOther;.        
13f10 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65  }else if( (pOthe
13f20 72 2d 3e 69 52 6f 77 69 64 3e 70 49 74 65 72 2d  r->iRowid>pIter-
13f30 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
13f40 70 49 74 65 72 2d 3e 62 52 65 76 20 29 7b 0a 20  pIter->bRev ){. 
13f50 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
13f60 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
13f70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 20  Other->iRowid;. 
13f80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13f90 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 69 46 69  .      pRes->iFi
13fa0 72 73 74 20 3d 20 28 70 4e 65 77 20 2d 20 70 49  rst = (pNew - pI
13fb0 74 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20  ter->aSeg);.    
13fc0 20 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65    if( i==1 ) bre
13fd0 61 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65  ak;..      pOthe
13fe0 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
13ff0 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  [ pIter->aFirst[
14000 69 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72  i ^ 0x0001].iFir
14010 73 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  st ];.    }.  }.
14020 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
14030 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 49  /*.** Set the pI
14040 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69 61 62  ter->bEof variab
14050 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  le based on the 
14060 73 74 61 74 65 20 6f 66 20 74 68 65 20 73 75 62  state of the sub
14070 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73  -iterators..*/.s
14080 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
14090 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 46  ultiIterSetEof(F
140a0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
140b0 74 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49  ter){.  Fts5SegI
140c0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
140d0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
140e0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
140f0 74 20 5d 3b 0a 20 20 70 49 74 65 72 2d 3e 62 45  t ];.  pIter->bE
14100 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66  of = pSeg->pLeaf
14110 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e 69 53  ==0;.  pIter->iS
14120 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 53 65  witchRowid = pSe
14130 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  g->iRowid;.}../*
14140 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74 65  .** Move the ite
14150 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  rator to the nex
14160 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
14170 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
14180 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
14190 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46 74 73  e is left in Fts
141a0 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20 69 73  5Index.rc. It is
141b0 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69 64 65   not .** conside
141c0 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20  red an error if 
141d0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
141e0 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69 66 20  ches EOF, or if 
141f0 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  it is already at
14200 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20 74 68   .** EOF when th
14210 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14220 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
14230 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
14240 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49  terNext(.  Fts5I
14250 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
14260 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
14270 2c 0a 20 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20  ,.  int bFrom,  
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61      /* True if a
142a0 72 67 75 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73  rgument iFrom is
142b0 20 76 61 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20   valid */.  i64 
142c0 69 46 72 6f 6d 20 20 20 20 20 20 20 20 20 20 20  iFrom           
142d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
142e0 64 76 61 6e 63 65 20 61 74 20 6c 65 61 73 74 20  dvance at least 
142f0 61 73 20 66 61 72 20 61 73 20 74 68 69 73 20 2a  as far as this *
14300 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  /.){.  if( p->rc
14310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14320 20 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d 20     int bUseFrom 
14330 3d 20 62 46 72 6f 6d 3b 0a 20 20 20 20 64 6f 20  = bFrom;.    do 
14340 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69 72  {.      int iFir
14350 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72  st = pIter->aFir
14360 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20  st[1].iFirst;.  
14370 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d      int bNewTerm
14380 20 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35   = 0;.      Fts5
14390 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
143a0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
143b0 72 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  rst];.      asse
143c0 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
143d0 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 69 66  E_OK );.      if
143e0 28 20 62 55 73 65 46 72 6f 6d 20 26 26 20 70 53  ( bUseFrom && pS
143f0 65 67 2d 3e 70 44 6c 69 64 78 20 29 7b 0a 20 20  eg->pDlidx ){.  
14400 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
14410 72 4e 65 78 74 46 72 6f 6d 28 70 2c 20 70 53 65  rNextFrom(p, pSe
14420 67 2c 20 69 46 72 6f 6d 29 3b 0a 20 20 20 20 20  g, iFrom);.     
14430 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14440 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
14450 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65  p, pSeg, &bNewTe
14460 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rm);.      }..  
14470 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c      if( pSeg->pL
14480 65 61 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65  eaf==0 || bNewTe
14490 72 6d 20 0a 20 20 20 20 20 20 20 7c 7c 20 66 74  rm .       || ft
144a0 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
144b0 63 65 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72  ceRowid(p, pIter
144c0 2c 20 69 46 69 72 73 74 29 0a 20 20 20 20 20 20  , iFirst).      
144d0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
144e0 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
144f0 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
14500 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66  t, 1);.        f
14510 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
14520 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
14530 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41 73 73   }.      fts5Ass
14540 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75  ertMultiIterSetu
14550 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20  p(p, pIter);..  
14560 20 20 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30      bUseFrom = 0
14570 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70 49  ;.    }while( pI
14580 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20  ter->bSkipEmpty 
14590 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  && fts5MultiIter
145a0 49 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72  IsEmpty(p, pIter
145b0 29 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ) );.  }.}..stat
145c0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
145d0 69 49 74 65 72 4e 65 78 74 32 28 0a 20 20 46 74  iIterNext2(.  Ft
145e0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
145f0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
14600 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e 65  ter,.  int *pbNe
14610 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  wTerm           
14620 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
14630 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20 62  rue if *might* b
14640 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  e new term */.){
14650 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
14660 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b 0a  ->bSkipEmpty );.
14670 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
14680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 6f  ITE_OK ){.    do
14690 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 46 69   {.      int iFi
146a0 72 73 74 20 3d 20 70 49 74 65 72 2d 3e 61 46 69  rst = pIter->aFi
146b0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20  rst[1].iFirst;. 
146c0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
146d0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
146e0 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20  >aSeg[iFirst];. 
146f0 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72       int bNewTer
14700 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 66 74  m = 0;..      ft
14710 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
14720 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d   pSeg, &bNewTerm
14730 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  );.      if( pSe
14740 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
14750 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
14760 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
14770 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20  AdvanceRowid(p, 
14780 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20  pIter, iFirst). 
14790 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
147a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
147b0 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
147c0 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
147d0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
147e0 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a  rSetEof(pIter);.
147f0 20 20 20 20 20 20 20 20 2a 70 62 4e 65 77 54 65          *pbNewTe
14800 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rm = 1;.      }e
14810 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 62  lse{.        *pb
14820 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
14830 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41     }.      fts5A
14840 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
14850 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  tup(p, pIter);..
14860 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73 35      }while( fts5
14870 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
14880 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20  (p, pIter) );.  
14890 7d 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 46 74 73  }.}...static Fts
148a0 35 49 6e 64 65 78 49 74 65 72 20 2a 66 74 73 35  5IndexIter *fts5
148b0 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a  MultiIterAlloc(.
148c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
148f0 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
14900 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65  hin */.  int nSe
14910 67 0a 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  g.){.  Fts5Index
14920 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e  Iter *pNew;.  in
14930 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20 20 20 20  t nSlot;        
14940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14950 20 50 6f 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d   Power of two >=
14960 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28   nSeg */..  for(
14970 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e  nSlot=2; nSlot<n
14980 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74  Seg; nSlot=nSlot
14990 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74  *2);.  pNew = ft
149a0 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a  s5IdxMalloc(p, .
149b0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
149c0 35 49 6e 64 65 78 49 74 65 72 29 20 2b 20 20 20  5IndexIter) +   
149d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65            /* pNe
149e0 77 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  w */.      sizeo
149f0 66 28 46 74 73 35 53 65 67 49 74 65 72 29 20 2a  f(Fts5SegIter) *
14a00 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f   (nSlot-1) +   /
14a10 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a  * pNew->aSeg[] *
14a20 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
14a30 74 73 35 43 52 65 73 75 6c 74 29 20 2a 20 6e 53  ts5CResult) * nS
14a40 6c 6f 74 20 20 20 20 20 20 20 20 20 2f 2a 20 70  lot         /* p
14a50 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f  New->aFirst[] */
14a60 0a 20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  .  );.  if( pNew
14a70 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53   ){.    pNew->nS
14a80 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20  eg = nSlot;.    
14a90 70 4e 65 77 2d 3e 61 46 69 72 73 74 20 3d 20 28  pNew->aFirst = (
14aa0 46 74 73 35 43 52 65 73 75 6c 74 2a 29 26 70 4e  Fts5CResult*)&pN
14ab0 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b  ew->aSeg[nSlot];
14ac0 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65  .    pNew->pInde
14ad0 78 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74  x = p;.  }.  ret
14ae0 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
14af0 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
14b00 77 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  w Fts5IndexIter 
14b10 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  object..**.** Th
14b20 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c  e new object wil
14b30 6c 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65  l be used to ite
14b40 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 61 74  rate through dat
14b50 61 20 69 6e 20 73 74 72 75 63 74 75 72 65 20 70  a in structure p
14b60 53 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c  Struct..** If iL
14b70 65 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65  evel is -ve, the
14b80 6e 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c  n all data in al
14b90 6c 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65  l segments is me
14ba0 72 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65  rged. Or, if iLe
14bb0 76 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f  vel.** is zero o
14bc0 72 20 67 72 65 61 74 65 72 2c 20 64 61 74 61 20  r greater, data 
14bd0 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e  from the first n
14be0 53 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73  Segment segments
14bf0 20 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c   on level iLevel
14c00 0a 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a  .** is merged..*
14c10 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f  *.** The iterato
14c20 72 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e  r initially poin
14c30 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
14c40 74 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79  term/rowid entry
14c50 20 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72   in the .** iter
14c60 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ated data..*/.st
14c70 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75  atic void fts5Mu
14c80 6c 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74  ltiIterNew(.  Ft
14c90 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
14ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14cb0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f   FTS5 backend to
14cc0 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20   iterate within 
14cd0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
14ce0 72 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20  re *pStruct,    
14cf0 20 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72       /* Structur
14d00 65 20 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e  e of specific in
14d10 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b  dex */.  int bSk
14d20 69 70 45 6d 70 74 79 2c 20 20 20 20 20 20 20 20  ipEmpty,        
14d30 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
14d40 20 74 6f 20 69 67 6e 6f 72 65 20 64 65 6c 65 74   to ignore delet
14d50 65 2d 6b 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20  e-keys */.  int 
14d60 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
14d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14d80 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58  TS5INDEX_QUERY_X
14d90 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  XX flags */.  co
14da0 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69  nst u8 *pTerm, i
14db0 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a  nt nTerm,     /*
14dc0 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f   Term to seek to
14dd0 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a   (or NULL/0) */.
14de0 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20    int iLevel,   
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74    /* Level to it
14e10 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20 61 6c  erate (-1 for al
14e20 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67  l) */.  int nSeg
14e30 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20  ment,           
14e40 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
14e50 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20 74 6f  r of segments to
14e60 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d   merge (iLevel>=
14e70 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  0) */.  Fts5Inde
14e80 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  xIter **ppOut   
14e90 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
14ea0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  bject */.){.  in
14eb0 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20 20 20  t nSeg = 0;     
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14ed0 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   Number of segme
14ee0 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73 65 20  nt-iters in use 
14ef0 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72 20 3d  */.  int iIter =
14f00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
14f10 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74       /* */.  int
14f20 20 69 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   iSeg;          
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f40 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
14f50 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e 74 73  through segments
14f60 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
14f70 20 62 75 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20   buf = {0,0,0}; 
14f80 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
14f90 75 73 65 64 20 62 79 20 66 74 73 35 53 65 67 49  used by fts5SegI
14fa0 74 65 72 53 65 65 6b 49 6e 69 74 28 29 20 2a 2f  terSeekInit() */
14fb0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
14fc0 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46  Level *pLvl;.  F
14fd0 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e  ts5IndexIter *pN
14fe0 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  ew;..  assert( (
14ff0 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72  pTerm==0 && nTer
15000 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c  m==0) || iLevel<
15010 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  0 );..  /* Alloc
15020 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
15030 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d  e new multi-seg-
15040 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69  iterator. */.  i
15050 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
15060 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69  _OK ){.    if( i
15070 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20  Level<0 ){.     
15080 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
15090 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
150a0 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
150b0 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
150c0 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20  );.      nSeg = 
150d0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
150e0 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d  t;.      nSeg +=
150f0 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a   (p->pHash ? 1 :
15100 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
15110 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e        nSeg = MIN
15120 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
15130 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e  [iLevel].nSeg, n
15140 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  Segment);.    }.
15150 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70    }.  *ppOut = p
15160 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  New = fts5MultiI
15170 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67  terAlloc(p, nSeg
15180 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
15190 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65   ) return;.  pNe
151a0 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66  w->bRev = (0!=(f
151b0 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
151c0 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20  _QUERY_DESC));. 
151d0 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
151e0 79 20 3d 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a  y = bSkipEmpty;.
151f0 20 20 70 4e 65 77 2d 3e 70 53 74 72 75 63 74 20    pNew->pStruct 
15200 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 66 74 73  = pStruct;.  fts
15210 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 53  5StructureRef(pS
15220 74 72 75 63 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e  truct);..  /* In
15230 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f 66  itialize each of
15240 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73   the component s
15250 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
15260 2e 20 2a 2f 0a 20 20 69 66 28 20 69 4c 65 76 65  . */.  if( iLeve
15270 6c 3c 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  l<0 ){.    Fts5S
15280 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
15290 45 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  End = &pStruct->
152a0 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e  aLevel[pStruct->
152b0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28  nLevel];.    if(
152c0 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20   p->pHash ){.   
152d0 20 20 20 2f 2a 20 41 64 64 20 61 20 73 65 67 6d     /* Add a segm
152e0 65 6e 74 20 69 74 65 72 61 74 6f 72 20 66 6f 72  ent iterator for
152f0 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e   the current con
15300 74 65 6e 74 73 20 6f 66 20 74 68 65 20 68 61 73  tents of the has
15310 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
15320 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15330 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
15340 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
15350 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48 61     fts5SegIterHa
15360 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c  shInit(p, pTerm,
15370 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70   nTerm, flags, p
15380 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Iter);.    }.   
15390 20 66 6f 72 28 70 4c 76 6c 3d 26 70 53 74 72 75   for(pLvl=&pStru
153a0 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70  ct->aLevel[0]; p
153b0 4c 76 6c 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b  Lvl<pEnd; pLvl++
153c0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ){.      for(iSe
153d0 67 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  g=pLvl->nSeg-1; 
153e0 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29  iSeg>=0; iSeg--)
153f0 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74  {.        Fts5St
15400 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
15410 70 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53  pSeg = &pLvl->aS
15420 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20  eg[iSeg];.      
15430 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15440 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53  Iter = &pNew->aS
15450 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20  eg[iIter++];.   
15460 20 20 20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d       if( pTerm==
15470 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  0 ){.          f
15480 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70  ts5SegIterInit(p
15490 2c 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a  , pSeg, pIter);.
154a0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
154b0 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67           fts5Seg
154c0 49 74 65 72 53 65 65 6b 49 6e 69 74 28 70 2c 20  IterSeekInit(p, 
154d0 26 62 75 66 2c 20 70 54 65 72 6d 2c 20 6e 54 65  &buf, pTerm, nTe
154e0 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53 65 67 2c  rm, flags, pSeg,
154f0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 20   pIter);.       
15500 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15510 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
15520 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
15530 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20  Level[iLevel];. 
15540 20 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67     for(iSeg=nSeg
15550 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65  -1; iSeg>=0; iSe
15560 67 2d 2d 29 7b 0a 20 20 20 20 20 20 66 74 73 35  g--){.      fts5
15570 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 26  SegIterInit(p, &
15580 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
15590 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  , &pNew->aSeg[iI
155a0 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20  ter++]);.    }. 
155b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 69 49 74   }.  assert( iIt
155c0 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f  er==nSeg );..  /
155d0 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65 20 77  * If the above w
155e0 61 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 65  as successful, e
155f0 61 63 68 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74  ach component it
15600 65 72 61 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e  erators now poin
15610 74 73 20 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ts .  ** to the 
15620 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 69  first entry in i
15630 74 73 20 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74  ts segment. In t
15640 68 69 73 20 63 61 73 65 20 69 6e 69 74 69 61 6c  his case initial
15650 69 7a 65 20 74 68 65 20 0a 20 20 2a 2a 20 61 46  ize the .  ** aF
15660 69 72 73 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72  irst[] array. Or
15670 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61  , if an error ha
15680 73 20 6f 63 63 75 72 72 65 64 2c 20 66 72 65 65  s occurred, free
15690 20 74 68 65 20 69 74 65 72 61 74 6f 72 0a 20 20   the iterator.  
156a0 2a 2a 20 6f 62 6a 65 63 74 20 61 6e 64 20 73 65  ** object and se
156b0 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
156c0 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20  iable to NULL.  
156d0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
156e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
156f0 20 66 6f 72 28 69 49 74 65 72 3d 70 4e 65 77 2d   for(iIter=pNew-
15700 3e 6e 53 65 67 2d 31 3b 20 69 49 74 65 72 3e 30  >nSeg-1; iIter>0
15710 3b 20 69 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20  ; iIter--){.    
15720 20 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 20    int iEq;.     
15730 20 69 66 28 20 28 69 45 71 20 3d 20 66 74 73 35   if( (iEq = fts5
15740 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61  MultiIterDoCompa
15750 72 65 28 70 4e 65 77 2c 20 69 49 74 65 72 29 29  re(pNew, iIter))
15760 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
15770 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c 20 26  SegIterNext(p, &
15780 70 4e 65 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c  pNew->aSeg[iEq],
15790 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
157a0 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
157b0 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
157c0 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
157d0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
157e0 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
157f0 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
15800 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
15810 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
15820 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
15830 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
15840 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
15850 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
15860 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
15870 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
15880 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
15890 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  {.    fts5MultiI
158a0 74 65 72 46 72 65 65 28 70 2c 20 70 4e 65 77 29  terFree(p, pNew)
158b0 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
158c0 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66 66  ;.  }.  fts5Buff
158d0 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a  erFree(&buf);.}.
158e0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e  ./*.** Create an
158f0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 74   Fts5IndexIter t
15900 68 61 74 20 69 74 65 72 61 74 65 73 20 74 68 72  hat iterates thr
15910 6f 75 67 68 20 74 68 65 20 64 6f 63 6c 69 73 74  ough the doclist
15920 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20   provided.** as 
15930 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
15940 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ent..*/.static v
15950 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65  oid fts5MultiIte
15960 72 4e 65 77 32 28 0a 20 20 46 74 73 35 49 6e 64  rNew2(.  Fts5Ind
15970 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
15980 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
15990 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
159a0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
159b0 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 2c  Fts5Data *pData,
159c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
159d0 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f 20 69 74  /* Doclist to it
159e0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
159f0 0a 20 20 69 6e 74 20 62 44 65 73 63 2c 20 20 20  .  int bDesc,   
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 64     /* True for d
15a20 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
15a30 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74 73 35 49  order */.  Fts5I
15a40 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 4f 75 74  ndexIter **ppOut
15a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
15a60 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  w object */.){. 
15a70 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
15a80 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66  pNew;.  pNew = f
15a90 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f  ts5MultiIterAllo
15aa0 63 28 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70  c(p, 2);.  if( p
15ab0 4e 65 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53  New ){.    Fts5S
15ac0 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  egIter *pIter = 
15ad0 26 70 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a  &pNew->aSeg[1];.
15ae0 0a 20 20 20 20 70 4e 65 77 2d 3e 62 46 69 6c 74  .    pNew->bFilt
15af0 65 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 49  ered = 1;.    pI
15b00 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46 54 53  ter->flags = FTS
15b10 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
15b20 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61 74 61  M;.    if( pData
15b30 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a 20 20  ->szLeaf>0 ){.  
15b40 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
15b50 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
15b60 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
15b70 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  et = fts5GetVari
15b80 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36  nt(pData->p, (u6
15b90 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
15ba0 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  d);.      pIter-
15bb0 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
15bc0 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20 20 20   pData->nn;.    
15bd0 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 31    pNew->aFirst[1
15be0 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a 20 20  ].iFirst = 1;.  
15bf0 20 20 20 20 69 66 28 20 62 44 65 73 63 20 29 7b      if( bDesc ){
15c00 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 62  .        pNew->b
15c10 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Rev = 1;.       
15c20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d   pIter->flags |=
15c30 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
15c40 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20 20 66  VERSE;.        f
15c50 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
15c60 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
15c70 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  er);.      }else
15c80 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  {.        fts5Se
15c90 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c  gIterLoadNPos(p,
15ca0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   pIter);.      }
15cb0 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 30  .      pData = 0
15cc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15cd0 20 20 20 70 4e 65 77 2d 3e 62 45 6f 66 20 3d 20     pNew->bEof = 
15ce0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70  1;.    }..    *p
15cf0 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d  pOut = pNew;.  }
15d00 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ..  fts5DataRele
15d10 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f  ase(pData);.}../
15d20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
15d30 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
15d40 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20 69 66   is at EOF or if
15d50 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   an error has oc
15d60 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61 6c 73  curred. .** Fals
15d70 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
15d80 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
15d90 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74 73 35  ultiIterEof(Fts5
15da0 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e  Index *p, Fts5In
15db0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
15dc0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
15dd0 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49 74 65   .      || (pIte
15de0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
15df0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
15e00 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49   ].pLeaf==0)==pI
15e10 74 65 72 2d 3e 62 45 6f 66 20 0a 20 20 29 3b 0a  ter->bEof .  );.
15e20 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 20    return (p->rc 
15e30 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66 29 3b  || pIter->bEof);
15e40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
15e50 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74 68   the rowid of th
15e60 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
15e70 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
15e80 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  tly points.** to
15e90 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74 6f  . If the iterato
15ea0 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46 20  r points to EOF 
15eb0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
15ec0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
15ed0 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65 20  .** results are 
15ee0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
15ef0 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75 6c  atic i64 fts5Mul
15f00 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73 35  tiIterRowid(Fts5
15f10 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
15f20 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
15f30 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
15f40 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
15f50 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20 20 72  t ].pLeaf );.  r
15f60 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 53 65  eturn pIter->aSe
15f70 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
15f80 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69 52 6f  [1].iFirst ].iRo
15f90 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  wid;.}../*.** Mo
15fa0 76 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ve the iterator 
15fb0 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72  to the next entr
15fc0 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e  y at or followin
15fd0 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61  g iMatch..*/.sta
15fe0 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
15ff0 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a  tiIterNextFrom(.
16000 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
16010 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
16020 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36 34 20   *pIter, .  i64 
16030 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c  iMatch.){.  whil
16040 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20  e( 1 ){.    i64 
16050 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74 73 35  iRowid;.    fts5
16060 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
16070 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61 74 63   pIter, 1, iMatc
16080 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35  h);.    if( fts5
16090 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
160a0 70 49 74 65 72 29 20 29 20 62 72 65 61 6b 3b 0a  pIter) ) break;.
160b0 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66 74 73      iRowid = fts
160c0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
160d0 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  pIter);.    if( 
160e0 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26  pIter->bRev==0 &
160f0 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68  & iRowid>=iMatch
16100 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
16110 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21 3d 30  ( pIter->bRev!=0
16120 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74   && iRowid<=iMat
16130 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ch ) break;.  }.
16140 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
16150 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62  a pointer to a b
16160 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
16170 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f 63 69   the term associ
16180 61 74 65 64 20 77 69 74 68 20 74 68 65 20 0a 2a  ated with the .*
16190 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  * entry that the
161a0 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65 6e   iterator curren
161b0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a  tly points to..*
161c0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
161d0 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65 72  8 *fts5MultiIter
161e0 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74  Term(Fts5IndexIt
161f0 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a  er *pIter, int *
16200 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  pn){.  Fts5SegIt
16210 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72 2d 3e  er *p = &pIter->
16220 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
16230 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b  rst[1].iFirst ];
16240 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65 72 6d  .  *pn = p->term
16250 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e  .n;.  return p->
16260 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 73 74 61 74 69  term.p;.}..stati
16270 63 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b  c void fts5Chunk
16280 49 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49  Iterate(.  Fts5I
16290 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
162a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
162b0 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  dex object */.  
162c0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65  Fts5SegIter *pSe
162d0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
162e0 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68  /* Poslist of th
162f0 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
16300 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20   void *pCtx,    
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e   /* Context poin
16330 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63  ter for xChunk c
16340 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69  allback */.  voi
16350 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35  d (*xChunk)(Fts5
16360 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63  Index*, void*, c
16370 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29  onst u8*, int).)
16380 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70  {.  int nRem = p
16390 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20  Seg->nPos;      
163a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
163b0 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20   bytes still to 
163c0 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61  come */.  Fts5Da
163d0 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20  ta *pData = 0;. 
163e0 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70   u8 *pChunk = &p
163f0 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53  Seg->pLeaf->p[pS
16400 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d  eg->iLeafOffset]
16410 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d  ;.  int nChunk =
16420 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d   MIN(nRem, pSeg-
16430 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d  >pLeaf->szLeaf -
16440 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
16450 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20  et);.  int pgno 
16460 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e  = pSeg->iLeafPgn
16470 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76  o;.  int pgnoSav
16480 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 28 70  e = 0;..  if( (p
16490 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46 54 53  Seg->flags & FTS
164a0 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
164b0 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e  E)==0 ){.    pgn
164c0 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a  oSave = pgno+1;.
164d0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 31 20    }..  while( 1 
164e0 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28 70 2c  ){.    xChunk(p,
164f0 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e   pCtx, pChunk, n
16500 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d  Chunk);.    nRem
16510 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20   -= nChunk;.    
16520 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
16530 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20  pData);.    if( 
16540 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20  nRem<=0 ){.     
16550 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73   break;.    }els
16560 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b  e{.      pgno++;
16570 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20 66  .      pData = f
16580 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46  ts5DataRead(p, F
16590 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
165a0 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53  D(pSeg->pSeg->iS
165b0 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  egid, pgno));.  
165c0 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30      if( pData==0
165d0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
165e0 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d  pChunk = &pData-
165f0 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68  >p[4];.      nCh
16600 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20  unk = MIN(nRem, 
16610 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20  pData->szLeaf - 
16620 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  4);.      if( pg
16630 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a  no==pgnoSave ){.
16640 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16650 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  pSeg->pNextLeaf=
16660 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
16670 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  eg->pNextLeaf = 
16680 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70  pData;.        p
16690 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  Data = 0;.      
166a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
166b0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
166c0 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
166d0 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
166e0 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20  re pStruct. The 
166f0 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69  new segment.** i
16700 64 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  d must be betwee
16710 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e  n 1 and 65335 in
16720 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73  clusive, and mus
16730 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79  t not be used by
16740 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74   .** any current
16750 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  ly existing segm
16760 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73  ent. If a free s
16770 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74  egment id cannot
16780 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51   be found,.** SQ
16790 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74  LITE_FULL is ret
167a0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
167b0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
167c0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
167d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
167e0 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a  a no-op. 0 is .*
167f0 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
16800 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
16810 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63  ic int fts5Alloc
16820 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64  ateSegid(Fts5Ind
16830 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
16840 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
16850 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30    int iSegid = 0
16860 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
16870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16880 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53   if( pStruct->nS
16890 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58  egment>=FTS5_MAX
168a0 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
168b0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
168c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _FULL;.    }else
168d0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
168e0 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
168f0 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
16900 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
16910 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
16920 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76 6f 69  izeof(u32), (voi
16930 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20  d*)&iSegid);.   
16940 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 69 53       iSegid = iS
16950 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54  egid & ((1 << FT
16960 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29  S5_DATA_ID_B)-1)
16970 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c  ;.        for(iL
16980 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
16990 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
169a0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
169b0 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
169c0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
169d0 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
169e0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
169f0 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53 74   if( iSegid==pSt
16a00 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
16a10 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
16a20 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  egid ){.        
16a30 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 30        iSegid = 0
16a40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
16a50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
16a60 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
16a70 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
16a80 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a  n iSegid;.}../*.
16a90 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64  ** Discard all d
16aa0 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ata currently ca
16ab0 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68  ched in the hash
16ac0 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  -tables..*/.stat
16ad0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
16ae0 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73  xDiscardData(Fts
16af0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
16b00 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c  sert( p->pHash |
16b10 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  | p->nPendingDat
16b20 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  a==0 );.  if( p-
16b30 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71  >pHash ){.    sq
16b40 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65  lite3Fts5HashCle
16b50 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  ar(p->pHash);.  
16b60 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
16b70 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  a = 0;.  }.}../*
16b80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
16b90 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69  ize of the prefi
16ba0 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61  x, in bytes, tha
16bb0 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70  t buffer (nNew/p
16bc0 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77  New) shares.** w
16bd0 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64  ith buffer (nOld
16be0 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /pOld)..*/.stati
16bf0 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
16c00 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20  Compress(.  int 
16c10 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
16c20 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77  pOld,.  int nNew
16c30 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
16c40 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  .){.  int i;.  a
16c50 73 73 65 72 74 28 20 66 74 73 35 42 6c 6f 62 43  ssert( fts5BlobC
16c60 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20 6e 4f 6c  ompare(pOld, nOl
16c70 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 29 3c 30  d, pNew, nNew)<0
16c80 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
16c90 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
16ca0 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e   if( pOld[i]!=pN
16cb0 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ew[i] ) break;. 
16cc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
16cd0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
16ce0 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
16cf0 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
16d00 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
16d10 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
16d20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20  int bFlush      
16d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d40 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74  /* If true, writ
16d50 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20  e dlidx to disk 
16d60 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
16d70 20 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d   assert( bFlush=
16d80 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e  =0 || (pWriter->
16d90 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69  nDlidx>0 && pWri
16da0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
16db0 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72  uf.n>0) );.  for
16dc0 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d  (i=0; i<pWriter-
16dd0 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20  >nDlidx; i++){. 
16de0 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
16df0 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
16e00 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
16e10 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ;.    if( pDlidx
16e20 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65  ->buf.n==0 ) bre
16e30 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75  ak;.    if( bFlu
16e40 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
16e50 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  rt( pDlidx->pgno
16e60 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  !=0 );.      fts
16e70 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
16e80 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
16e90 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65  IDX_ROWID(pWrite
16ea0 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44  r->iSegid, i, pD
16eb0 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20  lidx->pgno),.   
16ec0 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62         pDlidx->b
16ed0 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75  uf.p, pDlidx->bu
16ee0 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f.n.      );.   
16ef0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
16f00 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44  s5BufferZero(&pD
16f10 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20  lidx->buf);.    
16f20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
16f30 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
16f40 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57  *.** Grow the pW
16f50 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20  riter->aDlidx[] 
16f60 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73  array to at leas
16f70 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20  t nLvl elements 
16f80 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20  in size..** Any 
16f90 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e  new array elemen
16fa0 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65  ts are zeroed be
16fb0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
16fc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
16fd0 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
16fe0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16ff0 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ,.  Fts5SegWrite
17000 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
17010 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20  t nLvl.){.  if( 
17020 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
17030 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65   && nLvl>=pWrite
17040 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20  r->nDlidx ){.   
17050 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
17060 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35   *aDlidx = (Fts5
17070 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c  DlidxWriter*)sql
17080 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
17090 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
170a0 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74  Dlidx, sizeof(Ft
170b0 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
170c0 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20   nLvl.    );.   
170d0 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29   if( aDlidx==0 )
170e0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
170f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
17100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
17110 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
17120 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f(Fts5DlidxWrite
17130 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72  r) * (nLvl - pWr
17140 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20  iter->nDlidx);. 
17150 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c       memset(&aDl
17160 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c  idx[pWriter->nDl
17170 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b  idx], 0, nByte);
17180 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
17190 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b  aDlidx = aDlidx;
171a0 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
171b0 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20  nDlidx = nLvl;. 
171c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
171d0 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  n p->rc;.}../*.*
171e0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
171f0 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61   doclist-index a
17200 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70  ccumulating in p
17210 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d  Writer->aDlidx[]
17220 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   is large.** eno
17230 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74 6f  ugh, flush it to
17240 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72 6e   disk and return
17250 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64 69   1. Otherwise di
17260 73 63 61 72 64 20 69 74 20 61 6e 64 20 72 65 74  scard it and ret
17270 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a  urn.** zero..*/.
17280 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57  static int fts5W
17290 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 46  riteFlushDlidx(F
172a0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
172b0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
172c0 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61  ter){.  int bFla
172d0 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  g = 0;..  /* If 
172e0 74 68 65 72 65 20 77 65 72 65 20 46 54 53 35 5f  there were FTS5_
172f0 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f  MIN_DLIDX_SIZE o
17300 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61  r more empty lea
17310 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  f pages written.
17320 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
17330 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65  base, also write
17340 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
17350 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a  ex to disk.  */.
17360 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61    if( pWriter->a
17370 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
17380 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   && pWriter->nEm
17390 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
173a0 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
173b0 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20  bFlag = 1;.  }. 
173c0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43   fts5WriteDlidxC
173d0 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c  lear(p, pWriter,
173e0 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69 74   bFlag);.  pWrit
173f0 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
17400 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a    return bFlag;.
17410 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
17420 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
17430 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65 73   whenever proces
17440 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 6c  sing of the docl
17450 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ist for the .** 
17460 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61  last term on lea
17470 66 20 70 61 67 65 20 28 70 57 72 69 74 65 72 2d  f page (pWriter-
17480 3e 69 42 74 50 61 67 65 29 20 69 73 20 63 6f 6d  >iBtPage) is com
17490 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  pleted. .**.** T
174a0 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
174b0 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20 69   for that term i
174c0 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
174d0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74  ed in-memory wit
174e0 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 53  hin the.** Fts5S
174f0 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78 5b  egWriter.aDlidx[
17500 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74 20 69  ] array. If it i
17510 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20  s large enough, 
17520 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
17530 20 77 72 69 74 65 73 20 69 74 20 6f 75 74 20 74   writes it out t
17540 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69  o disk. Or, if i
17550 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74  t is too small t
17560 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20 64  o bother with, d
17570 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a  iscards.** it..*
17580 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74  *.** Fts5SegWrit
17590 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65 6e  er.btterm curren
175a0 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  tly contains the
175b0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70   first term on p
175c0 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a  age iBtPage..*/.
175d0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
175e0 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28  WriteFlushBtree(
175f0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
17600 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
17610 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c  iter){.  int bFl
17620 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ag;..  assert( p
17630 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
17640 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  || pWriter->nEmp
17650 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ty==0 );.  if( p
17660 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3d  Writer->iBtPage=
17670 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62  =0 ) return;.  b
17680 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74 65  Flag = fts5Write
17690 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70 57  FlushDlidx(p, pW
176a0 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  riter);..  if( p
176b0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
176c0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
176d0 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72 2d  r *z = (pWriter-
176e0 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e  >btterm.n>0?(con
176f0 73 74 20 63 68 61 72 2a 29 70 57 72 69 74 65 72  st char*)pWriter
17700 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a  ->btterm.p:"");.
17710 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
17720 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64 79  wing was already
17730 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72 69   done in fts5Wri
17740 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20  teInit(): */.   
17750 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   /* sqlite3_bind
17760 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
17770 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
17780 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20  iSegid); */.    
17790 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
177a0 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  b(p->pIdxWriter,
177b0 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e   2, z, pWriter->
177c0 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45  btterm.n, SQLITE
177d0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
177e0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
177f0 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
17800 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36 34  3, bFlag + ((i64
17810 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67  )pWriter->iBtPag
17820 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  e<<1));.    sqli
17830 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
17840 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  Writer);.    p->
17850 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
17860 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  et(p->pIdxWriter
17870 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72  );.  }.  pWriter
17880 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d  ->iBtPage = 0;.}
17890 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
178a0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
178b0 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65  each leaf page e
178c0 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20  xcept the first 
178d0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
178e0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
178f0 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54  rm. Argument (nT
17900 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68  erm/pTerm) is th
17910 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20  e split-key - a 
17920 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20  term that.** is 
17930 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
17940 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f  terms written to
17950 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c   earlier leaves,
17960 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72   and equal to or
17970 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  .** smaller than
17980 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
17990 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e  on the new leaf.
179a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
179b0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
179c0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
179d0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
179e0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  . If an error.**
179f0 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
17a00 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
17a10 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
17a20 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
17a30 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
17a40 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
17a50 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
17a60 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
17a70 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
17a80 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
17a90 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
17aa0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
17ab0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
17ac0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ject */.  int nT
17ad0 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
17ae0 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72  Term      /* Fir
17af0 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70  st term on new p
17b00 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35  age */.){.  fts5
17b10 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28  WriteFlushBtree(
17b20 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 66  p, pWriter);.  f
17b30 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
17b40 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62  >rc, &pWriter->b
17b50 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  tterm, nTerm, pT
17b60 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
17b70 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72 69 74  >iBtPage = pWrit
17b80 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b  er->writer.pgno;
17b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
17ba0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
17bb0 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20  d when flushing 
17bc0 61 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74  a leaf page that
17bd0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
17be0 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20  terms at all to 
17bf0 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
17c00 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
17c10 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
17c20 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
17c30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17c40 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
17c50 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
17c60 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
17c70 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
17c80 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
17c90 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65    /* If there we
17ca0 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20  re no rowids on 
17cb0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69  the leaf page ei
17cc0 74 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63  ther and the doc
17cd0 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20  list-index.  ** 
17ce0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
17cf0 20 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64   started, append
17d00 20 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f   an 0x00 byte to
17d10 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70   it.  */.  if( p
17d20 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
17d30 77 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72  widInPage && pWr
17d40 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
17d50 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46  buf.n>0 ){.    F
17d60 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
17d70 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
17d80 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20  r->aDlidx[0];.  
17d90 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
17da0 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a  ->bPrevValid );.
17db0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
17dc0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17dd0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
17de0 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  x->buf, 0);.  }.
17df0 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
17e00 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73  the "number of s
17e10 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73  equential leaves
17e20 20 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22   without a term"
17e30 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70   counter. */.  p
17e40 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b  Writer->nEmpty++
17e50 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20  ;.}..static i64 
17e60 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74  fts5DlidxExtract
17e70 46 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42  FirstRowid(Fts5B
17e80 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
17e90 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e  i64 iRowid;.  in
17ea0 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20  t iOff;..  iOff 
17eb0 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72  = 1 + fts5GetVar
17ec0 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c  int(&pBuf->p[1],
17ed0 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
17ee0 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  .  fts5GetVarint
17ef0 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c  (&pBuf->p[iOff],
17f00 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
17f10 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64  .  return iRowid
17f20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64  ;.}../*.** Rowid
17f30 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74   iRowid has just
17f40 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74   been appended t
17f50 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  o the current le
17f60 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74  af page. It is t
17f70 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74  he.** first on t
17f80 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  he page. This fu
17f90 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
17fa0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  n appropriate en
17fb0 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65  try to the curre
17fc0 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  nt.** doclist-in
17fd0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
17fe0 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
17ff0 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35  dxAppend(.  Fts5
18000 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
18010 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
18020 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  ter, .  i64 iRow
18030 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  id.){.  int i;. 
18040 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
18050 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
18060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18070 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  bDone==0; i++){.
18080 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
18090 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
180a0 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
180b0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
180c0 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ..    if( pDlidx
180d0 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
180e0 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
180f0 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
18100 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  t doclist-index 
18110 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72  page is full. Wr
18120 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61  ite it to disk a
18130 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a  nd push.      **
18140 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69   a copy of iRowi
18150 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  d (which will be
18160 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72  come the first r
18170 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  owid on the next
18180 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73  .      ** doclis
18190 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67  t-index leaf pag
181a0 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e  e) up into the n
181b0 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ext level of the
181c0 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a   b-tree .      *
181d0 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20  * hierarchy. If 
181e0 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66  the node being f
181f0 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e  lushed is curren
18200 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  tly the root nod
18210 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f  e,.      ** also
18220 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20   push its first 
18230 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a  rowid upwards. *
18240 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  /.      pDlidx->
18250 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b  buf.p[0] = 0x01;
18260 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72      /* Not the r
18270 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20  oot node */.    
18280 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
18290 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
182a0 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
182b0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
182c0 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  i, pDlidx->pgno)
182d0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69  ,.          pDli
182e0 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64  dx->buf.p, pDlid
182f0 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29  x->buf.n.      )
18300 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
18310 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57  eDlidxGrow(p, pW
18320 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20  riter, i+2);.   
18330 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72     pDlidx = &pWr
18340 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
18350 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
18360 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
18370 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d  Dlidx[1].buf.n==
18380 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  0 ){.        i64
18390 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c   iFirst = fts5Dl
183a0 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52  idxExtractFirstR
183b0 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75  owid(&pDlidx->bu
183c0 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  f);..        /* 
183d0 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f  This was the roo
183e0 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73  t node. Push its
183f0 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20   first rowid up 
18400 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e  to the new root.
18410 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69   */.        pDli
18420 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c  dx[1].pgno = pDl
18430 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  idx->pgno;.     
18440 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
18450 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
18460 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
18470 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  [1].buf, 0);.   
18480 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
18490 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
184a0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
184b0 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64  dx[1].buf, pDlid
184c0 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  x->pgno);.      
184d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
184e0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
184f0 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
18500 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b  1].buf, iFirst);
18510 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
18520 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  1].bPrevValid = 
18530 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  1;.        pDlid
18540 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69  x[1].iPrev = iFi
18550 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rst;.      }..  
18560 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
18570 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64  ufferZero(&pDlid
18580 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70  x->buf);.      p
18590 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
185a0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c  d = 0;.      pDl
185b0 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20  idx->pgno++;.   
185c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44   }else{.      bD
185d0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  one = 1;.    }..
185e0 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
185f0 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  bPrevValid ){.  
18600 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
18610 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65  d - pDlidx->iPre
18620 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
18630 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20      i64 iPgno = 
18640 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d  (i==0 ? pWriter-
18650 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70  >writer.pgno : p
18660 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b  Dlidx[-1].pgno);
18670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
18680 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20  Dlidx->buf.n==0 
18690 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
186a0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
186b0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
186c0 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44  pDlidx->buf, !bD
186d0 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  one);.      sqli
186e0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
186f0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
18700 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
18710 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56  iPgno);.      iV
18720 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  al = iRowid;.   
18730 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
18740 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
18750 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
18760 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c  Dlidx->buf, iVal
18770 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  );.    pDlidx->b
18780 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
18790 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76     pDlidx->iPrev
187a0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d   = iRowid;.  }.}
187b0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
187c0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
187d0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
187e0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
187f0 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63  riter){.  static
18800 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d   const u8 zero[]
18810 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c   = { 0x00, 0x00,
18820 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20   0x00, 0x00 };. 
18830 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
18840 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
18850 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34  r->writer;.  i64
18860 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65   iRowid;..  asse
18870 72 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64  rt( (pPage->pgid
18880 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65  x.n==0)==(pWrite
18890 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
188a0 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  age) );..  /* Se
188b0 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61  t the szLeaf hea
188c0 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20  der field. */.  
188d0 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47  assert( 0==fts5G
188e0 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75  etU16(&pPage->bu
188f0 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73  f.p[2]) );.  fts
18900 35 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5PutU16(&pPage->
18910 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d  buf.p[2], pPage-
18920 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66 28 20  >buf.n);..  if( 
18930 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
18940 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  ermInPage ){.   
18950 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20   /* No term was 
18960 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
18970 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
18980 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 69 64  ert( pPage->pgid
18990 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 66 74  x.n==0 );.    ft
189a0 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65  s5WriteBtreeNoTe
189b0 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  rm(p, pWriter);.
189c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
189d0 41 70 70 65 6e 64 20 74 68 65 20 70 67 69 64 78  Append the pgidx
189e0 20 74 6f 20 74 68 65 20 70 61 67 65 20 62 75 66   to the page buf
189f0 66 65 72 2e 20 53 65 74 20 74 68 65 20 73 7a 4c  fer. Set the szL
18a00 65 61 66 20 68 65 61 64 65 72 20 66 69 65 6c 64  eaf header field
18a10 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66  . */.    fts5Buf
18a20 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
18a30 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
18a40 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  f, pPage->pgidx.
18a50 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e  n, pPage->pgidx.
18a60 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 72  p);.  }..  /* Wr
18a70 69 74 65 20 74 68 65 20 70 61 67 65 20 6f 75 74  ite the page out
18a80 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 52   to disk */.  iR
18a90 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47 4d  owid = FTS5_SEGM
18aa0 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74 65  ENT_ROWID(pWrite
18ab0 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61 67 65  r->iSegid, pPage
18ac0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73 35 44  ->pgno);.  fts5D
18ad0 61 74 61 57 72 69 74 65 28 70 2c 20 69 52 6f 77  ataWrite(p, iRow
18ae0 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 70  id, pPage->buf.p
18af0 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
18b00 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  ..  /* Initializ
18b10 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 2e  e the next page.
18b20 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72   */.  fts5Buffer
18b30 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62 75 66  Zero(&pPage->buf
18b40 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a  );.  fts5BufferZ
18b50 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67 69 64  ero(&pPage->pgid
18b60 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  x);.  fts5Buffer
18b70 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
18b80 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
18b90 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50 61 67  4, zero);.  pPag
18ba0 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20 3d 20  e->iPrevPgidx = 
18bb0 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  0;.  pPage->pgno
18bc0 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 61  ++;..  /* Increa
18bd0 73 65 20 74 68 65 20 6c 65 61 76 65 73 20 77 72  se the leaves wr
18be0 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20 2a 2f  itten counter */
18bf0 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c 65 61  .  pWriter->nLea
18c00 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20 20 2f  fWritten++;..  /
18c10 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66 20 68  * The new leaf h
18c20 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20 6f 72  olds no terms or
18c30 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70 57 72   rowids */.  pWr
18c40 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
18c50 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 70 57  InPage = 1;.  pW
18c60 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
18c70 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a 7d 0a  idInPage = 1;.}.
18c80 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74 65  ./*.** Append te
18c90 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d 20 74  rm pTerm/nTerm t
18ca0 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20 62 65  o the segment be
18cb0 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79 20 74  ing written by t
18cc0 68 65 20 77 72 69 74 65 72 20 70 61 73 73 65 64  he writer passed
18cd0 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f 6e  .** as the secon
18ce0 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  d argument..**.*
18cf0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
18d00 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
18d10 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
18d20 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
18d30 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
18d40 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
18d50 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
18d60 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18d70 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
18d80 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46 74 73  ppendTerm(.  Fts
18d90 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
18da0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
18db0 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54 65 72  iter,.  int nTer
18dc0 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  m, const u8 *pTe
18dd0 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 72  rm .){.  int nPr
18de0 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 20  efix;           
18df0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
18e00 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f 6d 70  s of prefix comp
18e10 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65 72 6d  ression for term
18e20 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
18e30 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
18e40 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
18e50 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50    Fts5Buffer *pP
18e60 67 69 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d  gidx = &pWriter-
18e70 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a  >writer.pgidx;..
18e80 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
18e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
18ea0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62  assert( pPage->b
18eb0 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61 73 73  uf.n>=4 );.  ass
18ec0 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
18ed0 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  n>4 || pWriter->
18ee0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
18ef0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
18f00 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61   current leaf pa
18f10 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c 75 73  ge is full, flus
18f20 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  h it to disk. */
18f30 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d 3e 62  .  if( (pPage->b
18f40 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  uf.n + pPgidx->n
18f50 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e 3d 70   + nTerm + 2)>=p
18f60 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
18f70 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
18f80 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20  ->buf.n>4 ){.   
18f90 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
18fa0 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72  hLeaf(p, pWriter
18fb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
18fc0 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
18fd0 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
18fe0 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54 41   nTerm+FTS5_DATA
18ff0 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 20  _PADDING);.  }. 
19000 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55 70   .  /* TODO1: Up
19010 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65 72  dating pgidx her
19020 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d 3e  e. */.  pPgidx->
19030 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
19040 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20 20  PutVarint(.     
19050 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67 69   &pPgidx->p[pPgi
19060 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e 62  dx->n], pPage->b
19070 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69 50  uf.n - pPage->iP
19080 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20 20  revPgidx.  );.  
19090 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
190a0 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  x = pPage->buf.n
190b0 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50 75  ;.#if 0.  fts5Pu
190c0 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70 5b  tU16(&pPgidx->p[
190d0 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67  pPgidx->n], pPag
190e0 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50 67  e->buf.n);.  pPg
190f0 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65 6e  idx->n += 2;.#en
19100 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69 74  dif..  if( pWrit
19110 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e  er->bFirstTermIn
19120 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72 65  Page ){.    nPre
19130 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  fix = 0;.    if(
19140 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20   pPage->pgno!=1 
19150 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73  ){.      /* This
19160 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74 65   is the first te
19170 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61  rm on a leaf tha
19180 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66  t is not the lef
19190 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20  tmost leaf in.  
191a0 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65      ** the segme
191b0 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68  nt b-tree. In th
191c0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 65  is case it is ne
191d0 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20 61  cessary to add a
191e0 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a   term to.      *
191f0 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69 65  * the b-tree hie
19200 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20 28  rarchy that is (
19210 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  a) larger than t
19220 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20  he largest term 
19230 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64  .      ** alread
19240 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  y written to the
19250 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29   segment and (b)
19260 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72   smaller than or
19270 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20   equal to.      
19280 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e  ** this term. In
19290 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20   other words, a 
192a0 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d  prefix of (pTerm
192b0 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73 20  /nTerm) that is 
192c0 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74  one.      ** byt
192d0 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68  e longer than th
192e0 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78  e longest prefix
192f0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73   (pTerm/nTerm) s
19300 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a 20  hares with the. 
19310 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73       ** previous
19320 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a   term. .      **
19330 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c  .      ** Usuall
19340 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  y, the previous 
19350 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c  term is availabl
19360 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d  e in pPage->term
19370 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a  . The exception.
19380 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74        ** is if t
19390 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
193a0 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e   term written in
193b0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
193c0 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20  merge step..    
193d0 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
193e0 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74  e the previous t
193f0 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c  erm is not avail
19400 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72  able, so just wr
19410 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ite a.      ** c
19420 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54  opy of (pTerm/nT
19430 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61  erm) into the pa
19440 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20  rent node. This 
19450 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20  is slightly.    
19460 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74    ** inefficient
19470 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72  , but still corr
19480 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69  ect.  */.      i
19490 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20  nt n = nTerm;.  
194a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74      if( pPage->t
194b0 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20  erm.n ){.       
194c0 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65   n = 1 + fts5Pre
194d0 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67  fixCompress(pPag
194e0 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65  e->term.n, pPage
194f0 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c  ->term.p, nTerm,
19500 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d   pTerm);.      }
19510 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
19520 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72  BtreeTerm(p, pWr
19530 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b  iter, n, pTerm);
19540 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 26  .      pPage = &
19550 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b  pWriter->writer;
19560 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
19570 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74      nPrefix = ft
19580 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
19590 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20  (pPage->term.n, 
195a0 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e  pPage->term.p, n
195b0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
195c0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
195d0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
195e0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50   &pPage->buf, nP
195f0 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f  refix);.  }..  /
19600 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d  * Append the num
19610 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
19620 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74  new data, then t
19630 68 65 20 74 65 72 6d 20 64 61 74 61 20 69 74 73  he term data its
19640 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  elf.  ** to the 
19650 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42  page. */.  fts5B
19660 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
19670 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
19680 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
19690 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42  Prefix);.  fts5B
196a0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
196b0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
196c0 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
196d0 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72  efix, &pTerm[nPr
196e0 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70  efix]);..  /* Up
196f0 64 61 74 65 20 74 68 65 20 46 74 73 35 50 61 67  date the Fts5Pag
19700 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65  eWriter.term fie
19710 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ld. */.  fts5Buf
19720 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26  ferSet(&p->rc, &
19730 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65  pPage->term, nTe
19740 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57  rm, pTerm);.  pW
19750 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72  riter->bFirstTer
19760 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20  mInPage = 0;..  
19770 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
19780 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
19790 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
197a0 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
197b0 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 1;..  assert( 
197c0 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65  p->rc || (pWrite
197d0 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70  r->nDlidx>0 && p
197e0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
197f0 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20  ].buf.n==0) );. 
19800 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
19810 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65  [0].pgno = pPage
19820 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
19830 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69 64 20   Append a rowid 
19840 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  and position-lis
19850 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74 6f 20  t size field to 
19860 74 68 65 20 77 72 69 74 65 72 73 20 6f 75 74 70  the writers outp
19870 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ut. .*/.static v
19880 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70  oid fts5WriteApp
19890 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74 73 35  endRowid(.  Fts5
198a0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
198b0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
198c0 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f 77 69  ter,.  i64 iRowi
198d0 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a 29 7b  d,.  int nPos.){
198e0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
198f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
19900 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
19910 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
19920 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66  >writer;..    if
19930 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
19940 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
19950 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
19960 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
19970 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
19980 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
19990 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
199a0 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65 20  is is to be the 
199b0 66 69 72 73 74 20 72 6f 77 69 64 20 77 72 69 74  first rowid writ
199c0 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ten to the page,
199d0 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a   set the .    **
199e0 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69   rowid-pointer i
199f0 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  n the page-heade
19a00 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61  r. Also append a
19a10 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c   value to the dl
19a20 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65  idx.    ** buffe
19a30 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63  r, in case a doc
19a40 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65  list-index is re
19a50 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20  quired.  */.    
19a60 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
19a70 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
19a80 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55  {.      fts5PutU
19a90 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  16(pPage->buf.p,
19aa0 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a   pPage->buf.n);.
19ab0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44        fts5WriteD
19ac0 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57  lidxAppend(p, pW
19ad0 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a  riter, iRowid);.
19ae0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72      }..    /* Wr
19af0 69 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a  ite the rowid. *
19b00 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65  /.    if( pWrite
19b10 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
19b20 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74  Doclist || pWrit
19b30 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
19b40 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66  nPage ){.      f
19b50 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
19b60 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
19b70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69  Page->buf, iRowi
19b80 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
19b90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e       assert( p->
19ba0 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57 72  rc || iRowid>pWr
19bb0 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69 64  iter->iPrevRowid
19bc0 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75   );.      fts5Bu
19bd0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19be0 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d  (&p->rc, &pPage-
19bf0 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20 70  >buf, iRowid - p
19c00 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
19c10 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  id);.    }.    p
19c20 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
19c30 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  id = iRowid;.   
19c40 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
19c50 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d  RowidInDoclist =
19c60 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d   0;.    pWriter-
19c70 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
19c80 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74 73  ge = 0;..    fts
19c90 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
19ca0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
19cb0 67 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a  ge->buf, nPos);.
19cc0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
19cd0 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
19ce0 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20  ndPoslistData(. 
19cf0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
19d00 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
19d10 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e  *pWriter, .  con
19d20 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20  st u8 *aData, . 
19d30 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20   int nData.){.  
19d40 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
19d50 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
19d60 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73  ->writer;.  cons
19d70 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b  t u8 *a = aData;
19d80 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61  .  int n = nData
19d90 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
19da0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e  ->pConfig->pgsz>
19db0 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
19dc0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
19dd0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e       && (pPage->
19de0 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70  buf.n + pPage->p
19df0 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e  gidx.n + n)>=p->
19e00 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20  pConfig->pgsz . 
19e10 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   ){.    int nReq
19e20 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
19e30 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66  gsz - pPage->buf
19e40 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64  .n - pPage->pgid
19e50 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  x.n;.    int nCo
19e60 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  py = 0;.    whil
19e70 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b  e( nCopy<nReq ){
19e80 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79  .      i64 dummy
19e90 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d  ;.      nCopy +=
19ea0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
19eb0 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
19ec0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
19ed0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
19ee0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
19ef0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
19f00 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
19f10 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
19f20 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
19f30 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
19f40 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
19f50 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
19f60 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
19f70 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
19f80 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29  Page->buf, n, a)
19f90 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
19fa0 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61  lush any data ca
19fb0 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74  ched by the writ
19fc0 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
19fd0 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20   database. Free 
19fe0 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  any.** allocatio
19ff0 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
1a000 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a  th the writer..*
1a010 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1a020 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20  s5WriteFinish(. 
1a030 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1a040 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1a050 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
1a060 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1a070 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ct */.  int *pnL
1a080 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1a090 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1a0a0 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
1a0b0 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a  ages in b-tree *
1a0c0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1a0d0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1a0e0 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72  pLeaf = &pWriter
1a0f0 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20  ->writer;.  if( 
1a100 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1a110 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a120 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29  pLeaf->pgno>=1 )
1a130 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  ;.    if( pLeaf-
1a140 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20  >buf.n>4 ){.    
1a150 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1a160 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1a170 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c  ;.    }.    *pnL
1a180 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e  eaf = pLeaf->pgn
1a190 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 57 72 69  o-1;.    fts5Wri
1a1a0 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20  teFlushBtree(p, 
1a1b0 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pWriter);.  }.  
1a1c0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1a1d0 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20  pLeaf->term);.  
1a1e0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1a1f0 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66  pLeaf->buf);.  f
1a200 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1a210 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20 20  Leaf->pgidx);.  
1a220 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1a230 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29  pWriter->btterm)
1a240 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
1a250 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b  pWriter->nDlidx;
1a260 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
1a270 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
1a280 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  (&pWriter->aDlid
1a290 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20  x[i].buf);.  }. 
1a2a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57   sqlite3_free(pW
1a2b0 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a  riter->aDlidx);.
1a2c0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1a2d0 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20  ts5WriteInit(.  
1a2e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
1a2f0 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1a300 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20  pWriter, .  int 
1a310 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e 73  iSegid.){.  cons
1a320 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d 20  t int nBuffer = 
1a330 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
1a340 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
1a350 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  DING;..  memset(
1a360 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65  pWriter, 0, size
1a370 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72  of(Fts5SegWriter
1a380 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69  ));.  pWriter->i
1a390 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
1a3a0 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  .  fts5WriteDlid
1a3b0 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65 72  xGrow(p, pWriter
1a3c0 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  , 1);.  pWriter-
1a3d0 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 31  >writer.pgno = 1
1a3e0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1a3f0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1a400 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69 42  1;.  pWriter->iB
1a410 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61 73  tPage = 1;..  as
1a420 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 77  sert( pWriter->w
1a430 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20 29  riter.buf.n==0 )
1a440 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72 69  ;.  assert( pWri
1a450 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1a460 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  x.n==0 );..  /* 
1a470 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75 66  Grow the two buf
1a480 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20 70  fers to pgsz + p
1a490 61 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e 20  adding bytes in 
1a4a0 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74  size. */.  sqlit
1a4b0 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a 65  e3Fts5BufferSize
1a4c0 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65  (&p->rc, &pWrite
1a4d0 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 2c  r->writer.pgidx,
1a4e0 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71 6c   nBuffer);.  sql
1a4f0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
1a500 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69  ze(&p->rc, &pWri
1a510 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2c  ter->writer.buf,
1a520 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69 66   nBuffer);..  if
1a530 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72 3d  ( p->pIdxWriter=
1a540 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f  =0 ){.    Fts5Co
1a550 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
1a560 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
1a570 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
1a580 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78  Stmt(p, &p->pIdx
1a590 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33 5f  Writer, sqlite3_
1a5a0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
1a5b0 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
1a5c0 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73 65  '%q'.'%q_idx'(se
1a5d0 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20 56  gid,term,pgno) V
1a5e0 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20 0a  ALUES(?,?,?)", .
1a5f0 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
1a600 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
1a610 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20  >zName.    ));. 
1a620 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   }..  if( p->rc=
1a630 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a640 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
1a650 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66 2d  the 4-byte leaf-
1a660 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20 30  page header to 0
1a670 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73  x00. */.    mems
1a680 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69 74  et(pWriter->writ
1a690 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29 3b  er.buf.p, 0, 4);
1a6a0 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77 72  .    pWriter->wr
1a6b0 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b 0a  iter.buf.n = 4;.
1a6c0 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68 65  .    /* Bind the
1a6d0 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20   current output 
1a6e0 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74 68  segment id to th
1a6f0 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e 20  e index-writer. 
1a700 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20 2a  This is an.    *
1a710 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6f  * optimization o
1a720 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65 20  ver binding the 
1a730 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72 20  same value over 
1a740 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77 73  and over as rows
1a750 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73 65   are.    ** inse
1a760 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78 20  rted into %_idx 
1a770 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 77  by the current w
1a780 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20 73  riter.  */.    s
1a790 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1a7a0 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31  p->pIdxWriter, 1
1a7b0 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  , pWriter->iSegi
1a7c0 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  d);.  }.}../*.**
1a7d0 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
1a7e0 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65 72  was used to iter
1a7f0 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
1a800 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 6f  input segments o
1a810 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72 65  f on an.** incre
1a820 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
1a830 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75 6e  ration. This fun
1a840 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
1a850 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e 74  if the increment
1a860 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65 70  al.** merge step
1a870 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62 75   has finished bu
1a880 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73 20  t the input has 
1a890 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74  not been complet
1a8a0 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a 2a  ely exhausted..*
1a8b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1a8c0 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 46  s5TrimSegments(F
1a8d0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
1a8e0 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
1a8f0 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 46  r){.  int i;.  F
1a900 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
1a910 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
1a920 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1a930 65 72 29 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  er));.  for(i=0;
1a940 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
1a950 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65  i++){.    Fts5Se
1a960 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1a970 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
1a980 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65     if( pSeg->pSe
1a990 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  g==0 ){.      /*
1a9a0 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
1a9b0 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c  lse if( pSeg->pL
1a9c0 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
1a9d0 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d  /* All keys from
1a9e0 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d   this input segm
1a9f0 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72  ent have been tr
1aa00 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20  ansfered to the 
1aa10 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a  output..      **
1aa20 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69   Set both the fi
1aa30 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67  rst and last pag
1aa40 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74  e-numbers to 0 t
1aa50 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1aa60 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  the.      ** seg
1aa70 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74  ment is now empt
1aa80 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67  y. */.      pSeg
1aa90 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
1aaa0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67   = 0;.      pSeg
1aab0 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1aac0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
1aad0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
1aae0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1aaf0 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a  afOffset;     /*
1ab00 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66   Offset on new f
1ab10 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a  irst leaf page *
1ab20 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61  /.      i64 iLea
1ab30 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74  fRowid;.      Ft
1ab40 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
1ab50 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70       int iId = p
1ab60 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
1ab70 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72  d;.      u8 aHdr
1ab80 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30  [4] = {0x00, 0x0
1ab90 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
1aba0 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69  .      iLeafRowi
1abb0 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
1abc0 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67  _ROWID(iId, pSeg
1abd0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
1abe0 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
1abf0 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
1ac00 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1ac10 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1ac20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1ac30 65 72 5a 65 72 6f 28 26 62 75 66 29 3b 0a 20 20  erZero(&buf);.  
1ac40 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1ac50 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75  Grow(&p->rc, &bu
1ac60 66 2c 20 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20  f, pData->nn);. 
1ac70 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1ac80 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1ac90 72 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66  rc, &buf, sizeof
1aca0 28 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20  (aHdr), aHdr);. 
1acb0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1acc0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1acd0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67  ->rc, &buf, pSeg
1ace0 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20 20  ->term.n);.     
1acf0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ad00 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1ad10 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d  &buf, pSeg->term
1ad20 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70  .n, pSeg->term.p
1ad30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1ad40 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1ad50 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44  &p->rc, &buf, pD
1ad60 61 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66  ata->szLeaf-iOff
1ad70 2c 20 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66  , &pData->p[iOff
1ad80 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
1ad90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ada0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
1adb0 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20   Set the szLeaf 
1adc0 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20 20 20  field */.       
1add0 20 20 20 66 74 73 35 50 75 74 55 31 36 28 26 62     fts5PutU16(&b
1ade0 75 66 2e 70 5b 32 5d 2c 20 62 75 66 2e 6e 29 3b  uf.p[2], buf.n);
1adf0 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ae00 20 20 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68      /* Set up th
1ae10 65 20 6e 65 77 20 70 61 67 65 2d 69 6e 64 65 78  e new page-index
1ae20 20 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 20 20   array */.      
1ae30 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ae40 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1ae50 20 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20   &buf, 4);.     
1ae60 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65     if( pSeg->iLe
1ae70 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69 54  afPgno==pSeg->iT
1ae80 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20  ermLeafPgno .   
1ae90 20 20 20 20 20 20 26 26 20 70 53 65 67 2d 3e 69        && pSeg->i
1aea0 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 44 61  EndofDoclist<pDa
1aeb0 74 61 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20  ta->szLeaf .    
1aec0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
1aed0 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61   int nDiff = pDa
1aee0 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65  ta->szLeaf - pSe
1aef0 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  g->iEndofDoclist
1af00 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
1af10 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1af20 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
1af30 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44 69   buf.n - 1 - nDi
1af40 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 20  ff - 4);.       
1af50 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1af60 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1af70 26 62 75 66 2c 20 0a 20 20 20 20 20 20 20 20 20  &buf, .         
1af80 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 2d       pData->nn -
1af90 20 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66   pSeg->iPgidxOff
1afa0 2c 20 26 70 44 61 74 61 2d 3e 70 5b 70 53 65 67  , &pData->p[pSeg
1afb0 2d 3e 69 50 67 69 64 78 4f 66 66 5d 0a 20 20 20  ->iPgidxOff].   
1afc0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1afd0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 66 74 73    }..        fts
1afe0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
1aff0 74 61 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  ta);.        pSe
1b000 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72  g->pSeg->pgnoFir
1b010 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d  st = pSeg->iTerm
1b020 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20 20 20  LeafPgno;.      
1b030 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
1b040 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  (p, FTS5_SEGMENT
1b050 5f 52 4f 57 49 44 28 69 49 64 2c 20 31 29 2c 20  _ROWID(iId, 1), 
1b060 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1b070 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
1b080 74 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64  te(p, iLeafRowid
1b090 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
1b0a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1b0b0 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
1b0c0 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74  ree(&buf);.}..st
1b0d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
1b0e0 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b  rgeChunkCallback
1b0f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1b100 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  , .  void *pCtx,
1b110 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
1b120 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
1b130 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69  .){.  Fts5SegWri
1b140 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28  ter *pWriter = (
1b150 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29 70  Fts5SegWriter*)p
1b160 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65  Ctx;.  fts5Write
1b170 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74  AppendPoslistDat
1b180 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43  a(p, pWriter, pC
1b190 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d  hunk, nChunk);.}
1b1a0 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
1b1b0 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1b1c0 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74  MergeLevel(.  Ft
1b1d0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1b1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b1f0 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1b200 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1b210 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
1b220 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
1b230 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66  OUT: Stucture of
1b240 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
1b250 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
1b260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1b270 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
1b280 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ut from */.  int
1b290 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20   *pnRem         
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b2b0 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73  Write up to this
1b2c0 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61   many output lea
1b2d0 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ves */.){.  Fts5
1b2e0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
1b2f0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1b300 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
1b310 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
1b320 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1b330 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63  vl];.  Fts5Struc
1b340 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f  tureLevel *pLvlO
1b350 75 74 3b 0a 20 20 46 74 73 35 49 6e 64 65 78 49  ut;.  Fts5IndexI
1b360 74 65 72 20 2a 70 49 74 65 72 20 3d 20 30 3b 20  ter *pIter = 0; 
1b370 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
1b380 72 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74 20  r to read input 
1b390 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  data */.  int nR
1b3a0 65 6d 20 3d 20 70 6e 52 65 6d 20 3f 20 2a 70 6e  em = pnRem ? *pn
1b3b0 52 65 6d 20 3a 20 30 3b 20 20 2f 2a 20 4f 75 74  Rem : 0;  /* Out
1b3c0 70 75 74 20 6c 65 61 66 20 70 61 67 65 73 20 6c  put leaf pages l
1b3d0 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
1b3e0 20 20 69 6e 74 20 6e 49 6e 70 75 74 3b 20 20 20    int nInput;   
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
1b410 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f  nput segments */
1b420 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1b430 20 77 72 69 74 65 72 3b 20 20 20 20 20 20 20 20   writer;        
1b440 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a     /* Writer obj
1b450 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
1b460 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1b470 53 65 67 3b 20 20 20 20 20 2f 2a 20 4f 75 74 70  Seg;     /* Outp
1b480 75 74 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ut segment */.  
1b490 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
1b4a0 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b 20  .  int bOldest; 
1b4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b4c0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
1b4d0 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1b4e0 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20 2a   is the oldest *
1b4f0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  /..  assert( iLv
1b500 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1b510 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  l );.  assert( p
1b520 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c 76  Lvl->nMerge<=pLv
1b530 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d 65  l->nSeg );..  me
1b540 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
1b550 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 57   sizeof(Fts5SegW
1b560 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73 65  riter));.  memse
1b570 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65  t(&term, 0, size
1b580 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
1b590 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65  .  if( pLvl->nMe
1b5a0 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c 4f  rge ){.    pLvlO
1b5b0 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
1b5c0 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 20  Level[iLvl+1];. 
1b5d0 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c 4f     assert( pLvlO
1b5e0 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20 20  ut->nSeg>0 );.  
1b5f0 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d    nInput = pLvl-
1b600 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53 65  >nMerge;.    pSe
1b610 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61 53  g = &pLvlOut->aS
1b620 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67  eg[pLvlOut->nSeg
1b630 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  -1];..    fts5Wr
1b640 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
1b650 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  er, pSeg->iSegid
1b660 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77 72  );.    writer.wr
1b670 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65 67  iter.pgno = pSeg
1b680 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20 20  ->pgnoLast+1;.  
1b690 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67 65    writer.iBtPage
1b6a0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
1b6b0 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20     int iSegid = 
1b6c0 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67 69  fts5AllocateSegi
1b6d0 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a  d(p, pStruct);..
1b6e0 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74 68      /* Extend th
1b6f0 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  e Fts5Structure 
1b700 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69 72  object as requir
1b710 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65  ed to ensure the
1b720 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20 73   output.    ** s
1b730 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20 2a  egment exists. *
1b740 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d 3d  /.    if( iLvl==
1b750 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d  pStruct->nLevel-
1b760 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  1 ){.      fts5S
1b770 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
1b780 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75 63  (&p->rc, ppStruc
1b790 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63  t);.      pStruc
1b7a0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1b7b0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
1b7c0 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65  uctureExtendLeve
1b7d0 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63  l(&p->rc, pStruc
1b7e0 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30 29  t, iLvl+1, 1, 0)
1b7f0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20  ;.    if( p->rc 
1b800 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c  ) return;.    pL
1b810 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  vl = &pStruct->a
1b820 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
1b830 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72   pLvlOut = &pStr
1b840 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
1b850 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57 72  +1];..    fts5Wr
1b860 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
1b870 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  er, iSegid);..  
1b880 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
1b890 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65 20   segment to the 
1b8a0 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a  output level */.
1b8b0 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c      pSeg = &pLvl
1b8c0 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75  Out->aSeg[pLvlOu
1b8d0 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70 4c  t->nSeg];.    pL
1b8e0 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a 20  vlOut->nSeg++;. 
1b8f0 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
1b900 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65 67  st = 1;.    pSeg
1b910 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69  ->iSegid = iSegi
1b920 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e  d;.    pStruct->
1b930 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20 20  nSegment++;..   
1b940 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20 66   /* Read input f
1b950 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73  rom all segments
1b960 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 65   in the input le
1b970 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70 75  vel */.    nInpu
1b980 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a  t = pLvl->nSeg;.
1b990 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d 20    }.  bOldest = 
1b9a0 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d 3d  (pLvlOut->nSeg==
1b9b0 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c  1 && pStruct->nL
1b9c0 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a 0a  evel==iLvl+2);..
1b9d0 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e 3d    assert( iLvl>=
1b9e0 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35 4d  0 );.  for(fts5M
1b9f0 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70  ultiIterNew(p, p
1ba00 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30 2c  Struct, 0, 0, 0,
1ba10 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74   0, iLvl, nInput
1ba20 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20  , &pIter);.     
1ba30 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
1ba40 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a  f(p, pIter)==0;.
1ba50 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1ba60 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
1ba70 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20  , 0, 0).  ){.   
1ba80 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1ba90 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72 2d  egIter = &pIter-
1baa0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
1bab0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1bac0 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20  ;.    int nPos; 
1bad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bae0 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d      /* position-
1baf0 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
1bb00 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74  value */.    int
1bb10 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73   nTerm;.    cons
1bb20 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20  t u8 *pTerm;..  
1bb30 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b    /* Check for k
1bb40 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e  ey annihilation.
1bb50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67   */.    if( pSeg
1bb60 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26  Iter->nPos==0 &&
1bb70 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65   (bOldest || pSe
1bb80 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20  gIter->bDel==0) 
1bb90 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20  ) continue;..   
1bba0 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c   pTerm = fts5Mul
1bbb0 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72  tiIterTerm(pIter
1bbc0 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69  , &nTerm);.    i
1bbd0 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e  f( nTerm!=term.n
1bbe0 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72 6d   || memcmp(pTerm
1bbf0 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 29  , term.p, nTerm)
1bc00 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 6e   ){.      if( pn
1bc10 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e 4c  Rem && writer.nL
1bc20 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d 20  eafWritten>nRem 
1bc30 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
1bc40 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1bc50 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65   /* This is a ne
1bc60 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61  w term. Append a
1bc70 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74   term to the out
1bc80 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  put segment. */.
1bc90 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
1bca0 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
1bcb0 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65  iter, nTerm, pTe
1bcc0 72 6d 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  rm);.      fts5B
1bcd0 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
1bce0 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70   &term, nTerm, p
1bcf0 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Term);.    }..  
1bd00 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1bd10 72 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74  rowid to the out
1bd20 70 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52  put */.    /* WR
1bd30 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
1bd40 2f 0a 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65  /.    nPos = pSe
1bd50 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20  gIter->nPos*2 + 
1bd60 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a  pSegIter->bDel;.
1bd70 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
1bd80 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72 69  endRowid(p, &wri
1bd90 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49 74  ter, fts5MultiIt
1bda0 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 2c 20  erRowid(pIter), 
1bdb0 6e 50 6f 73 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  nPos);..    /* A
1bdc0 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69 74 69  ppend the positi
1bdd0 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74 6f 20  on-list data to 
1bde0 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
1bdf0 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
1be00 74 65 28 70 2c 20 70 53 65 67 49 74 65 72 2c 20  te(p, pSegIter, 
1be10 28 76 6f 69 64 2a 29 26 77 72 69 74 65 72 2c 20  (void*)&writer, 
1be20 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61  fts5MergeChunkCa
1be30 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a 0a 20 20  llback);.  }..  
1be40 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 6c 61 73  /* Flush the las
1be50 74 20 6c 65 61 66 20 70 61 67 65 20 74 6f 20 64  t leaf page to d
1be60 69 73 6b 2e 20 53 65 74 20 74 68 65 20 6f 75 74  isk. Set the out
1be70 70 75 74 20 73 65 67 6d 65 6e 74 20 62 2d 74 72  put segment b-tr
1be80 65 65 20 68 65 69 67 68 74 0a 20 20 2a 2a 20 61  ee height.  ** a
1be90 6e 64 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  nd last leaf pag
1bea0 65 20 6e 75 6d 62 65 72 20 61 74 20 74 68 65 20  e number at the 
1beb0 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a 2f 0a 20  same time.  */. 
1bec0 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68   fts5WriteFinish
1bed0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70 53  (p, &writer, &pS
1bee0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a  eg->pgnoLast);..
1bef0 20 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49    if( fts5MultiI
1bf00 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1bf10 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a   ){.    int i;..
1bf20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68      /* Remove th
1bf30 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d  e redundant segm
1bf40 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20 25 5f  ents from the %_
1bf50 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20  data table */.  
1bf60 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e    for(i=0; i<nIn
1bf70 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  put; i++){.     
1bf80 20 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53   fts5DataRemoveS
1bf90 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76 6c 2d 3e  egment(p, pLvl->
1bfa0 61 53 65 67 5b 69 5d 2e 69 53 65 67 69 64 29 3b  aSeg[i].iSegid);
1bfb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1bfc0 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64  emove the redund
1bfd0 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f  ant segments fro
1bfe0 6d 20 74 68 65 20 69 6e 70 75 74 20 6c 65 76 65  m the input leve
1bff0 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c 76  l */.    if( pLv
1c000 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70 75 74 20  l->nSeg!=nInput 
1c010 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f  ){.      int nMo
1c020 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53 65 67  ve = (pLvl->nSeg
1c030 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20 73 69 7a   - nInput) * siz
1c040 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1c050 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 20  eSegment);.     
1c060 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c 2d 3e 61   memmove(pLvl->a
1c070 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67  Seg, &pLvl->aSeg
1c080 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f 76 65 29  [nInput], nMove)
1c090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 72  ;.    }.    pStr
1c0a0 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 2d 3d  uct->nSegment -=
1c0b0 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
1c0c0 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49 6e 70 75  l->nSeg -= nInpu
1c0d0 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65  t;.    pLvl->nMe
1c0e0 72 67 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rge = 0;.    if(
1c0f0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3d   pSeg->pgnoLast=
1c100 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4c 76 6c  =0 ){.      pLvl
1c110 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20  Out->nSeg--;.   
1c120 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67     pStruct->nSeg
1c130 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  ment--;.    }.  
1c140 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
1c150 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  t( pSeg->pgnoLas
1c160 74 3e 30 20 29 3b 0a 20 20 20 20 66 74 73 35 54  t>0 );.    fts5T
1c170 72 69 6d 53 65 67 6d 65 6e 74 73 28 70 2c 20 70  rimSegments(p, p
1c180 49 74 65 72 29 3b 0a 20 20 20 20 70 4c 76 6c 2d  Iter);.    pLvl-
1c190 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e 70 75 74  >nMerge = nInput
1c1a0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 4d 75 6c  ;.  }..  fts5Mul
1c1b0 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 49  tiIterFree(p, pI
1c1c0 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
1c1d0 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
1c1e0 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e   if( pnRem ) *pn
1c1f0 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c  Rem -= writer.nL
1c200 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  eafWritten;.}../
1c210 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50  *.** Do up to nP
1c220 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d  g pages of autom
1c230 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65  erge work on the
1c240 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
1c250 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
1c260 4d 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64  Merge(.  Fts5Ind
1c270 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
1c280 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
1c290 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
1c2a0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
1c2b0 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20  re **ppStruct,  
1c2c0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
1c2d0 43 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72  Current structur
1c2e0 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20  e of index */.  
1c2f0 69 6e 74 20 6e 50 67 20 20 20 20 20 20 20 20 20  int nPg         
1c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c310 2f 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b  /* Pages of work
1c320 20 74 6f 20 64 6f 20 2a 2f 0a 29 7b 0a 20 20 69   to do */.){.  i
1c330 6e 74 20 6e 52 65 6d 20 3d 20 6e 50 67 3b 0a 20  nt nRem = nPg;. 
1c340 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1c350 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1c360 75 63 74 3b 0a 20 20 77 68 69 6c 65 28 20 6e 52  uct;.  while( nR
1c370 65 6d 3e 30 20 26 26 20 70 2d 3e 72 63 3d 3d 53  em>0 && p->rc==S
1c380 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c390 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
1c3a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1c3b0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
1c3c0 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20 20 20  h levels */.    
1c3d0 69 6e 74 20 69 42 65 73 74 4c 76 6c 20 3d 20 30  int iBestLvl = 0
1c3e0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c  ;           /* L
1c3f0 65 76 65 6c 20 6f 66 66 65 72 69 6e 67 20 74 68  evel offering th
1c400 65 20 6d 6f 73 74 20 69 6e 70 75 74 20 73 65 67  e most input seg
1c410 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74  ments */.    int
1c420 20 6e 42 65 73 74 20 3d 20 30 3b 20 20 20 20 20   nBest = 0;     
1c430 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1c440 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d  er of input segm
1c450 65 6e 74 73 20 6f 6e 20 62 65 73 74 20 6c 65 76  ents on best lev
1c460 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65  el */..    /* Se
1c470 74 20 69 42 65 73 74 4c 76 6c 20 74 6f 20 74 68  t iBestLvl to th
1c480 65 20 6c 65 76 65 6c 20 74 6f 20 72 65 61 64 20  e level to read 
1c490 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20 66  input segments f
1c4a0 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  rom. */.    asse
1c4b0 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65  rt( pStruct->nLe
1c4c0 76 65 6c 3e 30 20 29 3b 0a 20 20 20 20 66 6f 72  vel>0 );.    for
1c4d0 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53  (iLvl=0; iLvl<pS
1c4e0 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69  truct->nLevel; i
1c4f0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Lvl++){.      Ft
1c500 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
1c510 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
1c520 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
1c530 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  .      if( pLvl-
1c540 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 20  >nMerge ){.     
1c550 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65     if( pLvl->nMe
1c560 72 67 65 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  rge>nBest ){.   
1c570 20 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20         iBestLvl 
1c580 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 20 20  = iLvl;.        
1c590 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e    nBest = pLvl->
1c5a0 6e 4d 65 72 67 65 3b 0a 20 20 20 20 20 20 20 20  nMerge;.        
1c5b0 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  }.        break;
1c5c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c5d0 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 3e 6e 42  f( pLvl->nSeg>nB
1c5e0 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  est ){.        n
1c5f0 42 65 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  Best = pLvl->nSe
1c600 67 3b 0a 20 20 20 20 20 20 20 20 69 42 65 73 74  g;.        iBest
1c610 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
1c620 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1c630 2a 20 49 66 20 6e 42 65 73 74 20 69 73 20 73 74  * If nBest is st
1c640 69 6c 6c 20 30 2c 20 74 68 65 6e 20 74 68 65 20  ill 0, then the 
1c650 69 6e 64 65 78 20 6d 75 73 74 20 62 65 20 65 6d  index must be em
1c660 70 74 79 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53  pty. */.#ifdef S
1c670 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
1c680 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 6e 42 65 73  for(iLvl=0; nBes
1c690 74 3d 3d 30 20 26 26 20 69 4c 76 6c 3c 70 53 74  t==0 && iLvl<pSt
1c6a0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
1c6b0 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73  vl++){.      ass
1c6c0 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 61 4c  ert( pStruct->aL
1c6d0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
1c6e0 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  =0 );.    }.#end
1c6f0 69 66 0a 0a 20 20 20 20 69 66 28 20 6e 42 65 73  if..    if( nBes
1c700 74 3c 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41  t<p->pConfig->nA
1c710 75 74 6f 6d 65 72 67 65 20 0a 20 20 20 20 20 20  utomerge .      
1c720 20 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c    && pStruct->aL
1c730 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e  evel[iBestLvl].n
1c740 4d 65 72 67 65 3d 3d 30 20 0a 20 20 20 20 20 20  Merge==0 .      
1c750 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
1c760 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49 6e      }.    fts5In
1c770 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
1c780 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74   &pStruct, iBest
1c790 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
1c7a0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1c7b0 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
1c7c0 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
1c7d0 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  l].nMerge==0 ){.
1c7e0 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
1c7f0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
1c800 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
1c810 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
1c820 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
1c830 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  uct;.}../*.** A 
1c840 74 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c  total of nLeaf l
1c850 65 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74  eaf pages of dat
1c860 61 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  a has just been 
1c870 66 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76  flushed to a lev
1c880 65 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e  el-0.** segment.
1c890 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   This function u
1c8a0 70 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65  pdates the write
1c8b0 2d 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69  -counter accordi
1c8c0 6e 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20  ngly and, if.** 
1c8d0 6e 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f  necessary, perfo
1c8e0 72 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  rms incremental 
1c8f0 6d 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a  merge work..**.*
1c900 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
1c910 63 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74  curs, set the Ft
1c920 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72  s5Index.rc error
1c930 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72   code. If an err
1c940 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61  or has .** alrea
1c950 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69  dy occurred, thi
1c960 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1c970 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1c980 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41   void fts5IndexA
1c990 75 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35  utomerge(.  Fts5
1c9a0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1c9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c9c0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1c9d0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
1c9e0 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74  cture **ppStruct
1c9f0 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55  ,       /* IN/OU
1ca00 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63  T: Current struc
1ca10 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f  ture of index */
1ca20 0a 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20  .  int nLeaf    
1ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca40 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ca50 6f 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75  output leaves ju
1ca60 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b  st written */.){
1ca70 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1ca80 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43  LITE_OK && p->pC
1ca90 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
1caa0 65 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53  e>0 ){.    Fts5S
1cab0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1cac0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1cad0 20 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20     u64 nWrite;  
1cae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caf0 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
1cb00 65 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74  e of write-count
1cb10 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57  er */.    int nW
1cb20 6f 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ork;            
1cb30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1cb40 72 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61  r of work-quanta
1cb50 20 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20   to perform */. 
1cb60 20 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20     int nRem;    
1cb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb80 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
1cb90 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f  af pages left to
1cba0 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f   write */..    /
1cbb0 2a 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69  * Update the wri
1cbc0 74 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c  te-counter. Whil
1cbd0 65 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20  e doing so, set 
1cbe0 6e 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57  nWork. */.    nW
1cbf0 72 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e  rite = pStruct->
1cc00 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20  nWriteCounter;. 
1cc10 20 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29     nWork = (int)
1cc20 28 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61  (((nWrite + nLea
1cc30 66 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  f) / p->nWorkUni
1cc40 74 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70  t) - (nWrite / p
1cc50 2d 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20  ->nWorkUnit));. 
1cc60 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69     pStruct->nWri
1cc70 74 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65  teCounter += nLe
1cc80 61 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28  af;.    nRem = (
1cc90 69 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69  int)(p->nWorkUni
1cca0 74 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72  t * nWork * pStr
1ccb0 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20  uct->nLevel);.. 
1ccc0 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67     fts5IndexMerg
1ccd0 65 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e  e(p, ppStruct, n
1cce0 52 65 6d 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  Rem);.  }.}..sta
1ccf0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1cd00 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20  exCrisismerge(. 
1cd10 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1cd40 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1cd50 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1cd60 74 72 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20  truct        /* 
1cd70 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1cd80 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1cd90 65 78 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ex */.){.  const
1cda0 20 69 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70   int nCrisis = p
1cdb0 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73  ->pConfig->nCris
1cdc0 69 73 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53  isMerge;.  Fts5S
1cdd0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1cde0 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20  t = *ppStruct;. 
1cdf0 20 69 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a   int iLvl = 0;..
1ce00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21    assert( p->rc!
1ce10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
1ce20 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20  truct->nLevel>0 
1ce30 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  );.  while( p->r
1ce40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ce50 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1ce60 69 4c 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69  iLvl].nSeg>=nCri
1ce70 73 69 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49  sis ){.    fts5I
1ce80 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70  ndexMergeLevel(p
1ce90 2c 20 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c  , &pStruct, iLvl
1cea0 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
1ceb0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
1cec0 4f 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e  OK || pStruct->n
1ced0 4c 65 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29  Level>(iLvl+1) )
1cee0 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
1cef0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c  urePromote(p, iL
1cf00 76 6c 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a  vl+1, pStruct);.
1cf10 20 20 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a      iLvl++;.  }.
1cf20 20 20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53    *ppStruct = pS
1cf30 74 72 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63  truct;.}..static
1cf40 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65   int fts5IndexRe
1cf50 74 75 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a  turn(Fts5Index *
1cf60 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  p){.  int rc = p
1cf70 2d 3e 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  ->rc;.  p->rc = 
1cf80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74  SQLITE_OK;.  ret
1cf90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64  urn rc;.}..typed
1cfa0 65 66 20 73 74 72 75 63 74 20 46 74 73 35 46 6c  ef struct Fts5Fl
1cfb0 75 73 68 43 74 78 20 46 74 73 35 46 6c 75 73 68  ushCtx Fts5Flush
1cfc0 43 74 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35  Ctx;.struct Fts5
1cfd0 46 6c 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73  FlushCtx {.  Fts
1cfe0 35 49 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20  5Index *pIdx;.  
1cff0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1d000 69 74 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  iter; .};../*.**
1d010 20 42 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63   Buffer aBuf[] c
1d020 6f 6e 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f  ontains a list o
1d030 66 20 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73  f varints, all s
1d040 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66  mall enough to f
1d050 69 74 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69  it.** in a 32-bi
1d060 74 20 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72  t integer. Retur
1d070 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  n the size of th
1d080 65 20 6c 61 72 67 65 73 74 20 70 72 65 66 69 78  e largest prefix
1d090 20 6f 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73   of this .** lis
1d0a0 74 20 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20  t nMax bytes or 
1d0b0 6c 65 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  less in size..*/
1d0c0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1d0d0 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f  PoslistPrefix(co
1d0e0 6e 73 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e  nst u8 *aBuf, in
1d0f0 74 20 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72  t nMax){.  int r
1d100 65 74 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b  et;.  u32 dummy;
1d110 0a 20 20 72 65 74 20 3d 20 66 74 73 35 47 65 74  .  ret = fts5Get
1d120 56 61 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64  Varint32(aBuf, d
1d130 75 6d 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74  ummy);.  if( ret
1d140 3c 6e 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69  <nMax ){.    whi
1d150 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69  le( 1 ){.      i
1d160 6e 74 20 69 20 3d 20 66 74 73 35 47 65 74 56 61  nt i = fts5GetVa
1d170 72 69 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74  rint32(&aBuf[ret
1d180 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20  ], dummy);.     
1d190 20 69 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e   if( (ret + i) >
1d1a0 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20   nMax ) break;. 
1d1b0 20 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20       ret += i;. 
1d1c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d1d0 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
1d1e0 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e  Flush the conten
1d1f0 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  ts of in-memory 
1d200 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73 68  hash table iHash
1d210 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d   to a new level-
1d220 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e  0 .** segment on
1d230 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61   disk. Also upda
1d240 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  te the correspon
1d250 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 72  ding structure r
1d260 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1d270 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1d280 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64   set the Fts5Ind
1d290 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65  ex.rc error code
1d2a0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
1d2b0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63  s .** already oc
1d2c0 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e  curred, this fun
1d2d0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1d2e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1d2f0 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73   fts5FlushOneHas
1d300 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  h(Fts5Index *p){
1d310 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48 61  .  Fts5Hash *pHa
1d320 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20  sh = p->pHash;. 
1d330 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1d340 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69  pStruct;.  int i
1d350 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e  Segid;.  int pgn
1d360 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20  oLast = 0;      
1d370 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
1d380 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
1d390 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
1d3a0 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
1d3b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
1d3c0 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72  e index structur
1d3d0 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  e and allocate a
1d3e0 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a   new segment-id.
1d3f0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77    ** for the new
1d400 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74   level-0 segment
1d410 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  .  */.  pStruct 
1d420 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
1d430 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69 64  ead(p);.  iSegid
1d440 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
1d450 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
1d460 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 20  ;..  if( iSegid 
1d470 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  ){.    const int
1d480 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66   pgsz = p->pConf
1d490 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20 20 20 20 46  ig->pgsz;..    F
1d4a0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1d4b0 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
1d4c0 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74 68  New segment with
1d4d0 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20 20  in pStruct */.  
1d4e0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1d4f0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  uf;             
1d500 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69  /* Buffer in whi
1d510 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c  ch to assemble l
1d520 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
1d530 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 67 69  Fts5Buffer *pPgi
1d540 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  dx;           /*
1d550 20 42 75 66 66 65 72 20 69 6e 20 77 68 69 63 68   Buffer in which
1d560 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70 67 69   to assemble pgi
1d570 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73 35 53  dx */..    Fts5S
1d580 65 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b  egWriter writer;
1d590 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e  .    fts5WriteIn
1d5a0 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69  it(p, &writer, i
1d5b0 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70 42 75  Segid);..    pBu
1d5c0 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74  f = &writer.writ
1d5d0 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50 67 69  er.buf;.    pPgi
1d5e0 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  dx = &writer.wri
1d5f0 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20 20 20  ter.pgidx;..    
1d600 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  /* fts5WriteInit
1d610 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65 20 69  () should have i
1d620 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65 20 62  nitialized the b
1d630 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73 74 20  uffers to (most 
1d640 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a 20 74  likely).    ** t
1d650 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61 63 65  he maximum space
1d660 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
1d670 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20    assert( p->rc 
1d680 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3e  || pBuf->nSpace>
1d690 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41  =(pgsz + FTS5_DA
1d6a0 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 20  TA_PADDING) );. 
1d6b0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
1d6c0 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53 70 61   || pPgidx->nSpa
1d6d0 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35  ce>=(pgsz + FTS5
1d6e0 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29  _DATA_PADDING) )
1d6f0 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69 6e 20  ;..    /* Begin 
1d700 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68  scanning through
1d710 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e 74 72   hash table entr
1d720 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72  ies. This loop r
1d730 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  uns once for eac
1d740 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f  h.    ** term/do
1d750 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20  clist currently 
1d760 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20 74 68  stored within th
1d770 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f  e hash table. */
1d780 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  .    if( p->rc==
1d790 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d7a0 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
1d7b0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
1d7c0 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30 29 3b  it(pHash, 0, 0);
1d7d0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1d7e0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1d7f0 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33  OK && 0==sqlite3
1d800 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f 66 28  Fts5HashScanEof(
1d810 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20 20 20  pHash) ){.      
1d820 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72  const char *zTer
1d830 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  m;          /* B
1d840 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1d850 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20 20 63   term */.      c
1d860 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c 69 73  onst u8 *pDoclis
1d870 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  t;         /* Po
1d880 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69 73 74  inter to doclist
1d890 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 2a   for this term *
1d8a0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44 6f 63  /.      int nDoc
1d8b0 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  list;           
1d8c0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 64      /* Size of d
1d8d0 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65 73 20  oclist in bytes 
1d8e0 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  */..      /* Wri
1d8f0 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f 72 20  te the term for 
1d900 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20 64 69  this entry to di
1d910 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  sk. */.      sql
1d920 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1d930 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26 7a 54  Entry(pHash, &zT
1d940 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74 2c 20  erm, &pDoclist, 
1d950 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20  &nDoclist);.    
1d960 20 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e    fts5WriteAppen
1d970 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74 65 72  dTerm(p, &writer
1d980 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54  , (int)strlen(zT
1d990 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75 38 2a  erm), (const u8*
1d9a0 29 7a 54 65 72 6d 29 3b 0a 0a 20 20 20 20 20 20  )zTerm);..      
1d9b0 61 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62  assert( writer.b
1d9c0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1d9d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==0 );.      if(
1d9e0 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20   pgsz>=(pBuf->n 
1d9f0 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44  + pPgidx->n + nD
1da00 6f 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20  oclist + 1) ){. 
1da10 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e         /* The en
1da20 74 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c  tire doclist wil
1da30 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72  l fit on the cur
1da40 72 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20  rent leaf. */.  
1da50 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1da60 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70  SafeAppendBlob(p
1da70 42 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e  Buf, pDoclist, n
1da80 44 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20  Doclist);.      
1da90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1daa0 36 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20  64 iRowid = 0;. 
1dab0 20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74         i64 iDelt
1dac0 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  a = 0;.        i
1dad0 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  nt iOff = 0;..  
1dae0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
1daf0 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
1db00 20 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73   not fit on this
1db10 20 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f   leaf. The follo
1db20 77 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a  wing .        **
1db30 20 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74   loop iterates t
1db40 68 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69  hrough the posli
1db50 73 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  sts that make up
1db60 20 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20   the current .  
1db70 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
1db80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68  .  */.        wh
1db90 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1dba0 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44  TE_OK && iOff<nD
1dbb0 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  oclist ){.      
1dbc0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20      int nPos;.  
1dbd0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70          int nCop
1dbe0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  y;.          int
1dbf0 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20   bDummy;.       
1dc00 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
1dc10 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69  etVarint(&pDocli
1dc20 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  st[iOff], (u64*)
1dc30 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
1dc40 20 20 20 20 6e 43 6f 70 79 20 3d 20 66 74 73 35      nCopy = fts5
1dc50 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26  GetPoslistSize(&
1dc60 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20  pDoclist[iOff], 
1dc70 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b  &nPos, &bDummy);
1dc80 0a 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79  .          nCopy
1dc90 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20   += nPos;.      
1dca0 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44      iRowid += iD
1dcb0 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  elta;.          
1dcc0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77  .          if( w
1dcd0 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
1dce0 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
1dcf0 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
1dd00 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 70  6(&pBuf->p[0], p
1dd10 42 75 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69  Buf->n);   /* fi
1dd20 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67  rst rowid on pag
1dd30 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1dd40 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
1dd50 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
1dd60 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1dd70 6e 5d 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  n], iRowid);.   
1dd80 20 20 20 20 20 20 20 20 20 77 72 69 74 65 72 2e           writer.
1dd90 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67  bFirstRowidInPag
1dda0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
1ddb0 20 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64     fts5WriteDlid
1ddc0 78 41 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74  xAppend(p, &writ
1ddd0 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  er, iRowid);.   
1dde0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ddf0 20 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e            pBuf->
1de00 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  n += sqlite3Fts5
1de10 50 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d  PutVarint(&pBuf-
1de20 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65  >p[pBuf->n], iDe
1de30 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lta);.          
1de40 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  }.          asse
1de50 72 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75  rt( pBuf->n<=pBu
1de60 66 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20  f->nSpace );..  
1de70 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42 75          if( (pBu
1de80 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
1de90 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70 67 73   + nCopy) <= pgs
1dea0 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  z ){.           
1deb0 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70   /* The entire p
1dec0 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69 74 20  oslist will fit 
1ded0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  on the current l
1dee0 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20 20 20  eaf. So copy.   
1def0 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69           ** it i
1df00 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20 20 20  n one go. */.   
1df10 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
1df20 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1df30 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c 69 73  b(pBuf, &pDoclis
1df40 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79 29 3b  t[iOff], nCopy);
1df50 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1df60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
1df70 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
1df80 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
1df90 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53   on this leaf. S
1dfa0 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20  o it needs.     
1dfb0 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20         ** to be 
1dfc0 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74  broken into sect
1dfd0 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71  ions. The only q
1dfe0 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69  ualification bei
1dff0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ng.            *
1e000 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72 69  * that each vari
1e010 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72 65  nt must be store
1e020 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e 20  d contiguously. 
1e030 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
1e040 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 6c 69  const u8 *pPosli
1e050 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74 5b 69  st = &pDoclist[i
1e060 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Off];.          
1e070 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30 3b 0a    int iPos = 0;.
1e080 20 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c              whil
1e090 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1e0a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1e0b0 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63 65 20       int nSpace 
1e0c0 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d 3e 6e  = pgsz - pBuf->n
1e0d0 20 2d 20 70 50 67 69 64 78 2d 3e 6e 3b 0a 20 20   - pPgidx->n;.  
1e0e0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1e0f0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  n = 0;.         
1e100 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20       if( (nCopy 
1e110 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20  - iPos)<=nSpace 
1e120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e130 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69     n = nCopy - i
1e140 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pos;.           
1e150 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e160 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 66 74            n = ft
1e170 73 35 50 6f 73 6c 69 73 74 50 72 65 66 69 78 28  s5PoslistPrefix(
1e180 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
1e190 20 6e 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20   nSpace);.      
1e1a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e1b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e1c0 6e 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  n>0 );.         
1e1d0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1e1e0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
1e1f0 75 66 2c 20 26 70 50 6f 73 6c 69 73 74 5b 69 50  uf, &pPoslist[iP
1e200 6f 73 5d 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20  os], n);.       
1e210 20 20 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e         iPos += n
1e220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1e230 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70  if( (pBuf->n + p
1e240 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20  Pgidx->n)>=pgsz 
1e250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1e260 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73     fts5WriteFlus
1e270 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72  hLeaf(p, &writer
1e280 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1e290 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
1e2a0 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43 6f 70 79   if( iPos>=nCopy
1e2b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1e2c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e2d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 4f    }.          iO
1e2e0 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  ff += nCopy;.   
1e2f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1e300 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 32 3a 20        /* TODO2: 
1e310 44 6f 63 6c 69 73 74 20 74 65 72 6d 69 6e 61 74  Doclist terminat
1e320 6f 72 20 77 72 69 74 74 65 6e 20 68 65 72 65 2e  or written here.
1e330 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 70 42 75   */.      /* pBu
1e340 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20  f->p[pBuf->n++] 
1e350 3d 20 27 5c 30 27 3b 20 2a 2f 0a 20 20 20 20 20  = '\0'; */.     
1e360 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
1e370 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
1e380 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1e390 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28  ts5HashScanNext(
1e3a0 70 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20  pHash);.    }.  
1e3b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1e3c0 68 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20  hClear(pHash);. 
1e3d0 20 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69     fts5WriteFini
1e3e0 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26  sh(p, &writer, &
1e3f0 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20  pgnoLast);..    
1e400 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74  /* Update the Ft
1e410 73 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20  s5Structure. It 
1e420 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
1e430 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1e440 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74  by the.    ** ft
1e450 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1e460 73 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e  se() call below.
1e470 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74    */.    if( pSt
1e480 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20  ruct->nLevel==0 
1e490 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72  ){.      fts5Str
1e4a0 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26  uctureAddLevel(&
1e4b0 70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29  p->rc, &pStruct)
1e4c0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
1e4d0 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
1e4e0 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
1e4f0 72 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a  ruct, 0, 1, 0);.
1e500 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
1e510 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1e520 20 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63    pSeg = &pStruc
1e530 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65  t->aLevel[0].aSe
1e540 67 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  g[ pStruct->aLev
1e550 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a  el[0].nSeg++ ];.
1e560 20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67        pSeg->iSeg
1e570 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
1e580 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72     pSeg->pgnoFir
1e590 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53  st = 1;.      pS
1e5a0 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70  eg->pgnoLast = p
1e5b0 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70  gnoLast;.      p
1e5c0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
1e5d0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ++;.    }.    ft
1e5e0 73 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f  s5StructurePromo
1e5f0 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74  te(p, 0, pStruct
1e600 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e  );.  }..  fts5In
1e610 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20  dexAutomerge(p, 
1e620 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61  &pStruct, pgnoLa
1e630 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78  st);.  fts5Index
1e640 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26  Crisismerge(p, &
1e650 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35  pStruct);.  fts5
1e660 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
1e670 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74  , pStruct);.  ft
1e680 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
1e690 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a  se(pStruct);.}..
1e6a0 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20  /*.** Flush any 
1e6b0 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
1e6c0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73  he in-memory has
1e6d0 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20  h tables to the 
1e6e0 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
1e6f0 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64  tic void fts5Ind
1e700 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65  exFlush(Fts5Inde
1e710 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65  x *p){.  /* Unle
1e720 73 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20  ss it is empty, 
1e730 66 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74  flush the hash t
1e740 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a  able to disk */.
1e750 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e    if( p->nPendin
1e760 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73  gData ){.    ass
1e770 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b  ert( p->pHash );
1e780 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67  .    p->nPending
1e790 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74  Data = 0;.    ft
1e7a0 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70  s5FlushOneHash(p
1e7b0 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74 20 73  );.  }.}...int s
1e7c0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f  qlite3Fts5IndexO
1e7d0 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65  ptimize(Fts5Inde
1e7e0 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
1e7f0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b  ucture *pStruct;
1e800 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1e810 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 69 6e   *pNew = 0;.  in
1e820 74 20 6e 53 65 67 20 3d 20 30 3b 0a 0a 20 20 61  t nSeg = 0;..  a
1e830 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
1e840 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
1e850 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a  5IndexFlush(p);.
1e860 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
1e870 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
1e880 3b 0a 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  ;..  if( pStruct
1e890 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e8a0 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
1e8b0 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65  t==fts5Structure
1e8c0 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53  CountSegments(pS
1e8d0 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20 6e 53  truct) );.    nS
1e8e0 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 53  eg = pStruct->nS
1e8f0 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 66 28 20  egment;.    if( 
1e900 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20 20 20  nSeg>1 ){.      
1e910 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  int nByte = size
1e920 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65  of(Fts5Structure
1e930 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65 20 2b  );.      nByte +
1e940 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  = (pStruct->nLev
1e950 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 46  el+1) * sizeof(F
1e960 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
1e970 6c 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d  l);.      pNew =
1e980 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 2a   (Fts5Structure*
1e990 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
1e9a0 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
1e9b0 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Byte);.    }.  }
1e9c0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
1e9d0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1e9e0 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
1e9f0 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 53 65   int nByte = nSe
1ea00 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53  g * sizeof(Fts5S
1ea10 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
1ea20 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c 65 76  ;.    pNew->nLev
1ea30 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e 4c  el = pStruct->nL
1ea40 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e 65 77  evel+1;.    pNew
1ea50 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
1ea60 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  pNew->nWriteCoun
1ea70 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  ter = pStruct->n
1ea80 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20  WriteCounter;.  
1ea90 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e    pLvl = &pNew->
1eaa0 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e  aLevel[pStruct->
1eab0 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70 4c 76  nLevel];.    pLv
1eac0 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73 35 53  l->aSeg = (Fts5S
1ead0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 2a  tructureSegment*
1eae0 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
1eaf0 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20 6e  ocZero(&p->rc, n
1eb00 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 70  Byte);.    if( p
1eb10 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20 20 20  Lvl->aSeg ){.   
1eb20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65     int iLvl, iSe
1eb30 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65  g;.      int iSe
1eb40 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  gOut = 0;.      
1eb50 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c  for(iLvl=0; iLvl
1eb60 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
1eb70 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
1eb80 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69     for(iSeg=0; i
1eb90 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65  Seg<pStruct->aLe
1eba0 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20  vel[iLvl].nSeg; 
1ebb0 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iSeg++){.       
1ebc0 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53     pLvl->aSeg[iS
1ebd0 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75 63 74  egOut] = pStruct
1ebe0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
1ebf0 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
1ec00 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b 3b 0a       iSegOut++;.
1ec10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ec20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 6e 53  }.      pNew->nS
1ec30 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d 3e 6e  egment = pLvl->n
1ec40 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20 20 20  Seg = nSeg;.    
1ec50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
1ec60 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
1ec70 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  .      pNew = 0;
1ec80 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
1ec90 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  ( pNew ){.    in
1eca0 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d 3e 6e  t iLvl = pNew->n
1ecb0 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77 68 69  Level-1;.    whi
1ecc0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
1ecd0 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e 61 4c  E_OK && pNew->aL
1ece0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e  evel[iLvl].nSeg>
1ecf0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  0 ){.      int n
1ed00 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54 5f 57  Rem = FTS5_OPT_W
1ed10 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 20 20  ORK_UNIT;.      
1ed20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1ed30 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20 69 4c  vel(p, &pNew, iL
1ed40 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20 20  vl, &nRem);.    
1ed50 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  }..    fts5Struc
1ed60 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 4e 65  tureWrite(p, pNe
1ed70 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75  w);.    fts5Stru
1ed80 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 4e 65  ctureRelease(pNe
1ed90 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53  w);.  }..  fts5S
1eda0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
1edb0 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74 75  pStruct);.  retu
1edc0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
1edd0 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74 20 73  rn(p); .}..int s
1ede0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4d  qlite3Fts5IndexM
1edf0 65 72 67 65 28 46 74 73 35 49 6e 64 65 78 20 2a  erge(Fts5Index *
1ee00 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29 7b 0a  p, int nMerge){.
1ee10 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1ee20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20 70 53 74  *pStruct;..  pSt
1ee30 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
1ee40 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 69  tureRead(p);.  i
1ee50 66 28 20 70 53 74 72 75 63 74 20 26 26 20 70 53  f( pStruct && pS
1ee60 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 7b  truct->nLevel ){
1ee70 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65  .    fts5IndexMe
1ee80 72 67 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c  rge(p, &pStruct,
1ee90 20 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20 66 74   nMerge);.    ft
1eea0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
1eeb0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
1eec0 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  }.  fts5Structur
1eed0 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74  eRelease(pStruct
1eee0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73  );..  return fts
1eef0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
1ef00 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1ef10 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62  fts5PoslistCallb
1ef20 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
1ef30 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43   *p, .  void *pC
1ef40 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74  ontext, .  const
1ef50 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74   u8 *pChunk, int
1ef60 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 61 73 73   nChunk.){.  ass
1ef70 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
1ef80 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
1ef90 6b 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  k>0 ){.    fts5B
1efa0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1efb0 6c 6f 62 28 28 46 74 73 35 42 75 66 66 65 72 2a  lob((Fts5Buffer*
1efc0 29 70 43 6f 6e 74 65 78 74 2c 20 70 43 68 75 6e  )pContext, pChun
1efd0 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a  k, nChunk);.  }.
1efe0 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  }..typedef struc
1eff0 74 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63  t PoslistCallbac
1f000 6b 43 74 78 20 50 6f 73 6c 69 73 74 43 61 6c 6c  kCtx PoslistCall
1f010 62 61 63 6b 43 74 78 3b 0a 73 74 72 75 63 74 20  backCtx;.struct 
1f020 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43  PoslistCallbackC
1f030 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66 65  tx {.  Fts5Buffe
1f040 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20 20  r *pBuf;        
1f050 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64         /* Append
1f060 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20   to this buffer 
1f070 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20  */.  Fts5Colset 
1f080 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20 20  *pColset;       
1f090 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63 74       /* Restrict
1f0a0 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69 73   matches to this
1f0b0 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74   column */.  int
1f0c0 20 65 53 74 61 74 65 3b 20 20 20 20 20 20 20 20   eState;        
1f0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f0e0 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a  See above */.};.
1f0f0 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b  ./*.** TODO: Mak
1f100 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69  e this more effi
1f110 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63  cient!.*/.static
1f120 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f   int fts5IndexCo
1f130 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c  lsetTest(Fts5Col
1f140 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e  set *pColset, in
1f150 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  t iCol){.  int i
1f160 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f170 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b  Colset->nCol; i+
1f180 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  +){.    if( pCol
1f190 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69  set->aiCol[i]==i
1f1a0 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Col ) return 1;.
1f1b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f1c0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1f1d0 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65 72  ts5PoslistFilter
1f1e0 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
1f1f0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69  Index *p, .  voi
1f200 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  d *pContext, .  
1f210 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
1f220 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
1f230 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63    PoslistCallbac
1f240 6b 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f  kCtx *pCtx = (Po
1f250 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
1f260 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 61 73  *)pContext;.  as
1f270 73 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e  sert_nc( nChunk>
1f280 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75  =0 );.  if( nChu
1f290 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  nk>0 ){.    /* S
1f2a0 65 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f  earch through to
1f2b0 20 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20   find the first 
1f2c0 76 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75  varint with valu
1f2d0 65 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65  e 1. This is the
1f2e0 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66  .    ** start of
1f2f0 20 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e   the next column
1f300 73 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69  s hits. */.    i
1f310 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e  nt i = 0;.    in
1f320 74 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20  t iStart = 0;.. 
1f330 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74     if( pCtx->eSt
1f340 61 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  ate==2 ){.      
1f350 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  int iCol;.      
1f360 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
1f370 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69  t32(pChunk, i, i
1f380 43 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Col);.      if( 
1f390 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
1f3a0 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
1f3b0 74 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20  t, iCol) ){.    
1f3c0 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65      pCtx->eState
1f3d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74   = 1;.        ft
1f3e0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1f3f0 6e 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70  ndVarint(pCtx->p
1f400 42 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  Buf, 1);.      }
1f410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43  else{.        pC
1f420 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a  tx->eState = 0;.
1f430 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f440 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68     do {.      wh
1f450 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26  ile( i<nChunk &&
1f460 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31   pChunk[i]!=0x01
1f470 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
1f480 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30  e( pChunk[i] & 0
1f490 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20  x80 ) i++;.     
1f4a0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a     i++;.      }.
1f4b0 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e        if( pCtx->
1f4c0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20  eState ){.      
1f4d0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1f4e0 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d  AppendBlob(pCtx-
1f4f0 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69  >pBuf, &pChunk[i
1f500 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74  Start], i-iStart
1f510 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f520 20 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b   if( i<nChunk ){
1f530 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
1f540 6c 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72  l;.        iStar
1f550 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69  t = i;.        i
1f560 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
1f570 69 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20  i>=nChunk ){.   
1f580 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
1f590 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
1f5a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f5b0 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72    fts5FastGetVar
1f5c0 69 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c  int32(pChunk, i,
1f5d0 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20   iCol);.        
1f5e0 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
1f5f0 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
1f600 54 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73  Test(pCtx->pCols
1f610 65 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20  et, iCol);.     
1f620 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
1f630 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
1f640 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
1f650 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43  afeAppendBlob(pC
1f660 74 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e  tx->pBuf, &pChun
1f670 6b 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74  k[iStart], i-iSt
1f680 61 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  art);.          
1f690 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20    iStart = i;.  
1f6a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f6b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f6c0 7d 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b  }while( i<nChunk
1f6d0 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   );.  }.}../*.**
1f6e0 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   Iterator pIter 
1f6f0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1f700 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
1f710 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69  y (not EOF). Thi
1f720 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70  s.** function ap
1f730 70 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74 69  pends the positi
1f740 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f 72  on list data for
1f750 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74   the current ent
1f760 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20  ry to.** buffer 
1f770 70 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e 6f  pBuf. It does no
1f780 74 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  t make a copy of
1f790 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
1f7a0 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c 64  st size.** field
1f7b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1f7c0 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
1f7d0 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
1f7e0 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49 74   *p,.  Fts5SegIt
1f7f0 65 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73 35  er *pSeg,.  Fts5
1f800 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c  Colset *pColset,
1f810 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
1f820 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d 3d  Buf.){.  if( 0==
1f830 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26  fts5BufferGrow(&
1f840 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65  p->rc, pBuf, pSe
1f850 67 2d 3e 6e 50 6f 73 29 20 29 7b 0a 20 20 20 20  g->nPos) ){.    
1f860 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29  if( pColset==0 )
1f870 7b 0a 20 20 20 20 20 20 66 74 73 35 43 68 75 6e  {.      fts5Chun
1f880 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
1f890 2c 20 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66  , (void*)pBuf, f
1f8a0 74 73 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61  ts5PoslistCallba
1f8b0 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ck);.    }else{.
1f8c0 20 20 20 20 20 20 50 6f 73 6c 69 73 74 43 61 6c        PoslistCal
1f8d0 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b 0a 20  lbackCtx sCtx;. 
1f8e0 20 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d       sCtx.pBuf =
1f8f0 20 70 42 75 66 3b 0a 20 20 20 20 20 20 73 43 74   pBuf;.      sCt
1f900 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c  x.pColset = pCol
1f910 73 65 74 3b 0a 20 20 20 20 20 20 73 43 74 78 2e  set;.      sCtx.
1f920 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64  eState = fts5Ind
1f930 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f  exColsetTest(pCo
1f940 6c 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  lset, 0);.      
1f950 61 73 73 65 72 74 28 20 73 43 74 78 2e 65 53 74  assert( sCtx.eSt
1f960 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65  ate==0 || sCtx.e
1f970 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20  State==1 );.    
1f980 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61    fts5ChunkItera
1f990 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76 6f 69  te(p, pSeg, (voi
1f9a0 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35 50 6f  d*)&sCtx, fts5Po
1f9b0 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62  slistFilterCallb
1f9c0 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ack);.    }.  }.
1f9d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20  }../*.** IN/OUT 
1f9e0 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61 29 20  parameter (*pa) 
1f9f0 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69  points to a posi
1fa00 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74 65  tion list n byte
1fa10 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a  s in size. If.**
1fa20 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
1fa30 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  st contains entr
1fa40 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
1fa50 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29 20  Col, then (*pa) 
1fa60 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69  is set.** to poi
1fa70 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d 70 6f  nt to the sub-po
1fa80 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20  sition-list for 
1fa90 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  that column and 
1faa0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
1fab0 20 62 79 74 65 73 20 69 6e 20 69 74 20 72 65 74   bytes in it ret
1fac0 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
1fad0 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73 69 74  e argument posit
1fae0 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f  ion list does no
1faf0 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79  t.** contain any
1fb00 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c   entries for col
1fb10 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e  umn iCol, return
1fb20 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
1fb30 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  t fts5IndexExtra
1fb40 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75  ctCol(.  const u
1fb50 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20 20  8 **pa,         
1fb60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
1fb70 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70  UT: Pointer to p
1fb80 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oslist */.  int 
1fb90 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1fbb0 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69  N: Size of posli
1fbc0 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  st in bytes */. 
1fbd0 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
1fbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbf0 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78   /* Column to ex
1fc00 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69  tract from posli
1fc10 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  st */.){.  int i
1fc20 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  Current = 0;    
1fc30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
1fc40 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68  ything before th
1fc50 65 20 66 69 72 73 74 20 30 78 30 31 20 69 73 20  e first 0x01 is 
1fc60 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74  col 0 */.  const
1fc70 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20   u8 *p = *pa;.  
1fc80 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64 20 3d  const u8 *pEnd =
1fc90 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20   &p[n];         
1fca0 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61 73 74  /* One byte past
1fcb0 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e   end of position
1fcc0 20 6c 69 73 74 20 2a 2f 0a 20 20 75 38 20 70 72   list */.  u8 pr
1fcd0 65 76 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65  ev = 0;..  while
1fce0 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74 20  ( iCol>iCurrent 
1fcf0 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  ){.    /* Advanc
1fd00 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74 69  e pointer p unti
1fd10 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 70  l it points to p
1fd20 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20 62  End or an 0x01 b
1fd30 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 20 20  yte that is.    
1fd40 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  ** not part of a
1fd50 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 20 20 77   varint */.    w
1fd60 68 69 6c 65 28 20 28 70 72 65 76 20 26 20 30 78  hile( (prev & 0x
1fd70 38 30 29 20 7c 7c 20 2a 70 21 3d 30 78 30 31 20  80) || *p!=0x01 
1fd80 29 7b 0a 20 20 20 20 20 20 70 72 65 76 20 3d 20  ){.      prev = 
1fd90 2a 70 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  *p++;.      if( 
1fda0 70 3d 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e  p==pEnd ) return
1fdb0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70   0;.    }.    *p
1fdc0 61 20 3d 20 70 2b 2b 3b 0a 20 20 20 20 70 20 2b  a = p++;.    p +
1fdd0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
1fde0 32 28 70 2c 20 69 43 75 72 72 65 6e 74 29 3b 0a  2(p, iCurrent);.
1fdf0 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21 3d    }.  if( iCol!=
1fe00 69 43 75 72 72 65 6e 74 20 29 20 72 65 74 75 72  iCurrent ) retur
1fe10 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61 6e  n 0;..  /* Advan
1fe20 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74  ce pointer p unt
1fe30 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
1fe40 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20  pEnd or an 0x01 
1fe50 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 2a  byte that is.  *
1fe60 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 20  * not part of a 
1fe70 76 61 72 69 6e 74 20 2a 2f 0a 20 20 61 73 73 65  varint */.  asse
1fe80 72 74 28 20 28 70 72 65 76 20 26 20 30 78 38 30  rt( (prev & 0x80
1fe90 29 3d 3d 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  )==0 );.  while(
1fea0 20 70 3c 70 45 6e 64 20 26 26 20 28 28 70 72 65   p<pEnd && ((pre
1feb0 76 20 26 20 30 78 38 30 29 20 7c 7c 20 2a 70 21  v & 0x80) || *p!
1fec0 3d 30 78 30 31 29 20 29 7b 0a 20 20 20 20 70 72  =0x01) ){.    pr
1fed0 65 76 20 3d 20 2a 70 2b 2b 3b 0a 20 20 7d 0a 20  ev = *p++;.  }. 
1fee0 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a 70 61   return p - (*pa
1fef0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  );.}.../*.** Ite
1ff00 72 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72  rator pMulti cur
1ff10 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
1ff20 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28   a valid entry (
1ff30 6e 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a  not EOF). This.*
1ff40 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e  * function appen
1ff50 64 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ds the following
1ff60 20 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 3a   to buffer pBuf:
1ff70 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20 76  .**.**   * The v
1ff80 61 72 69 6e 74 20 69 44 65 6c 74 61 2c 20 61 6e  arint iDelta, an
1ff90 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 70 6f 73  d.**   * the pos
1ffa0 69 74 69 6f 6e 20 6c 69 73 74 20 74 68 61 74 20  ition list that 
1ffb0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73  currently points
1ffc0 20 74 6f 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74   to, including t
1ffd0 68 65 20 73 69 7a 65 20 66 69 65 6c 64 2e 0a 2a  he size field..*
1ffe0 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1fff0 20 70 43 6f 6c 73 65 74 20 69 73 20 4e 55 4c 4c   pColset is NULL
20000 2c 20 74 68 65 6e 20 74 68 65 20 70 6f 73 69 74  , then the posit
20010 69 6f 6e 20 6c 69 73 74 20 69 73 20 66 69 6c 74  ion list is filt
20020 65 72 65 64 20 61 63 63 6f 72 64 69 6e 67 0a 2a  ered according.*
20030 2a 20 74 6f 20 70 43 6f 6c 73 65 74 20 62 65 66  * to pColset bef
20040 6f 72 65 20 62 65 69 6e 67 20 61 70 70 65 6e 64  ore being append
20050 65 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ed to the buffer
20060 2e 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20  . If this means 
20070 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6e 6f 20  there are.** no 
20080 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 70  entries in the p
20090 6f 73 69 74 69 6f 6e 20 6c 69 73 74 2c 20 6e 6f  osition list, no
200a0 74 68 69 6e 67 20 69 73 20 61 70 70 65 6e 64 65  thing is appende
200b0 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  d to the buffer 
200c0 28 6e 6f 74 0a 2a 2a 20 65 76 65 6e 20 69 44 65  (not.** even iDe
200d0 6c 74 61 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  lta)..**.** If a
200e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
200f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
20100 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
20110 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
20120 74 73 35 41 70 70 65 6e 64 50 6f 73 6c 69 73 74  ts5AppendPoslist
20130 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
20140 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c 0a  ,.  i64 iDelta,.
20150 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
20160 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73 35 43  *pMulti,.  Fts5C
20170 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a  olset *pColset,.
20180 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
20190 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  uf.){.  if( p->r
201a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
201b0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
201c0 2a 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d  *pSeg = &pMulti-
201d0 3e 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61  >aSeg[ pMulti->a
201e0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
201f0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ];.    assert( f
20200 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
20210 70 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b  p, pMulti)==0 );
20220 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
20230 67 2d 3e 6e 50 6f 73 3e 30 20 29 3b 0a 20 20 20  g->nPos>0 );.   
20240 20 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66   if( 0==fts5Buff
20250 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70  erGrow(&p->rc, p
20260 42 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2b  Buf, pSeg->nPos+
20270 39 2b 39 29 20 29 7b 0a 0a 20 20 20 20 20 20 69  9+9) ){..      i
20280 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
20290 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c  fset+pSeg->nPos<
202a0 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  =pSeg->pLeaf->sz
202b0 4c 65 61 66 20 0a 20 20 20 20 20 20 20 26 26 20  Leaf .       && 
202c0 28 70 43 6f 6c 73 65 74 3d 3d 30 20 7c 7c 20 70  (pColset==0 || p
202d0 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 29  Colset->nCol==1)
202e0 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
202f0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
20300 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
20310 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
20320 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  fset];.        i
20330 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20  nt nPos;.       
20340 20 69 66 28 20 70 43 6f 6c 73 65 74 20 29 7b 0a   if( pColset ){.
20350 20 20 20 20 20 20 20 20 20 20 6e 50 6f 73 20 3d            nPos =
20360 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
20370 74 43 6f 6c 28 26 70 50 6f 73 2c 20 70 53 65 67  tCol(&pPos, pSeg
20380 2d 3e 6e 50 6f 73 2c 20 70 43 6f 6c 73 65 74 2d  ->nPos, pColset-
20390 3e 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aiCol[0]);.    
203a0 20 20 20 20 20 20 69 66 28 20 6e 50 6f 73 3d 3d        if( nPos==
203b0 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
203c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
203d0 20 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53         nPos = pS
203e0 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 20 20  eg->nPos;.      
203f0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
20400 72 74 28 20 6e 50 6f 73 3e 30 20 29 3b 0a 20 20  rt( nPos>0 );.  
20410 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
20420 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74  SafeAppendVarint
20430 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b 0a  (pBuf, iDelta);.
20440 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
20450 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
20460 6e 74 28 70 42 75 66 2c 20 6e 50 6f 73 2a 32 29  nt(pBuf, nPos*2)
20470 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
20480 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
20490 6f 62 28 70 42 75 66 2c 20 70 50 6f 73 2c 20 6e  ob(pBuf, pPos, n
204a0 50 6f 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  Pos);.      }els
204b0 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  e{.        int i
204c0 53 76 31 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Sv1;.        int
204d0 20 69 53 76 32 3b 0a 20 20 20 20 20 20 20 20 69   iSv2;.        i
204e0 6e 74 20 69 44 61 74 61 3b 0a 0a 20 20 20 20 20  nt iData;..     
204f0 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 69 44 65     /* Append iDe
20500 6c 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  lta */.        i
20510 53 76 31 20 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20  Sv1 = pBuf->n;. 
20520 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
20530 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
20540 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  t(pBuf, iDelta);
20550 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49  ..        /* WRI
20560 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
20570 0a 20 20 20 20 20 20 20 20 69 53 76 32 20 3d 20  .        iSv2 = 
20580 70 42 75 66 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pBuf->n;.       
20590 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
205a0 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66  ppendVarint(pBuf
205b0 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32 29 3b  , pSeg->nPos*2);
205c0 0a 20 20 20 20 20 20 20 20 69 44 61 74 61 20 3d  .        iData =
205d0 20 70 42 75 66 2d 3e 6e 3b 0a 0a 20 20 20 20 20   pBuf->n;..     
205e0 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f     fts5SegiterPo
205f0 73 6c 69 73 74 28 70 2c 20 70 53 65 67 2c 20 70  slist(p, pSeg, p
20600 43 6f 6c 73 65 74 2c 20 70 42 75 66 29 3b 0a 0a  Colset, pBuf);..
20610 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c          if( pCol
20620 73 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  set ){.         
20630 20 69 6e 74 20 6e 41 63 74 75 61 6c 20 3d 20 70   int nActual = p
20640 42 75 66 2d 3e 6e 20 2d 20 69 44 61 74 61 3b 0a  Buf->n - iData;.
20650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
20660 63 74 75 61 6c 21 3d 70 53 65 67 2d 3e 6e 50 6f  ctual!=pSeg->nPo
20670 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  s ){.           
20680 20 69 66 28 20 6e 41 63 74 75 61 6c 3d 3d 30 20   if( nActual==0 
20690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
206a0 20 70 42 75 66 2d 3e 6e 20 3d 20 69 53 76 31 3b   pBuf->n = iSv1;
206b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
206c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
206d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
206e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52            int nR
206f0 65 71 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  eq = sqlite3Fts5
20700 47 65 74 56 61 72 69 6e 74 4c 65 6e 28 28 75 33  GetVarintLen((u3
20710 32 29 28 6e 41 63 74 75 61 6c 2a 32 29 29 3b 0a  2)(nActual*2));.
20720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
20730 69 6c 65 28 20 69 53 76 32 3c 28 69 44 61 74 61  ile( iSv2<(iData
20740 2d 6e 52 65 71 29 20 29 7b 20 70 42 75 66 2d 3e  -nReq) ){ pBuf->
20750 70 5b 69 53 76 32 2b 2b 5d 20 3d 20 30 78 38 30  p[iSv2++] = 0x80
20760 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20  ; }.            
20770 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74    sqlite3Fts5Put
20780 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b  Varint(&pBuf->p[
20790 69 53 76 32 5d 2c 20 6e 41 63 74 75 61 6c 2a 32  iSv2], nActual*2
207a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
207b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
207c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
207d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
207e0 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn 0;.}..static
207f0 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73   void fts5Doclis
20800 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44 6f  tIterNext(Fts5Do
20810 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72  clistIter *pIter
20820 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70 49 74  ){.  u8 *p = pIt
20830 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20 70  er->aPoslist + p
20840 49 74 65 72 2d 3e 6e 53 69 7a 65 20 2b 20 70 49  Iter->nSize + pI
20850 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a 0a  ter->nPoslist;..
20860 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
20870 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20 20 69  >aPoslist );.  i
20880 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61 45 6f  f( p>=pIter->aEo
20890 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
208a0 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a 20 20  aPoslist = 0;.  
208b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 69  }else{.    i64 i
208c0 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20 2b 3d  Delta;..    p +=
208d0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70   fts5GetVarint(p
208e0 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
208f0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f  ;.    pIter->iRo
20900 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 0a  wid += iDelta;..
20910 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f 73 69      /* Read posi
20920 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 2a  tion list size *
20930 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d 20 26  /.    if( p[0] &
20940 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 69   0x80 ){.      i
20950 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 70  nt nPos;.      p
20960 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 66 74  Iter->nSize = ft
20970 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c  s5GetVarint32(p,
20980 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 70 49   nPos);.      pI
20990 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20  ter->nPoslist = 
209a0 28 6e 50 6f 73 3e 3e 31 29 3b 0a 20 20 20 20 7d  (nPos>>1);.    }
209b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
209c0 72 2d 3e 6e 50 6f 73 6c 69 73 74 20 3d 20 28 28  r->nPoslist = ((
209d0 69 6e 74 29 28 70 5b 30 5d 29 29 20 3e 3e 20 31  int)(p[0])) >> 1
209e0 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e  ;.      pIter->n
209f0 53 69 7a 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Size = 1;.    }.
20a00 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 50 6f 73  .    pIter->aPos
20a10 6c 69 73 74 20 3d 20 70 3b 0a 20 20 7d 0a 7d 0a  list = p;.  }.}.
20a20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
20a30 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
20a40 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
20a50 70 42 75 66 2c 20 0a 20 20 46 74 73 35 44 6f 63  pBuf, .  Fts5Doc
20a60 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65 72 0a  listIter *pIter.
20a70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65  ){.  memset(pIte
20a80 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  r, 0, sizeof(*pI
20a90 74 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e  ter));.  pIter->
20aa0 61 50 6f 73 6c 69 73 74 20 3d 20 70 42 75 66 2d  aPoslist = pBuf-
20ab0 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 61 45 6f  >p;.  pIter->aEo
20ac0 66 20 3d 20 26 70 42 75 66 2d 3e 70 5b 70 42 75  f = &pBuf->p[pBu
20ad0 66 2d 3e 6e 5d 3b 0a 20 20 66 74 73 35 44 6f 63  f->n];.  fts5Doc
20ae0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 70 49 74  listIterNext(pIt
20af0 65 72 29 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a  er);.}..#if 0./*
20b00 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63  .** Append a doc
20b10 6c 69 73 74 20 74 6f 20 62 75 66 66 65 72 20 70  list to buffer p
20b20 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
20b30 66 75 6e 63 74 69 6f 6e 20 61 73 73 75 6d 65 73  function assumes
20b40 20 74 68 61 74 20 73 70 61 63 65 20 77 69 74 68   that space with
20b50 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 68 61  in the buffer ha
20b60 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a  s already been.*
20b70 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2f 0a  * allocated..*/.
20b80 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
20b90 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
20ba0 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
20bb0 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
20bc0 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
20bd0 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69   write to */.  i
20be0 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 2c  64 *piLastRowid,
20bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c00 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69 6f  * IN/OUT: Previo
20c10 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65 6e  us rowid written
20c20 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20 69   (if any) */.  i
20c30 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20 20  64 iRowid       
20c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c50 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65 6e  * Rowid to appen
20c60 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
20c70 28 20 70 42 75 66 2d 3e 6e 21 3d 30 20 7c 7c 20  ( pBuf->n!=0 || 
20c80 28 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3d 3d  (*piLastRowid)==
20c90 30 20 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  0 );.  fts5Buffe
20ca0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
20cb0 74 28 70 42 75 66 2c 20 69 52 6f 77 69 64 20 2d  t(pBuf, iRowid -
20cc0 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 29 3b 0a   *piLastRowid);.
20cd0 20 20 2a 70 69 4c 61 73 74 52 6f 77 69 64 20 3d    *piLastRowid =
20ce0 20 69 52 6f 77 69 64 3b 0a 7d 0a 23 65 6e 64 69   iRowid;.}.#endi
20cf0 66 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4d  f..#define fts5M
20d00 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
20d10 70 42 75 66 2c 20 69 4c 61 73 74 52 6f 77 69 64  pBuf, iLastRowid
20d20 2c 20 69 52 6f 77 69 64 29 20 7b 20 20 20 20 20  , iRowid) {     
20d30 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28 70    \.  assert( (p
20d40 42 75 66 29 2d 3e 6e 21 3d 30 20 7c 7c 20 28 69  Buf)->n!=0 || (i
20d50 4c 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b  LastRowid)==0 );
20d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d70 20 20 20 5c 0a 20 20 66 74 73 35 42 75 66 66 65     \.  fts5Buffe
20d80 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
20d90 74 28 28 70 42 75 66 29 2c 20 28 69 52 6f 77 69  t((pBuf), (iRowi
20da0 64 29 20 2d 20 28 69 4c 61 73 74 52 6f 77 69 64  d) - (iLastRowid
20db0 29 29 3b 20 5c 0a 20 20 28 69 4c 61 73 74 52 6f  )); \.  (iLastRo
20dc0 77 69 64 29 20 3d 20 28 69 52 6f 77 69 64 29 3b  wid) = (iRowid);
20dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20df0 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20       \.}../*.** 
20e00 42 75 66 66 65 72 73 20 70 31 20 61 6e 64 20 70  Buffers p1 and p
20e10 32 20 63 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73  2 contain doclis
20e20 74 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ts. This functio
20e30 6e 20 6d 65 72 67 65 73 20 74 68 65 20 63 6f 6e  n merges the con
20e40 74 65 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74  tent.** of the t
20e50 77 6f 20 64 6f 63 6c 69 73 74 73 20 74 6f 67 65  wo doclists toge
20e60 74 68 65 72 20 61 6e 64 20 73 65 74 73 20 62 75  ther and sets bu
20e70 66 66 65 72 20 70 31 20 74 6f 20 74 68 65 20 72  ffer p1 to the r
20e80 65 73 75 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20  esult before.** 
20e90 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
20ea0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
20eb0 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f  urs, an error co
20ec0 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d  de is left in p-
20ed0 3e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  >rc. If an error
20ee0 20 68 61 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20   has.** already 
20ef0 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66  occurred, this f
20f00 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
20f10 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
20f20 69 64 20 66 74 73 35 4d 65 72 67 65 50 72 65 66  id fts5MergePref
20f30 69 78 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49  ixLists(.  Fts5I
20f40 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
20f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
20f60 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
20f70 74 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  t */.  Fts5Buffe
20f80 72 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20  r *p1,          
20f90 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
20fa0 6c 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f  list to merge */
20fb0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
20fc0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
20fd0 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73     /* Second lis
20fe0 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b  t to merge */.){
20ff0 0a 20 20 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a  .  if( p2->n ){.
21000 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77      i64 iLastRow
21010 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  id = 0;.    Fts5
21020 44 6f 63 6c 69 73 74 49 74 65 72 20 69 31 3b 0a  DoclistIter i1;.
21030 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49      Fts5DoclistI
21040 74 65 72 20 69 32 3b 0a 20 20 20 20 46 74 73 35  ter i2;.    Fts5
21050 42 75 66 66 65 72 20 6f 75 74 3b 0a 20 20 20 20  Buffer out;.    
21060 46 74 73 35 42 75 66 66 65 72 20 74 6d 70 3b 0a  Fts5Buffer tmp;.
21070 20 20 20 20 6d 65 6d 73 65 74 28 26 6f 75 74 2c      memset(&out,
21080 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74 29 29   0, sizeof(out))
21090 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 74 6d  ;.    memset(&tm
210a0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 74 6d 70  p, 0, sizeof(tmp
210b0 29 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ));..    sqlite3
210c0 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
210d0 70 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d  p->rc, &out, p1-
210e0 3e 6e 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 20  >n + p2->n);.   
210f0 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
21100 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a 20  Init(p1, &i1);. 
21110 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
21120 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29 3b  erInit(p2, &i2);
21130 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
21140 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21150 28 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d 30 20  (i1.aPoslist!=0 
21160 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 21 3d  || i2.aPoslist!=
21170 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  0) ){.      if( 
21180 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c  i2.aPoslist==0 |
21190 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 20 26  | (i1.aPoslist &
211a0 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e 69  & i1.iRowid<i2.i
211b0 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20 20  Rowid) ){.      
211c0 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
211d0 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20 20  from i1 */.     
211e0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
211f0 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
21200 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
21210 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
21220 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
21230 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e  ndBlob(&out, i1.
21240 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
21250 73 6c 69 73 74 2b 69 31 2e 6e 53 69 7a 65 29 3b  slist+i1.nSize);
21260 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
21270 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
21280 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
21290 20 65 6c 73 65 20 69 66 28 20 69 31 2e 61 50 6f   else if( i1.aPo
212a0 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69 32 2e 69  slist==0 || i2.i
212b0 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f 77 69 64  Rowid!=i1.iRowid
212c0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43   ){.        /* C
212d0 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20 69  opy entry from i
212e0 32 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  2 */.        fts
212f0 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
21300 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77  d(&out, iLastRow
21310 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a  id, i2.iRowid);.
21320 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
21330 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62  erSafeAppendBlob
21340 28 26 6f 75 74 2c 20 69 32 2e 61 50 6f 73 6c 69  (&out, i2.aPosli
21350 73 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 2b  st, i2.nPoslist+
21360 69 32 2e 6e 53 69 7a 65 29 3b 0a 20 20 20 20 20  i2.nSize);.     
21370 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74     fts5DoclistIt
21380 65 72 4e 65 78 74 28 26 69 32 29 3b 0a 20 20 20  erNext(&i2);.   
21390 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b     }.      else{
213a0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f  .        i64 iPo
213b0 73 31 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  s1 = 0;.        
213c0 69 36 34 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20  i64 iPos2 = 0;. 
213d0 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 31         int iOff1
213e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
213f0 74 20 69 4f 66 66 32 20 3d 20 30 3b 0a 20 20 20  t iOff2 = 0;.   
21400 20 20 20 20 20 75 38 20 2a 61 31 20 3d 20 26 69       u8 *a1 = &i
21410 31 2e 61 50 6f 73 6c 69 73 74 5b 69 31 2e 6e 53  1.aPoslist[i1.nS
21420 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 75 38  ize];.        u8
21430 20 2a 61 32 20 3d 20 26 69 32 2e 61 50 6f 73 6c   *a2 = &i2.aPosl
21440 69 73 74 5b 69 32 2e 6e 53 69 7a 65 5d 3b 0a 0a  ist[i2.nSize];..
21450 20 20 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c          Fts5Posl
21460 69 73 74 57 72 69 74 65 72 20 77 72 69 74 65 72  istWriter writer
21470 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
21480 28 26 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (&writer, 0, siz
21490 65 6f 66 28 77 72 69 74 65 72 29 29 3b 0a 0a 20  eof(writer));.. 
214a0 20 20 20 20 20 20 20 2f 2a 20 4d 65 72 67 65 20         /* Merge 
214b0 74 68 65 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e  the two position
214c0 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20   lists. */ .    
214d0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
214e0 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
214f0 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
21500 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
21510 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 74  ts5BufferZero(&t
21520 6d 70 29 3b 0a 0a 20 20 20 20 20 20 20 20 73 71  mp);..        sq
21530 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
21540 4e 65 78 74 36 34 28 61 31 2c 20 69 31 2e 6e 50  Next64(a1, i1.nP
21550 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 20  oslist, &iOff1, 
21560 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20  &iPos1);.       
21570 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
21580 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69 32  istNext64(a2, i2
21590 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
215a0 32 2c 20 26 69 50 6f 73 32 29 3b 0a 0a 20 20 20  2, &iPos2);..   
215b0 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72       while( p->r
215c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
215d0 28 69 50 6f 73 31 3e 3d 30 20 7c 7c 20 69 50 6f  (iPos1>=0 || iPo
215e0 73 32 3e 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  s2>=0) ){.      
215f0 20 20 20 20 69 36 34 20 69 4e 65 77 3b 0a 20 20      i64 iNew;.  
21600 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
21610 32 3c 30 20 7c 7c 20 28 69 50 6f 73 31 3e 3d 30  2<0 || (iPos1>=0
21620 20 26 26 20 69 50 6f 73 31 3c 69 50 6f 73 32 29   && iPos1<iPos2)
21630 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21640 69 4e 65 77 20 3d 20 69 50 6f 73 31 3b 0a 20 20  iNew = iPos1;.  
21650 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21660 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
21670 36 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69  64(a1, i1.nPosli
21680 73 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f  st, &iOff1, &iPo
21690 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  s1);.          }
216a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
216b0 20 20 69 4e 65 77 20 3d 20 69 50 6f 73 32 3b 0a    iNew = iPos2;.
216c0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
216d0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
216e0 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73  xt64(a2, i2.nPos
216f0 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69  list, &iOff2, &i
21700 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos2);.         
21710 20 20 20 69 66 28 20 69 50 6f 73 31 3d 3d 69 50     if( iPos1==iP
21720 6f 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  os2 ){.         
21730 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
21740 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31  PoslistNext64(a1
21750 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
21760 69 4f 66 66 31 2c 26 69 50 6f 73 31 29 3b 0a 20  iOff1,&iPos1);. 
21770 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21780 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21790 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
217a0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 57 72 69  e3Fts5PoslistWri
217b0 74 65 72 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  terAppend(&tmp, 
217c0 26 77 72 69 74 65 72 2c 20 69 4e 65 77 29 3b 0a  &writer, iNew);.
217d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
217e0 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
217f0 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
21800 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
21810 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75  AppendVarint(&ou
21820 74 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20  t, tmp.n * 2);. 
21830 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
21840 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
21850 26 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70  &out, tmp.p, tmp
21860 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  .n);.        fts
21870 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
21880 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66  (&i1);.        f
21890 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65  ts5DoclistIterNe
218a0 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 7d  xt(&i2);.      }
218b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
218c0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
218d0 2c 20 70 31 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74  , p1, out.n, out
218e0 2e 70 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66  .p);.    fts5Buf
218f0 66 65 72 46 72 65 65 28 26 74 6d 70 29 3b 0a 20  ferFree(&tmp);. 
21900 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
21910 65 28 26 6f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(&out);.  }.}..
21920 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
21930 42 75 66 66 65 72 53 77 61 70 28 46 74 73 35 42  BufferSwap(Fts5B
21940 75 66 66 65 72 20 2a 70 31 2c 20 46 74 73 35 42  uffer *p1, Fts5B
21950 75 66 66 65 72 20 2a 70 32 29 7b 0a 20 20 46 74  uffer *p2){.  Ft
21960 73 35 42 75 66 66 65 72 20 74 6d 70 20 3d 20 2a  s5Buffer tmp = *
21970 70 31 3b 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b  p1;.  *p1 = *p2;
21980 0a 20 20 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a  .  *p2 = tmp;.}.
21990 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
219a0 35 53 65 74 75 70 50 72 65 66 69 78 49 74 65 72  5SetupPrefixIter
219b0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
219c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
219d0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20      /* Index to 
219e0 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  read from */.  i
219f0 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20  nt bDesc,       
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21a10 2a 20 54 72 75 65 20 66 6f 72 20 22 4f 52 44 45  * True for "ORDE
21a20 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
21a30 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
21a40 70 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  pToken,         
21a50 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
21a60 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 66 69  containing prefi
21a70 78 20 74 6f 20 6d 61 74 63 68 20 2a 2f 0a 20 20  x to match */.  
21a80 69 6e 74 20 6e 54 6f 6b 65 6e 2c 20 20 20 20 20  int nToken,     
21a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21aa0 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65  /* Size of buffe
21ab0 72 20 70 54 6f 6b 65 6e 20 69 6e 20 62 79 74 65  r pToken in byte
21ac0 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65  s */.  Fts5Colse
21ad0 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20 20  t *pColset,     
21ae0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69         /* Restri
21af0 63 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68  ct matches to th
21b00 65 73 65 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ese columns */. 
21b10 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
21b20 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
21b30 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
21b40 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  rator */.){.  Ft
21b50 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
21b60 72 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66  ruct;.  Fts5Buff
21b70 65 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73  er *aBuf;.  cons
21b80 74 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b  t int nBuf = 32;
21b90 0a 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35  ..  aBuf = (Fts5
21ba0 42 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d  Buffer*)fts5IdxM
21bb0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
21bc0 46 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66  Fts5Buffer)*nBuf
21bd0 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  );.  pStruct = f
21be0 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
21bf0 28 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66  (p);..  if( aBuf
21c00 20 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20   && pStruct ){. 
21c10 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61     const int fla
21c20 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
21c30 55 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20 20 69  UERY_SCAN;.    i
21c40 6e 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c  nt i;.    i64 iL
21c50 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  astRowid = 0;.  
21c60 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
21c70 2a 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  *p1 = 0;     /* 
21c80 49 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f  Iterator used to
21c90 20 67 61 74 68 65 72 20 64 61 74 61 20 66 72 6f   gather data fro
21ca0 6d 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46  m index */.    F
21cb0 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
21cc0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 64      Fts5Buffer d
21cd0 6f 63 6c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  oclist;.    int 
21ce0 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 0a 20  bNewTerm = 0;.. 
21cf0 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63 6c 69     memset(&docli
21d00 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 6f  st, 0, sizeof(do
21d10 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66 6f 72  clist));.    for
21d20 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65  (fts5MultiIterNe
21d30 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c  w(p, pStruct, 1,
21d40 20 66 6c 61 67 73 2c 20 70 54 6f 6b 65 6e 2c 20   flags, pToken, 
21d50 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c 20 26  nToken, -1, 0, &
21d60 70 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  p1);.        fts
21d70 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
21d80 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20   p1)==0;.       
21d90 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
21da0 78 74 32 28 70 2c 20 70 31 2c 20 26 62 4e 65 77  xt2(p, p1, &bNew
21db0 54 65 72 6d 29 0a 20 20 20 20 29 7b 0a 20 20 20  Term).    ){.   
21dc0 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
21dd0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
21de0 69 64 28 70 31 29 3b 0a 20 20 20 20 20 20 69 6e  id(p1);.      in
21df0 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 63  t nTerm;.      c
21e00 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 20 3d  onst u8 *pTerm =
21e10 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65   fts5MultiIterTe
21e20 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d 29 3b 0a  rm(p1, &nTerm);.
21e30 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
21e40 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20   memcmp(pToken, 
21e50 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65  pTerm, MIN(nToke
21e60 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b  n, nTerm))<=0 );
21e70 0a 20 20 20 20 20 20 69 66 28 20 62 4e 65 77 54  .      if( bNewT
21e80 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  erm ){.        i
21e90 66 28 20 6e 54 65 72 6d 3c 6e 54 6f 6b 65 6e 20  f( nTerm<nToken 
21ea0 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e  || memcmp(pToken
21eb0 2c 20 70 54 65 72 6d 2c 20 6e 54 6f 6b 65 6e 29  , pTerm, nToken)
21ec0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
21ed0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63  }..      if( doc
21ee0 6c 69 73 74 2e 6e 3e 30 20 26 26 20 69 52 6f 77  list.n>0 && iRow
21ef0 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 29  id<=iLastRowid )
21f00 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
21f10 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
21f20 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e  _OK && doclist.n
21f30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21f40 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66    assert( i<nBuf
21f50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
21f60 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29  ( aBuf[i].n==0 )
21f70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
21f80 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64 6f  s5BufferSwap(&do
21f90 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
21fa0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
21fb0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f  s5BufferZero(&do
21fc0 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  clist);.        
21fd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21fe0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72       fts5MergePr
21ff0 65 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f  efixLists(p, &do
22000 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
22010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
22020 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42  s5BufferZero(&aB
22030 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
22040 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
22050 20 20 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64        iLastRowid
22060 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
22070 20 20 20 20 20 69 66 28 20 21 66 74 73 35 41 70       if( !fts5Ap
22080 70 65 6e 64 50 6f 73 6c 69 73 74 28 70 2c 20 69  pendPoslist(p, i
22090 52 6f 77 69 64 2d 69 4c 61 73 74 52 6f 77 69 64  Rowid-iLastRowid
220a0 2c 20 70 31 2c 20 70 43 6f 6c 73 65 74 2c 20 26  , p1, pColset, &
220b0 64 6f 63 6c 69 73 74 29 20 29 7b 0a 20 20 20 20  doclist) ){.    
220c0 20 20 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d      iLastRowid =
220d0 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 7d   iRowid;.      }
220e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
220f0 69 3d 30 3b 20 69 3c 6e 42 75 66 3b 20 69 2b 2b  i=0; i<nBuf; i++
22100 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
22110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22120 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
22130 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 70 2c  gePrefixLists(p,
22140 20 26 64 6f 63 6c 69 73 74 2c 20 26 61 42 75 66   &doclist, &aBuf
22150 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
22160 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
22170 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  ee(&aBuf[i]);.  
22180 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
22190 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 31 29  iIterFree(p, p1)
221a0 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d 20 66  ;..    pData = f
221b0 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20  ts5IdxMalloc(p, 
221c0 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29  sizeof(Fts5Data)
221d0 20 2b 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20   + doclist.n);. 
221e0 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
221f0 20 20 20 20 20 20 70 44 61 74 61 2d 3e 70 20 3d        pData->p =
22200 20 28 75 38 2a 29 26 70 44 61 74 61 5b 31 5d 3b   (u8*)&pData[1];
22210 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e  .      pData->nn
22220 20 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66   = pData->szLeaf
22230 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20   = doclist.n;.  
22240 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
22250 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20  ->p, doclist.p, 
22260 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20  doclist.n);.    
22270 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
22280 65 77 32 28 70 2c 20 70 44 61 74 61 2c 20 62 44  ew2(p, pData, bD
22290 65 73 63 2c 20 70 70 49 74 65 72 29 3b 0a 20 20  esc, ppIter);.  
222a0 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
222b0 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29  erFree(&doclist)
222c0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72  ;.  }..  fts5Str
222d0 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
222e0 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  truct);.  sqlite
222f0 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a  3_free(aBuf);.}.
22300 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
22310 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
22320 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
22330 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72  lite3Fts5IndexWr
22340 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a  ite() pertain.**
22350 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   to the document
22360 20 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77   with rowid iRow
22370 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
22380 65 33 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e  e3Fts5IndexBegin
22390 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
223a0 2a 70 2c 20 69 6e 74 20 62 44 65 6c 65 74 65 2c  *p, int bDelete,
223b0 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20   i64 iRowid){.  
223c0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
223d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f  QLITE_OK );..  /
223e0 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 68  * Allocate the h
223f0 61 73 68 20 74 61 62 6c 65 20 69 66 20 69 74 20  ash table if it 
22400 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
22410 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a  been allocated *
22420 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48 61 73 68  /.  if( p->pHash
22430 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ==0 ){.    p->rc
22440 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
22450 73 68 4e 65 77 28 26 70 2d 3e 70 48 61 73 68 2c  shNew(&p->pHash,
22460 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74   &p->nPendingDat
22470 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c  a);.  }..  /* Fl
22480 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61 62  ush the hash tab
22490 6c 65 20 74 6f 20 64 69 73 6b 20 69 66 20 72 65  le to disk if re
224a0 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20  quired */.  if( 
224b0 69 52 6f 77 69 64 3c 70 2d 3e 69 57 72 69 74 65  iRowid<p->iWrite
224c0 52 6f 77 69 64 20 0a 20 20 20 7c 7c 20 28 69 52  Rowid .   || (iR
224d0 6f 77 69 64 3d 3d 70 2d 3e 69 57 72 69 74 65 52  owid==p->iWriteR
224e0 6f 77 69 64 20 26 26 20 70 2d 3e 62 44 65 6c 65  owid && p->bDele
224f0 74 65 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 70 2d  te==0).   || (p-
22500 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20  >nPendingData > 
22510 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
22520 74 61 29 20 0a 20 20 29 7b 0a 20 20 20 20 66 74  ta) .  ){.    ft
22530 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b  s5IndexFlush(p);
22540 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 57 72 69 74  .  }..  p->iWrit
22550 65 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  eRowid = iRowid;
22560 0a 20 20 70 2d 3e 62 44 65 6c 65 74 65 20 3d 20  .  p->bDelete = 
22570 62 44 65 6c 65 74 65 3b 0a 20 20 72 65 74 75 72  bDelete;.  retur
22580 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
22590 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n(p);.}../*.** C
225a0 6f 6d 6d 69 74 20 64 61 74 61 20 74 6f 20 64 69  ommit data to di
225b0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
225c0 65 33 46 74 73 35 49 6e 64 65 78 53 79 6e 63 28  e3Fts5IndexSync(
225d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e  Fts5Index *p, in
225e0 74 20 62 43 6f 6d 6d 69 74 29 7b 0a 20 20 61 73  t bCommit){.  as
225f0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
22600 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
22610 49 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20  IndexFlush(p);. 
22620 20 69 66 28 20 62 43 6f 6d 6d 69 74 20 29 20 66   if( bCommit ) f
22630 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
22640 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
22650 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
22660 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
22670 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
22680 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
22690 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
226a0 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
226b0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
226c0 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
226d0 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
226e0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
226f0 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
22700 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
22710 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
22720 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
22730 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
22740 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
22750 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
22760 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
22770 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
22780 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66  s5Index *p){.  f
22790 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
227a0 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69  );.  fts5IndexDi
227b0 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20  scardData(p);.  
227c0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
227d0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
227e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
227f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 25 5f 64  }../*.** The %_d
22800 61 74 61 20 74 61 62 6c 65 20 69 73 20 63 6f 6d  ata table is com
22810 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 77 68  pletely empty wh
22820 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
22830 20 69 73 20 63 61 6c 6c 65 64 2e 20 54 68 69 73   is called. This
22840 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70  .** function pop
22850 75 6c 61 74 65 73 20 69 74 20 77 69 74 68 20 74  ulates it with t
22860 68 65 20 69 6e 69 74 69 61 6c 20 73 74 72 75 63  he initial struc
22870 74 75 72 65 20 6f 62 6a 65 63 74 73 20 66 6f 72  ture objects for
22880 20 65 61 63 68 20 69 6e 64 65 78 2c 0a 2a 2a 20   each index,.** 
22890 61 6e 64 20 74 68 65 20 69 6e 69 74 69 61 6c 20  and the initial 
228a0 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 22  version of the "
228b0 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64  averages" record
228c0 20 28 61 20 7a 65 72 6f 2d 62 79 74 65 20 62 6c   (a zero-byte bl
228d0 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ob)..*/.int sqli
228e0 74 65 33 46 74 73 35 49 6e 64 65 78 52 65 69 6e  te3Fts5IndexRein
228f0 69 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  it(Fts5Index *p)
22900 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
22910 65 20 73 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  e s;.  memset(&s
22920 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
22930 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66  Structure));.  f
22940 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
22950 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
22960 57 49 44 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29  WID, (const u8*)
22970 22 22 2c 20 30 29 3b 0a 20 20 66 74 73 35 53 74  "", 0);.  fts5St
22980 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20  ructureWrite(p, 
22990 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  &s);.  return ft
229a0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
229b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
229c0 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65 78 20  a new Fts5Index 
229d0 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65 20 62  handle. If the b
229e0 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e 74 20  Create argument 
229f0 69 73 20 74 72 75 65 2c 20 63 72 65 61 74 65 0a  is true, create.
22a00 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  ** and initializ
22a10 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
22a20 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a   %_data table..*
22a30 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
22a40 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 70  ul, set *pp to p
22a50 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
22a60 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
22a70 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
22a80 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74 20 2a  Otherwise, set *
22a90 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 72  pp to NULL and r
22aa0 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20  eturn an SQLite 
22ab0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 69  error code..*/.i
22ac0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
22ad0 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73 35 43  dexOpen(.  Fts5C
22ae0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
22af0 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65 2c 20  .  int bCreate, 
22b00 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 2a 70  .  Fts5Index **p
22b10 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72  p,.  char **pzEr
22b20 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  r.){.  int rc = 
22b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73  SQLITE_OK;.  Fts
22b40 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20 20 20  5Index *p;      
22b50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22b60 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  New object */.. 
22b70 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74 73 35   *pp = p = (Fts5
22b80 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33 46 74  Index*)sqlite3Ft
22b90 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
22ba0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64  , sizeof(Fts5Ind
22bb0 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex));.  if( rc==
22bc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22bd0 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20 70 43   p->pConfig = pC
22be0 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e 6e 57  onfig;.    p->nW
22bf0 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35 5f 57  orkUnit = FTS5_W
22c00 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20 70 2d  ORK_UNIT;.    p-
22c10 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74 61  >nMaxPendingData
22c20 20 3d 20 31 30 32 34 2a 31 30 32 34 3b 0a 20 20   = 1024*1024;.  
22c30 20 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20    p->zDataTbl = 
22c40 73 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e  sqlite3Fts5Mprin
22c50 74 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61  tf(&rc, "%s_data
22c60 22 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  ", pConfig->zNam
22c70 65 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  e);.    if( p->z
22c80 44 61 74 61 54 62 6c 20 26 26 20 62 43 72 65 61  DataTbl && bCrea
22c90 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  te ){.      rc =
22ca0 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61   sqlite3Fts5Crea
22cb0 74 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20  teTable(.       
22cc0 20 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74     pConfig, "dat
22cd0 61 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20  a", "id INTEGER 
22ce0 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f  PRIMARY KEY, blo
22cf0 63 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45  ck BLOB", 0, pzE
22d00 72 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  rr.      );.    
22d10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
22d30 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43  c = sqlite3Fts5C
22d40 72 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66  reateTable(pConf
22d50 69 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20  ig, "idx", .    
22d60 20 20 20 20 20 20 20 20 22 73 65 67 69 64 2c 20          "segid, 
22d70 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d  term, pgno, PRIM
22d80 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74  ARY KEY(segid, t
22d90 65 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20  erm)", .        
22da0 20 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20      1, pzErr.   
22db0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
22dc0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22de0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
22df0 74 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70  ts5IndexReinit(p
22e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
22e10 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
22e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
22e30 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
22e40 4b 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  K );.  if( rc ){
22e50 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
22e60 49 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20  IndexClose(p);. 
22e70 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a     *pp = 0;.  }.
22e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
22e90 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61  /*.** Close a ha
22ea0 6e 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61  ndle opened by a
22eb0 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
22ec0 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  o sqlite3Fts5Ind
22ed0 65 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  exOpen()..*/.int
22ee0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
22ef0 78 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78  xClose(Fts5Index
22f00 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
22f10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
22f20 28 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ( p ){.    asser
22f30 74 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30  t( p->pReader==0
22f40 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
22f50 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69  finalize(p->pWri
22f60 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ter);.    sqlite
22f70 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44  3_finalize(p->pD
22f80 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c  eleter);.    sql
22f90 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d  ite3_finalize(p-
22fa0 3e 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20  >pIdxWriter);.  
22fb0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
22fc0 7a 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  ze(p->pIdxDelete
22fd0 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
22fe0 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
22ff0 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c  Select);.    sql
23000 69 74 65 33 46 74 73 35 48 61 73 68 46 72 65 65  ite3Fts5HashFree
23010 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
23020 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
23030 7a 44 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73  zDataTbl);.    s
23040 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
23050 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
23060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
23070 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
23080 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
23090 6e 67 20 75 74 66 2d 38 20 74 65 78 74 20 74 68  ng utf-8 text th
230a0 61 74 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e  at is n bytes in
230b0 20 0a 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72   .** size. Retur
230c0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
230d0 62 79 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68  bytes in the nCh
230e0 61 72 20 63 68 61 72 61 63 74 65 72 20 70 72 65  ar character pre
230f0 66 69 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75  fix of the.** bu
23100 66 66 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68  ffer, or 0 if th
23110 65 72 65 20 61 72 65 20 6c 65 73 73 20 74 68 61  ere are less tha
23120 6e 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  n nChar characte
23130 72 73 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a  rs in total..*/.
23140 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
23150 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74  ndexCharlenToByt
23160 65 6c 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  elen(const char 
23170 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69  *p, int nByte, i
23180 6e 74 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74  nt nChar){.  int
23190 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   n = 0;.  int i;
231a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
231b0 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  har; i++){.    i
231c0 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65  f( n>=nByte ) re
231d0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20  turn 0;      /* 
231e0 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66  Input contains f
231f0 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20  ewer than nChar 
23200 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28  chars */.    if(
23210 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
23220 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  p[n++]>=0xc0 ){.
23230 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b        while( (p[
23240 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  n] & 0xc0)==0x80
23250 20 29 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) n++;.    }.  
23260 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
23270 0a 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20  ./*.** pIn is a 
23280 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74  UTF-8 encoded st
23290 72 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20  ring, nIn bytes 
232a0 69 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  in size. Return 
232b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
232c0 20 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74   unicode charact
232d0 65 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e  ers in the strin
232e0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
232f0 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
23300 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49  n(const char *pI
23310 6e 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69  n, int nIn){.  i
23320 6e 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20  nt nChar = 0;   
23330 20 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20           .  int 
23340 69 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  i = 0;.  while( 
23350 69 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28  i<nIn ){.    if(
23360 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
23370 70 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29  pIn[i++]>=0xc0 )
23380 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
23390 3c 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20  <nIn && (pIn[i] 
233a0 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20  & 0xc0)==0x80 ) 
233b0 69 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  i++;.    }.    n
233c0 43 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Char++;.  }.  re
233d0 74 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f  turn nChar;.}../
233e0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72  *.** Insert or r
233f0 65 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72  emove data to or
23400 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e   from the index.
23410 20 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63   Each time a doc
23420 75 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64  ument is .** add
23430 65 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64  ed to or removed
23440 20 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c   from the index,
23450 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
23460 73 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20  s called one or 
23470 6d 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a  more.** times..*
23480 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65  *.** For an inse
23490 72 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63  rt, it must be c
234a0 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65  alled once for e
234b0 61 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  ach token in the
234c0 20 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a   new document..*
234d0 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69  * If the operati
234e0 6f 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20  on is a delete, 
234f0 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  it must be calle
23500 64 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63  d (at least) onc
23510 65 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e  e for each.** un
23520 69 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68  ique token in th
23530 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20  e document with 
23540 61 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65  an iCol value le
23550 73 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68  ss than zero. Th
23560 65 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65  e iPos.** argume
23570 6e 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f  nt is ignored fo
23580 72 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69  r a delete..*/.i
23590 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
235a0 64 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35  dexWrite(.  Fts5
235b0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
235c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
235d0 6e 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f  ndex to write to
235e0 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20   */.  int iCol, 
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
23610 74 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e  token appears in
23620 20 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29   (-ve -> delete)
23630 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20   */.  int iPos, 
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23650 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f        /* Positio
23660 6e 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69  n of token withi
23670 6e 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f  n column */.  co
23680 6e 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e  nst char *pToken
23690 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a  , int nToken  /*
236a0 20 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72   Token to add or
236b0 20 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72   remove to or fr
236c0 6f 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  om index */.){. 
236d0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
236e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
236f0 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
23700 61 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65  ate through inde
23710 78 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  xes */.  int rc 
23720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
23730 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
23740 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
23750 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
23760 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a   = p->pConfig;..
23770 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
23780 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
23790 61 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29  assert( (iCol<0)
237a0 3d 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a  ==p->bDelete );.
237b0 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e  .  /* Add the en
237c0 74 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20  try to the main 
237d0 74 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a  terms index. */.
237e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
237f0 73 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20  s5HashWrite(.   
23800 20 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e     p->pHash, p->
23810 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f  iWriteRowid, iCo
23820 6c 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41  l, iPos, FTS5_MA
23830 49 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65  IN_PREFIX, pToke
23840 6e 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a  n, nToken.  );..
23850 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
23860 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26  nfig->nPrefix &&
23870 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20   rc==SQLITE_OK; 
23880 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  i++){.    int nB
23890 79 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78 43  yte = fts5IndexC
238a0 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28  harlenToBytelen(
238b0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
238c0 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78  pConfig->aPrefix
238d0 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  [i]);.    if( nB
238e0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  yte ){.      rc 
238f0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73  = sqlite3Fts5Has
23900 68 57 72 69 74 65 28 70 2d 3e 70 48 61 73 68 2c  hWrite(p->pHash,
23910 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69   .          p->i
23920 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
23930 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49  , iPos, FTS5_MAI
23940 4e 5f 50 52 45 46 49 58 2b 69 2b 31 2c 20 70 54  N_PREFIX+i+1, pT
23950 6f 6b 65 6e 2c 20 6e 42 79 74 65 0a 20 20 20 20  oken, nByte.    
23960 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
23970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
23980 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77  /*.** Open a new
23990 20 69 74 65 72 61 74 6f 72 20 74 6f 20 69 74 65   iterator to ite
239a0 72 61 74 65 20 74 68 6f 75 67 68 20 61 6c 6c 20  rate though all 
239b0 72 6f 77 69 64 20 74 68 61 74 20 6d 61 74 63 68  rowid that match
239c0 20 74 68 65 20 0a 2a 2a 20 73 70 65 63 69 66 69   the .** specifi
239d0 65 64 20 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65  ed token or toke
239e0 6e 20 70 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74  n prefix..*/.int
239f0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23a00 78 51 75 65 72 79 28 0a 20 20 46 74 73 35 49 6e  xQuery(.  Fts5In
23a10 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
23a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
23a30 20 69 6e 64 65 78 20 74 6f 20 71 75 65 72 79 20   index to query 
23a40 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
23a50 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f  *pToken, int nTo
23a60 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f  ken, /* Token (o
23a70 72 20 70 72 65 66 69 78 29 20 74 6f 20 71 75 65  r prefix) to que
23a80 72 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  ry for */.  int 
23a90 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
23aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
23ab0 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
23ac0 5f 51 55 45 52 59 5f 58 20 66 6c 61 67 73 20 2a  _QUERY_X flags *
23ad0 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a  /.  Fts5Colset *
23ae0 70 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20  pColset,        
23af0 20 20 20 20 2f 2a 20 4d 61 74 63 68 20 74 68 65      /* Match the
23b00 73 65 20 63 6f 6c 75 6d 6e 73 20 6f 6e 6c 79 20  se columns only 
23b10 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
23b20 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
23b30 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
23b40 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
23b50 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
23b60 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
23b70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 46 74 73  ->pConfig;.  Fts
23b80 35 49 6e 64 65 78 49 74 65 72 20 2a 70 52 65 74  5IndexIter *pRet
23b90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 49 64 78   = 0;.  int iIdx
23ba0 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
23bb0 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
23bc0 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0};..  /* If the
23bd0 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67   QUERY_SCAN flag
23be0 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68   is set, all oth
23bf0 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  er flags must be
23c00 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73   clear. */.  ass
23c10 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46 54  ert( (flags & FT
23c20 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
23c30 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  AN)==0 || flags=
23c40 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  =FTS5INDEX_QUERY
23c50 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20  _SCAN );..  if( 
23c60 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
23c70 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
23c80 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30  uf, nToken+1)==0
23c90 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26   ){.    memcpy(&
23ca0 62 75 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e  buf.p[1], pToken
23cb0 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64  , nToken);..#ifd
23cc0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
23cd0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55      /* If the QU
23ce0 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20 66  ERY_TEST_NOIDX f
23cf0 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69 65  lag was specifie
23d00 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75 73  d, then this mus
23d10 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70 72  t be a.    ** pr
23d20 65 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73 74  efix-query. Inst
23d30 65 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20 70  ead of using a p
23d40 72 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66 20  refix-index (if 
23d50 6f 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20 20  one exists), .  
23d60 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74 68    ** evaluate th
23d70 65 20 70 72 65 66 69 78 20 71 75 65 72 79 20 75  e prefix query u
23d80 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46 54  sing the main FT
23d90 53 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69 73  S index. This is
23da0 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f 72   used.    ** for
23db0 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74 79   internal sanity
23dc0 20 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68 65   checking by the
23dd0 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63 6b   integrity-check
23de0 20 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20 2a   in debug .    *
23df0 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a 2f  * mode only.  */
23e00 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
23e10 2d 3e 62 50 72 65 66 69 78 49 6e 64 65 78 3d 3d  ->bPrefixIndex==
23e20 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 46 54  0 || (flags & FT
23e30 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
23e40 53 54 5f 4e 4f 49 44 58 29 20 29 7b 0a 20 20 20  ST_NOIDX) ){.   
23e50 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73     assert( flags
23e60 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
23e70 52 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20  RY_PREFIX );.   
23e80 20 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e     iIdx = 1+pCon
23e90 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20  fig->nPrefix;.  
23ea0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
23eb0 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46     if( flags & F
23ec0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
23ed0 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69  REFIX ){.      i
23ee0 6e 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49  nt nChar = fts5I
23ef0 6e 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b  ndexCharlen(pTok
23f00 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20  en, nToken);.   
23f10 20 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69     for(iIdx=1; i
23f20 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50  Idx<=pConfig->nP
23f30 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a  refix; iIdx++){.
23f40 20 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e          if( pCon
23f50 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64  fig->aPrefix[iId
23f60 78 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72  x-1]==nChar ) br
23f70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
23f80 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78   }..    if( iIdx
23f90 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  <=pConfig->nPref
23fa0 69 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  ix ){.      Fts5
23fb0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
23fc0 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
23fd0 72 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20  reRead(p);.     
23fe0 20 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35   buf.p[0] = FTS5
23ff0 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
24000 49 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Idx;.      if( p
24010 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20  Struct ){.      
24020 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
24030 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31  ew(p, pStruct, 1
24040 2c 20 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20  , flags, buf.p, 
24050 6e 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c  nToken+1, -1, 0,
24060 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20   &pRet);.       
24070 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24080 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
240a0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65  e{.      int bDe
240b0 73 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  sc = (flags & FT
240c0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45  S5INDEX_QUERY_DE
240d0 53 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75  SC)!=0;.      bu
240e0 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41  f.p[0] = FTS5_MA
240f0 49 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20  IN_PREFIX;.     
24100 20 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78   fts5SetupPrefix
24110 49 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62  Iter(p, bDesc, b
24120 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20  uf.p, nToken+1, 
24130 70 43 6f 6c 73 65 74 2c 20 26 70 52 65 74 29 3b  pColset, &pRet);
24140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
24150 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73  p->rc ){.      s
24160 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
24170 6f 73 65 28 70 52 65 74 29 3b 0a 20 20 20 20 20  ose(pRet);.     
24180 20 70 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20   pRet = 0;.     
24190 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
241a0 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  (p);.    }.    *
241b0 70 70 49 74 65 72 20 3d 20 70 52 65 74 3b 0a 20  ppIter = pRet;. 
241c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
241d0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
241e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 74 73    }.  return fts
241f0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
24200 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
24210 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
24220 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
24230 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
24240 74 20 69 73 20 61 74 20 45 4f 46 2e 0a 2a 2f 0a  t is at EOF..*/.
24250 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24260 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78  terEof(Fts5Index
24270 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
24280 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
24290 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54  Index->rc==SQLIT
242a0 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72 6e  E_OK );.  return
242b0 20 70 49 74 65 72 2d 3e 62 45 6f 66 3b 0a 7d 0a   pIter->bEof;.}.
242c0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74  ./*.** Move to t
242d0 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67  he next matching
242e0 20 72 6f 77 69 64 2e 20 0a 2a 2f 0a 69 6e 74 20   rowid. .*/.int 
242f0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
24300 65 78 74 28 46 74 73 35 49 6e 64 65 78 49 74 65  ext(Fts5IndexIte
24310 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73  r *pIter){.  ass
24320 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
24330 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
24340 4b 20 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69  K );.  fts5Multi
24350 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 2d 3e  IterNext(pIter->
24360 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 30  pIndex, pIter, 0
24370 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  , 0);.  return f
24380 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24390 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
243a0 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20  ../*.** Move to 
243b0 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
243c0 67 20 74 65 72 6d 2f 72 6f 77 69 64 2e 20 55 73  g term/rowid. Us
243d0 65 64 20 62 79 20 74 68 65 20 66 74 73 35 76 6f  ed by the fts5vo
243e0 63 61 62 20 6d 6f 64 75 6c 65 2e 0a 2a 2f 0a 69  cab module..*/.i
243f0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
24400 65 72 4e 65 78 74 53 63 61 6e 28 46 74 73 35 49  erNextScan(Fts5I
24410 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
24420 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
24430 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
24440 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ;..  assert( pIt
24450 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
24460 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
24470 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
24480 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30  t(p, pIter, 0, 0
24490 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
244a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
244b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
244c0 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
244d0 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  g[ pIter->aFirst
244e0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
244f0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
24500 66 20 26 26 20 70 53 65 67 2d 3e 74 65 72 6d 2e  f && pSeg->term.
24510 70 5b 30 5d 21 3d 46 54 53 35 5f 4d 41 49 4e 5f  p[0]!=FTS5_MAIN_
24520 50 52 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20  PREFIX ){.      
24530 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
24540 70 53 65 67 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  pSeg->pLeaf);.  
24550 20 20 20 20 70 53 65 67 2d 3e 70 4c 65 61 66 20      pSeg->pLeaf 
24560 3d 20 30 3b 0a 20 20 20 20 20 20 70 49 74 65 72  = 0;.      pIter
24570 2d 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20  ->bEof = 1;.    
24580 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24590 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
245a0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
245b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f  }../*.** Move to
245c0 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
245d0 6e 67 20 72 6f 77 69 64 20 74 68 61 74 20 6f 63  ng rowid that oc
245e0 63 75 72 73 20 61 74 20 6f 72 20 61 66 74 65 72  curs at or after
245f0 20 69 4d 61 74 63 68 2e 20 54 68 65 0a 2a 2a 20   iMatch. The.** 
24600 64 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 22 61  definition of "a
24610 74 20 6f 72 20 61 66 74 65 72 22 20 64 65 70 65  t or after" depe
24620 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 74  nds on whether t
24630 68 69 73 20 69 74 65 72 61 74 6f 72 20 69 74 65  his iterator ite
24640 72 61 74 65 73 0a 2a 2a 20 69 6e 20 61 73 63 65  rates.** in asce
24650 6e 64 69 6e 67 20 6f 72 20 64 65 73 63 65 6e 64  nding or descend
24660 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 2e  ing rowid order.
24670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
24680 74 73 35 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  ts5IterNextFrom(
24690 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
246a0 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68  Iter, i64 iMatch
246b0 29 7b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  ){.  fts5MultiIt
246c0 65 72 4e 65 78 74 46 72 6f 6d 28 70 49 74 65 72  erNextFrom(pIter
246d0 2d 3e 70 49 6e 64 65 78 2c 20 70 49 74 65 72 2c  ->pIndex, pIter,
246e0 20 69 4d 61 74 63 68 29 3b 0a 20 20 72 65 74 75   iMatch);.  retu
246f0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24700 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  rn(pIter->pIndex
24710 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
24720 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  rn the current r
24730 6f 77 69 64 2e 0a 2a 2f 0a 69 36 34 20 73 71 6c  owid..*/.i64 sql
24740 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
24750 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  d(Fts5IndexIter 
24760 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
24770 6e 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  n fts5MultiIterR
24780 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 7d 0a 0a  owid(pIter);.}..
24790 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
247a0 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a 2a   current term..*
247b0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
247c0 6c 69 74 65 33 46 74 73 35 49 74 65 72 54 65 72  lite3Fts5IterTer
247d0 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  m(Fts5IndexIter 
247e0 2a 70 49 74 65 72 2c 20 69 6e 74 20 2a 70 6e 29  *pIter, int *pn)
247f0 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 6f 6e  {.  int n;.  con
24800 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
24810 6e 73 74 20 63 68 61 72 2a 29 66 74 73 35 4d 75  nst char*)fts5Mu
24820 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
24830 72 2c 20 26 6e 29 3b 0a 20 20 2a 70 6e 20 3d 20  r, &n);.  *pn = 
24840 6e 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 26 7a  n-1;.  return &z
24850 5b 31 5d 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  [1];.}...static 
24860 69 6e 74 20 66 74 73 35 49 6e 64 65 78 45 78 74  int fts5IndexExt
24870 72 61 63 74 43 6f 6c 73 65 74 20 28 0a 20 20 46  ractColset (.  F
24880 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
24890 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  et,            /
248a0 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c 74  * Colset to filt
248b0 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  er on */.  const
248c0 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e 74 20 6e   u8 *pPos, int n
248d0 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a 20 50 6f  Pos,       /* Po
248e0 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20  sition list */. 
248f0 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
24900 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
24910 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
24920 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
24930 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24940 69 6e 74 20 69 3b 0a 0a 20 20 66 74 73 35 42 75  int i;..  fts5Bu
24950 66 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a  fferZero(pBuf);.
24960 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f    for(i=0; i<pCo
24970 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29  lset->nCol; i++)
24980 7b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  {.    const u8 *
24990 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20  pSub = pPos;.   
249a0 20 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35   int nSub = fts5
249b0 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28  IndexExtractCol(
249c0 26 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f  &pSub, nPos, pCo
249d0 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b  lset->aiCol[i]);
249e0 0a 20 20 20 20 69 66 28 20 6e 53 75 62 20 29 7b  .    if( nSub ){
249f0 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65  .      fts5Buffe
24a00 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72 63 2c  rAppendBlob(&rc,
24a10 20 70 42 75 66 2c 20 6e 53 75 62 2c 20 70 53 75   pBuf, nSub, pSu
24a20 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  b);.    }.  }.  
24a30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
24a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
24a50 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
24a60 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  r containing a c
24a70 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
24a80 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20  ion list for.** 
24a90 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
24aa0 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  y. Output variab
24ab0 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f  le *pn is set to
24ac0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
24ad0 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62   buffer .** in b
24ae0 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
24af0 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rning..**.** The
24b00 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69   returned positi
24b10 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  on list does not
24b20 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75   include the "nu
24b30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22 20 76  mber of bytes" v
24b40 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74  arint.** field t
24b50 68 61 74 20 73 74 61 72 74 73 20 74 68 65 20 70  hat starts the p
24b60 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20  osition list on 
24b70 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
24b80 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
24b90 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
24ba0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
24bb0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
24bc0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
24bd0 2f 2a 20 43 6f 6c 75 6d 6e 20 66 69 6c 74 65 72  /* Column filter
24be0 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
24bf0 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20  const u8 **pp,  
24c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24c10 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
24c20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  to position-list
24c30 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
24c40 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pn,             
24c50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24c60 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74  T: Size of posit
24c70 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65  ion-list in byte
24c80 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f  s */.  i64 *piRo
24c90 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
24ca0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
24cb0 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
24cc0 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
24cd0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
24ce0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
24cf0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
24d00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
24d10 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
24d20 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
24d30 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
24d40 52 6f 77 69 64 3b 0a 20 20 69 66 28 20 70 53 65  Rowid;.  if( pSe
24d50 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 2b 70  g->iLeafOffset+p
24d60 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d  Seg->nPos<=pSeg-
24d70 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
24d80 7b 0a 20 20 20 20 75 38 20 2a 70 50 6f 73 20 3d  {.    u8 *pPos =
24d90 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70   &pSeg->pLeaf->p
24da0 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73  [pSeg->iLeafOffs
24db0 65 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f  et];.    if( pCo
24dc0 6c 73 65 74 3d 3d 30 20 7c 7c 20 70 49 74 65 72  lset==0 || pIter
24dd0 2d 3e 62 46 69 6c 74 65 72 65 64 20 29 7b 0a 20  ->bFiltered ){. 
24de0 20 20 20 20 20 2a 70 6e 20 3d 20 70 53 65 67 2d       *pn = pSeg-
24df0 3e 6e 50 6f 73 3b 0a 20 20 20 20 20 20 2a 70 70  >nPos;.      *pp
24e00 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 7d 65 6c   = pPos;.    }el
24e10 73 65 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e  se if( pColset->
24e20 6e 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nCol==1 ){.     
24e30 20 2a 70 70 20 3d 20 70 50 6f 73 3b 0a 20 20 20   *pp = pPos;.   
24e40 20 20 20 2a 70 6e 20 3d 20 66 74 73 35 49 6e 64     *pn = fts5Ind
24e50 65 78 45 78 74 72 61 63 74 43 6f 6c 28 70 70 2c  exExtractCol(pp,
24e60 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 70 43 6f   pSeg->nPos, pCo
24e70 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
24e80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
24e90 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f    fts5BufferZero
24ea0 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74  (&pIter->poslist
24eb0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64  );.      fts5Ind
24ec0 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65 74 28  exExtractColset(
24ed0 70 43 6f 6c 73 65 74 2c 20 70 50 6f 73 2c 20 70  pColset, pPos, p
24ee0 53 65 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65  Seg->nPos, &pIte
24ef0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
24f00 20 20 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e     *pp = pIter->
24f10 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 20  poslist.p;.     
24f20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pn = pIter->po
24f30 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20  slist.n;.    }. 
24f40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74 73 35   }else{.    fts5
24f50 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65  BufferZero(&pIte
24f60 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
24f70 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73 6c   fts5SegiterPosl
24f80 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e 64 65  ist(pIter->pInde
24f90 78 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65 74  x, pSeg, pColset
24fa0 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  , &pIter->poslis
24fb0 74 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 49  t);.    *pp = pI
24fc0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a  ter->poslist.p;.
24fd0 20 20 20 20 2a 70 6e 20 3d 20 70 49 74 65 72 2d      *pn = pIter-
24fe0 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d 0a  >poslist.n;.  }.
24ff0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
25000 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
25010 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
25020 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
25030 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 73 71  is similar to sq
25040 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73  lite3Fts5IterPos
25050 6c 69 73 74 28 29 2c 20 65 78 63 65 70 74 20 74  list(), except t
25060 68 61 74 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73  hat it.** copies
25070 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
25080 73 74 20 69 6e 74 6f 20 74 68 65 20 62 75 66 66  st into the buff
25090 65 72 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  er supplied as t
250a0 68 65 20 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72  he second .** ar
250b0 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
250c0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
250d0 73 6c 69 73 74 42 75 66 66 65 72 28 46 74 73 35  slistBuffer(Fts5
250e0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
250f0 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
25100 75 66 29 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  uf){.  Fts5Index
25110 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e   *p = pIter->pIn
25120 64 65 78 3b 0a 20 20 46 74 73 35 53 65 67 49 74  dex;.  Fts5SegIt
25130 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
25140 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
25150 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
25160 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   ];.  assert( p-
25170 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
25180 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65  ;.  fts5BufferZe
25190 72 6f 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35  ro(pBuf);.  fts5
251a0 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
251b0 2c 20 70 53 65 67 2c 20 30 2c 20 70 42 75 66 29  , pSeg, 0, pBuf)
251c0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
251d0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
251e0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e  ../*.** Close an
251f0 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64   iterator opened
25200 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
25210 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74  all to sqlite3Ft
25220 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a  s5IndexQuery()..
25230 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46  */.void sqlite3F
25240 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73  ts5IterClose(Fts
25250 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
25260 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
25270 29 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78  ){.    Fts5Index
25280 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72   *pIndex = pIter
25290 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74  ->pIndex;.    ft
252a0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
252b0 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
252c0 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43  Iter);.    fts5C
252d0 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65  loseReader(pInde
252e0 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  x);.  }.}../*.**
252f0 20 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65   Read and decode
25300 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
25310 72 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20  record from the 
25320 64 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a  database. .**.**
25330 20 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a   Parameter anSiz
25340 65 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20  e must point to 
25350 61 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65  an array of size
25360 20 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f   nCol, where nCo
25370 6c 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  l is.** the numb
25380 65 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e  er of user defin
25390 65 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ed columns in th
253a0 65 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a  e FTS table..*/.
253b0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
253c0 6e 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28  ndexGetAverages(
253d0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
253e0 34 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61  4 *pnRow, i64 *a
253f0 6e 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43  nSize){.  int nC
25400 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  ol = p->pConfig-
25410 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74  >nCol;.  Fts5Dat
25420 61 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e  a *pData;..  *pn
25430 52 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  Row = 0;.  memse
25440 74 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a  t(anSize, 0, siz
25450 65 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29  eof(i64) * nCol)
25460 3b 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35  ;.  pData = fts5
25470 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35  DataRead(p, FTS5
25480 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29  _AVERAGES_ROWID)
25490 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
254a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74  QLITE_OK && pDat
254b0 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74  a->nn ){.    int
254c0 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20   i = 0;.    int 
254d0 69 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66  iCol;.    i += f
254e0 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
254f0 61 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a  ata->p[i], (u64*
25500 29 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72  )pnRow);.    for
25510 28 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61  (iCol=0; i<pData
25520 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f  ->nn && iCol<nCo
25530 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
25540 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
25550 72 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69  rint(&pData->p[i
25560 5d 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65  ], (u64*)&anSize
25570 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20  [iCol]);.    }. 
25580 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
25590 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20  lease(pData);.  
255a0 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
255b0 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
255c0 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
255d0 63 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65  current "average
255e0 73 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74  s" record with t
255f0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
25600 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75  he buffer .** su
25610 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
25620 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
25630 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
25640 35 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65  5IndexSetAverage
25650 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  s(Fts5Index *p, 
25660 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c  const u8 *pData,
25670 20 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61   int nData){.  a
25680 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
25690 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
256a0 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54  5DataWrite(p, FT
256b0 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49  S5_AVERAGES_ROWI
256c0 44 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29  D, pData, nData)
256d0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
256e0 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
256f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
25700 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
25710 6f 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d  of blocks this m
25720 6f 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66  odule has read f
25730 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a  rom the %_data.*
25740 2a 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74  * table since it
25750 20 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f   was created..*/
25760 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
25770 49 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49  IndexReads(Fts5I
25780 6e 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75  ndex *p){.  retu
25790 72 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a  rn p->nRead;.}..
257a0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32  /*.** Set the 32
257b0 2d 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75  -bit cookie valu
257c0 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  e stored at the 
257d0 73 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72  start of all str
257e0 75 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72  ucture .** recor
257f0 64 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  ds to the value 
25800 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
25810 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  cond argument..*
25820 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
25830 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73  TE_OK if success
25840 66 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74  ful, or an SQLit
25850 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
25860 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  an error.** occu
25870 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
25880 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f  e3Fts5IndexSetCo
25890 6f 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a  okie(Fts5Index *
258a0 70 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20  p, int iNew){.  
258b0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
258e0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e  ode */.  Fts5Con
258f0 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
25900 2d 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a  ->pConfig;    /*
25910 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   Configuration o
25920 62 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43  bject */.  u8 aC
25930 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20  ookie[4];       
25940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25950 2f 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73  /* Binary repres
25960 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77  entation of iNew
25970 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c   */.  sqlite3_bl
25980 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a  ob *pBlob = 0;..
25990 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
259a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
259b0 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32  sqlite3Fts5Put32
259c0 28 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b  (aCookie, iNew);
259d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
259e0 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66  _blob_open(pConf
259f0 69 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d  ig->db, pConfig-
25a00 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62  >zDb, p->zDataTb
25a10 6c 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b  l, .      "block
25a20 22 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52  ", FTS5_STRUCTUR
25a30 45 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c  E_ROWID, 1, &pBl
25a40 6f 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  ob.  );.  if( rc
25a50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25a60 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f     sqlite3_blob_
25a70 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f  write(pBlob, aCo
25a80 6f 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20  okie, 4, 0);.   
25a90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c   rc = sqlite3_bl
25aa0 6f 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b  ob_close(pBlob);
25ab0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
25ac0 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  c;.}..int sqlite
25ad0 33 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f  3Fts5IndexLoadCo
25ae0 6e 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a  nfig(Fts5Index *
25af0 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  p){.  Fts5Struct
25b00 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
25b10 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
25b20 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
25b30 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
25b40 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b  elease(pStruct);
25b50 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
25b60 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
25b70 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
25b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
25bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 2a 2a 20 42 65 6c 6f 77  *******.** Below
25c10 20 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74   this point is t
25c20 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
25c30 6e 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69  n of the integri
25c40 74 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e  ty-check .** fun
25c50 63 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a  ctionality..*/..
25c60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  /*.** Return a s
25c70 69 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76  imple checksum v
25c80 61 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68  alue based on th
25c90 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a  e arguments..*/.
25ca0 73 74 61 74 69 63 20 75 36 34 20 66 74 73 35 49  static u64 fts5I
25cb0 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a  ndexEntryCksum(.
25cc0 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20    i64 iRowid, . 
25cd0 20 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e   int iCol, .  in
25ce0 74 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69  t iPos, .  int i
25cf0 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Idx,.  const cha
25d00 72 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20  r *pTerm,.  int 
25d10 6e 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69  nTerm.){.  int i
25d20 3b 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52  ;.  u64 ret = iR
25d30 6f 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28  owid;.  ret += (
25d40 72 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a  ret<<3) + iCol;.
25d50 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33    ret += (ret<<3
25d60 29 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20  ) + iPos;.  if( 
25d70 69 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d  iIdx>=0 ) ret +=
25d80 20 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53   (ret<<3) + (FTS
25d90 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20  5_MAIN_PREFIX + 
25da0 69 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30  iIdx);.  for(i=0
25db0 3b 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20  ; i<nTerm; i++) 
25dc0 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20  ret += (ret<<3) 
25dd0 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65  + pTerm[i];.  re
25de0 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66  turn ret;.}..#if
25df0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
25e00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
25e10 74 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61  tion is purely a
25e20 6e 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e  n internal test.
25e30 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e   It does not con
25e40 74 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46  tribute to .** F
25e50 54 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79  TS functionality
25e60 2c 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e  , or even the in
25e70 74 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69  tegrity-check, i
25e80 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a  n any way..**.**
25e90 20 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73   Instead, it tes
25ea0 74 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  ts that the same
25eb0 20 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77   set of pgno/row
25ec0 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  id combinations 
25ed0 61 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20  are .** visited 
25ee0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68  regardless of wh
25ef0 65 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73  ether the doclis
25f00 74 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69  t-index identifi
25f10 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73  ed by parameters
25f20 0a 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66  .** iSegid/iLeaf
25f30 20 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20   is iterated in 
25f40 66 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65  forwards or reve
25f50 72 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  rse order..*/.st
25f60 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65  atic void fts5Te
25f70 73 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a  stDlidxReverse(.
25f80 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25f90 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20  .  int iSegid,  
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fb0 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64     /* Segment id
25fc0 20 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f   to load from */
25fd0 0a 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20  .  int iLeaf    
25fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ff0 20 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69     /* Load docli
26000 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69  st-index for thi
26010 73 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46  s leaf */.){.  F
26020 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
26030 6c 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20  lidx = 0;.  u64 
26040 63 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75  cksum1 = 13;.  u
26050 36 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a  64 cksum2 = 13;.
26060 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
26070 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
26080 70 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 0, iSegid, iL
26090 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
260a0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
260b0 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
260c0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
260d0 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  ext(p, pDlidx). 
260e0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
260f0 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
26100 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
26110 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
26120 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
26130 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
26140 73 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61  ssert( pgno>iLea
26150 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20  f );.    cksum1 
26160 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
26170 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
26180 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
26190 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
261a0 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66  pDlidx = 0;..  f
261b0 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
261c0 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31  idxIterInit(p, 1
261d0 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29  , iSegid, iLeaf)
261e0 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
261f0 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
26200 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
26210 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
26220 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  p, pDlidx).  ){.
26230 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
26240 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
26250 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  wid(pDlidx);.   
26260 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35   int pgno = fts5
26270 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
26280 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72  lidx);.    asser
26290 74 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  t( fts5DlidxIter
262a0 50 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65  Pgno(pDlidx)>iLe
262b0 61 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32  af );.    cksum2
262c0 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69   += iRowid + ((i
262d0 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20  64)pgno<<32);.  
262e0 7d 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65  }.  fts5DlidxIte
262f0 72 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20  rFree(pDlidx);. 
26300 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20   pDlidx = 0;..  
26310 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
26320 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d  E_OK && cksum1!=
26330 63 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d  cksum2 ) p->rc =
26340 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d   FTS5_CORRUPT;.}
26350 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  ..static int fts
26360 35 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46  5QueryCksum(.  F
26370 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26390 2a 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a  * Fts5 index obj
263a0 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64  ect */.  int iId
263b0 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  x,.  const char 
263c0 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *z,             
263d0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65       /* Index ke
263e0 79 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a  y to query for *
263f0 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
26400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26410 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69      /* Size of i
26420 6e 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65  ndex key in byte
26430 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  s */.  int flags
26440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26450 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
26460 66 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65  for Fts5IndexQue
26470 72 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b  ry */.  u64 *pCk
26480 73 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  sum             
26490 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
264a0 54 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75  T: Checksum valu
264b0 65 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b  e */.){.  u64 ck
264c0 73 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20  sum = *pCksum;. 
264d0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
264e0 70 49 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20  pIdxIter = 0;.  
264f0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
26500 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70  Fts5IndexQuery(p
26510 2c 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30  , z, n, flags, 0
26520 2c 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20  , &pIdxIter);.. 
26530 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
26540 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69  TE_OK && 0==sqli
26550 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70  te3Fts5IterEof(p
26560 49 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20  IdxIter) ){.    
26570 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 63  i64 dummy;.    c
26580 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a 20  onst u8 *pPos;. 
26590 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
265a0 20 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c   i64 rowid = sql
265b0 69 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69  ite3Fts5IterRowi
265c0 64 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20  d(pIdxIter);.   
265d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
265e0 35 49 74 65 72 50 6f 73 6c 69 73 74 28 70 49 64  5IterPoslist(pId
265f0 78 49 74 65 72 2c 20 30 2c 20 26 70 50 6f 73 2c  xIter, 0, &pPos,
26600 20 26 6e 50 6f 73 2c 20 26 64 75 6d 6d 79 29 3b   &nPos, &dummy);
26610 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
26620 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
26630 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
26640 72 20 73 52 65 61 64 65 72 3b 0a 20 20 20 20 20  r sReader;.     
26650 20 66 6f 72 28 73 71 6c 69 74 65 33 46 74 73 35   for(sqlite3Fts5
26660 50 6f 73 6c 69 73 74 52 65 61 64 65 72 49 6e 69  PoslistReaderIni
26670 74 28 70 50 6f 73 2c 20 6e 50 6f 73 2c 20 26 73  t(pPos, nPos, &s
26680 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20  Reader);.       
26690 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d     sReader.bEof=
266a0 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  =0;.          sq
266b0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
266c0 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61  ReaderNext(&sRea
266d0 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  der).      ){.  
266e0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
266f0 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
26700 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
26710 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
26720 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
26730 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  ET(sReader.iPos)
26740 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
26750 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
26760 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43  yCksum(rowid, iC
26770 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20  ol, iOff, iIdx, 
26780 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
26790 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
267a0 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49  3Fts5IterNext(pI
267b0 64 78 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  dxIter);.    }. 
267c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   }.  sqlite3Fts5
267d0 49 74 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74  IterClose(pIdxIt
267e0 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20  er);..  *pCksum 
267f0 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72  = cksum;.  retur
26800 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
26810 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
26820 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20   also purely an 
26830 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
26840 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
26850 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
26860 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
26870 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
26880 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
26890 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74  any way..*/.stat
268a0 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
268b0 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
268c0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66  x *p, .  Fts5Buf
268d0 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20  fer *pPrev,     
268e0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
268f0 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63  ious term */.  c
26900 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
26910 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  t n,           /
26920 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74  * Possibly new t
26930 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  erm to test */. 
26940 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20   u64 expected,. 
26950 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a   u64 *pCksum.){.
26960 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
26970 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e  ;.  if( pPrev->n
26980 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  ==0 ){.    fts5B
26990 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
269a0 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
269b0 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  8*)z);.  }else. 
269c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
269d0 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21  OK && (pPrev->n!
269e0 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72  =n || memcmp(pPr
269f0 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b  ev->p, z, n)) ){
26a00 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20  .    u64 cksum3 
26a10 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63  = *pCksum;.    c
26a20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
26a30 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
26a40 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f  &pPrev->p[1];  /
26a50 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66  * term sans pref
26a60 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ix-byte */.    i
26a70 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76  nt nTerm = pPrev
26a80 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20  ->n-1;          
26a90 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
26aa0 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
26ab0 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70     int iIdx = (p
26ac0 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53  Prev->p[0] - FTS
26ad0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a  5_MAIN_PREFIX);.
26ae0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
26af0 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46  (iIdx==0 ? 0 : F
26b00 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
26b10 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20  REFIX);.    u64 
26b20 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  ck1 = 0;.    u64
26b30 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   ck2 = 0;..    /
26b40 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
26b50 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
26b60 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45  d for ASC and DE
26b70 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20  SC queries are. 
26b80 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
26b90 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
26ba0 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
26bb0 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51  /.    rc = fts5Q
26bc0 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
26bd0 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
26be0 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
26bf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
26c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
26c10 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
26c20 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
26c30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
26c40 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
26c50 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
26c60 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
26c70 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
26c80 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
26c90 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
26ca0 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f  _CORRUPT;..    /
26cb0 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
26cc0 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65  refix query, che
26cd0 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
26ce0 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20  lts returned if 
26cf0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  the.    ** the i
26d00 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
26d10 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
26d20 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
26d30 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20  ESC order. .    
26d40 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63  **.    ** This c
26d50 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65  heck may only be
26d60 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
26d70 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20  e hash table is 
26d80 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20  empty. This.    
26d90 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68  ** is because th
26da0 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c  e hash table onl
26db0 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e  y supports a sin
26dc0 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61  gle scan query a
26dd0 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c  t.    ** a time,
26de0 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69   and the multi-i
26df0 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68  ter loop from wh
26e00 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ich this functio
26e10 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  n is called.    
26e20 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65  ** is already pe
26e30 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20  rforming such a 
26e40 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
26e50 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
26e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
26e70 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
26e80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
26e90 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
26ea0 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
26eb0 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20  Y_TEST_NOIDX;.  
26ec0 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
26ed0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
26ee0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
26ef0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
26f00 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
26f10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26f20 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
26f30 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
26f40 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
26f50 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
26f60 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
26f70 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
26f80 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
26f90 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
26fa0 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51  OIDX|FTS5INDEX_Q
26fb0 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
26fc0 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
26fd0 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
26fe0 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
26ff0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
27000 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20  , &ck2);.       
27010 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27020 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
27030 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
27040 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
27050 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d  }..    cksum3 ^=
27060 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75   ck1;.    fts5Bu
27070 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
27080 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
27090 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  *)z);..    if( r
270a0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
270b0 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64  cksum3!=expected
270c0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
270d0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
270e0 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d   }.    *pCksum =
270f0 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70   cksum3;.  }.  p
27100 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23  ->rc = rc;.}. .#
27110 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
27120 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
27130 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69  se(x,y,z).# defi
27140 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  ne fts5TestTerm(
27150 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
27160 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
27170 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31   that:.**.**   1
27180 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
27190 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69  pSeg between iFi
271a0 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69  rst and iLast (i
271b0 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
271c0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
271d0 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a  ain zero terms..
271e0 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76  **   2) 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 4e 6f 52 6f 77 69 64 20 61 6e 64 20  en iNoRowid and 
27210 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
27220 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
27230 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
27240 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
27250 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
27260 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
27270 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65  mpty(.  Fts5Inde
27280 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75  x *p,.  Fts5Stru
27290 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
272a0 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg,     /* Segme
272b0 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
272c0 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
272d0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
272e0 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64  ,.  int iNoRowid
272f0 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b  ,.  int iLast.){
27300 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
27310 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
27320 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
27330 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
27340 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
27350 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20  .  ** (a) exist 
27360 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
27370 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66  no terms. */.  f
27380 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e  or(i=iFirst; p->
27390 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
273a0 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b   i<=iLast; i++){
273b0 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
273c0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
273d0 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
273e0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
273f0 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20  iSegid, i));.   
27400 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
27410 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61      if( !fts5Lea
27420 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61  fIsTermless(pLea
27430 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
27440 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
27450 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64   if( i>=iNoRowid
27460 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46   && 0!=fts5LeafF
27470 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
27480 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
27490 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
274a0 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
274b0 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
274c0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
274d0 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
274e0 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64  eckPgidx(Fts5Ind
274f0 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20  ex *p, Fts5Data 
27500 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69  *pLeaf){.  int i
27510 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69  TermOff = 0;.  i
27520 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75  nt ii;..  Fts5Bu
27530 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30  ffer buf1 = {0,0
27540 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ,0};.  Fts5Buffe
27550 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d  r buf2 = {0,0,0}
27560 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d  ;..  ii = pLeaf-
27570 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65  >szLeaf;.  while
27580 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26  ( ii<pLeaf->nn &
27590 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
275a0 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  OK ){.    int re
275b0 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  s;.    int iOff;
275c0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a  .    int nIncr;.
275d0 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47  .    ii += fts5G
275e0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
275f0 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29  f->p[ii], nIncr)
27600 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
27610 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66  = nIncr;.    iOf
27620 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
27630 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
27640 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
27650 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
27660 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
27670 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
27680 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20  ==nIncr ){.     
27690 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
276a0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
276b0 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
276c0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
276d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f  );.      if( (iO
276e0 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
276f0 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
27700 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
27710 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
27720 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
27730 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
27740 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
27750 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
27760 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
27770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
27780 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20   nKeep, nByte;. 
27790 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
277a0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
277b0 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b  eaf->p[iOff], nK
277c0 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  eep);.      iOff
277d0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
277e0 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
277f0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
27800 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66     if( nKeep>buf
27810 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79  1.n || (iOff+nBy
27820 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
27830 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
27840 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
27850 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
27860 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d          buf1.n =
27870 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
27880 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
27890 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
278a0 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
278b0 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
278c0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
278d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
278e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
278f0 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
27900 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32  are(&buf1, &buf2
27910 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27920 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  es<=0 ) p->rc = 
27930 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
27940 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27950 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
27960 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66  ->rc, &buf2, buf
27970 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20  1.n, buf1.p);.  
27980 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  }..  fts5BufferF
27990 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74  ree(&buf1);.  ft
279a0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
279b0 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  f2);.}..static v
279c0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
279d0 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
279e0 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
279f0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
27a00 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
27a10 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
27a20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
27a30 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20  egment *pSeg    
27a40 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
27a50 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
27a60 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b  onsistency */.){
27a70 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
27a80 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
27a90 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  fig;.  sqlite3_s
27aa0 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
27ab0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74    int rc2;.  int
27ac0 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
27ad0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
27ae0 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50  1;.  int iDlidxP
27af0 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
27b00 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28  pgnoLast;..  if(
27b10 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
27b20 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
27b30 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
27b40 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c  eStmt(p, &pStmt,
27b50 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
27b60 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  (.      "SELECT 
27b70 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67  segid, term, (pg
27b80 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29  no>>1), (pgno&1)
27b90 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78   FROM %Q.'%q_idx
27ba0 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64  ' WHERE segid=%d
27bb0 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ",.      pConfig
27bc0 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
27bd0 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65  zName, pSeg->iSe
27be0 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  gid.  ));..  /* 
27bf0 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
27c00 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
27c10 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c  rchy.  */.  whil
27c20 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
27c30 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
27c40 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
27c50 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36  pStmt) ){.    i6
27c60 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
27c70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
27c80 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65  owid for this le
27c90 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  af */.    Fts5Da
27ca0 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
27cb0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
27cc0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
27cd0 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65  ..    int nIdxTe
27ce0 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rm = sqlite3_col
27cf0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
27d00 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
27d10 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20  har *zIdxTerm = 
27d20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
27d30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
27d40 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
27d50 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73  int iIdxLeaf = s
27d60 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
27d70 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
27d80 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d   int bIdxDlidx =
27d90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
27da0 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a  int(pStmt, 3);..
27db0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
27dc0 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
27dd0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
27de0 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
27df0 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
27e00 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
27e10 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
27e20 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
27e30 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
27e40 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c     if( iIdxLeaf<
27e50 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
27e60 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
27e70 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
27e80 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
27e90 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
27ea0 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
27eb0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
27ec0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
27ed0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
27ee0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
27ef0 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
27f00 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
27f10 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
27f20 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
27f30 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
27f40 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
27f50 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e  key in zIdxTerm.
27f60 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61    Also check tha
27f70 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a  t if there.    *
27f80 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69  * is also a rowi
27f90 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  d pointer within
27fa0 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68   the leaf page h
27fb0 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73  eader, it points
27fc0 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63   to a.    ** loc
27fd0 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65  ation before the
27fe0 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69   term.  */.    i
27ff0 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c  f( pLeaf->nn<=pL
28000 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
28010 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
28020 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
28030 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
28040 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
28050 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
28060 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
28070 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
28080 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20   int iRowidOff; 
28090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
280a0 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
280b0 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f  rowid on leaf */
280c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
280d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
280e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
280f0 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79  rm on leaf in by
28100 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tes */.      int
28110 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
28120 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
28130 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61  arison of term a
28140 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a  nd split-key */.
28150 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
28160 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
28170 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
28180 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
28190 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
281a0 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
281b0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
281c0 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  iOff ){.        
281d0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
281e0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
281f0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
28200 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
28210 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
28220 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  f], nTerm);.    
28230 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
28240 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
28250 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28  , zIdxTerm, MIN(
28260 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29  nTerm, nIdxTerm)
28270 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
28280 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54  es==0 ) res = nT
28290 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a  erm - nIdxTerm;.
282a0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
282b0 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
282c0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
282d0 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74  }..      fts5Int
282e0 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
282f0 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  (p, pLeaf);.    
28300 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
28310 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
28320 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
28330 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  eak;..    /* Now
28340 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   check that the 
28350 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61 76  iter.nEmpty leav
28360 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  es following the
28370 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20 20   current leaf.  
28380 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20 61    ** (a) exist a
28390 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20 6e  nd (b) contain n
283a0 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20 20  o terms. */.    
283b0 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
283c0 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20  tyCheckEmpty(.  
283d0 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20 69        p, pSeg, i
283e0 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20 69  IdxPrevLeaf+1, i
283f0 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31 2c  DlidxPrevLeaf+1,
28400 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20 20   iIdxLeaf-1.    
28410 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
28420 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f   ) break;..    /
28430 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
28440 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20 63  doclist-index, c
28450 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f 6f  heck that it loo
28460 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20 20  ks right. */.   
28470 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20 29   if( bIdxDlidx )
28480 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69 64  {.      Fts5Dlid
28490 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
284a0 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61  0;  /* For itera
284b0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f 63  ting through doc
284c0 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
284d0 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65 61      int iPrevLea
284e0 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20 20  f = iIdxLeaf;.  
284f0 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
28500 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20   pSeg->iSegid;. 
28510 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20 30       int iPg = 0
28520 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65 79  ;.      i64 iKey
28530 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44 6c  ;..      for(pDl
28540 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65  idx=fts5DlidxIte
28550 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67  rInit(p, 0, iSeg
28560 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a 20  id, iIdxLeaf);. 
28570 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c 69           fts5Dli
28580 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
28590 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20  idx)==0;.       
285a0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
285b0 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a  Next(p, pDlidx).
285c0 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20 20        ){..      
285d0 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20 72    /* Check any r
285e0 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73 20  owid-less pages 
285f0 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f 72  that occur befor
28600 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  e the current le
28610 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  af. */.        f
28620 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61 66  or(iPg=iPrevLeaf
28630 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69 64  +1; iPg<fts5Dlid
28640 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
28650 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20  ); iPg++){.     
28660 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53 35       iKey = FTS5
28670 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
28680 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20 20  Segid, iPg);.   
28690 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 66         pLeaf = f
286a0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
286b0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
286c0 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20 20  if( pLeaf ){.   
286d0 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74 73           if( fts
286e0 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
286f0 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20 70  ff(pLeaf)!=0 ) p
28700 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
28710 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20  UPT;.           
28720 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
28730 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
28740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
28750 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61 66         iPrevLeaf
28760 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
28770 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20  Pgno(pDlidx);.. 
28780 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20         /* Check 
28790 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70 61  that the leaf pa
287a0 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ge indicated by 
287b0 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61  the iterator rea
287c0 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20 20  lly does.       
287d0 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   ** contain the 
287e0 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64 20  rowid suggested 
287f0 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f 0a  by the same. */.
28800 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
28810 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
28820 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76 4c  D(iSegid, iPrevL
28830 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4c  eaf);.        pL
28840 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65  eaf = fts5DataRe
28850 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20  ad(p, iKey);.   
28860 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29       if( pLeaf )
28870 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34 20  {.          i64 
28880 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20  iRowid;.        
28890 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
288a0 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
288b0 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b 0a  owidOff(pLeaf);.
288c0 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52 54            ASSERT
288d0 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66  _SZLEAF_OK(pLeaf
288e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
288f0 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61   iRowidOff>=pLea
28900 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
28910 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
28920 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
28930 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
28940 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
28950 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61 66  GetVarint(&pLeaf
28960 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c 20  ->p[iRowidOff], 
28970 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
28980 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28990 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69 64  iRowid!=fts5Dlid
289a0 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64  xIterRowid(pDlid
289b0 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  x) ) p->rc = FTS
289c0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
289d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
289e0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
289f0 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  (pLeaf);.       
28a00 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
28a10 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66    iDlidxPrevLeaf
28a20 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66 74   = iPg;.      ft
28a30 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65 28  s5DlidxIterFree(
28a40 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 66  pDlidx);.      f
28a50 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
28a60 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20 69  rse(p, iSegid, i
28a70 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d 65  IdxLeaf);.    }e
28a80 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69 64  lse{.      iDlid
28a90 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67  xPrevLeaf = pSeg
28aa0 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20  ->pgnoLast;.    
28ab0 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b    /* TODO: Check
28ac0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f 63   there is no doc
28ad0 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20 20  list index */.  
28ae0 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72 65    }..    iIdxPre
28af0 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66  vLeaf = iIdxLeaf
28b00 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20 73  ;.  }..  rc2 = s
28b10 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
28b20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 2d  pStmt);.  if( p-
28b30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
28b40 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a 20   p->rc = rc2;.. 
28b50 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69 4c   /* Page iter.iL
28b60 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65 20  eaf must now be 
28b70 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c 65  the rightmost le
28b80 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20 73  af-page in the s
28b90 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30 0a  egment */.#if 0.
28ba0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
28bb0 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e 69  ITE_OK && iter.i
28bc0 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e 6f  Leaf!=pSeg->pgno
28bd0 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e 72  Last ){.    p->r
28be0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
28bf0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a  ;.  }.#endif.}..
28c00 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65 72  ./*.** Run inter
28c10 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65 6e  nal checks to en
28c20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46 54  sure that the FT
28c30 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20 69  S index (a) is i
28c40 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63 6f  nternally .** co
28c50 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62 29  nsistent and (b)
28c60 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69 65   contains entrie
28c70 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  s for which the 
28c80 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63 6b  XOR of the check
28c90 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63 75  sums.** as calcu
28ca0 6c 61 74 65 64 20 62 79 20 66 74 73 35 49 6e 64  lated by fts5Ind
28cb0 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20 69  exEntryCksum() i
28cc0 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20 52  s cksum..**.** R
28cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
28ce0 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20 74  RUPT if any of t
28cf0 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65 63  he internal chec
28d00 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20 74  ks fail, or if t
28d10 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20 64  he.** checksum d
28d20 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 52  oes not match. R
28d30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
28d40 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70 61  if all checks pa
28d50 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65 72  ss without.** er
28d60 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74 68  ror, or some oth
28d70 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  er SQLite error 
28d80 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72 20  code if another 
28d90 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d 29  error (e.g. OOM)
28da0 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69  .** occurs..*/.i
28db0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
28dc0 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
28dd0 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  k(Fts5Index *p, 
28de0 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 75 36  u64 cksum){.  u6
28df0 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20  4 cksum2 = 0;   
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e10 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20   Checksum based 
28e20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69  on contents of i
28e30 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35  ndexes */.  Fts5
28e40 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d  Buffer poslist =
28e50 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42   {0,0,0};   /* B
28e60 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f  uffer used to ho
28e70 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  ld a poslist */.
28e80 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
28e90 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20 20  *pIter;         
28ea0 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
28eb0 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74  rate through ent
28ec0 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46  ire index */.  F
28ed0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
28ee0 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f  truct;         /
28ef0 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75 72  * Index structur
28f00 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64 20  e */..  /* Used 
28f10 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e 61  by extra interna
28f20 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75 6e  l tests only run
28f30 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f   if NDEBUG is no
28f40 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20 75  t defined */.  u
28f50 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20 20  64 cksum3 = 0;  
28f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28f70 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
28f80 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
28f90 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
28fa0 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20 7b  5Buffer term = {
28fb0 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a 20  0,0,0};      /* 
28fc0 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
28fd0 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  old most recent 
28fe0 74 65 72 6d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  term */.  .  /* 
28ff0 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e 64  Load the FTS ind
29000 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ex structure */.
29010 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
29020 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
29030 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
29040 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  at the internal 
29050 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73 65  nodes of each se
29060 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65 20  gment match the 
29070 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28 20  leaves */.  if( 
29080 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
29090 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
290a0 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
290b0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
290c0 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
290d0 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
290e0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
290f0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
29100 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
29110 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
29120 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
29130 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
29140 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d  iLvl].aSeg[iSeg]
29150 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49 6e  ;.        fts5In
29160 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
29170 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65 67  kSegment(p, pSeg
29180 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29190 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
291a0 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70 61  ksum argument pa
291b0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
291c0 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63 6b  ction is a check
291d0 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a 20  sum calculated. 
291e0 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c 6c   ** based on all
291f0 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69 65   expected entrie
29200 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e 64  s in the FTS ind
29210 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70 72  ex (including pr
29220 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a 20  efix index.  ** 
29230 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20 62  entries). This b
29240 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61 74  lock checks that
29250 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63   a checksum calc
29260 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
29270 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
29280 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53 20  contents of FTS 
29290 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69 63  index is identic
292a0 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 77  al..  **.  ** Tw
292b0 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68  o versions of th
292c0 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d 20  e same checksum 
292d0 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e 20  are calculated. 
292e0 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63 6b  The first (stack
292f0 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20 63  .  ** variable c
29300 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e 20  ksum2) based on 
29310 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74 65  entries extracte
29320 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c 2d  d from the full-
29330 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a 20  text index.  ** 
29340 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c 69  while doing a li
29350 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61 63  near scan of eac
29360 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e 64  h individual ind
29370 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20 2a  ex in turn. .  *
29380 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20 74  *.  ** As each t
29390 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20 74  erm visited by t
293a0 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73 2c  he linear scans,
293b0 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65 72   a separate quer
293c0 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  y for the.  ** s
293d0 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72 66  ame term is perf
293e0 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69 73  ormed. cksum3 is
293f0 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73 65   calculated base
29400 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65 73  d on the entries
29410 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20  .  ** extracted 
29420 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65 73  by these queries
29430 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74 73  ..  */.  for(fts
29440 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c  5MultiIterNew(p,
29450 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20   pStruct, 0, 0, 
29460 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70 49  0, 0, -1, 0, &pI
29470 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ter);.      fts5
29480 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
29490 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  pIter)==0;.     
294a0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
294b0 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20  xt(p, pIter, 0, 
294c0 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  0).  ){.    int 
294d0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
294e0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
294f0 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65 73  of term in bytes
29500 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f 73   */.    i64 iPos
29510 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
29520 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
29530 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69 73  read from poslis
29540 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 66  t */.    int iOf
29550 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  f = 0;          
29560 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 77       /* Offset w
29570 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a 2f  ithin poslist */
29580 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20  .    i64 iRowid 
29590 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52  = fts5MultiIterR
295a0 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20 20  owid(pIter);.   
295b0 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61 72   char *z = (char
295c0 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
295d0 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
295e0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
295f0 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20 71  is a new term, q
29600 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70 64  uery for it. Upd
29610 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68 20  ate cksum3 with 
29620 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f 0a  the results. */.
29630 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72 6d      fts5TestTerm
29640 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e 2c  (p, &term, z, n,
29650 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
29660 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69 73 74 2e  );..    poslist.
29670 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 53  n = 0;.    fts5S
29680 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 2c  egiterPoslist(p,
29690 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70 49   &pIter->aSeg[pI
296a0 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
296b0 46 69 72 73 74 5d 20 2c 20 30 2c 20 26 70 6f 73  First] , 0, &pos
296c0 6c 69 73 74 29 3b 0a 20 20 20 20 77 68 69 6c 65  list);.    while
296d0 28 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  ( 0==sqlite3Fts5
296e0 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 70 6f  PoslistNext64(po
296f0 73 6c 69 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74  slist.p, poslist
29700 2e 6e 2c 20 26 69 4f 66 66 2c 20 26 69 50 6f 73  .n, &iOff, &iPos
29710 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ) ){.      int i
29720 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43  Col = FTS5_POS2C
29730 4f 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20  OLUMN(iPos);.   
29740 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d     int iTokOff =
29750 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
29760 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 63 6b  (iPos);.      ck
29770 73 75 6d 32 20 5e 3d 20 66 74 73 35 49 6e 64 65  sum2 ^= fts5Inde
29780 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77  xEntryCksum(iRow
29790 69 64 2c 20 69 43 6f 6c 2c 20 69 54 6f 6b 4f 66  id, iCol, iTokOf
297a0 66 2c 20 2d 31 2c 20 7a 2c 20 6e 29 3b 0a 20 20  f, -1, z, n);.  
297b0 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54 65    }.  }.  fts5Te
297c0 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d 2c  stTerm(p, &term,
297d0 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20 26   0, 0, cksum2, &
297e0 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73 35  cksum3);..  fts5
297f0 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 2c  MultiIterFree(p,
29800 20 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70   pIter);.  if( p
29810 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
29820 26 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32  && cksum!=cksum2
29830 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f   ) p->rc = FTS5_
29840 43 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35  CORRUPT;..  fts5
29850 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
29860 28 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73  (pStruct);.  fts
29870 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
29880 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
29890 46 72 65 65 28 26 70 6f 73 6c 69 73 74 29 3b 0a  Free(&poslist);.
298a0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
298b0 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
298c0 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65  ./*.** Calculate
298d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
298e0 65 63 6b 73 75 6d 20 74 68 61 74 20 69 73 20 74  ecksum that is t
298f0 68 65 20 58 4f 52 20 6f 66 20 74 68 65 20 69 6e  he XOR of the in
29900 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 63 68 65  dex entry.** che
29910 63 6b 73 75 6d 20 6f 66 20 61 6c 6c 20 65 6e 74  cksum of all ent
29920 72 69 65 73 20 74 68 61 74 20 77 6f 75 6c 64 20  ries that would 
29930 62 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  be generated by 
29940 74 68 65 20 74 6f 6b 65 6e 20 73 70 65 63 69 66  the token specif
29950 69 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 69  ied.** by the fi
29960 6e 61 6c 20 35 20 61 72 67 75 6d 65 6e 74 73 2e  nal 5 arguments.
29970 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46  .*/.u64 sqlite3F
29980 74 73 35 49 6e 64 65 78 43 6b 73 75 6d 28 0a 20  ts5IndexCksum(. 
29990 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
299a0 6e 66 69 67 2c 20 20 20 20 20 20 20 20 20 20 20  nfig,           
299b0 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
299c0 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  n object */.  i6
299d0 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
299e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
299f0 20 44 6f 63 75 6d 65 6e 74 20 74 65 72 6d 20 61   Document term a
29a00 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69  ppears in */.  i
29a10 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt iCol,        
29a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29a30 2a 20 43 6f 6c 75 6d 6e 20 74 65 72 6d 20 61 70  * Column term ap
29a40 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 69 6e  pears in */.  in
29a50 74 20 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20  t iPos,         
29a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29a70 20 50 6f 73 69 74 69 6f 6e 20 74 65 72 6d 20 61   Position term a
29a80 70 70 65 61 72 73 20 69 6e 20 2a 2f 0a 20 20 63  ppears in */.  c
29a90 6f 6e 73 74 20 63 68 61 72 20 2a 70 54 65 72 6d  onst char *pTerm
29aa0 2c 20 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 2f  , int nTerm    /
29ab0 2a 20 54 65 72 6d 20 61 74 20 69 50 6f 73 20 2a  * Term at iPos *
29ac0 2f 0a 29 7b 0a 20 20 75 36 34 20 72 65 74 20 3d  /.){.  u64 ret =
29ad0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
29ae0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
29af0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20   value */.  int 
29b00 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  iIdx;           
29b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
29b20 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
29b30 6f 75 67 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a  ough indexes */.
29b40 0a 20 20 72 65 74 20 3d 20 66 74 73 35 49 6e 64  .  ret = fts5Ind
29b50 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f  exEntryCksum(iRo
29b60 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c  wid, iCol, iPos,
29b70 20 30 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d   0, pTerm, nTerm
29b80 29 3b 0a 0a 20 20 66 6f 72 28 69 49 64 78 3d 30  );..  for(iIdx=0
29b90 3b 20 69 49 64 78 3c 70 43 6f 6e 66 69 67 2d 3e  ; iIdx<pConfig->
29ba0 6e 50 72 65 66 69 78 3b 20 69 49 64 78 2b 2b 29  nPrefix; iIdx++)
29bb0 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
29bc0 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
29bd0 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 65 72  enToBytelen(pTer
29be0 6d 2c 20 6e 54 65 72 6d 2c 20 70 43 6f 6e 66 69  m, nTerm, pConfi
29bf0 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78 5d  g->aPrefix[iIdx]
29c00 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  );.    if( nByte
29c10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 20 5e 3d   ){.      ret ^=
29c20 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43   fts5IndexEntryC
29c30 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
29c40 6c 2c 20 69 50 6f 73 2c 20 69 49 64 78 2b 31 2c  l, iPos, iIdx+1,
29c50 20 70 54 65 72 6d 2c 20 6e 42 79 74 65 29 3b 0a   pTerm, nByte);.
29c60 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
29c70 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 2a 2a  urn ret;.}../***
29c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29cc0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
29cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29d10 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20  *.** Below this 
29d20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70  point is the imp
29d30 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
29d40 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
29d50 20 73 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74   scalar.** funct
29d60 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a  ion only..*/../*
29d70 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67  .** Decode a seg
29d80 6d 65 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20  ment-data rowid 
29d90 66 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20  from the %_data 
29da0 74 61 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63  table. This func
29db0 74 69 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f  tion is.** the o
29dc0 70 70 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f  pposite of macro
29dd0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
29de0 57 49 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  WID()..*/.static
29df0 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
29e00 52 6f 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f  Rowid(.  i64 iRo
29e10 77 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  wid,            
29e20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
29e30 64 20 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61  d from %_data ta
29e40 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  ble */.  int *pi
29e50 53 65 67 69 64 2c 20 20 20 20 20 20 20 20 20 20  Segid,          
29e60 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29e70 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
29e80 20 69 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20 20   int *pbDlidx,  
29e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29ea0 20 2f 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20 66   /* OUT: Dlidx f
29eb0 6c 61 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  lag */.  int *pi
29ec0 48 65 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  Height,         
29ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29ee0 20 48 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74   Height */.  int
29ef0 20 2a 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20   *piPgno        
29f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29f10 4f 55 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72  OUT: Page number
29f20 20 2a 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f   */.){.  *piPgno
29f30 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
29f40 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
29f50 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20  S5_DATA_PAGE_B) 
29f60 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20  - 1));.  iRowid 
29f70 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41  >>= FTS5_DATA_PA
29f80 47 45 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67  GE_B;..  *piHeig
29f90 68 74 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69  ht = (int)(iRowi
29fa0 64 20 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20  d & (((i64)1 << 
29fb0 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
29fc0 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f  _B) - 1));.  iRo
29fd0 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54  wid >>= FTS5_DAT
29fe0 41 5f 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a  A_HEIGHT_B;..  *
29ff0 70 62 44 6c 69 64 78 20 3d 20 28 69 6e 74 29 28  pbDlidx = (int)(
2a000 69 52 6f 77 69 64 20 26 20 30 78 30 30 30 31 29  iRowid & 0x0001)
2a010 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46  ;.  iRowid >>= F
2a020 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a  TS5_DATA_DLI_B;.
2a030 0a 20 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69  .  *piSegid = (i
2a040 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28  nt)(iRowid & (((
2a050 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41  i64)1 << FTS5_DA
2a060 54 41 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a  TA_ID_B) - 1));.
2a070 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
2a080 74 73 35 44 65 62 75 67 52 6f 77 69 64 28 69 6e  ts5DebugRowid(in
2a090 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
2a0a0 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b  er *pBuf, i64 iK
2a0b0 65 79 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69  ey){.  int iSegi
2a0c0 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e  d, iHeight, iPgn
2a0d0 6f 2c 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20  o, bDlidx;      
2a0e0 20 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e   /* Rowid compen
2a0f0 65 6e 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65  ents */.  fts5De
2a100 63 6f 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20  codeRowid(iKey, 
2a110 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
2a120 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
2a130 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67  no);..  if( iSeg
2a140 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  id==0 ){.    if(
2a150 20 69 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52   iKey==FTS5_AVER
2a160 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
2a170 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2a180 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2a190 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 61  f(pRc, pBuf, "{a
2a1a0 76 65 72 61 67 65 73 7d 20 22 29 3b 0a 20 20 20  verages} ");.   
2a1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2a1c0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2a1d0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2a1e0 20 70 42 75 66 2c 20 22 7b 73 74 72 75 63 74 75   pBuf, "{structu
2a1f0 72 65 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  re}");.    }.  }
2a200 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
2a210 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2a220 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2a230 70 42 75 66 2c 20 22 7b 25 73 73 65 67 69 64 3d  pBuf, "{%ssegid=
2a240 25 64 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d  %d h=%d pgno=%d}
2a250 22 2c 0a 20 20 20 20 20 20 20 20 62 44 6c 69 64  ",.        bDlid
2a260 78 20 3f 20 22 64 6c 69 64 78 20 22 20 3a 20 22  x ? "dlidx " : "
2a270 22 2c 20 69 53 65 67 69 64 2c 20 69 48 65 69 67  ", iSegid, iHeig
2a280 68 74 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b  ht, iPgno.    );
2a290 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
2a2a0 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
2a2b0 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
2a2c0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
2a2d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
2a2e0 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
2a2f0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
2a300 2a 70 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72  *pBuf,.  Fts5Str
2a310 75 63 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69  ucture *p.){.  i
2a320 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20  nt iLvl, iSeg;  
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a340 2a 20 49 74 65 72 61 74 65 20 74 68 72 6f 75 67  * Iterate throug
2a350 68 20 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e  h levels, segmen
2a360 74 73 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76  ts */..  for(iLv
2a370 6c 3d 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65  l=0; iLvl<p->nLe
2a380 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
2a390 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
2a3a0 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d  evel *pLvl = &p-
2a3b0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20  >aLevel[iLvl];. 
2a3c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2a3d0 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2a3e0 28 70 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20  (pRc, pBuf, .   
2a3f0 20 20 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e       " {lvl=%d n
2a400 4d 65 72 67 65 3d 25 64 20 6e 53 65 67 3d 25 64  Merge=%d nSeg=%d
2a410 22 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e  ", iLvl, pLvl->n
2a420 4d 65 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65  Merge, pLvl->nSe
2a430 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72  g.    );.    for
2a440 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c  (iSeg=0; iSeg<pL
2a450 76 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl->nSeg; iSeg++
2a460 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
2a470 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2a480 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
2a490 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73  g[iSeg];.      s
2a4a0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2a4b0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2a4c0 2c 20 70 42 75 66 2c 20 22 20 7b 69 64 3d 25 64  , pBuf, " {id=%d
2a4d0 20 6c 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22   leaves=%d..%d}"
2a4e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  , .          pSe
2a4f0 67 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d  g->iSegid, pSeg-
2a500 3e 70 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67  >pgnoFirst, pSeg
2a510 2d 3e 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20  ->pgnoLast.     
2a520 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   );.    }.    sq
2a530 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2a540 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2a550 20 70 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d   pBuf, "}");.  }
2a560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
2a570 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 74  s part of the ft
2a580 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75  s5_decode() debu
2a590 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a  gging aid..**.**
2a5a0 20 41 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62   Arguments pBlob
2a5b0 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61  /nBlob contain a
2a5c0 20 73 65 72 69 61 6c 69 7a 65 64 20 46 74 73 35   serialized Fts5
2a5d0 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
2a5e0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
2a5f0 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d  on appends a hum
2a600 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72  an-readable repr
2a610 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
2a620 65 20 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a  e same object.**
2a630 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70   to the buffer p
2a640 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
2a650 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a  ond argument. .*
2a660 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2a670 73 35 44 65 63 6f 64 65 53 74 72 75 63 74 75 72  s5DecodeStructur
2a680 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20  e(.  int *pRc,  
2a690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a6a0 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20       /* IN/OUT: 
2a6b0 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20  error code */.  
2a6c0 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
2a6d0 2c 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42  ,.  const u8 *pB
2a6e0 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29  lob, int nBlob.)
2a6f0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a710 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a720 64 65 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  de */.  Fts5Stru
2a730 63 74 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20  cture *p = 0;   
2a740 20 20 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64          /* Decod
2a750 65 64 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a  ed structure obj
2a760 65 63 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66  ect */..  rc = f
2a770 74 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f  ts5StructureDeco
2a780 64 65 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c  de(pBlob, nBlob,
2a790 20 30 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72   0, &p);.  if( r
2a7a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2a7b0 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
2a7c0 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
2a7d0 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63    fts5DebugStruc
2a7e0 74 75 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20  ture(pRc, pBuf, 
2a7f0 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
2a800 75 72 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d  ureRelease(p);.}
2a810 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2a820 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35  part of the fts5
2a830 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67  _decode() debugg
2a840 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41  ing aid..**.** A
2a850 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e  rguments pBlob/n
2a860 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20  Blob contain an 
2a870 22 61 76 65 72 61 67 65 73 22 20 72 65 63 6f 72  "averages" recor
2a880 64 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  d. This function
2a890 20 0a 2a 2a 20 61 70 70 65 6e 64 73 20 61 20 68   .** appends a h
2a8a0 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65  uman-readable re
2a8b0 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2a8c0 72 65 63 6f 72 64 20 74 6f 20 74 68 65 20 62 75  record to the bu
2a8d0 66 66 65 72 20 70 61 73 73 65 64 20 0a 2a 2a 20  ffer passed .** 
2a8e0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
2a8f0 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74  gument. .*/.stat
2a900 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f  ic void fts5Deco
2a910 64 65 41 76 65 72 61 67 65 73 28 0a 20 20 69 6e  deAverages(.  in
2a920 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
2a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a940 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
2a950 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
2a960 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
2a970 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
2a980 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
2a990 20 69 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20   i = 0;.  const 
2a9a0 63 68 61 72 20 2a 7a 53 70 61 63 65 20 3d 20 22  char *zSpace = "
2a9b0 22 3b 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e  ";..  while( i<n
2a9c0 42 6c 6f 62 20 29 7b 0a 20 20 20 20 75 36 34 20  Blob ){.    u64 
2a9d0 69 56 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73  iVal;.    i += s
2a9e0 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
2a9f0 69 6e 74 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26  int(&pBlob[i], &
2aa00 69 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  iVal);.    sqlit
2aa10 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2aa20 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2aa30 75 66 2c 20 22 25 73 25 64 22 2c 20 7a 53 70 61  uf, "%s%d", zSpa
2aa40 63 65 2c 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a  ce, (int)iVal);.
2aa50 20 20 20 20 7a 53 70 61 63 65 20 3d 20 22 20 22      zSpace = " "
2aa60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  ;.  }.}../*.** B
2aa70 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61  uffer (a/n) is a
2aa80 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69  ssumed to contai
2aa90 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69  n a list of seri
2aaa0 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20  alized varints. 
2aab0 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72  Read.** each var
2aac0 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69  int and append i
2aad0 74 73 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  ts string repres
2aae0 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66  entation to buff
2aaf0 65 72 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a  er pBuf. Return.
2ab00 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65 72 20  ** after either 
2ab10 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72  the input buffer
2ab20 20 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72   is exhausted or
2ab30 20 61 20 30 20 76 61 6c 75 65 20 69 73 20 72 65   a 0 value is re
2ab40 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ad..**.** The re
2ab50 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
2ab60 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
2ab70 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
2ab80 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f  input buffer..*/
2ab90 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
2aba0 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e  DecodePoslist(in
2abb0 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66  t *pRc, Fts5Buff
2abc0 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20  er *pBuf, const 
2abd0 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20  u8 *a, int n){. 
2abe0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20   int iOff = 0;. 
2abf0 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29   while( iOff<n )
2ac00 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a  {.    int iVal;.
2ac10 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35      iOff += fts5
2ac20 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2ac30 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20  Off], iVal);.   
2ac40 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2ac50 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2ac60 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c  Rc, pBuf, " %d",
2ac70 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65   iVal);.  }.  re
2ac80 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
2ac90 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66  .** The start of
2aca0 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f   buffer (a/n) co
2acb0 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61 72 74  ntains the start
2acc0 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54   of a doclist. T
2acd0 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61  he doclist.** ma
2ace0 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e  y or may not fin
2acf0 69 73 68 20 77 69 74 68 69 6e 20 74 68 65 20 62  ish within the b
2ad00 75 66 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63  uffer. This func
2ad10 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74  tion appends a t
2ad20 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74  ext.** represent
2ad30 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72  ation of the par
2ad40 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74  t of the doclist
2ad50 20 74 68 61 74 20 69 73 20 70 72 65 73 65 6e 74   that is present
2ad60 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42   to buffer.** pB
2ad70 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  uf. .**.** The r
2ad80 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
2ad90 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
2ada0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  es read from the
2adb0 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a   input buffer..*
2adc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
2add0 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69  5DecodeDoclist(i
2ade0 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66  nt *pRc, Fts5Buf
2adf0 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74  fer *pBuf, const
2ae00 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a   u8 *a, int n){.
2ae10 20 20 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30    i64 iDocid = 0
2ae20 3b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30  ;.  int iOff = 0
2ae30 3b 0a 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a  ;..  if( n>0 ){.
2ae40 20 20 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74      iOff = sqlit
2ae50 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
2ae60 61 2c 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64  a, (u64*)&iDocid
2ae70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  );.    sqlite3Ft
2ae80 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
2ae90 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
2aea0 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63  " id=%lld", iDoc
2aeb0 69 64 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  id);.  }.  while
2aec0 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  ( iOff<n ){.    
2aed0 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e  int nPos;.    in
2aee0 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69 4f  t bDummy;.    iO
2aef0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73  ff += fts5GetPos
2af00 6c 69 73 74 53 69 7a 65 28 26 61 5b 69 4f 66 66  listSize(&a[iOff
2af10 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
2af20 79 29 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20  y);.    iOff += 
2af30 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73  fts5DecodePoslis
2af40 74 28 70 52 63 2c 20 70 42 75 66 2c 20 26 61 5b  t(pRc, pBuf, &a[
2af50 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d 69 4f 66  iOff], MIN(n-iOf
2af60 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20 20 20 69  f, nPos));.    i
2af70 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  f( iOff<n ){.   
2af80 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
2af90 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c       iOff += sql
2afa0 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2afb0 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
2afc0 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
2afd0 20 20 69 44 6f 63 69 64 20 2b 3d 20 69 44 65 6c    iDocid += iDel
2afe0 74 61 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ta;.      sqlite
2aff0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2b000 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2b010 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c 20 69  f, " id=%lld", i
2b020 44 6f 63 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20  Docid);.    }.  
2b030 7d 0a 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66  }..  return iOff
2b040 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  ;.}../*.** The i
2b050 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
2b060 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63   user-defined sc
2b070 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74  alar function ft
2b080 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a  s5_decode()..*/.
2b090 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2b0a0 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e 28 0a  DecodeFunction(.
2b0b0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
2b0c0 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20 20  t *pCtx,        
2b0d0 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61    /* Function ca
2b0e0 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ll context */.  
2b0f0 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b110 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2b120 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f 0a  s (always 2) */.
2b130 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
2b140 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20 20  **apVal         
2b150 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61 72    /* Function ar
2b160 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2b170 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20 20 20  i64 iRowid;     
2b180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b190 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72 65 63  /* Rowid for rec
2b1a0 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f 64 65  ord being decode
2b1b0 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 69  d */.  int iSegi
2b1c0 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e 6f 2c  d,iHeight,iPgno,
2b1d0 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69 64 20  bDlidx;/* Rowid 
2b1e0 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a 20 20  components */.  
2b1f0 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f 62 3b  const u8 *aBlob;
2b200 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2b210 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64 65 63  /* Record to dec
2b220 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61 20 3d  ode */.  u8 *a =
2b230 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72   0;.  Fts5Buffer
2b240 20 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   s;             
2b250 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64 20 75        /* Build u
2b260 70 20 74 65 78 74 20 74 6f 20 72 65 74 75 72 6e  p text to return
2b270 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72   here */.  int r
2b280 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2b290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2b2a0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2b2b0 6e 74 20 6e 53 70 61 63 65 20 3d 20 30 3b 0a 0a  nt nSpace = 0;..
2b2c0 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
2b2d0 32 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  2 );.  memset(&s
2b2e0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
2b2f0 42 75 66 66 65 72 29 29 3b 0a 20 20 69 52 6f 77  Buffer));.  iRow
2b300 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  id = sqlite3_val
2b310 75 65 5f 69 6e 74 36 34 28 61 70 56 61 6c 5b 30  ue_int64(apVal[0
2b320 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  ]);..  /* Make a
2b330 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
2b340 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28 61 20  ond argument (a 
2b350 62 6c 6f 62 29 20 69 6e 20 61 42 6c 6f 62 5b 5d  blob) in aBlob[]
2b360 2e 20 54 68 65 20 61 42 6c 6f 62 5b 5d 0a 20 20  . The aBlob[].  
2b370 2a 2a 20 63 6f 70 79 20 69 73 20 66 6f 6c 6c 6f  ** copy is follo
2b380 77 65 64 20 62 79 20 46 54 53 35 5f 44 41 54 41  wed by FTS5_DATA
2b390 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 30 78  _ZERO_PADDING 0x
2b3a0 30 30 20 62 79 74 65 73 2c 20 77 68 69 63 68 20  00 bytes, which 
2b3b0 70 72 65 76 65 6e 74 73 0a 20 20 2a 2a 20 62 75  prevents.  ** bu
2b3c0 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 20 65  ffer overreads e
2b3d0 76 65 6e 20 69 66 20 74 68 65 20 72 65 63 6f 72  ven if the recor
2b3e0 64 20 69 73 20 63 6f 72 72 75 70 74 2e 20 20 2a  d is corrupt.  *
2b3f0 2f 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  /.  n = sqlite3_
2b400 76 61 6c 75 65 5f 62 79 74 65 73 28 61 70 56 61  value_bytes(apVa
2b410 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c 6f 62 20 3d  l[1]);.  aBlob =
2b420 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
2b430 6c 6f 62 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  lob(apVal[1]);. 
2b440 20 6e 53 70 61 63 65 20 3d 20 6e 20 2b 20 46 54   nSpace = n + FT
2b450 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
2b460 44 49 4e 47 3b 0a 20 20 61 20 3d 20 28 75 38 2a  DING;.  a = (u8*
2b470 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c  )sqlite3Fts5Mall
2b480 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 53 70 61  ocZero(&rc, nSpa
2b490 63 65 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20  ce);.  if( a==0 
2b4a0 29 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75  ) goto decode_ou
2b4b0 74 3b 0a 20 20 6d 65 6d 63 70 79 28 61 2c 20 61  t;.  memcpy(a, a
2b4c0 42 6c 6f 62 2c 20 6e 29 3b 0a 0a 0a 20 20 66 74  Blob, n);...  ft
2b4d0 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52  s5DecodeRowid(iR
2b4e0 6f 77 69 64 2c 20 26 69 53 65 67 69 64 2c 20 26  owid, &iSegid, &
2b4f0 62 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74  bDlidx, &iHeight
2b500 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66 74  , &iPgno);..  ft
2b510 73 35 44 65 62 75 67 52 6f 77 69 64 28 26 72 63  s5DebugRowid(&rc
2b520 2c 20 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a 20  , &s, iRowid);. 
2b530 20 69 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20   if( bDlidx ){. 
2b540 20 20 20 46 74 73 35 44 61 74 61 20 64 6c 69 64     Fts5Data dlid
2b550 78 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  x;.    Fts5Dlidx
2b560 4c 76 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c  Lvl lvl;..    dl
2b570 69 64 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64  idx.p = a;.    d
2b580 6c 69 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20  lidx.nn = n;..  
2b590 20 20 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30    memset(&lvl, 0
2b5a0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  , sizeof(Fts5Dli
2b5b0 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c  dxLvl));.    lvl
2b5c0 2e 70 44 61 74 61 20 3d 20 26 64 6c 69 64 78 3b  .pData = &dlidx;
2b5d0 0a 20 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67  .    lvl.iLeafPg
2b5e0 6e 6f 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20  no = iPgno;..   
2b5f0 20 66 6f 72 28 66 74 73 35 44 6c 69 64 78 4c 76   for(fts5DlidxLv
2b600 6c 4e 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c  lNext(&lvl); lvl
2b610 2e 62 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c  .bEof==0; fts5Dl
2b620 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
2b630 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b640 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2b650 50 72 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20  Printf(&rc, &s, 
2b660 0a 20 20 20 20 20 20 20 20 20 20 22 20 25 64 28  .          " %d(
2b670 25 6c 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61  %lld)", lvl.iLea
2b680 66 50 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69  fPgno, lvl.iRowi
2b690 64 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  d.      );.    }
2b6a0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65  .  }else if( iSe
2b6b0 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  gid==0 ){.    if
2b6c0 28 20 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41  ( iRowid==FTS5_A
2b6d0 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b  VERAGES_ROWID ){
2b6e0 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f 64  .      fts5Decod
2b6f0 65 41 76 65 72 61 67 65 73 28 26 72 63 2c 20 26  eAverages(&rc, &
2b700 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 65  s, a, n);.    }e
2b710 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44  lse{.      fts5D
2b720 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 26  ecodeStructure(&
2b730 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
2b740 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2b750 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
2b760 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
2b770 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20  /* Current term 
2b780 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a  read from page *
2b790 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66  /.    int szLeaf
2b7a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b7b0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2b7c0 20 70 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a 2f   pgidx in a[] */
2b7d0 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f  .    int iPgidxO
2b7e0 66 66 3b 0a 20 20 20 20 69 6e 74 20 69 50 67 69  ff;.    int iPgi
2b7f0 64 78 50 72 65 76 20 3d 20 30 3b 20 20 20 20 20  dxPrev = 0;     
2b800 20 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75        /* Previou
2b810 73 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  s value read fro
2b820 6d 20 70 67 69 64 78 20 2a 2f 0a 20 20 20 20 69  m pgidx */.    i
2b830 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b  nt iTermOff = 0;
2b840 0a 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f  .    int iRowidO
2b850 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ff = 0;.    int 
2b860 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 44  iOff;.    int nD
2b870 6f 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d  oclist;..    mem
2b880 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69  set(&term, 0, si
2b890 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
2b8a0 29 3b 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34 20  );..    if( n<4 
2b8b0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2b8c0 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  Fts5BufferSet(&r
2b8d0 63 2c 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73 74  c, &s, 7, (const
2b8e0 20 75 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b   u8*)"corrupt");
2b8f0 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f  .      goto deco
2b900 64 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73  de_out;.    }els
2b910 65 7b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f  e{.      iRowidO
2b920 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
2b930 26 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 50  &a[0]);.      iP
2b940 67 69 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66  gidxOff = szLeaf
2b950 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2b960 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [2]);.      if( 
2b970 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20  iPgidxOff<n ){. 
2b980 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
2b990 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
2b9a0 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b  Off], iTermOff);
2b9b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
2b9c0 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
2b9d0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
2b9e0 74 61 69 6c 20 61 74 20 74 68 65 20 73 74 61 72  tail at the star
2b9f0 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
2ba00 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f  .    if( iRowidO
2ba10 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ff!=0 ){.      i
2ba20 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b  Off = iRowidOff;
2ba30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
2ba40 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20 20  TermOff!=0 ){.  
2ba50 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
2ba60 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Off;.    }else{.
2ba70 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73 7a 4c        iOff = szL
2ba80 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eaf;.    }.    f
2ba90 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74  ts5DecodePoslist
2baa0 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c  (&rc, &s, &a[4],
2bab0 20 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 2f   iOff-4);..    /
2bac0 2a 20 44 65 63 6f 64 65 20 61 6e 79 20 6d 6f 72  * Decode any mor
2bad0 65 20 64 6f 63 6c 69 73 74 20 64 61 74 61 20 74  e doclist data t
2bae0 68 61 74 20 61 70 70 65 61 72 73 20 6f 6e 20 74  hat appears on t
2baf0 68 65 20 70 61 67 65 20 62 65 66 6f 72 65 20 74  he page before t
2bb00 68 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20  he.    ** first 
2bb10 74 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 6e 44 6f  term. */.    nDo
2bb20 63 6c 69 73 74 20 3d 20 28 69 54 65 72 6d 4f 66  clist = (iTermOf
2bb30 66 20 3f 20 69 54 65 72 6d 4f 66 66 20 3a 20 73  f ? iTermOff : s
2bb40 7a 4c 65 61 66 29 20 2d 20 69 4f 66 66 3b 0a 20  zLeaf) - iOff;. 
2bb50 20 20 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63     fts5DecodeDoc
2bb60 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61  list(&rc, &s, &a
2bb70 5b 69 4f 66 66 5d 2c 20 6e 44 6f 63 6c 69 73 74  [iOff], nDoclist
2bb80 29 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 69  );..    while( i
2bb90 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20  PgidxOff<n ){.  
2bba0 20 20 20 20 69 6e 74 20 62 46 69 72 73 74 20 3d      int bFirst =
2bbb0 20 28 69 50 67 69 64 78 4f 66 66 3d 3d 73 7a 4c   (iPgidxOff==szL
2bbc0 65 61 66 29 3b 20 20 20 20 20 2f 2a 20 54 72 75  eaf);     /* Tru
2bbd0 65 20 66 6f 72 20 66 69 72 73 74 20 74 65 72 6d  e for first term
2bbe0 20 6f 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20   on page */.    
2bbf0 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc10 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
2bc20 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 20 20   of data */.    
2bc30 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20    int iEnd;.    
2bc40 20 20 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f    .      iPgidxO
2bc50 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2bc60 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
2bc70 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
2bc80 20 20 20 69 50 67 69 64 78 50 72 65 76 20 2b 3d     iPgidxPrev +=
2bc90 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f   nByte;.      iO
2bca0 66 66 20 3d 20 69 50 67 69 64 78 50 72 65 76 3b  ff = iPgidxPrev;
2bcb0 0a 0a 20 20 20 20 20 20 69 66 28 20 69 50 67 69  ..      if( iPgi
2bcc0 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20  dxOff<n ){.     
2bcd0 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74     fts5GetVarint
2bce0 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66 5d  32(&a[iPgidxOff]
2bcf0 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2bd00 20 20 69 45 6e 64 20 3d 20 69 50 67 69 64 78 50    iEnd = iPgidxP
2bd10 72 65 76 20 2b 20 6e 42 79 74 65 3b 0a 20 20 20  rev + nByte;.   
2bd20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2bd30 20 20 69 45 6e 64 20 3d 20 73 7a 4c 65 61 66 3b    iEnd = szLeaf;
2bd40 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2bd50 69 66 28 20 62 46 69 72 73 74 3d 3d 30 20 29 7b  if( bFirst==0 ){
2bd60 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
2bd70 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2bd80 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  (&a[iOff], nByte
2bd90 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d 2e  );.        term.
2bda0 6e 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  n = nByte;.     
2bdb0 20 7d 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d   }.      iOff +=
2bdc0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2bdd0 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  (&a[iOff], nByte
2bde0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
2bdf0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 72  ferAppendBlob(&r
2be00 63 2c 20 26 74 65 72 6d 2c 20 6e 42 79 74 65 2c  c, &term, nByte,
2be10 20 26 61 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20   &a[iOff]);.    
2be20 20 20 69 4f 66 66 20 2b 3d 20 6e 42 79 74 65 3b    iOff += nByte;
2be30 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ..      sqlite3F
2be40 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2be50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
2be60 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
2be70 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
2be80 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
2be90 6d 2e 70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  m.p.      );.   
2bea0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44     iOff += fts5D
2beb0 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72 63  ecodeDoclist(&rc
2bec0 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  , &s, &a[iOff], 
2bed0 69 45 6e 64 2d 69 4f 66 66 29 3b 0a 20 20 20 20  iEnd-iOff);.    
2bee0 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  }..    fts5Buffe
2bef0 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
2bf00 7d 0a 20 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74  }.  . decode_out
2bf10 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
2bf20 28 61 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  (a);.  if( rc==S
2bf30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bf40 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
2bf50 65 78 74 28 70 43 74 78 2c 20 28 63 6f 6e 73 74  ext(pCtx, (const
2bf60 20 63 68 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c   char*)s.p, s.n,
2bf70 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
2bf80 54 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  T);.  }else{.   
2bf90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
2bfa0 65 72 72 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c  error_code(pCtx,
2bfb0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35   rc);.  }.  fts5
2bfc0 42 75 66 66 65 72 46 72 65 65 28 26 73 29 3b 0a  BufferFree(&s);.
2bfd0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  }../*.** The imp
2bfe0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75  lementation of u
2bff0 73 65 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c  ser-defined scal
2c000 61 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35  ar function fts5
2c010 5f 72 6f 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61  _rowid()..*/.sta
2c020 74 69 63 20 76 6f 69 64 20 66 74 73 35 52 6f 77  tic void fts5Row
2c030 69 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  idFunction(.  sq
2c040 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
2c050 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Ctx,          /*
2c060 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63   Function call c
2c070 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
2c080 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  nArg,           
2c090 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c0a0 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 28 61  umber of args (a
2c0b0 6c 77 61 79 73 20 32 29 20 2a 2f 0a 20 20 73 71  lways 2) */.  sq
2c0c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
2c0d0 56 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Val           /*
2c0e0 20 46 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65   Function argume
2c0f0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  nts */.){.  cons
2c100 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20  t char *zArg;.  
2c110 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20  if( nArg==0 ){. 
2c120 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
2c130 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 22 73  t_error(pCtx, "s
2c140 68 6f 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72  hould be: fts5_r
2c150 6f 77 69 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e  owid(subject, ..
2c160 2e 2e 29 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c  ..)", -1);.  }el
2c170 73 65 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 28  se{.    zArg = (
2c180 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
2c190 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
2c1a0 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66  pVal[0]);.    if
2c1b0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  ( 0==sqlite3_str
2c1c0 69 63 6d 70 28 7a 41 72 67 2c 20 22 73 65 67 6d  icmp(zArg, "segm
2c1d0 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 69  ent") ){.      i
2c1e0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20  64 iRowid;.     
2c1f0 20 69 6e 74 20 73 65 67 69 64 2c 20 70 67 6e 6f   int segid, pgno
2c200 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  ;.      if( nArg
2c210 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  !=3 ){.        s
2c220 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
2c230 72 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20  ror(pCtx, .     
2c240 20 20 20 20 20 20 20 22 73 68 6f 75 6c 64 20 62         "should b
2c250 65 3a 20 66 74 73 35 5f 72 6f 77 69 64 28 27 73  e: fts5_rowid('s
2c260 65 67 6d 65 6e 74 27 2c 20 73 65 67 69 64 2c 20  egment', segid, 
2c270 70 67 6e 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20  pgno))", -1.    
2c280 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c      );.      }el
2c290 73 65 7b 0a 20 20 20 20 20 20 20 20 73 65 67 69  se{.        segi
2c2a0 64 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  d = sqlite3_valu
2c2b0 65 5f 69 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b  e_int(apVal[1]);
2c2c0 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
2c2d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e  sqlite3_value_in
2c2e0 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20  t(apVal[2]);.   
2c2f0 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 46 54       iRowid = FT
2c300 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2c310 28 73 65 67 69 64 2c 20 70 67 6e 6f 29 3b 0a 20  (segid, pgno);. 
2c320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
2c330 65 73 75 6c 74 5f 69 6e 74 36 34 28 70 43 74 78  esult_int64(pCtx
2c340 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
2c350 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2c360 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2c370 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2c380 20 20 20 20 20 20 20 20 22 66 69 72 73 74 20 61          "first a
2c390 72 67 20 74 6f 20 66 74 73 35 5f 72 6f 77 69 64  rg to fts5_rowid
2c3a0 28 29 20 6d 75 73 74 20 62 65 20 27 73 65 67 6d  () must be 'segm
2c3b0 65 6e 74 27 22 20 2c 20 2d 31 0a 20 20 20 20 20  ent'" , -1.     
2c3c0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
2c3d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63  ./*.** This is c
2c3e0 61 6c 6c 65 64 20 61 73 20 70 61 72 74 20 6f 66  alled as part of
2c3f0 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
2c400 20 46 54 53 35 20 6d 6f 64 75 6c 65 20 77 69 74   FTS5 module wit
2c410 68 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  h database.** co
2c420 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 20 49 74 20  nnection db. It 
2c430 72 65 67 69 73 74 65 72 73 20 73 65 76 65 72 61  registers severa
2c440 6c 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 73  l user-defined s
2c450 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 73 20  calar functions 
2c460 75 73 65 66 75 6c 0a 2a 2a 20 77 69 74 68 20 46  useful.** with F
2c470 54 53 35 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  TS5..**.** If su
2c480 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
2c490 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
2c4a0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
2c4b0 75 72 73 2c 20 73 6f 6d 65 20 6f 74 68 65 72 0a  urs, some other.
2c4c0 2a 2a 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  ** SQLite error 
2c4d0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2c4e0 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 69 6e 74   instead..*/.int
2c4f0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2c500 78 49 6e 69 74 28 73 71 6c 69 74 65 33 20 2a 64  xInit(sqlite3 *d
2c510 62 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  b){.  int rc = s
2c520 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
2c530 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20 20 64 62  nction(.      db
2c540 2c 20 22 66 74 73 35 5f 64 65 63 6f 64 65 22 2c  , "fts5_decode",
2c550 20 32 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   2, SQLITE_UTF8,
2c560 20 30 2c 20 66 74 73 35 44 65 63 6f 64 65 46 75   0, fts5DecodeFu
2c570 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 29  nction, 0, 0.  )
2c580 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2c590 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
2c5a0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
2c5b0 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20 20 20  _function(.     
2c5c0 20 20 20 64 62 2c 20 22 66 74 73 35 5f 72 6f 77     db, "fts5_row
2c5d0 69 64 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  id", -1, SQLITE_
2c5e0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 52 6f 77  UTF8, 0, fts5Row
2c5f0 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  idFunction, 0, 0
2c600 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 20 20 72 65  .    );.  }.  re
2c610 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a              turn rc;.}..