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

Artifact 02b4d8b0ca77cb00af6cbedd3aa1aaaa18608e3f:


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 64 6f 63  of the first doc
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 62 2d 74 72 65 65 20 68 65       + b-tree he
0c80: 69 67 68 74 20 28 31 20 2d 3e 20 72 6f 6f 74 20  ight (1 -> root 
0c90: 69 73 20 6c 65 61 66 2c 20 32 20 2d 3e 20 72 6f  is leaf, 2 -> ro
0ca0: 6f 74 20 69 73 20 70 61 72 65 6e 74 20 6f 66 20  ot is parent of 
0cb0: 6c 65 61 66 20 65 74 63 2e 29 0a 2a 2a 20 20 20  leaf etc.).**   
0cc0: 20 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65        + first le
0cd0: 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  af page number (
0ce0: 6f 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20  often 1, always 
0cf0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a  greater than 0).
0d00: 2a 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e  **         + fin
0d10: 61 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  al leaf page num
0d20: 62 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65  ber.**.** 2. The
0d30: 20 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64   Averages Record
0d40: 3a 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67  :.**.**   A sing
0d50: 6c 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e  le record within
0d60: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
0d70: 65 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61  e. The data is a
0d80: 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
0d90: 2e 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74  ..**   The first
0da0: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75   value is the nu
0db0: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
0dc0: 74 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c  the index. Then,
0dd0: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
0de0: 0a 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20  .**   from left 
0df0: 74 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f  to right, the to
0e00: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f  tal number of to
0e10: 6b 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75  kens in the colu
0e20: 6d 6e 20 66 6f 72 20 61 6c 6c 20 0a 2a 2a 20 20  mn for all .**  
0e30: 20 72 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62   rows of the tab
0e40: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67  le..**.** 3. Seg
0e50: 6d 65 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a  ment leaves:.**.
0e60: 2a 2a 20 20 20 54 45 52 4d 20 44 4f 43 4c 49 53  **   TERM DOCLIS
0e70: 54 20 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20  T FORMAT:.**.** 
0e80: 20 20 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68      Most of each
0e90: 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73   segment leaf is
0ea0: 20 74 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72   taken up by ter
0eb0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20  m/doclist data. 
0ec0: 54 68 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65  The .**     gene
0ed0: 72 61 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 68  ral format of th
0ee0: 65 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20 64  e term/doclist d
0ef0: 61 74 61 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ata is:.**.**   
0f00: 20 20 20 20 20 20 76 61 72 69 6e 74 20 3a 20 73        varint : s
0f10: 69 7a 65 20 6f 66 20 66 69 72 73 74 20 74 65 72  ize of first ter
0f20: 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20 62 6c 6f  m.**         blo
0f30: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
0f40: 20 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20   data.**        
0f50: 20 64 6f 63 6c 69 73 74 3a 20 66 69 72 73 74 20   doclist: first 
0f60: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
0f70: 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20     zero-or-more 
0f80: 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76  {.**           v
0f90: 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f  arint:  number o
0fa0: 66 20 62 79 74 65 73 20 69 6e 20 63 6f 6d 6d 6f  f bytes in commo
0fb0: 6e 20 77 69 74 68 20 70 72 65 76 69 6f 75 73 20  n with previous 
0fc0: 74 65 72 6d 0a 2a 2a 20 20 20 20 20 20 20 20 20  term.**         
0fd0: 20 20 76 61 72 69 6e 74 3a 20 20 6e 75 6d 62 65    varint:  numbe
0fe0: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
0ff0: 77 20 74 65 72 6d 20 64 61 74 61 20 28 6e 4e 65  w term data (nNe
1000: 77 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  w).**           
1010: 62 6c 6f 62 3a 20 20 20 20 6e 4e 65 77 20 62 79  blob:    nNew by
1020: 74 65 73 20 6f 66 20 6e 65 77 20 74 65 72 6d 20  tes of new term 
1030: 64 61 74 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  data.**         
1040: 20 20 64 6f 63 6c 69 73 74 3a 20 6e 65 78 74 20    doclist: next 
1050: 64 6f 63 6c 69 73 74 0a 2a 2a 20 20 20 20 20 20  doclist.**      
1060: 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64     }.**.**     d
1070: 6f 63 6c 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a  oclist format:.*
1080: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 76 61 72  *.**         var
1090: 69 6e 74 3a 20 20 66 69 72 73 74 20 72 6f 77 69  int:  first rowi
10a0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6f 73  d.**         pos
10b0: 6c 69 73 74 3a 20 66 69 72 73 74 20 70 6f 73 6c  list: first posl
10c0: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
10d0: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
10e0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
10f0: 74 3a 20 20 72 6f 77 69 64 20 64 65 6c 74 61 20  t:  rowid delta 
1100: 28 61 6c 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20  (always > 0).** 
1110: 20 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73            poslis
1120: 74 3a 20 6e 65 78 74 20 70 6f 73 6c 69 73 74 0a  t: next poslist.
1130: 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a 2a 2a 20  **         }.** 
1140: 20 20 20 20 20 20 20 20 30 78 30 30 20 62 79 74          0x00 byt
1150: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 70 6f 73 6c  e.**.**     posl
1160: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
1170: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
1180: 3a 20 73 69 7a 65 20 6f 66 20 70 6f 73 6c 69 73  : size of poslis
1190: 74 20 69 6e 20 62 79 74 65 73 20 6d 75 6c 74 69  t in bytes multi
11a0: 70 6c 69 65 64 20 62 79 20 32 2c 20 6e 6f 74 20  plied by 2, not 
11b0: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 20 20 20  including.**    
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69               thi
11d0: 73 20 66 69 65 6c 64 2e 20 50 6c 75 73 20 31 20  s field. Plus 1 
11e0: 69 66 20 74 68 69 73 20 65 6e 74 72 79 20 63 61  if this entry ca
11f0: 72 72 69 65 73 20 74 68 65 20 22 64 65 6c 65 74  rries the "delet
1200: 65 22 20 66 6c 61 67 2e 0a 2a 2a 20 20 20 20 20  e" flag..**     
1210: 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20 63 6f 6c      collist: col
1220: 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75 6d 6e 20  list for column 
1230: 30 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72  0.**         zer
1240: 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20  o-or-more {.**  
1250: 20 20 20 20 20 20 20 20 20 30 78 30 31 20 62 79           0x01 by
1260: 74 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  te.**           
1270: 76 61 72 69 6e 74 3a 20 63 6f 6c 75 6d 6e 20 6e  varint: column n
1280: 75 6d 62 65 72 20 28 49 29 0a 2a 2a 20 20 20 20  umber (I).**    
1290: 20 20 20 20 20 20 20 63 6f 6c 6c 69 73 74 3a 20         collist: 
12a0: 63 6f 6c 6c 69 73 74 20 66 6f 72 20 63 6f 6c 75  collist for colu
12b0: 6d 6e 20 49 0a 2a 2a 20 20 20 20 20 20 20 20 20  mn I.**         
12c0: 7d 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 6f 6c 6c  }.**.**     coll
12d0: 69 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a  ist format:.**.*
12e0: 2a 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74  *         varint
12f0: 3a 20 66 69 72 73 74 20 6f 66 66 73 65 74 20 2b  : first offset +
1300: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a 65   2.**         ze
1310: 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20  ro-or-more {.** 
1320: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74            varint
1330: 3a 20 6f 66 66 73 65 74 20 64 65 6c 74 61 20 2b  : offset delta +
1340: 20 32 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d 0a   2.**         }.
1350: 2a 2a 0a 2a 2a 20 20 20 50 41 47 49 4e 41 54 49  **.**   PAGINATI
1360: 4f 4e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65  ON.**.**     The
1370: 20 66 6f 72 6d 61 74 20 64 65 73 63 72 69 62 65   format describe
1380: 64 20 61 62 6f 76 65 20 69 73 20 6f 6e 6c 79 20  d above is only 
1390: 61 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20  accurate if the 
13a0: 65 6e 74 69 72 65 20 74 65 72 6d 2f 64 6f 63 6c  entire term/docl
13b0: 69 73 74 0a 2a 2a 20 20 20 20 20 64 61 74 61 20  ist.**     data 
13c0: 66 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65  fits on a single
13d0: 20 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74   leaf page. If t
13e0: 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63  his is not the c
13f0: 61 73 65 2c 20 74 68 65 20 66 6f 72 6d 61 74 0a  ase, the format.
1400: 2a 2a 20 20 20 20 20 69 73 20 63 68 61 6e 67 65  **     is change
1410: 64 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a  d in two ways:.*
1420: 2a 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20  *.**       + if 
1430: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
1440: 6f 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73  on a page occurs
1450: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
1460: 74 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20  t term, it.**   
1470: 20 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20        is stored 
1480: 61 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c  as a literal val
1490: 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  ue:.**.**       
14a0: 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66        varint:  f
14b0: 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a  irst rowid.**.**
14c0: 20 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72         + the fir
14d0: 73 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20  st term on each 
14e0: 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69  page is stored i
14f0: 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61  n the same way a
1500: 73 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20  s the.**        
1510: 20 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d   very first term
1520: 20 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a   of the segment:
1530: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
1540: 20 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65     varint : size
1550: 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a   of first term.*
1560: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c  *             bl
1570: 6f 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72  ob:    first ter
1580: 6d 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 20 20 20  m data.**.**    
1590: 20 45 61 63 68 20 6c 65 61 66 20 70 61 67 65 20   Each leaf page 
15a0: 62 65 67 69 6e 73 20 77 69 74 68 3a 0a 2a 2a 0a  begins with:.**.
15b0: 2a 2a 20 20 20 20 20 20 20 2b 20 32 2d 62 79 74  **       + 2-byt
15c0: 65 20 75 6e 73 69 67 6e 65 64 20 63 6f 6e 74 61  e unsigned conta
15d0: 69 6e 69 6e 67 20 6f 66 66 73 65 74 20 74 6f 20  ining offset to 
15e0: 66 69 72 73 74 20 72 6f 77 69 64 20 28 6f 72 20  first rowid (or 
15f0: 30 29 2e 0a 2a 2a 20 20 20 20 20 20 20 2b 20 32  0)..**       + 2
1600: 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 20 63  -byte unsigned c
1610: 6f 6e 74 61 69 6e 69 6e 67 20 6f 66 66 73 65 74  ontaining offset
1620: 20 74 6f 20 66 69 72 73 74 20 74 65 72 6d 20 28   to first term (
1630: 6f 72 20 30 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 46  or 0)..**.**   F
1640: 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 72 6d 2f  ollowed by term/
1650: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 0a 2a 2a  doclist data..**
1660: 0a 2a 2a 20 34 2e 20 53 65 67 6d 65 6e 74 20 69  .** 4. Segment i
1670: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 73 3a 0a 2a  nterior nodes:.*
1680: 2a 0a 2a 2a 20 20 20 54 68 65 20 69 6e 74 65 72  *.**   The inter
1690: 69 6f 72 20 6e 6f 64 65 73 20 74 75 72 6e 20 74  ior nodes turn t
16a0: 68 65 20 6c 69 73 74 20 6f 66 20 6c 65 61 76 65  he list of leave
16b0: 73 20 69 6e 74 6f 20 61 20 62 2b 74 72 65 65 2e  s into a b+tree.
16c0: 20 0a 2a 2a 0a 2a 2a 20 20 20 45 61 63 68 20 69   .**.**   Each i
16d0: 6e 74 65 72 69 6f 72 20 6e 6f 64 65 20 62 65 67  nterior node beg
16e0: 69 6e 73 20 77 69 74 68 20 61 20 76 61 72 69 6e  ins with a varin
16f0: 74 20 2d 20 74 68 65 20 70 61 67 65 20 6e 75 6d  t - the page num
1700: 62 65 72 20 6f 66 20 74 68 65 20 6c 65 66 74 0a  ber of the left.
1710: 2a 2a 20 20 20 6d 6f 73 74 20 63 68 69 6c 64 20  **   most child 
1720: 6e 6f 64 65 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20  node. Following 
1730: 74 68 69 73 2c 20 66 6f 72 20 65 61 63 68 20 6c  this, for each l
1740: 65 61 66 20 70 61 67 65 20 65 78 63 65 70 74 20  eaf page except 
1750: 74 68 65 20 66 69 72 73 74 2c 0a 2a 2a 20 20 20  the first,.**   
1760: 74 68 65 20 69 6e 74 65 72 69 6f 72 20 6e 6f 64  the interior nod
1770: 65 73 20 63 6f 6e 74 61 69 6e 3a 0a 2a 2a 0a 2a  es contain:.**.*
1780: 2a 20 20 20 20 20 61 29 20 49 66 20 74 68 65 20  *     a) If the 
1790: 6c 65 61 66 20 70 61 67 65 20 63 6f 6e 74 61 69  leaf page contai
17a0: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
17b0: 74 65 72 6d 2c 20 74 68 65 6e 20 61 20 74 65 72  term, then a ter
17c0: 6d 2d 70 72 65 66 69 78 20 74 68 61 74 0a 2a 2a  m-prefix that.**
17d0: 20 20 20 20 20 20 20 20 69 73 20 67 72 65 61 74          is great
17e0: 65 72 20 74 68 61 6e 20 61 6c 6c 20 70 72 65 76  er than all prev
17f0: 69 6f 75 73 20 74 65 72 6d 73 2c 20 61 6e 64 20  ious terms, and 
1800: 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1810: 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  al to the.**    
1820: 20 20 20 20 66 69 72 73 74 20 74 65 72 6d 20 6f      first term o
1830: 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e  n the leaf page.
1840: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 49 66  .**.**     b) If
1850: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e   the leaf page n
1860: 6f 20 74 65 72 6d 73 2c 20 61 20 72 65 63 6f 72  o terms, a recor
1870: 64 20 69 6e 64 69 63 61 74 69 6e 67 20 68 6f 77  d indicating how
1880: 20 6d 61 6e 79 20 63 6f 6e 73 65 63 75 74 69 76   many consecutiv
1890: 65 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 76  e.**        leav
18a0: 65 73 20 63 6f 6e 74 61 69 6e 20 6e 6f 20 74 65  es contain no te
18b0: 72 6d 73 2c 20 61 6e 64 20 77 68 65 74 68 65 72  rms, and whether
18c0: 20 6f 72 20 6e 6f 74 20 74 68 65 72 65 20 69 73   or not there is
18d0: 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 0a 2a   an associated.*
18e0: 2a 20 20 20 20 20 20 20 20 62 79 2d 72 6f 77 69  *        by-rowi
18f0: 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a  d index record..
1900: 2a 2a 0a 2a 2a 20 20 20 42 79 20 64 65 66 69 6e  **.**   By defin
1910: 69 74 69 6f 6e 2c 20 74 68 65 72 65 20 69 73 20  ition, there is 
1920: 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
1930: 6f 6e 65 20 74 79 70 65 20 28 62 29 20 72 65 63  one type (b) rec
1940: 6f 72 64 20 69 6e 20 61 20 72 6f 77 2e 0a 2a 2a  ord in a row..**
1950: 20 20 20 54 79 70 65 20 28 62 29 20 72 65 63 6f     Type (b) reco
1960: 72 64 73 20 6f 6e 6c 79 20 65 76 65 72 20 61 70  rds only ever ap
1970: 70 65 61 72 20 6f 6e 20 68 65 69 67 68 74 3d 31  pear on height=1
1980: 20 70 61 67 65 73 20 2d 20 69 6d 6d 65 64 69 61   pages - immedia
1990: 74 65 20 70 61 72 65 6e 74 73 0a 2a 2a 20 20 20  te parents.**   
19a0: 6f 66 20 6c 65 61 76 65 73 2e 20 4f 6e 6c 79 20  of leaves. Only 
19b0: 74 79 70 65 20 28 61 29 20 72 65 63 6f 72 64 73  type (a) records
19c0: 20 61 72 65 20 70 75 73 68 65 64 20 74 6f 20 68   are pushed to h
19d0: 69 67 68 65 72 20 6c 65 76 65 6c 73 2e 0a 2a 2a  igher levels..**
19e0: 0a 2a 2a 20 20 20 54 65 72 6d 20 66 6f 72 6d 61  .**   Term forma
19f0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 4e  t:.**.**     * N
1a00: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
1a10: 6e 20 63 6f 6d 6d 6f 6e 20 77 69 74 68 20 70 72  n common with pr
1a20: 65 76 69 6f 75 73 20 74 65 72 6d 20 70 6c 75 73  evious term plus
1a30: 20 32 2c 20 61 73 20 61 20 76 61 72 69 6e 74 2e   2, as a varint.
1a40: 0a 2a 2a 20 20 20 20 20 2a 20 4e 75 6d 62 65 72  .**     * Number
1a50: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77   of bytes of new
1a60: 20 74 65 72 6d 20 64 61 74 61 2c 20 61 73 20 61   term data, as a
1a70: 20 76 61 72 69 6e 74 2e 0a 2a 2a 20 20 20 20 20   varint..**     
1a80: 2a 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61 2e  * new term data.
1a90: 0a 2a 2a 0a 2a 2a 20 20 20 4e 6f 2d 74 65 72 6d  .**.**   No-term
1aa0: 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a 20 20   format:.**.**  
1ab0: 20 20 20 2a 20 65 69 74 68 65 72 20 61 6e 20 30     * either an 0
1ac0: 78 30 30 20 6f 72 20 30 78 30 31 20 62 79 74 65  x00 or 0x01 byte
1ad0: 2e 20 49 66 20 74 68 65 20 76 61 6c 75 65 20 30  . If the value 0
1ae0: 78 30 31 20 69 73 20 75 73 65 64 2c 20 74 68 65  x01 is used, the
1af0: 6e 20 74 68 65 72 65 20 0a 2a 2a 20 20 20 20 20  n there .**     
1b00: 20 20 69 73 20 61 6e 20 61 73 73 6f 63 69 61 74    is an associat
1b10: 65 64 20 69 6e 64 65 78 2d 62 79 2d 72 6f 77 69  ed index-by-rowi
1b20: 64 20 72 65 63 6f 72 64 2e 0a 2a 2a 20 20 20 20  d record..**    
1b30: 20 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   * the number of
1b40: 20 7a 65 72 6f 2d 74 65 72 6d 20 6c 65 61 76 65   zero-term leave
1b50: 73 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a  s as a varint..*
1b60: 2a 0a 2a 2a 20 35 2e 20 53 65 67 6d 65 6e 74 20  *.** 5. Segment 
1b70: 64 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 3a  doclist indexes:
1b80: 0a 2a 2a 0a 2a 2a 20 20 20 44 6f 63 6c 69 73 74  .**.**   Doclist
1b90: 20 69 6e 64 65 78 65 73 20 61 72 65 20 74 68 65   indexes are the
1ba0: 6d 73 65 6c 76 65 73 20 62 2d 74 72 65 65 73 2c  mselves b-trees,
1bb0: 20 68 6f 77 65 76 65 72 20 74 68 65 79 20 75 73   however they us
1bc0: 75 61 6c 6c 79 20 63 6f 6e 73 69 73 74 20 6f 66  ually consist of
1bd0: 0a 2a 2a 20 20 20 61 20 73 69 6e 67 6c 65 20 6c  .**   a single l
1be0: 65 61 66 20 72 65 63 6f 72 64 20 6f 6e 6c 79 2e  eaf record only.
1bf0: 20 54 68 65 20 66 6f 72 6d 61 74 20 6f 66 20 65   The format of e
1c00: 61 63 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ach doclist inde
1c10: 78 20 6c 65 61 66 20 70 61 67 65 20 0a 2a 2a 20  x leaf page .** 
1c20: 20 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20    is:.**.**     
1c30: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1c40: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1c50: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 69     0x01: Clear i
1c60: 66 20 6c 65 61 66 20 69 73 20 61 6c 73 6f 20 74  f leaf is also t
1c70: 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  he root page, ot
1c80: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1c90: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1ca0: 6d 62 65 72 20 6f 66 20 66 74 73 20 69 6e 64 65  mber of fts inde
1cb0: 78 20 6c 65 61 66 20 70 61 67 65 2e 20 41 73 20  x leaf page. As 
1cc0: 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
1cd0: 20 20 20 20 2a 20 46 69 72 73 74 20 64 6f 63 69      * First doci
1ce0: 64 20 6f 6e 20 70 61 67 65 20 69 6e 64 69 63 61  d on page indica
1cf0: 74 65 64 20 62 79 20 70 72 65 76 69 6f 75 73 20  ted by previous 
1d00: 66 69 65 6c 64 2e 20 41 73 20 61 20 76 61 72 69  field. As a vari
1d10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  nt..**.**     * 
1d20: 41 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74  A list of varint
1d30: 73 2c 20 6f 6e 65 20 66 6f 72 20 65 61 63 68 20  s, one for each 
1d40: 73 75 62 73 65 71 75 65 6e 74 20 74 65 72 6d 6c  subsequent terml
1d50: 65 73 73 20 70 61 67 65 2e 20 41 20 0a 2a 2a 20  ess page. A .** 
1d60: 20 20 20 20 20 20 70 6f 73 69 74 69 76 65 20 64        positive d
1d70: 65 6c 74 61 20 69 66 20 74 68 65 20 74 65 72 6d  elta if the term
1d80: 6c 65 73 73 20 70 61 67 65 20 63 6f 6e 74 61 69  less page contai
1d90: 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ns at least one 
1da0: 64 6f 63 69 64 2c 20 0a 2a 2a 20 20 20 20 20 20  docid, .**      
1db0: 20 6f 72 20 61 6e 20 30 78 30 30 20 62 79 74 65   or an 0x00 byte
1dc0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
1dd0: 2a 20 20 20 49 6e 74 65 72 6e 61 6c 20 64 6f 63  *   Internal doc
1de0: 6c 69 73 74 20 69 6e 64 65 78 20 6e 6f 64 65 73  list index nodes
1df0: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   are:.**.**     
1e00: 2a 20 46 6c 61 67 73 20 62 79 74 65 2e 20 42 69  * Flags byte. Bi
1e10: 74 73 20 61 72 65 3a 0a 2a 2a 20 20 20 20 20 20  ts are:.**      
1e20: 20 20 20 30 78 30 31 3a 20 43 6c 65 61 72 20 66     0x01: Clear f
1e30: 6f 72 20 72 6f 6f 74 20 70 61 67 65 2c 20 6f 74  or root page, ot
1e40: 68 65 72 77 69 73 65 20 73 65 74 2e 0a 2a 2a 0a  herwise set..**.
1e50: 2a 2a 20 20 20 20 20 2a 20 50 61 67 65 20 6e 75  **     * Page nu
1e60: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 63 68  mber of first ch
1e70: 69 6c 64 20 70 61 67 65 2e 20 41 73 20 61 20 76  ild page. As a v
1e80: 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  arint..**.**    
1e90: 20 2a 20 43 6f 70 79 20 6f 66 20 66 69 72 73 74   * Copy of first
1ea0: 20 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20 69   docid on page i
1eb0: 6e 64 69 63 61 74 65 64 20 62 79 20 70 72 65 76  ndicated by prev
1ec0: 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73 20 61  ious field. As a
1ed0: 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 20   varint..**.**  
1ee0: 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66 20 64     * A list of d
1ef0: 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 76 61 72  elta-encoded var
1f00: 69 6e 74 73 20 2d 20 74 68 65 20 66 69 72 73 74  ints - the first
1f10: 20 64 6f 63 69 64 20 6f 6e 20 65 61 63 68 20 73   docid on each s
1f20: 75 62 73 65 71 75 65 6e 74 0a 2a 2a 20 20 20 20  ubsequent.**    
1f30: 20 20 20 63 68 69 6c 64 20 70 61 67 65 2e 20 0a     child page. .
1f40: 2a 2a 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77  **.*/../*.** Row
1f50: 69 64 73 20 66 6f 72 20 74 68 65 20 61 76 65 72  ids for the aver
1f60: 61 67 65 73 20 61 6e 64 20 73 74 72 75 63 74 75  ages and structu
1f70: 72 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  re records in th
1f80: 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a  e %_data table..
1f90: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f  */.#define FTS5_
1fa0: 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20 20  AVERAGES_ROWID  
1fb0: 20 20 20 31 20 20 20 20 2f 2a 20 52 6f 77 69 64     1    /* Rowid
1fc0: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 61 76   used for the av
1fd0: 65 72 61 67 65 73 20 72 65 63 6f 72 64 20 2a 2f  erages record */
1fe0: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 53 54  .#define FTS5_ST
1ff0: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 20 20 20  RUCTURE_ROWID   
2000: 31 30 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  10    /* The str
2010: 75 63 74 75 72 65 20 72 65 63 6f 72 64 20 2a 2f  ucture record */
2020: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 64  ../*.** Macros d
2030: 65 74 65 72 6d 69 6e 69 6e 67 20 74 68 65 20 72  etermining the r
2040: 6f 77 69 64 73 20 75 73 65 64 20 62 79 20 73 65  owids used by se
2050: 67 6d 65 6e 74 20 6e 6f 64 65 73 2e 20 41 6c 6c  gment nodes. All
2060: 20 6e 6f 64 65 73 20 69 6e 20 61 6c 6c 0a 2a 2a   nodes in all.**
2070: 20 73 65 67 6d 65 6e 74 73 20 66 6f 72 20 61 6c   segments for al
2080: 6c 20 69 6e 64 65 78 65 73 20 28 74 68 65 20 72  l indexes (the r
2090: 65 67 75 6c 61 72 20 46 54 53 20 69 6e 64 65 78  egular FTS index
20a0: 20 61 6e 64 20 61 6e 79 20 70 72 65 66 69 78 20   and any prefix 
20b0: 69 6e 64 65 78 65 73 29 0a 2a 2a 20 61 72 65 20  indexes).** are 
20c0: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 25 5f  stored in the %_
20d0: 64 61 74 61 20 74 61 62 6c 65 20 77 69 74 68 20  data table with 
20e0: 6c 61 72 67 65 20 70 6f 73 69 74 69 76 65 20 72  large positive r
20f0: 6f 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  owids..**.** The
2100: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 6d 61   %_data table ma
2110: 79 20 63 6f 6e 74 61 69 6e 20 75 70 20 74 6f 20  y contain up to 
2120: 28 31 3c 3c 46 54 53 35 5f 53 45 47 4d 45 4e 54  (1<<FTS5_SEGMENT
2130: 5f 49 4e 44 45 58 5f 42 49 54 53 29 20 0a 2a 2a  _INDEX_BITS) .**
2140: 20 69 6e 64 65 78 65 73 20 2d 20 6f 6e 65 20 72   indexes - one r
2150: 65 67 75 6c 61 72 20 74 65 72 6d 20 69 6e 64 65  egular term inde
2160: 78 20 61 6e 64 20 7a 65 72 6f 20 6f 72 20 6d 6f  x and zero or mo
2170: 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78 65  re prefix indexe
2180: 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 73 65  s..**.** Each se
2190: 67 6d 65 6e 74 20 69 6e 20 61 6e 20 69 6e 64 65  gment in an inde
21a0: 78 20 68 61 73 20 61 20 75 6e 69 71 75 65 20 69  x has a unique i
21b0: 64 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  d greater than z
21c0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20  ero..**.** Each 
21d0: 6e 6f 64 65 20 69 6e 20 61 20 73 65 67 6d 65 6e  node in a segmen
21e0: 74 20 62 2d 74 72 65 65 20 69 73 20 61 73 73 69  t b-tree is assi
21f0: 67 6e 65 64 20 61 20 22 70 61 67 65 20 6e 75 6d  gned a "page num
2200: 62 65 72 22 20 74 68 61 74 20 69 73 20 75 6e 69  ber" that is uni
2210: 71 75 65 0a 2a 2a 20 77 69 74 68 69 6e 20 6e 6f  que.** within no
2220: 64 65 73 20 6f 66 20 69 74 73 20 68 65 69 67 68  des of its heigh
2230: 74 20 77 69 74 68 69 6e 20 74 68 65 20 73 65 67  t within the seg
2240: 6d 65 6e 74 20 28 6c 65 61 66 20 6e 6f 64 65 73  ment (leaf nodes
2250: 20 68 61 76 65 20 61 20 68 65 69 67 68 74 20 0a   have a height .
2260: 2a 2a 20 6f 66 20 30 2c 20 70 61 72 65 6e 74 73  ** of 0, parents
2270: 20 31 2c 20 65 74 63 2e 29 2e 20 50 61 67 65 20   1, etc.). Page 
2280: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 6c 6f  numbers are allo
2290: 63 61 74 65 64 20 73 65 71 75 65 6e 74 69 61 6c  cated sequential
22a0: 6c 79 20 73 6f 20 74 68 61 74 0a 2a 2a 20 61 20  ly so that.** a 
22b0: 6e 6f 64 65 73 20 70 61 67 65 20 6e 75 6d 62 65  nodes page numbe
22c0: 72 20 69 73 20 61 6c 77 61 79 73 20 6f 6e 65 20  r is always one 
22d0: 6d 6f 72 65 20 74 68 61 6e 20 69 74 73 20 6c 65  more than its le
22e0: 66 74 20 73 69 62 6c 69 6e 67 2e 0a 2a 2a 0a 2a  ft sibling..**.*
22f0: 2a 20 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20  * The rowid for 
2300: 61 20 6e 6f 64 65 20 69 73 20 74 68 65 6e 20 66  a node is then f
2310: 6f 75 6e 64 20 75 73 69 6e 67 20 74 68 65 20 46  ound using the F
2320: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2330: 44 28 29 20 6d 61 63 72 6f 0a 2a 2a 20 62 65 6c  D() macro.** bel
2340: 6f 77 2e 20 54 68 65 20 46 54 53 35 5f 53 45 47  ow. The FTS5_SEG
2350: 4d 45 4e 54 5f 2a 5f 42 49 54 53 20 6d 61 63 72  MENT_*_BITS macr
2360: 6f 73 20 64 65 66 69 6e 65 20 74 68 65 20 6e 75  os define the nu
2370: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 75 73 65  mber of bits use
2380: 64 0a 2a 2a 20 74 6f 20 65 6e 63 6f 64 65 20 74  d.** to encode t
2390: 68 65 20 74 68 72 65 65 20 46 54 53 35 5f 53 45  he three FTS5_SE
23a0: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 20 61 72  GMENT_ROWID() ar
23b0: 67 75 6d 65 6e 74 73 2e 20 54 68 69 73 20 6d 6f  guments. This mo
23c0: 64 75 6c 65 20 72 65 74 75 72 6e 73 0a 2a 2a 20  dule returns.** 
23d0: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
23e0: 66 61 69 6c 73 20 74 68 65 20 63 75 72 72 65 6e  fails the curren
23f0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 66 20 74  t operation if t
2400: 68 65 79 20 65 76 65 72 20 70 72 6f 76 65 20 74  hey ever prove t
2410: 6f 6f 20 73 6d 61 6c 6c 2e 0a 2a 2f 0a 23 64 65  oo small..*/.#de
2420: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 49  fine FTS5_DATA_I
2430: 44 5f 42 20 20 20 20 20 31 36 20 20 20 20 20 2f  D_B     16     /
2440: 2a 20 4d 61 78 20 73 65 67 20 69 64 20 6e 75 6d  * Max seg id num
2450: 62 65 72 20 36 35 35 33 35 20 2a 2f 0a 23 64 65  ber 65535 */.#de
2460: 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 44  fine FTS5_DATA_D
2470: 4c 49 5f 42 20 20 20 20 20 31 20 20 20 20 20 2f  LI_B     1     /
2480: 2a 20 44 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * Doclist-index 
2490: 66 6c 61 67 20 28 31 20 62 69 74 29 20 2a 2f 0a  flag (1 bit) */.
24a0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24b0: 41 5f 48 45 49 47 48 54 5f 42 20 20 35 20 20 20  A_HEIGHT_B  5   
24c0: 20 20 2f 2a 20 4d 61 78 20 62 2d 74 72 65 65 20    /* Max b-tree 
24d0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
24e0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
24f0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2500: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2510: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2520: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2530: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2540: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2550: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2570: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2580: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2590: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
25a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
25b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
25c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
25d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
25e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
25f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2600: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2610: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2620: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2630: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2640: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2670: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
26c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
26d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
26e0: 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 66   height, pgno) f
26f0: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30  ts5_dri(segid, 0
2700: 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 0a  , height, pgno).
2710: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 4c 49  #define FTS5_DLI
2720: 44 58 5f 52 4f 57 49 44 28 73 65 67 69 64 2c 20  DX_ROWID(segid, 
2730: 68 65 69 67 68 74 2c 20 70 67 6e 6f 29 20 20 20  height, pgno)   
2740: 66 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20  fts5_dri(segid, 
2750: 31 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  1, height, pgno)
2760: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
2770: 73 65 67 6d 65 6e 74 73 20 70 65 72 6d 69 74 74  segments permitt
2780: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 69  ed in a single i
2790: 6e 64 65 78 20 0a 2a 2f 0a 23 64 65 66 69 6e 65  ndex .*/.#define
27a0: 20 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e   FTS5_MAX_SEGMEN
27b0: 54 20 32 30 30 30 0a 0a 23 69 66 64 65 66 20 53  T 2000..#ifdef S
27c0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 69 6e 74 20  QLITE_DEBUG.int 
27d0: 73 71 6c 69 74 65 33 46 74 73 35 43 6f 72 72 75  sqlite3Fts5Corru
27e0: 70 74 28 29 20 7b 20 72 65 74 75 72 6e 20 53 51  pt() { return SQ
27f0: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
2800: 42 3b 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  B; }.#endif.../*
2810: 0a 2a 2a 20 45 61 63 68 20 74 69 6d 65 20 61 20  .** Each time a 
2820: 62 6c 6f 62 20 69 73 20 72 65 61 64 20 66 72 6f  blob is read fro
2830: 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2840: 6c 65 2c 20 69 74 20 69 73 20 70 61 64 64 65 64  le, it is padded
2850: 20 77 69 74 68 20 74 68 69 73 0a 2a 2a 20 6d 61   with this.** ma
2860: 6e 79 20 7a 65 72 6f 20 62 79 74 65 73 2e 20 54  ny zero bytes. T
2870: 68 69 73 20 6d 61 6b 65 73 20 69 74 20 65 61 73  his makes it eas
2880: 69 65 72 20 74 6f 20 64 65 63 6f 64 65 20 74 68  ier to decode th
2890: 65 20 76 61 72 69 6f 75 73 20 72 65 63 6f 72 64  e various record
28a0: 20 66 6f 72 6d 61 74 73 0a 2a 2a 20 77 69 74 68   formats.** with
28b0: 6f 75 74 20 6f 76 65 72 72 65 61 64 69 6e 67 20  out overreading 
28c0: 69 66 20 74 68 65 20 72 65 63 6f 72 64 73 20 61  if the records a
28d0: 72 65 20 63 6f 72 72 75 70 74 2e 0a 2a 2f 0a 23  re corrupt..*/.#
28e0: 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54 41  define FTS5_DATA
28f0: 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 20 38 0a  _ZERO_PADDING 8.
2900: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
2910: 41 5f 50 41 44 44 49 4e 47 20 32 30 0a 0a 74 79  A_PADDING 20..ty
2920: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2930: 35 44 61 74 61 20 46 74 73 35 44 61 74 61 3b 0a  5Data Fts5Data;.
2940: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2950: 74 73 35 44 6c 69 64 78 49 74 65 72 20 46 74 73  ts5DlidxIter Fts
2960: 35 44 6c 69 64 78 49 74 65 72 3b 0a 74 79 70 65  5DlidxIter;.type
2970: 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35 44  def struct Fts5D
2980: 6c 69 64 78 4c 76 6c 20 46 74 73 35 44 6c 69 64  lidxLvl Fts5Dlid
2990: 78 4c 76 6c 3b 0a 74 79 70 65 64 65 66 20 73 74  xLvl;.typedef st
29a0: 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 57 72  ruct Fts5DlidxWr
29b0: 69 74 65 72 20 46 74 73 35 44 6c 69 64 78 57 72  iter Fts5DlidxWr
29c0: 69 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  iter;.typedef st
29d0: 72 75 63 74 20 46 74 73 35 4e 6f 64 65 49 74 65  ruct Fts5NodeIte
29e0: 72 20 46 74 73 35 4e 6f 64 65 49 74 65 72 3b 0a  r Fts5NodeIter;.
29f0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
2a00: 74 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74  ts5PageWriter Ft
2a10: 73 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79  s5PageWriter;.ty
2a20: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2a30: 35 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67  5SegIter Fts5Seg
2a40: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
2a50: 72 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74  ruct Fts5Doclist
2a60: 49 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74  Iter Fts5Doclist
2a70: 49 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74  Iter;.typedef st
2a80: 72 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74  ruct Fts5SegWrit
2a90: 65 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72  er Fts5SegWriter
2aa0: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2ab0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46   Fts5Structure F
2ac0: 74 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79  ts5Structure;.ty
2ad0: 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73  pedef struct Fts
2ae0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2af0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
2b00: 65 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  el;.typedef stru
2b10: 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ct Fts5Structure
2b20: 53 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75  Segment Fts5Stru
2b30: 63 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73  ctureSegment;..s
2b40: 74 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b  truct Fts5Data {
2b50: 0a 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20  .  u8 *p;       
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2b80: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
2b90: 6e 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69  ng record */.  i
2ba0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bc0: 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
2bd0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 7d 3b 0a   in bytes */.};.
2be0: 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20 6f 62 6a 65 63  ./*.** One objec
2bf0: 74 20 70 65 72 20 25 5f 64 61 74 61 20 74 61 62  t per %_data tab
2c00: 6c 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  le..*/.struct Ft
2c10: 73 35 49 6e 64 65 78 20 7b 0a 20 20 46 74 73 35  s5Index {.  Fts5
2c20: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 3b  Config *pConfig;
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
2c40: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 63 6f 6e  irtual table con
2c50: 66 69 67 75 72 61 74 69 6f 6e 20 2a 2f 0a 20 20  figuration */.  
2c60: 63 68 61 72 20 2a 7a 44 61 74 61 54 62 6c 3b 20  char *zDataTbl; 
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 2f 2a 20 4e 61 6d 65 20 6f 66 20 25 5f 64 61 74  /* Name of %_dat
2c90: 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  a table */.  int
2ca0: 20 6e 57 6f 72 6b 55 6e 69 74 3b 20 20 20 20 20   nWorkUnit;     
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cc0: 4c 65 61 66 20 70 61 67 65 73 20 69 6e 20 61 20  Leaf pages in a 
2cd0: 22 75 6e 69 74 22 20 6f 66 20 77 6f 72 6b 20 2a  "unit" of work *
2ce0: 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 56 61 72  /..  /*.  ** Var
2cf0: 69 61 62 6c 65 73 20 72 65 6c 61 74 65 64 20 74  iables related t
2d00: 6f 20 74 68 65 20 61 63 63 75 6d 75 6c 61 74 69  o the accumulati
2d10: 6f 6e 20 6f 66 20 74 6f 6b 65 6e 73 20 61 6e 64  on of tokens and
2d20: 20 64 6f 63 6c 69 73 74 73 20 77 69 74 68 69 6e   doclists within
2d30: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 2d 6d 65 6d   the.  ** in-mem
2d40: 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 20  ory hash tables 
2d50: 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
2d60: 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73 6b 2e  flushed to disk.
2d70: 0a 20 20 2a 2f 0a 20 20 46 74 73 35 48 61 73 68  .  */.  Fts5Hash
2d80: 20 2a 70 48 61 73 68 3b 20 20 20 20 20 20 20 20   *pHash;        
2d90: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
2da0: 74 61 62 6c 65 20 66 6f 72 20 69 6e 2d 6d 65 6d  table for in-mem
2db0: 6f 72 79 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  ory data */.  in
2dc0: 74 20 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61 74  t nMaxPendingDat
2dd0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  a;            /*
2de0: 20 4d 61 78 20 70 65 6e 64 69 6e 67 20 64 61 74   Max pending dat
2df0: 61 20 62 65 66 6f 72 65 20 66 6c 75 73 68 20 74  a before flush t
2e00: 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 6e 74 20  o disk */.  int 
2e10: 6e 50 65 6e 64 69 6e 67 44 61 74 61 3b 20 20 20  nPendingData;   
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2e30: 75 72 72 65 6e 74 20 62 79 74 65 73 20 6f 66 20  urrent bytes of 
2e40: 70 65 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  pending data */.
2e50: 20 20 69 36 34 20 69 57 72 69 74 65 52 6f 77 69    i64 iWriteRowi
2e60: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2e70: 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 63    /* Rowid for c
2e80: 75 72 72 65 6e 74 20 64 6f 63 20 62 65 69 6e 67  urrent doc being
2e90: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 46 74   written */.  Ft
2ea0: 73 35 42 75 66 66 65 72 20 73 63 72 61 74 63 68  s5Buffer scratch
2eb0: 3b 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73 74  ;..  /* Error st
2ec0: 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ate. */.  int rc
2ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
2ef0: 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  rent error code 
2f00: 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20 75  */..  /* State u
2f10: 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35 44  sed by the fts5D
2f20: 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69 6f  ataXXX() functio
2f30: 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ns. */.  sqlite3
2f40: 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b 20  _blob *pReader; 
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20 69           /* RO i
2f60: 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f 6e  ncr-blob open on
2f70: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
2f80: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2f90: 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20 20  *pWriter;       
2fa0: 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e     /* "INSERT ..
2fb0: 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53 28  . %_data VALUES(
2fc0: 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74  ?,?)" */.  sqlit
2fd0: 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74 65  e3_stmt *pDelete
2fe0: 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22 44  r;         /* "D
2ff0: 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74  ELETE FROM %_dat
3000: 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44 20  a ... id>=? AND 
3010: 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c 69  id<=?" */.  sqli
3020: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 57 72  te3_stmt *pIdxWr
3030: 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20 22  iter;       /* "
3040: 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64 78  INSERT ... %_idx
3050: 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 29   VALUES(?,?,?,?)
3060: 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  " */.  sqlite3_s
3070: 74 6d 74 20 2a 70 49 64 78 44 65 6c 65 74 65 72  tmt *pIdxDeleter
3080: 3b 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45 54  ;      /* "DELET
3090: 45 20 46 52 4f 4d 20 25 5f 69 64 78 20 57 48 45  E FROM %_idx WHE
30a0: 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20 20  RE segid=? */.  
30b0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
30c0: 64 78 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20  dxSelect;.  int 
30d0: 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20 20  nRead;          
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
30f0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
3100: 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d 3b  locks read */.};
3110: 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f 63  ..struct Fts5Doc
3120: 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38 20  listIter {.  u8 
3130: 2a 61 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69  *a;.  int n;.  i
3140: 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4f 75 74 70  nt i;..  /* Outp
3150: 75 74 20 76 61 72 69 61 62 6c 65 73 2e 20 61 50  ut variables. aP
3160: 6f 73 6c 69 73 74 3d 3d 30 20 61 74 20 45 4f 46  oslist==0 at EOF
3170: 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
3180: 3b 0a 20 20 75 38 20 2a 61 50 6f 73 6c 69 73 74  ;.  u8 *aPoslist
3190: 3b 0a 20 20 69 6e 74 20 6e 50 6f 73 6c 69 73 74  ;.  int nPoslist
31a0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.};../*.** The 
31b0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
31c0: 22 73 74 72 75 63 74 75 72 65 22 20 72 65 63 6f  "structure" reco
31d0: 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  rd for each inde
31e0: 78 20 61 72 65 20 72 65 70 72 65 73 65 6e 74 65  x are represente
31f0: 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20 46 74  d.** using an Ft
3200: 73 35 53 74 72 75 63 74 75 72 65 20 72 65 63 6f  s5Structure reco
3210: 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 57 68  rd in memory. Wh
3220: 69 63 68 20 75 73 65 73 20 69 6e 73 74 61 6e 63  ich uses instanc
3230: 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 6f 74  es of the .** ot
3240: 68 65 72 20 46 74 73 35 53 74 72 75 63 74 75 72  her Fts5Structur
3250: 65 58 58 58 20 74 79 70 65 73 20 61 73 20 63 6f  eXXX types as co
3260: 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73 74 72  mponents..*/.str
3270: 75 63 74 20 46 74 73 35 53 74 72 75 63 74 75 72  uct Fts5Structur
3280: 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69 6e 74  eSegment {.  int
3290: 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20   iSegid;        
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32b0: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
32c0: 69 6e 74 20 6e 48 65 69 67 68 74 3b 20 20 20 20  int nHeight;    
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e0: 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 73 65 67  /* Height of seg
32f0: 6d 65 6e 74 20 62 2d 74 72 65 65 20 2a 2f 0a 20  ment b-tree */. 
3300: 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b 20   int pgnoFirst; 
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3320: 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20 70   /* First leaf p
3330: 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
3340: 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 70  gment */.  int p
3350: 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20 20  gnoLast;        
3360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
3370: 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  st leaf page num
3380: 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a  ber in segment *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 7b  StructureLevel {
33b0: 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20 20  .  int nMerge;  
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33e0: 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63 72  segments in incr
33f0: 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74 20  -merge */.  int 
3400: 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20  nSeg;           
3410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3420: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
3430: 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c  egments on level
3440: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3450: 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65 67  ureSegment *aSeg
3460: 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  ;     /* Array o
3470: 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65 67  f segments. aSeg
3480: 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20 2a  [0] is oldest. *
3490: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
34a0: 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69 6e  Structure {.  in
34b0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
34c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34d0: 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   Object referenc
34e0: 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36 34  e count */.  u64
34f0: 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 20   nWriteCounter; 
3500: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3510: 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72 69  Total leaves wri
3520: 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30 20  tten to level 0 
3530: 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
3540: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3550: 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 65       /* Total se
3560: 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20 73  gments in this s
3570: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e  tructure */.  in
3580: 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20 20  t nLevel;       
3590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
35a0: 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c   Number of level
35b0: 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78 20  s in this index 
35c0: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
35d0: 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b 31  reLevel aLevel[1
35e0: 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  ];   /* Array of
35f0: 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f 62   nLevel level ob
3600: 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  jects */.};../*.
3610: 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66 20  ** An object of 
3620: 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69 74  type Fts5SegWrit
3630: 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77 72  er is used to wr
3640: 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73 2e  ite to segments.
3650: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 50  .*/.struct Fts5P
3660: 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  ageWriter {.  in
3670: 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20  t pgno;         
3680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3690: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
36a0: 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
36b0: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20  Fts5Buffer buf; 
36c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d0: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
36e0: 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a  ning page data *
36f0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3700: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3710: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3720: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3730: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3740: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
3750: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
3760: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
3790: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
37a0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
37b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37c0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
37d0: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
37e0: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63   /* Previous doc
3810: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3820: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3830: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3850: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
3860: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
3870: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
3880: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
3890: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
38a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
38b0: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
38c0: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
38d0: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
38e0: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
38f0: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3900: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3920: 2f 2a 20 50 72 65 76 69 6f 75 73 20 64 6f 63 69  /* Previous doci
3930: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3940: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
3950: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
3960: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
3970: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
3980: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
3990: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
39a0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
39b0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
39c0: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
39d0: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
39e0: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 62 46 69  page */.  u8 bFi
39f0: 72 73 74 54 65 72 6d 49 6e 50 61 67 65 3b 20 20  rstTermInPage;  
3a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3a10: 65 20 69 66 20 6e 65 78 74 20 74 65 72 6d 20 77  e if next term w
3a20: 69 6c 6c 20 62 65 20 66 69 72 73 74 20 69 6e 20  ill be first in 
3a30: 6c 65 61 66 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c  leaf */.  int nL
3a40: 65 61 66 57 72 69 74 74 65 6e 3b 20 20 20 20 20  eafWritten;     
3a50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3a60: 62 65 72 20 6f 66 20 6c 65 61 66 20 70 61 67 65  ber of leaf page
3a70: 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69  s written */.  i
3a80: 6e 74 20 6e 45 6d 70 74 79 3b 20 20 20 20 20 20  nt nEmpty;      
3a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3aa0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 74  * Number of cont
3ab0: 69 67 75 6f 75 73 20 74 65 72 6d 2d 6c 65 73 73  iguous term-less
3ac0: 20 6e 6f 64 65 73 20 2a 2f 0a 0a 20 20 69 6e 74   nodes */..  int
3ad0: 20 6e 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20   nDlidx;        
3ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3af0: 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
3b00: 66 20 61 44 6c 69 64 78 5b 5d 20 61 72 72 61 79  f aDlidx[] array
3b10: 20 2a 2f 0a 20 20 46 74 73 35 44 6c 69 64 78 57   */.  Fts5DlidxW
3b20: 72 69 74 65 72 20 2a 61 44 6c 69 64 78 3b 20 20  riter *aDlidx;  
3b30: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
3b40: 66 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f Fts5DlidxWrite
3b50: 72 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 0a 20 20  r objects */..  
3b60: 2f 2a 20 56 61 6c 75 65 73 20 74 6f 20 69 6e 73  /* Values to ins
3b70: 65 72 74 20 69 6e 74 6f 20 74 68 65 20 25 5f 69  ert into the %_i
3b80: 64 78 20 74 61 62 6c 65 20 2a 2f 0a 20 20 46 74  dx table */.  Ft
3b90: 73 35 42 75 66 66 65 72 20 62 74 74 65 72 6d 3b  s5Buffer btterm;
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3bb0: 20 54 4f 44 4f 3a 20 44 6f 63 73 20 2a 2f 0a 20   TODO: Docs */. 
3bc0: 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20 20   int iBtPage;   
3bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3be0: 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 2a   /* TODO: This *
3bf0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65  /.};../*.** Obje
3c00: 63 74 20 66 6f 72 20 69 74 65 72 61 74 69 6e 67  ct for iterating
3c10: 20 74 68 72 6f 75 67 68 20 74 68 65 20 6d 65 72   through the mer
3c20: 67 65 64 20 72 65 73 75 6c 74 73 20 6f 66 20 6f  ged results of o
3c30: 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67 6d 65  ne or more segme
3c40: 6e 74 73 2c 0a 2a 2a 20 76 69 73 69 74 69 6e 67  nts,.** visiting
3c50: 20 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64   each term/docid
3c60: 20 70 61 69 72 20 69 6e 20 74 68 65 20 6d 65 72   pair in the mer
3c70: 67 65 64 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20  ged data..**.** 
3c80: 6e 53 65 67 20 69 73 20 61 6c 77 61 79 73 20 61  nSeg is always a
3c90: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 67 72   power of two gr
3ca0: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
3cb0: 75 61 6c 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ual to the numbe
3cc0: 72 20 6f 66 0a 2a 2a 20 73 65 67 6d 65 6e 74 73  r of.** segments
3cd0: 20 74 68 61 74 20 74 68 69 73 20 6f 62 6a 65 63   that this objec
3ce0: 74 20 69 73 20 6d 65 72 67 69 6e 67 20 64 61 74  t is merging dat
3cf0: 61 20 66 72 6f 6d 2e 20 42 6f 74 68 20 74 68 65  a from. Both the
3d00: 20 61 53 65 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61   aSeg[] and.** a
3d10: 46 69 72 73 74 5b 5d 20 61 72 72 61 79 73 20 61  First[] arrays a
3d20: 72 65 20 73 69 7a 65 64 20 61 74 20 6e 53 65 67  re sized at nSeg
3d30: 20 65 6e 74 72 69 65 73 2e 20 54 68 65 20 61 53   entries. The aS
3d40: 65 67 5b 5d 20 61 72 72 61 79 20 69 73 20 70 61  eg[] array is pa
3d50: 64 64 65 64 0a 2a 2a 20 77 69 74 68 20 7a 65 72  dded.** with zer
3d60: 6f 65 64 20 6f 62 6a 65 63 74 73 20 2d 20 74 68  oed objects - th
3d70: 65 73 65 20 61 72 65 20 68 61 6e 64 6c 65 64 20  ese are handled 
3d80: 61 73 20 69 66 20 74 68 65 79 20 77 65 72 65 20  as if they were 
3d90: 69 74 65 72 61 74 6f 72 73 20 6f 70 65 6e 65 64  iterators opened
3da0: 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79 20 73 65 67  .** on empty seg
3db0: 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ments..**.** The
3dc0: 20 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70   results of comp
3dd0: 61 72 69 6e 67 20 73 65 67 6d 65 6e 74 73 20 61  aring segments a
3de0: 53 65 67 5b 4e 5d 20 61 6e 64 20 61 53 65 67 5b  Seg[N] and aSeg[
3df0: 4e 2b 31 5d 2c 20 77 68 65 72 65 20 4e 20 69 73  N+1], where N is
3e00: 20 61 6e 0a 2a 2a 20 65 76 65 6e 20 6e 75 6d 62   an.** even numb
3e10: 65 72 2c 20 69 73 20 73 74 6f 72 65 64 20 69 6e  er, is stored in
3e20: 20 61 46 69 72 73 74 5b 28 6e 53 65 67 2b 4e 29   aFirst[(nSeg+N)
3e30: 2f 32 5d 2e 20 54 68 65 20 22 72 65 73 75 6c 74  /2]. The "result
3e40: 22 20 6f 66 20 74 68 65 20 0a 2a 2a 20 63 6f 6d  " of the .** com
3e50: 70 61 72 69 73 6f 6e 20 69 6e 20 74 68 69 73 20  parison in this 
3e60: 63 6f 6e 74 65 78 74 20 69 73 20 74 68 65 20 69  context is the i
3e70: 6e 64 65 78 20 6f 66 20 74 68 65 20 69 74 65 72  ndex of the iter
3e80: 61 74 6f 72 20 74 68 61 74 20 63 75 72 72 65 6e  ator that curren
3e90: 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  tly.** points to
3ea0: 20 74 68 65 20 73 6d 61 6c 6c 65 72 20 74 65 72   the smaller ter
3eb0: 6d 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  m/rowid combinat
3ec0: 69 6f 6e 2e 20 49 74 65 72 61 74 6f 72 73 20 61  ion. Iterators a
3ed0: 74 20 45 4f 46 20 61 72 65 0a 2a 2a 20 63 6f 6e  t EOF are.** con
3ee0: 73 69 64 65 72 65 64 20 74 6f 20 62 65 20 67 72  sidered to be gr
3ef0: 65 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 6f  eater than all o
3f00: 74 68 65 72 20 69 74 65 72 61 74 6f 72 73 2e 0a  ther iterators..
3f10: 2a 2a 0a 2a 2a 20 61 46 69 72 73 74 5b 31 5d 20  **.** aFirst[1] 
3f20: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 64  contains the ind
3f30: 65 78 20 69 6e 20 61 53 65 67 5b 5d 20 6f 66 20  ex in aSeg[] of 
3f40: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 68 61  the iterator tha
3f50: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74  t points to.** t
3f60: 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
3f70: 6f 76 65 72 61 6c 6c 2e 20 61 46 69 72 73 74 5b  overall. aFirst[
3f80: 30 5d 20 69 73 20 75 6e 75 73 65 64 2e 20 0a 2a  0] is unused. .*
3f90: 2f 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  /..typedef struc
3fa0: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 46 74  t Fts5CResult Ft
3fb0: 73 35 43 52 65 73 75 6c 74 3b 0a 73 74 72 75 63  s5CResult;.struc
3fc0: 74 20 46 74 73 35 43 52 65 73 75 6c 74 20 7b 0a  t Fts5CResult {.
3fd0: 20 20 75 31 36 20 69 46 69 72 73 74 3b 20 20 20    u16 iFirst;   
3fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ff0: 20 20 2f 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65    /* aSeg[] inde
4000: 78 20 6f 66 20 66 69 72 73 74 65 73 74 20 69 74  x of firstest it
4010: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62  erator */.  u8 b
4020: 54 65 72 6d 45 71 3b 20 20 20 20 20 20 20 20 20  TermEq;         
4030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4040: 72 75 65 20 69 66 20 74 68 65 20 74 65 72 6d 73  rue if the terms
4050: 20 61 72 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b   are equal */.};
4060: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
4070: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
4080: 6f 75 67 68 20 61 20 73 69 6e 67 6c 65 20 73 65  ough a single se
4090: 67 6d 65 6e 74 2c 20 76 69 73 69 74 69 6e 67 20  gment, visiting 
40a0: 65 61 63 68 20 74 65 72 6d 2f 64 6f 63 69 64 0a  each term/docid.
40b0: 2a 2a 20 70 61 69 72 20 69 6e 20 74 68 65 20 73  ** pair in the s
40c0: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53  egment..**.** pS
40d0: 65 67 3a 0a 2a 2a 20 20 20 54 68 65 20 73 65 67  eg:.**   The seg
40e0: 6d 65 6e 74 20 74 6f 20 69 74 65 72 61 74 65 20  ment to iterate 
40f0: 74 68 72 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69  through..**.** i
4100: 4c 65 61 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43  LeafPgno:.**   C
4110: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
4120: 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 73   number within s
4130: 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c  egment..**.** iL
4140: 65 61 66 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20  eafOffset:.**   
4150: 42 79 74 65 20 6f 66 66 73 65 74 20 77 69 74 68  Byte offset with
4160: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  in the current l
4170: 65 61 66 20 74 68 61 74 20 69 73 20 74 68 65 20  eaf that is the 
4180: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
4190: 65 20 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e  e .**   position
41a0: 20 6c 69 73 74 20 64 61 74 61 20 28 6f 6e 65 20   list data (one 
41b0: 62 79 74 65 20 70 61 73 73 65 64 20 74 68 65 20  byte passed the 
41c0: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
41d0: 7a 65 20 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20  ze field)..**   
41e0: 72 6f 77 69 64 20 66 69 65 6c 64 20 6f 66 20 74  rowid field of t
41f0: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
4200: 2e 20 55 73 75 61 6c 6c 79 20 74 68 69 73 20 69  . Usually this i
4210: 73 20 74 68 65 20 73 69 7a 65 20 66 69 65 6c 64  s the size field
4220: 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73   of the.**   pos
4230: 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e  ition list data.
4240: 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e 20 69   The exception i
4250: 73 20 69 66 20 74 68 65 20 72 6f 77 69 64 20 66  s if the rowid f
4260: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65  or the current e
4270: 6e 74 72 79 20 0a 2a 2a 20 20 20 69 73 20 74 68  ntry .**   is th
4280: 65 20 6c 61 73 74 20 74 68 69 6e 67 20 6f 6e 20  e last thing on 
4290: 74 68 65 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a  the leaf page..*
42a0: 2a 0a 2a 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20  *.** pLeaf:.**  
42b0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
42c0: 6e 67 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  ng current leaf 
42d0: 70 61 67 65 20 64 61 74 61 2e 20 53 65 74 20 74  page data. Set t
42e0: 6f 20 4e 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a  o NULL at EOF..*
42f0: 2a 0a 2a 2a 20 69 54 65 72 6d 4c 65 61 66 50 67  *.** iTermLeafPg
4300: 6e 6f 2c 20 69 54 65 72 6d 4c 65 61 66 4f 66 66  no, iTermLeafOff
4310: 73 65 74 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70  set:.**   Leaf p
4320: 61 67 65 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61  age number conta
4330: 69 6e 69 6e 67 20 74 68 65 20 6c 61 73 74 20 74  ining the last t
4340: 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 74 68  erm read from th
4350: 65 20 73 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a  e segment. And.*
4360: 2a 20 20 20 74 68 65 20 6f 66 66 73 65 74 20 69  *   the offset i
4370: 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f  mmediately follo
4380: 77 69 6e 67 20 74 68 65 20 74 65 72 6d 20 64 61  wing the term da
4390: 74 61 2e 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a  ta..**.** flags:
43a0: 0a 2a 2a 20 20 20 4d 61 73 6b 20 6f 66 20 46 54  .**   Mask of FT
43b0: 53 35 5f 53 45 47 49 54 45 52 5f 58 58 58 20 76  S5_SEGITER_XXX v
43c0: 61 6c 75 65 73 2e 20 49 6e 74 65 72 70 72 65 74  alues. Interpret
43d0: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
43e0: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
43f0: 54 45 52 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20  TER_ONETERM:.** 
4400: 20 20 20 20 49 66 20 73 65 74 2c 20 73 65 74 20      If set, set 
4410: 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
4420: 70 6f 69 6e 74 20 74 6f 20 45 4f 46 20 61 66 74  point to EOF aft
4430: 65 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  er the current d
4440: 6f 63 6c 69 73 74 20 0a 2a 2a 20 20 20 20 20 68  oclist .**     h
4450: 61 73 20 62 65 65 6e 20 65 78 68 61 75 73 74 65  as been exhauste
4460: 64 2e 20 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65  d. Do not procee
4470: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  d to the next te
4480: 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e  rm in the segmen
4490: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f  t..**.**   FTS5_
44a0: 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 3a  SEGITER_REVERSE:
44b0: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61  .**     This fla
44c0: 67 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 73  g is only ever s
44d0: 65 74 20 69 66 20 46 54 53 35 5f 53 45 47 49 54  et if FTS5_SEGIT
44e0: 45 52 5f 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c  ER_ONETERM is al
44f0: 73 6f 20 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20  so set. If.**   
4500: 20 20 69 74 20 69 73 20 73 65 74 2c 20 69 74 65    it is set, ite
4510: 72 61 74 65 20 74 68 72 6f 75 67 68 20 64 6f 63  rate through doc
4520: 69 64 73 20 69 6e 20 64 65 73 63 65 6e 64 69 6e  ids in descendin
4530: 67 20 6f 72 64 65 72 20 69 6e 73 74 65 61 64 20  g order instead 
4540: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 64 65  of the.**     de
4550: 66 61 75 6c 74 20 61 73 63 65 6e 64 69 6e 67 20  fault ascending 
4560: 6f 72 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f  order..**.** iRo
4570: 77 69 64 4f 66 66 73 65 74 2f 6e 52 6f 77 69 64  widOffset/nRowid
4580: 4f 66 66 73 65 74 2f 61 52 6f 77 69 64 4f 66 66  Offset/aRowidOff
4590: 73 65 74 3a 0a 2a 2a 20 20 20 20 20 54 68 65 73  set:.**     Thes
45a0: 65 20 61 72 65 20 75 73 65 64 20 69 66 20 74 68  e are used if th
45b0: 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  e FTS5_SEGITER_R
45c0: 45 56 45 52 53 45 20 66 6c 61 67 20 69 73 20 73  EVERSE flag is s
45d0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f  et..**.**     Fo
45e0: 72 20 65 61 63 68 20 72 6f 77 69 64 20 6f 6e 20  r each rowid on 
45f0: 74 68 65 20 70 61 67 65 20 63 6f 72 72 65 73 70  the page corresp
4600: 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 63 75  onding to the cu
4610: 72 72 65 6e 74 20 74 65 72 6d 2c 20 74 68 65 0a  rrent term, the.
4620: 2a 2a 20 20 20 20 20 63 6f 72 72 65 73 70 6f 6e  **     correspon
4630: 64 69 6e 67 20 61 52 6f 77 69 64 4f 66 66 73 65  ding aRowidOffse
4640: 74 5b 5d 20 65 6e 74 72 79 20 69 73 20 73 65 74  t[] entry is set
4650: 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66   to the byte off
4660: 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 20 20  set of the.**   
4670: 20 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 22    start of the "
4680: 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 2d 73 69  position-list-si
4690: 7a 65 22 20 66 69 65 6c 64 20 77 69 74 68 69 6e  ze" field within
46a0: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
46b0: 72 75 63 74 20 46 74 73 35 53 65 67 49 74 65 72  ruct Fts5SegIter
46c0: 20 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75   {.  Fts5Structu
46d0: 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b  reSegment *pSeg;
46e0: 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20       /* Segment 
46f0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
4700: 67 68 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  gh */.  int flag
4710: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
4720: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
4730: 6f 66 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  of configuration
4740: 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20   flags */.  int 
4750: 69 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20  iLeafPgno;      
4760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
4770: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
4780: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 46 74 73   number */.  Fts
4790: 35 44 61 74 61 20 2a 70 4c 65 61 66 3b 20 20 20  5Data *pLeaf;   
47a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47b0: 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
47c0: 61 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  a */.  Fts5Data 
47d0: 2a 70 4e 65 78 74 4c 65 61 66 3b 20 20 20 20 20  *pNextLeaf;     
47e0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 66 20 70         /* Leaf p
47f0: 61 67 65 20 28 69 4c 65 61 66 50 67 6e 6f 2b 31  age (iLeafPgno+1
4800: 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  ) */.  int iLeaf
4810: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
4820: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f         /* Byte o
4830: 66 66 73 65 74 20 77 69 74 68 69 6e 20 63 75 72  ffset within cur
4840: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 0a 20 20  rent leaf */..  
4850: 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64 20  /* The page and 
4860: 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69 63  offset from whic
4870: 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 65  h the current te
4880: 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68 65  rm was read. The
4890: 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69 73   offset .  ** is
48a0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
48b0: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
48c0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f  n the current do
48d0: 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e 74  clist.  */.  int
48e0: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a   iTermLeafPgno;.
48f0: 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66 4f    int iTermLeafO
4900: 66 66 73 65 74 3b 0a 0a 20 20 2f 2a 20 54 68 65  ffset;..  /* The
4910: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f   following are o
4920: 6e 6c 79 20 75 73 65 64 20 69 66 20 74 68 65 20  nly used if the 
4930: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
4940: 45 52 53 45 20 66 6c 61 67 20 69 73 20 73 65 74  ERSE flag is set
4950: 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69  . */.  int iRowi
4960: 64 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20  dOffset;        
4970: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4980: 74 20 65 6e 74 72 79 20 69 6e 20 61 52 6f 77 69  t entry in aRowi
4990: 64 4f 66 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69  dOffset[] */.  i
49a0: 6e 74 20 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b  nt nRowidOffset;
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
49c0: 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
49d0: 20 6f 66 20 61 52 6f 77 69 64 4f 66 66 73 65 74   of aRowidOffset
49e0: 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e  [] array */.  in
49f0: 74 20 2a 61 52 6f 77 69 64 4f 66 66 73 65 74 3b  t *aRowidOffset;
4a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a10: 20 41 72 72 61 79 20 6f 66 20 6f 66 66 73 65 74   Array of offset
4a20: 20 74 6f 20 72 6f 77 69 64 20 66 69 65 6c 64 73   to rowid fields
4a30: 20 2a 2f 0a 0a 20 20 46 74 73 35 44 6c 69 64 78   */..  Fts5Dlidx
4a40: 49 74 65 72 20 2a 70 44 6c 69 64 78 3b 20 20 20  Iter *pDlidx;   
4a50: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
4a60: 72 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d  re is a doclist-
4a70: 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56  index */..  /* V
4a80: 61 72 69 61 62 6c 65 73 20 70 6f 70 75 6c 61 74  ariables populat
4a90: 65 64 20 62 61 73 65 64 20 6f 6e 20 63 75 72 72  ed based on curr
4aa0: 65 6e 74 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20  ent entry. */.  
4ab0: 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
4ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ad0: 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20  /* Current term 
4ae0: 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  */.  i64 iRowid;
4af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b00: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
4b10: 72 6f 77 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  rowid */.  int n
4b20: 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Pos;            
4b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b40: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
4b50: 20 63 75 72 72 65 6e 74 20 70 6f 73 69 74 69 6f   current positio
4b60: 6e 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  n list */.  int 
4b70: 62 44 65 6c 3b 20 20 20 20 20 20 20 20 20 20 20  bDel;           
4b80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4b90: 72 75 65 20 69 66 20 74 68 65 20 64 65 6c 65 74  rue if the delet
4ba0: 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a 2f  e flag is set */
4bb0: 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 46 54 53  .};..#define FTS
4bc0: 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52  5_SEGITER_ONETER
4bd0: 4d 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46  M 0x01.#define F
4be0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
4bf0: 52 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 0a 2a 2a  RSE 0x02.../*.**
4c00: 20 70 6f 73 6c 69 73 74 3a 0a 2a 2a 20 20 20 55   poslist:.**   U
4c10: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 46 74  sed by sqlite3Ft
4c20: 73 35 49 74 65 72 50 6f 73 6c 69 73 74 28 29 20  s5IterPoslist() 
4c30: 77 68 65 6e 20 74 68 65 20 70 6f 73 6c 69 73 74  when the poslist
4c40: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 75 66   needs to be buf
4c50: 66 65 72 65 64 2e 0a 2a 2a 20 20 20 54 68 65 72  fered..**   Ther
4c60: 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20 74  e is no way to t
4c70: 65 6c 6c 20 69 66 20 74 68 69 73 20 69 73 20 70  ell if this is p
4c80: 6f 70 75 6c 61 74 65 64 20 6f 72 20 6e 6f 74 2e  opulated or not.
4c90: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 49  .*/.struct Fts5I
4ca0: 6e 64 65 78 49 74 65 72 20 7b 0a 20 20 46 74 73  ndexIter {.  Fts
4cb0: 35 49 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20  5Index *pIndex; 
4cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4cd0: 49 6e 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20  Index that owns 
4ce0: 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f  this iterator */
4cf0: 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
4d00: 20 2a 70 53 74 72 75 63 74 3b 20 20 20 20 20 20   *pStruct;      
4d10: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 73     /* Database s
4d20: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 69  tructure for thi
4d30: 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  s iterator */.  
4d40: 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c 69  Fts5Buffer posli
4d50: 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
4d60: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
4d70: 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f 73  ning current pos
4d80: 6c 69 73 74 20 2a 2f 0a 0a 20 20 69 6e 74 20 6e  list */..  int n
4d90: 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
4da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
4db0: 7a 65 20 6f 66 20 61 53 65 67 5b 5d 20 61 72 72  ze of aSeg[] arr
4dc0: 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 76  ay */.  int bRev
4dd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4de0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
4df0: 74 6f 20 69 74 65 72 61 74 65 20 69 6e 20 72 65  to iterate in re
4e00: 76 65 72 73 65 20 6f 72 64 65 72 20 2a 2f 0a 20  verse order */. 
4e10: 20 69 6e 74 20 62 53 6b 69 70 45 6d 70 74 79 3b   int bSkipEmpty;
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 6b 69 70   /* True to skip
4e40: 20 64 65 6c 65 74 65 64 20 65 6e 74 72 69 65 73   deleted entries
4e50: 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20   */.  int bEof; 
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 61 74        /* True at
4e80: 20 45 4f 46 20 2a 2f 0a 0a 20 20 69 36 34 20 69   EOF */..  i64 i
4e90: 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20 20  SwitchRowid;    
4ea0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
4eb0: 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66 20  rstest rowid of 
4ec0: 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72 73  other than aFirs
4ed0: 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43 52  t[1] */.  Fts5CR
4ee0: 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20 20  esult *aFirst;  
4ef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
4f00: 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74 65  rent merge state
4f10: 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f 0a   (see above) */.
4f20: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61 53    Fts5SegIter aS
4f30: 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 20  eg[1];          
4f40: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65    /* Array of se
4f50: 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73 20  gment iterators 
4f60: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 62  */.};.../*.** Ob
4f70: 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61 74 69  ject for iterati
4f80: 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65 20 63  ng through the c
4f90: 6f 6e 65 6e 74 73 20 6f 66 20 61 20 73 69 6e 67  onents of a sing
4fa0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65  le internal node
4fb0: 20 69 6e 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a   in .** memory..
4fc0: 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 4e 6f  */.struct Fts5No
4fd0: 64 65 49 74 65 72 20 7b 0a 20 20 2f 2a 20 49 6e  deIter {.  /* In
4fe0: 74 65 72 6e 61 6c 2e 20 53 65 74 20 61 6e 64 20  ternal. Set and 
4ff0: 6d 61 6e 61 67 65 64 20 62 79 20 66 74 73 35 4e  managed by fts5N
5000: 6f 64 65 49 74 65 72 58 58 58 28 29 20 66 75 6e  odeIterXXX() fun
5010: 63 74 69 6f 6e 73 2e 20 45 78 63 65 70 74 2c 20  ctions. Except, 
5020: 0a 20 20 2a 2a 20 74 68 65 20 45 4f 46 20 74 65  .  ** the EOF te
5030: 73 74 20 66 6f 72 20 74 68 65 20 69 74 65 72 61  st for the itera
5040: 74 6f 72 20 69 73 20 28 46 74 73 35 4e 6f 64 65  tor is (Fts5Node
5050: 49 74 65 72 2e 61 44 61 74 61 3d 3d 30 29 2e 20  Iter.aData==0). 
5060: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
5070: 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 44 61  aData;.  int nDa
5080: 74 61 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a  ta;.  int iOff;.
5090: 0a 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72  .  /* Output var
50a0: 69 61 62 6c 65 73 20 2a 2f 0a 20 20 46 74 73 35  iables */.  Fts5
50b0: 42 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69  Buffer term;.  i
50c0: 6e 74 20 6e 45 6d 70 74 79 3b 0a 20 20 69 6e 74  nt nEmpty;.  int
50d0: 20 69 43 68 69 6c 64 3b 0a 20 20 69 6e 74 20 62   iChild;.  int b
50e0: 44 6c 69 64 78 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Dlidx;.};../*.**
50f0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
5100: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79  the following ty
5110: 70 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 74  pe is used to it
5120: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
5130: 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
5140: 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
5150: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70   record..**.** p
5160: 44 61 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72  Data:.**   Recor
5170: 64 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  d containing the
5180: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64   doclist-index d
5190: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a  ata..**.** bEof:
51a0: 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75  .**   Set to tru
51b0: 65 20 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20  e once iterator 
51c0: 68 61 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e  has reached EOF.
51d0: 0a 2a 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20  .**.** iOff:.** 
51e0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
51f0: 72 65 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68  rent offset with
5200: 69 6e 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e  in record pData.
5210: 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44  .*/.struct Fts5D
5220: 6c 69 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35  lidxLvl {.  Fts5
5230: 44 61 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20  Data *pData;    
5240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
5250: 61 20 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61  a for current pa
5260: 67 65 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c  ge of this level
5270: 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20   */.  int iOff; 
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f      /* Current o
52a0: 66 66 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61  ffset into pData
52b0: 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20   */.  int bEof; 
52c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52d0: 20 20 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c      /* At EOF al
52e0: 72 65 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69  ready */.  int i
52f0: 46 69 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20  FirstOff;       
5300: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
5310: 20 62 79 20 72 65 76 65 72 73 65 20 69 74 65 72   by reverse iter
5320: 61 74 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  ators */..  /* O
5330: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
5340: 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67  */.  int iLeafPg
5350: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
5360: 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
5370: 72 20 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61  r of current lea
5380: 66 20 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20  f page */.  i64 
5390: 69 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  iRowid;         
53a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
53b0: 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66  st rowid on leaf
53c0: 20 69 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b   iLeafPgno */.};
53d0: 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69 64  .struct Fts5Dlid
53e0: 78 49 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c  xIter {.  int nL
53f0: 76 6c 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64  vl;.  int iSegid
5400: 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c  ;.  Fts5DlidxLvl
5410: 20 61 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 0a 0a   aLvl[1];.};....
5420: 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  /*.** The first 
5430: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
5440: 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20 69 73  to this macro is
5450: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
5460: 20 46 74 73 35 42 75 66 66 65 72 0a 2a 2a 20 6f   Fts5Buffer.** o
5470: 62 6a 65 63 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  bject..*/.#defin
5480: 65 20 66 74 73 35 42 75 66 66 65 72 53 69 7a 65  e fts5BufferSize
5490: 28 70 42 75 66 2c 6e 29 20 7b 20 20 20 20 20 20  (pBuf,n) {      
54a0: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66            \.  if
54b0: 28 20 70 42 75 66 2d 3e 6e 53 70 61 63 65 3c 6e  ( pBuf->nSpace<n
54c0: 20 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20   ) {            
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
54e0: 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 73 71 6c    u8 *pNew = sql
54f0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 42 75  ite3_realloc(pBu
5500: 66 2d 3e 70 2c 20 6e 29 3b 20 20 20 20 20 5c 0a  f->p, n);     \.
5510: 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20      if( pNew==0 
5520: 29 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ){              
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 5c 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  \.      sqlite3_
5550: 66 72 65 65 28 70 42 75 66 2d 3e 70 29 3b 20 20  free(pBuf->p);  
5560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5570: 20 20 5c 0a 20 20 20 20 7d 20 20 20 20 20 20 20    \.    }       
5580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 20 20 5c 0a 20 20 20 20 70 42 75 66 2d 3e      \.    pBuf->
55b0: 6e 53 70 61 63 65 20 3d 20 6e 3b 20 20 20 20 20  nSpace = n;     
55c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55d0: 20 20 20 20 20 20 5c 0a 20 20 20 20 70 42 75 66        \.    pBuf
55e0: 2d 3e 70 20 3d 20 70 4e 65 77 3b 20 20 20 20 20  ->p = pNew;     
55f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5600: 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 20 20 20          \.  }   
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5630: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 73            \.}..s
5640: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50  tatic void fts5P
5650: 75 74 55 31 36 28 75 38 20 2a 61 4f 75 74 2c 20  utU16(u8 *aOut, 
5660: 75 31 36 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75  u16 iVal){.  aOu
5670: 74 5b 30 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29  t[0] = (iVal>>8)
5680: 3b 0a 20 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69  ;.  aOut[1] = (i
5690: 56 61 6c 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74  Val&0xFF);.}..st
56a0: 61 74 69 63 20 75 31 36 20 66 74 73 35 47 65 74  atic u16 fts5Get
56b0: 55 31 36 28 63 6f 6e 73 74 20 75 38 20 2a 61 49  U16(const u8 *aI
56c0: 6e 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 28 75  n){.  return ((u
56d0: 31 36 29 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20  16)aIn[0] << 8) 
56e0: 2b 20 61 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a  + aIn[1];.} ../*
56f0: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64  .** Allocate and
5700: 20 72 65 74 75 72 6e 20 61 20 62 75 66 66 65 72   return a buffer
5710: 20 61 74 20 6c 65 61 73 74 20 6e 42 79 74 65 20   at least nByte 
5720: 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
5730: 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65  *.** If an OOM e
5740: 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
5750: 72 65 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  red, return NULL
5760: 20 61 6e 64 20 73 65 74 20 74 68 65 20 65 72 72   and set the err
5770: 6f 72 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68  or code in.** th
5780: 65 20 46 74 73 35 49 6e 64 65 78 20 68 61 6e 64  e Fts5Index hand
5790: 6c 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  le passed as the
57a0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
57b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
57c0: 2a 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46  *fts5IdxMalloc(F
57d0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
57e0: 20 6e 42 79 74 65 29 7b 0a 20 20 72 65 74 75 72   nByte){.  retur
57f0: 6e 20 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  n sqlite3Fts5Mal
5800: 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c 20  locZero(&p->rc, 
5810: 6e 42 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nByte);.}../*.**
5820: 20 43 6f 6d 70 61 72 65 20 74 68 65 20 63 6f 6e   Compare the con
5830: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 4c 65  tents of the pLe
5840: 66 74 20 62 75 66 66 65 72 20 77 69 74 68 20 74  ft buffer with t
5850: 68 65 20 70 52 69 67 68 74 2f 6e 52 69 67 68 74  he pRight/nRight
5860: 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a 2a 20 52 65 74   blob..**.** Ret
5870: 75 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74  urn -ve if pLeft
5880: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
5890: 20 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68   pRight, 0 if th
58a0: 65 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a  ey are equal or.
58b0: 2a 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74  ** +ve if pRight
58c0: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
58d0: 20 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72   pLeft. In other
58e0: 20 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   words:.**.**   
58f0: 20 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d    res = *pLeft -
5900: 20 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74   *pRight.*/.stat
5910: 69 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65  ic int fts5Buffe
5920: 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 0a 20 20  rCompareBlob(.  
5930: 46 74 73 35 42 75 66 66 65 72 20 2a 70 4c 65 66  Fts5Buffer *pLef
5940: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
5950: 2f 2a 20 4c 65 66 74 20 68 61 6e 64 20 73 69 64  /* Left hand sid
5960: 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20  e of comparison 
5970: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
5980: 52 69 67 68 74 2c 20 69 6e 74 20 6e 52 69 67 68  Right, int nRigh
5990: 74 20 20 20 20 2f 2a 20 52 69 67 68 74 20 68 61  t    /* Right ha
59a0: 6e 64 20 73 69 64 65 20 6f 66 20 63 6f 6d 70 61  nd side of compa
59b0: 72 69 73 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e  rison */.){.  in
59c0: 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70 4c 65  t nCmp = MIN(pLe
59d0: 66 74 2d 3e 6e 2c 20 6e 52 69 67 68 74 29 3b 0a  ft->n, nRight);.
59e0: 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d 63    int res = memc
59f0: 6d 70 28 70 4c 65 66 74 2d 3e 70 2c 20 70 52 69  mp(pLeft->p, pRi
5a00: 67 68 74 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65  ght, nCmp);.  re
5a10: 74 75 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28  turn (res==0 ? (
5a20: 70 4c 65 66 74 2d 3e 6e 20 2d 20 6e 52 69 67 68  pLeft->n - nRigh
5a30: 74 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 0a 2f  t) : res);.}.../
5a40: 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
5a50: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
5a60: 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69   two buffers usi
5a70: 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20  ng memcmp(). If 
5a80: 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73  one buffer.** is
5a90: 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
5aa0: 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f   other, it is co
5ab0: 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73  nsidered the les
5ac0: 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ser..**.** Retur
5ad0: 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69  n -ve if pLeft i
5ae0: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5af0: 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79  Right, 0 if they
5b00: 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a   are equal or.**
5b10: 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69   +ve if pRight i
5b20: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70  s smaller than p
5b30: 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77  Left. In other w
5b40: 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ords:.**.**     
5b50: 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a  res = *pLeft - *
5b60: 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63  pRight.*/.static
5b70: 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43   int fts5BufferC
5b80: 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65  ompare(Fts5Buffe
5b90: 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75  r *pLeft, Fts5Bu
5ba0: 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20  ffer *pRight){. 
5bb0: 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
5bc0: 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74  pLeft->n, pRight
5bd0: 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20  ->n);.  int res 
5be0: 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e  = memcmp(pLeft->
5bf0: 70 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43  p, pRight->p, nC
5c00: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5c10: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
5c20: 6e 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a  n - pRight->n) :
5c30: 20 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66   res);.}..#ifdef
5c40: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74   SQLITE_DEBUG.st
5c50: 61 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f  atic int fts5Blo
5c60: 62 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73  bCompare(.  cons
5c70: 74 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74  t u8 *pLeft, int
5c80: 20 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74   nLeft, .  const
5c90: 20 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74   u8 *pRight, int
5ca0: 20 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74   nRight.){.  int
5cb0: 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66   nCmp = MIN(nLef
5cc0: 74 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e  t, nRight);.  in
5cd0: 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70  t res = memcmp(p
5ce0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43  Left, pRight, nC
5cf0: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5d00: 65 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d  es==0 ? (nLeft -
5d10: 20 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b   nRight) : res);
5d20: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
5d30: 2a 20 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64  * Close the read
5d40: 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c  -only blob handl
5d50: 65 2c 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e  e, if it is open
5d60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5d70: 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72   fts5CloseReader
5d80: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
5d90: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5da0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5db0: 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20  blob *pReader = 
5dc0: 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20  p->pReader;.    
5dd0: 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a  p->pReader = 0;.
5de0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62      sqlite3_blob
5df0: 5f 63 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b  _close(pReader);
5e00: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46  .  }.}..static F
5e10: 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74  ts5Data *fts5Dat
5e20: 61 52 65 61 64 4f 72 42 75 66 66 65 72 28 0a 20  aReadOrBuffer(. 
5e30: 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
5e40: 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
5e50: 75 66 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  uf, .  i64 iRowi
5e60: 64 0a 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20  d.){.  Fts5Data 
5e70: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 66 28  *pRet = 0;.  if(
5e80: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
5e90: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  K ){.    int rc 
5ea0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
5eb0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5ec0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
5ed0: 73 20 63 61 6c 6c 20 6d 61 79 20 72 65 74 75 72  s call may retur
5ee0: 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 69  n SQLITE_ABORT i
5ef0: 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e  f there has been
5f00: 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 20 20 20   a savepoint.   
5f10: 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 73     ** rollback s
5f20: 69 6e 63 65 20 69 74 20 77 61 73 20 6c 61 73 74  ince it was last
5f30: 20 75 73 65 64 2e 20 49 6e 20 74 68 69 73 20 63   used. In this c
5f40: 61 73 65 20 61 20 6e 65 77 20 62 6c 6f 62 20 68  ase a new blob h
5f50: 61 6e 64 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69  andle.      ** i
5f60: 73 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a  s required.  */.
5f70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c        sqlite3_bl
5f80: 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 70 2d 3e 70  ob *pBlob = p->p
5f90: 52 65 61 64 65 72 3b 0a 20 20 20 20 20 20 70 2d  Reader;.      p-
5fa0: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
5fb0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5fc0: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c  _blob_reopen(pBl
5fd0: 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20  ob, iRowid);.   
5fe0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52     assert( p->pR
5ff0: 65 61 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20  eader==0 );.    
6000: 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20 70    p->pReader = p
6010: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 69 66 28 20  Blob;.      if( 
6020: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
6030: 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 6c 6f  .        fts5Clo
6040: 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
6050: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
6060: 63 3d 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  c==SQLITE_ABORT 
6070: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
6080: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6090: 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 6e 64  If the blob hand
60a0: 6c 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  le is not yet op
60b0: 65 6e 2c 20 6f 70 65 6e 20 61 6e 64 20 73 65 65  en, open and see
60c0: 6b 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c  k it. Otherwise,
60d0: 20 75 73 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   use.    ** the 
60e0: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29 20 41 50  blob_reopen() AP
60f0: 49 20 74 6f 20 72 65 73 65 65 6b 20 74 68 65 20  I to reseek the 
6100: 65 78 69 73 74 69 6e 67 20 62 6c 6f 62 20 68 61  existing blob ha
6110: 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ndle.  */.    if
6120: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
6130: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
6140: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f   ){.      Fts5Co
6150: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
6160: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
6170: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
6180: 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
6190: 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  ->db, .         
61a0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
61b0: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f  ->zDataTbl, "blo
61c0: 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20  ck", iRowid, 0, 
61d0: 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20  &p->pReader.    
61e0: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
61f0: 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  /* If either of 
6200: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
6210: 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
6220: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29  e3_blob_reopen()
6230: 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62   calls.    ** ab
6240: 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c  ove returned SQL
6250: 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72  ITE_ERROR, retur
6260: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
6270: 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20  _VTAB instead.. 
6280: 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65     ** All the re
6290: 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63  asons those func
62a0: 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75  tions might retu
62b0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
62c0: 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a  - missing.    **
62d0: 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20   table, missing 
62e0: 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65  row, non-blob/te
62f0: 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75  xt in block colu
6300: 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20  mn - indicate . 
6310: 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74     ** backing st
6320: 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ore corruption. 
6330: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
6340: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72  SQLITE_ERROR ) r
6350: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
6360: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
6370: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6380: 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b 20    u8 *aOut = 0; 
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63a0: 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20   Read blob data 
63b0: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
63c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
63d0: 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  yte = sqlite3_bl
63e0: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61  ob_bytes(p->pRea
63f0: 64 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  der);.      if( 
6400: 70 42 75 66 20 29 7b 0a 20 20 20 20 20 20 20 20  pBuf ){.        
6410: 66 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 70  fts5BufferSize(p
6420: 42 75 66 2c 20 4d 41 58 28 6e 42 79 74 65 2c 20  Buf, MAX(nByte, 
6430: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a  p->pConfig->pgsz
6440: 29 20 2b 20 32 30 29 3b 0a 20 20 20 20 20 20 20  ) + 20);.       
6450: 20 70 42 75 66 2d 3e 6e 20 3d 20 6e 42 79 74 65   pBuf->n = nByte
6460: 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20 3d  ;.        aOut =
6470: 20 70 42 75 66 2d 3e 70 3b 0a 20 20 20 20 20 20   pBuf->p;.      
6480: 20 20 69 66 28 20 61 4f 75 74 3d 3d 30 20 29 7b    if( aOut==0 ){
6490: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
64a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
64b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
64c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
64d0: 20 6e 53 70 61 63 65 20 3d 20 6e 42 79 74 65 20   nSpace = nByte 
64e0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
64f0: 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 70 52 65  ING;.        pRe
6500: 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73  t = (Fts5Data*)s
6510: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 53  qlite3_malloc(nS
6520: 70 61 63 65 2b 73 69 7a 65 6f 66 28 46 74 73 35  pace+sizeof(Fts5
6530: 44 61 74 61 29 29 3b 0a 20 20 20 20 20 20 20 20  Data));.        
6540: 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20  if( pRet ){.    
6550: 20 20 20 20 20 20 70 52 65 74 2d 3e 6e 20 3d 20        pRet->n = 
6560: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 20  nByte;.         
6570: 20 61 4f 75 74 20 3d 20 70 52 65 74 2d 3e 70 20   aOut = pRet->p 
6580: 3d 20 28 75 38 2a 29 26 70 52 65 74 5b 31 5d 3b  = (u8*)&pRet[1];
6590: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
65a0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
65b0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
65c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
65d0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
65e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
65f0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
6600: 62 6c 6f 62 5f 72 65 61 64 28 70 2d 3e 70 52 65  blob_read(p->pRe
6610: 61 64 65 72 2c 20 61 4f 75 74 2c 20 6e 42 79 74  ader, aOut, nByt
6620: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
6630: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
6640: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6650: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
6660: 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20 70 52  Ret);.        pR
6670: 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
6680: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 72 63 20      }.    p->rc 
6690: 3d 20 72 63 3b 0a 20 20 20 20 70 2d 3e 6e 52 65  = rc;.    p->nRe
66a0: 61 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ad++;.  }..  ret
66b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
66c0: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 72 65  ** Retrieve a re
66d0: 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  cord from the %_
66e0: 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  data table..**.*
66f0: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
6700: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
6710: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
6720: 72 6f 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20  ror left in the 
6730: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62  .** Fts5Index ob
6740: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
6750: 46 74 73 35 44 61 74 61 20 2a 66 74 73 35 44 61  Fts5Data *fts5Da
6760: 74 61 52 65 61 64 28 46 74 73 35 49 6e 64 65 78  taRead(Fts5Index
6770: 20 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29   *p, i64 iRowid)
6780: 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 52  {.  Fts5Data *pR
6790: 65 74 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  et = fts5DataRea
67a0: 64 4f 72 42 75 66 66 65 72 28 70 2c 20 30 2c 20  dOrBuffer(p, 0, 
67b0: 69 52 6f 77 69 64 29 3b 0a 20 20 61 73 73 65 72  iRowid);.  asser
67c0: 74 28 20 28 70 52 65 74 3d 3d 30 29 3d 3d 28 70  t( (pRet==0)==(p
67d0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  ->rc!=SQLITE_OK)
67e0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65   );.  return pRe
67f0: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  t;.}../*.** Read
6800: 20 61 20 72 65 63 6f 72 64 20 66 72 6f 6d 20 74   a record from t
6810: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
6820: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
6830: 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 0a  supplied as the.
6840: 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ** second argume
6850: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  nt..**.** If an 
6860: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
6870: 20 65 72 72 6f 72 20 69 73 20 6c 65 66 74 20 69   error is left i
6880: 6e 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20  n the Fts5Index 
6890: 6f 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a  object. If an.**
68a0: 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
68b0: 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
68c0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
68d0: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
68e0: 61 20 0a 2a 2a 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  a .** no-op..*/.
68f0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
6900: 44 61 74 61 42 75 66 66 65 72 28 46 74 73 35 49  DataBuffer(Fts5I
6910: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 42 75 66  ndex *p, Fts5Buf
6920: 66 65 72 20 2a 70 42 75 66 2c 20 69 36 34 20 69  fer *pBuf, i64 i
6930: 52 6f 77 69 64 29 7b 0a 20 20 28 76 6f 69 64 29  Rowid){.  (void)
6940: 66 74 73 35 44 61 74 61 52 65 61 64 4f 72 42 75  fts5DataReadOrBu
6950: 66 66 65 72 28 70 2c 20 70 42 75 66 2c 20 69 52  ffer(p, pBuf, iR
6960: 6f 77 69 64 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  owid);.}../*.** 
6970: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6980: 6e 63 65 20 74 6f 20 64 61 74 61 20 72 65 63 6f  nce to data reco
6990: 72 64 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  rd returned by a
69a0: 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
69b0: 6f 0a 2a 2a 20 66 74 73 35 44 61 74 61 52 65 61  o.** fts5DataRea
69c0: 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  d()..*/.static v
69d0: 6f 69 64 20 66 74 73 35 44 61 74 61 52 65 6c 65  oid fts5DataRele
69e0: 61 73 65 28 46 74 73 35 44 61 74 61 20 2a 70 44  ase(Fts5Data *pD
69f0: 61 74 61 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ata){.  sqlite3_
6a00: 66 72 65 65 28 70 44 61 74 61 29 3b 0a 7d 0a 0a  free(pData);.}..
6a10: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49  static int fts5I
6a20: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
6a30: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
6a40: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
6a50: 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 68 61 72  **ppStmt,.  char
6a60: 20 2a 7a 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20   *zSql.){.  if( 
6a70: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
6a80: 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 53 71 6c   ){.    if( zSql
6a90: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
6aa0: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
6ab0: 65 5f 76 32 28 70 2d 3e 70 43 6f 6e 66 69 67 2d  e_v2(p->pConfig-
6ac0: 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70  >db, zSql, -1, p
6ad0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
6ae0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72  else{.      p->r
6af0: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
6b00: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
6b10: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
6b20: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63  ;.  return p->rc
6b30: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 4e 53 45  ;.}.../*.** INSE
6b40: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 61 20  RT OR REPLACE a 
6b50: 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68 65 20  record into the 
6b60: 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f  %_data table..*/
6b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
6b80: 35 44 61 74 61 57 72 69 74 65 28 46 74 73 35 49  5DataWrite(Fts5I
6b90: 6e 64 65 78 20 2a 70 2c 20 69 36 34 20 69 52 6f  ndex *p, i64 iRo
6ba0: 77 69 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  wid, const u8 *p
6bb0: 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
6bc0: 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53  {.  if( p->rc!=S
6bd0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6be0: 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 70 57 72  n;..  if( p->pWr
6bf0: 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 69  iter==0 ){.    i
6c00: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
6c10: 4b 3b 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69  K;.    Fts5Confi
6c20: 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e  g *pConfig = p->
6c30: 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73  pConfig;.    fts
6c40: 35 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d  5IndexPrepareStm
6c50: 74 28 70 2c 20 26 70 2d 3e 70 57 72 69 74 65 72  t(p, &p->pWriter
6c60: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6c70: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 52 45  f(.          "RE
6c80: 50 4c 41 43 45 20 49 4e 54 4f 20 27 25 71 27 2e  PLACE INTO '%q'.
6c90: 27 25 71 5f 64 61 74 61 27 28 69 64 2c 20 62 6c  '%q_data'(id, bl
6ca0: 6f 63 6b 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29  ock) VALUES(?,?)
6cb0: 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43  ", .          pC
6cc0: 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e  onfig->zDb, pCon
6cd0: 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29  fig->zName.    )
6ce0: 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
6cf0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a   ) return;.  }..
6d00: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
6d10: 6e 74 36 34 28 70 2d 3e 70 57 72 69 74 65 72 2c  nt64(p->pWriter,
6d20: 20 31 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 73   1, iRowid);.  s
6d30: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62  qlite3_bind_blob
6d40: 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 32 2c 20  (p->pWriter, 2, 
6d50: 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 53 51  pData, nData, SQ
6d60: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
6d70: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
6d80: 70 57 72 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72  pWriter);.  p->r
6d90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6da0: 74 28 70 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d  t(p->pWriter);.}
6db0: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
6dc0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51  the following SQ
6dd0: 4c 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c  L:.**.**     DEL
6de0: 45 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20  ETE FROM %_data 
6df0: 57 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e  WHERE id BETWEEN
6e00: 20 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c   $iFirst AND $iL
6e10: 61 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ast.*/.static vo
6e20: 69 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74  id fts5DataDelet
6e30: 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
6e40: 69 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20  i64 iFirst, i64 
6e50: 69 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d  iLast){.  if( p-
6e60: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
6e70: 20 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20   return;..  if( 
6e80: 70 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29  p->pDeleter==0 )
6e90: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
6ea0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6eb0: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
6ec0: 69 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  ig;.    char *zS
6ed0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
6ee0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 44  intf(.        "D
6ef0: 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e  ELETE FROM '%q'.
6f00: 27 25 71 5f 64 61 74 61 27 20 57 48 45 52 45 20  '%q_data' WHERE 
6f10: 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22  id>=? AND id<=?"
6f20: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f  , .          pCo
6f30: 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66  nfig->zDb, pConf
6f40: 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b  ig->zName.    );
6f50: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
6f60: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
6f70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
6f80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
6f90: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
6fa0: 72 65 5f 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64  re_v2(pConfig->d
6fb0: 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d  b, zSql, -1, &p-
6fc0: 3e 70 44 65 6c 65 74 65 72 2c 20 30 29 3b 0a 20  >pDeleter, 0);. 
6fd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
6fe0: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  e(zSql);.    }. 
6ff0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
7000: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
7010: 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
7020: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
7030: 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  }..  sqlite3_bin
7040: 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65  d_int64(p->pDele
7050: 74 65 72 2c 20 31 2c 20 69 46 69 72 73 74 29 3b  ter, 1, iFirst);
7060: 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  .  sqlite3_bind_
7070: 69 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65  int64(p->pDelete
7080: 72 2c 20 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20  r, 2, iLast);.  
7090: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
70a0: 70 44 65 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e  pDeleter);.  p->
70b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
70c0: 65 74 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b  et(p->pDeleter);
70d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
70e0: 20 61 6c 6c 20 72 65 63 6f 72 64 73 20 61 73 73   all records ass
70f0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 73 65 67  ociated with seg
7100: 6d 65 6e 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a  ment iSegid..*/.
7110: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
7120: 44 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e  DataRemoveSegmen
7130: 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  t(Fts5Index *p, 
7140: 69 6e 74 20 69 53 65 67 69 64 29 7b 0a 20 20 69  int iSegid){.  i
7150: 36 34 20 69 46 69 72 73 74 20 3d 20 46 54 53 35  64 iFirst = FTS5
7160: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
7170: 53 65 67 69 64 2c 20 30 2c 20 30 29 3b 0a 20 20  Segid, 0, 0);.  
7180: 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53 35  i64 iLast = FTS5
7190: 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69  _SEGMENT_ROWID(i
71a0: 53 65 67 69 64 2b 31 2c 20 30 2c 20 30 29 2d 31  Segid+1, 0, 0)-1
71b0: 3b 0a 20 20 66 74 73 35 44 61 74 61 44 65 6c 65  ;.  fts5DataDele
71c0: 74 65 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c  te(p, iFirst, iL
71d0: 61 73 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  ast);.  if( p->p
71e0: 49 64 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  IdxDeleter==0 ){
71f0: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
7200: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
7210: 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
7220: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
7230: 70 2c 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74  p, &p->pIdxDelet
7240: 65 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  er, sqlite3_mpri
7250: 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22  ntf(.          "
7260: 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27  DELETE FROM '%q'
7270: 2e 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20  .'%q_idx' WHERE 
7280: 73 65 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20  segid=?",.      
7290: 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
72a0: 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
72b0: 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69  .    ));.  }.  i
72c0: 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
72d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
72e0: 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70  e3_bind_int(p->p
72f0: 49 64 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69  IdxDeleter, 1, i
7300: 53 65 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Segid);.    sqli
7310: 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
7320: 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d  Deleter);.    p-
7330: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
7340: 73 65 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74  set(p->pIdxDelet
7350: 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
7360: 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65 66 65  * Release a refe
7370: 72 65 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35  rence to an Fts5
7380: 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
7390: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20   returned by an 
73a0: 65 61 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c  earlier .** call
73b0: 20 74 6f 20 66 74 73 35 53 74 72 75 63 74 75 72   to fts5Structur
73c0: 65 52 65 61 64 28 29 20 6f 72 20 66 74 73 35 53  eRead() or fts5S
73d0: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
73e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
73f0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
7400: 6c 65 61 73 65 28 46 74 73 35 53 74 72 75 63 74  lease(Fts5Struct
7410: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
7420: 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20   if( pStruct && 
7430: 30 3e 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e  0>=(--pStruct->n
7440: 52 65 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20  Ref) ){.    int 
7450: 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  i;.    assert( p
7460: 53 74 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20  Struct->nRef==0 
7470: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
7480: 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  i<pStruct->nLeve
7490: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  l; i++){.      s
74a0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72  qlite3_free(pStr
74b0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  uct->aLevel[i].a
74c0: 53 65 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Seg);.    }.    
74d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74  sqlite3_free(pSt
74e0: 72 75 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  ruct);.  }.}..st
74f0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
7500: 72 75 63 74 75 72 65 52 65 66 28 46 74 73 35 53  ructureRef(Fts5S
7510: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7520: 74 29 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e  t){.  pStruct->n
7530: 52 65 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Ref++;.}../*.** 
7540: 44 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  Deserialize and 
7550: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
7560: 74 75 72 65 20 72 65 63 6f 72 64 20 63 75 72 72  ture record curr
7570: 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20  ently stored in 
7580: 73 65 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f  serialized.** fo
7590: 72 6d 20 77 69 74 68 69 6e 20 62 75 66 66 65 72  rm within buffer
75a0: 20 70 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a   pData/nData..**
75b0: 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75  .** The Fts5Stru
75c0: 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61  cture.aLevel[] a
75d0: 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75  nd each Fts5Stru
75e0: 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b  ctureLevel.aSeg[
75f0: 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f  ] array.** are o
7600: 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79  ver-allocated by
7610: 20 6f 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20   one slot. This 
7620: 61 6c 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63  allows the struc
7630: 74 75 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a  ture contents.**
7640: 20 74 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69   to be more easi
7650: 6c 79 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a  ly edited..**.**
7660: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
7670: 75 72 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73  urs, *ppOut is s
7680: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61  et to NULL and a
7690: 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63  n SQLite error c
76a0: 6f 64 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  ode.** returned.
76b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f   Otherwise, *ppO
76c0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  ut is set to poi
76d0: 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62  nt to the new ob
76e0: 6a 65 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  ject and.** SQLI
76f0: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
7700: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
7710: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
7720: 65 28 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  e(.  const u8 *p
7730: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
7740: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63       /* Buffer c
7750: 6f 6e 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c  ontaining serial
7760: 69 7a 65 64 20 73 74 72 75 63 74 75 72 65 20 2a  ized structure *
7770: 2f 0a 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20  /.  int nData,  
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
77a0: 75 66 66 65 72 20 70 44 61 74 61 20 69 6e 20 62  uffer pData in b
77b0: 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ytes */.  int *p
77c0: 69 43 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20  iCookie,        
77d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
77e0: 66 69 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69  figuration cooki
77f0: 65 20 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73  e value */.  Fts
7800: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f  5Structure **ppO
7810: 75 74 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ut           /* 
7820: 4f 55 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65  OUT: Deserialize
7830: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  d object */.){. 
7840: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
7850: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30  _OK;.  int i = 0
7860: 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20  ;.  int iLvl;.  
7870: 69 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a  int nLevel = 0;.
7880: 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d    int nSegment =
7890: 20 30 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   0;.  int nByte;
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78b0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
78c0: 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
78d0: 61 74 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20  ate at pRet */. 
78e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
78f0: 70 52 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20  pRet = 0;       
7900: 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62   /* Structure ob
7910: 6a 65 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a  ject to return *
7920: 2f 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  /..  /* Grab the
7930: 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f   cookie value */
7940: 0a 20 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20  .  if( piCookie 
7950: 29 20 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71  ) *piCookie = sq
7960: 6c 69 74 65 33 46 74 73 35 47 65 74 33 32 28 70  lite3Fts5Get32(p
7970: 44 61 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a  Data);.  i = 4;.
7980: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74  .  /* Read the t
7990: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c  otal number of l
79a0: 65 76 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e  evels and segmen
79b0: 74 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72  ts from the star
79c0: 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74  t of the.  ** st
79d0: 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20  ructure record. 
79e0: 20 2a 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47   */.  i += fts5G
79f0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74  etVarint32(&pDat
7a00: 61 5b 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20  a[i], nLevel);. 
7a10: 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
7a20: 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c  int32(&pData[i],
7a30: 20 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 6e 42   nSegment);.  nB
7a40: 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 73 69  yte = (.      si
7a50: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7a60: 72 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  re) +           
7a70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69 6e           /* Main
7a80: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
7a90: 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53      sizeof(Fts5S
7aa0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 20 2a  tructureLevel) *
7ab0: 20 28 6e 4c 65 76 65 6c 2d 31 29 20 20 20 20 2f   (nLevel-1)    /
7ac0: 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61 79  * aLevel[] array
7ad0: 20 2a 2f 0a 20 20 29 3b 0a 20 20 70 52 65 74 20   */.  );.  pRet 
7ae0: 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65  = (Fts5Structure
7af0: 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61 6c  *)sqlite3Fts5Mal
7b00: 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20 6e 42 79  locZero(&rc, nBy
7b10: 74 65 29 3b 0a 0a 20 20 69 66 28 20 70 52 65 74  te);..  if( pRet
7b20: 20 29 7b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 52   ){.    pRet->nR
7b30: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 52 65 74  ef = 1;.    pRet
7b40: 2d 3e 6e 4c 65 76 65 6c 20 3d 20 6e 4c 65 76 65  ->nLevel = nLeve
7b50: 6c 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 53 65  l;.    pRet->nSe
7b60: 67 6d 65 6e 74 20 3d 20 6e 53 65 67 6d 65 6e 74  gment = nSegment
7b70: 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69 74  ;.    i += sqlit
7b80: 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28  e3Fts5GetVarint(
7b90: 26 70 44 61 74 61 5b 69 5d 2c 20 26 70 52 65 74  &pData[i], &pRet
7ba0: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
7bb0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
7bc0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
7bd0: 20 26 26 20 69 4c 76 6c 3c 6e 4c 65 76 65 6c 3b   && iLvl<nLevel;
7be0: 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iLvl++){.      
7bf0: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7c00: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 52 65 74  el *pLvl = &pRet
7c10: 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
7c20: 20 20 20 20 20 20 69 6e 74 20 6e 54 6f 74 61 6c        int nTotal
7c30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  ;.      int iSeg
7c40: 3b 0a 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74  ;..      i += ft
7c50: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7c60: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e  Data[i], pLvl->n
7c70: 4d 65 72 67 65 29 3b 0a 20 20 20 20 20 20 69 20  Merge);.      i 
7c80: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
7c90: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
7ca0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 61 73 73  otal);.      ass
7cb0: 65 72 74 28 20 6e 54 6f 74 61 6c 3e 3d 70 4c 76  ert( nTotal>=pLv
7cc0: 6c 2d 3e 6e 4d 65 72 67 65 20 29 3b 0a 20 20 20  l->nMerge );.   
7cd0: 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20     pLvl->aSeg = 
7ce0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7cf0: 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74  gment*)sqlite3Ft
7d00: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63  s5MallocZero(&rc
7d10: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 6e 54 6f  , .          nTo
7d20: 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  tal * sizeof(Fts
7d30: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
7d40: 74 29 0a 20 20 20 20 20 20 29 3b 0a 0a 20 20 20  t).      );..   
7d50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
7d60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
7d70: 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 54 6f  pLvl->nSeg = nTo
7d80: 74 61 6c 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  tal;.        for
7d90: 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 6e 54  (iSeg=0; iSeg<nT
7da0: 6f 74 61 6c 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  otal; iSeg++){. 
7db0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
7dc0: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7dd0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
7de0: 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64  Seg[iSeg].iSegid
7df0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
7e00: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7e10: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76  2(&pData[i], pLv
7e20: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 6e 48  l->aSeg[iSeg].nH
7e30: 65 69 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20  eight);.        
7e40: 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
7e50: 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d  rint32(&pData[i]
7e60: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
7e70: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
7e80: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
7e90: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7ea0: 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 61  Data[i], pLvl->a
7eb0: 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61  Seg[iSeg].pgnoLa
7ec0: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  st);.        }. 
7ed0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
7ee0: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
7ef0: 65 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a  eRelease(pRet);.
7f00: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
7f10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7f20: 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20 3d 20    }..  *ppOut = 
7f30: 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 72  pRet;.  return r
7f40: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73  c;.}../*.**.*/.s
7f50: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
7f60: 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65 6c  tructureAddLevel
7f70: 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 53  (int *pRc, Fts5S
7f80: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
7f90: 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  uct){.  if( *pRc
7fa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7fb0: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
7fc0: 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53   *pStruct = *ppS
7fd0: 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74 20 6e  truct;.    int n
7fe0: 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d  Level = pStruct-
7ff0: 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69 6e 74  >nLevel;.    int
8000: 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20   nByte = (.     
8010: 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74     sizeof(Fts5St
8020: 72 75 63 74 75 72 65 29 20 2b 20 20 20 20 20 20  ructure) +      
8030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
8040: 61 69 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ain structure */
8050: 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28  .        sizeof(
8060: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
8070: 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29  el) * (nLevel+1)
8080: 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72    /* aLevel[] ar
8090: 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20  ray */.    );.. 
80a0: 20 20 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c     pStruct = sql
80b0: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 53 74  ite3_realloc(pSt
80c0: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
80d0: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
80e0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
80f0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
8100: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
8110: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
8120: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
8130: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
8140: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
8150: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
8160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
8170: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
8180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
8190: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
81a0: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
81b0: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
81c0: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
81d0: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
81e0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
81f0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
8200: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
8210: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
8220: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
8230: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
8240: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
8250: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
8260: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
8270: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
8280: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
8290: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
82a0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
82b0: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
82c0: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
82d0: 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a  .    int nByte;.
82e0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28 70 4c  .    nByte = (pL
82f0: 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78 74 72  vl->nSeg + nExtr
8300: 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  a) * sizeof(Fts5
8310: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8320: 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 73 71  );.    aNew = sq
8330: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 4c  lite3_realloc(pL
8340: 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74 65 29  vl->aSeg, nByte)
8350: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 20 29  ;.    if( aNew )
8360: 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49 6e 73  {.      if( bIns
8370: 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ert==0 ){.      
8380: 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 70    memset(&aNew[p
8390: 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c 20 73  Lvl->nSeg], 0, s
83a0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
83b0: 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20 6e 45  ureSegment) * nE
83c0: 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 65 6c  xtra);.      }el
83d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
83e0: 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53  nMove = pLvl->nS
83f0: 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  eg * sizeof(Fts5
8400: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
8410: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 6d 6f  );.        memmo
8420: 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72 61 5d  ve(&aNew[nExtra]
8430: 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a  , aNew, nMove);.
8440: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61          memset(a
8450: 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  New, 0, sizeof(F
8460: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
8470: 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29 3b 0a  ent) * nExtra);.
8480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c        }.      pL
8490: 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65 77 3b  vl->aSeg = aNew;
84a0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
84b0: 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
84c0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
84d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 2c 20  .}../*.** Read, 
84e0: 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20  deserialize and 
84f0: 72 65 74 75 72 6e 20 74 68 65 20 73 74 72 75 63  return the struc
8500: 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a  ture record..**.
8510: 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63  ** The Fts5Struc
8520: 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e  ture.aLevel[] an
8530: 64 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63  d each Fts5Struc
8540: 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d  tureLevel.aSeg[]
8550: 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76   array.** are ov
8560: 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61 73 20  er-allocated as 
8570: 64 65 73 63 72 69 62 65 64 20 66 6f 72 20 66 75  described for fu
8580: 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72 75 63  nction fts5Struc
8590: 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a 2a 2a  tureDecode() .**
85a0: 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   above..**.** If
85b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
85c0: 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
85d0: 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ed and an error 
85e0: 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74 68 65  code left in the
85f0: 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20 68 61  .** Fts5Index ha
8600: 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  ndle. If an erro
8610: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63  r has already oc
8620: 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73  curred when this
8630: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20   function.** is 
8640: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
8650: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
8660: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
8670: 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
8680: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  d(Fts5Index *p){
8690: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
86a0: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
86b0: 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  fig;.  Fts5Struc
86c0: 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b 20  ture *pRet = 0; 
86d0: 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74         /* Object
86e0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
86f0: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8710: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8720: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8730: 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b 30  5Buffer buf = {0
8740: 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 66 74 73 35  , 0, 0};..  fts5
8750: 44 61 74 61 42 75 66 66 65 72 28 70 2c 20 26 62  DataBuffer(p, &b
8760: 75 66 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55  uf, FTS5_STRUCTU
8770: 52 45 5f 52 4f 57 49 44 29 3b 0a 20 20 69 66 28  RE_ROWID);.  if(
8780: 20 62 75 66 2e 70 3d 3d 30 20 29 20 72 65 74 75   buf.p==0 ) retu
8790: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
87a0: 62 75 66 2e 6e 53 70 61 63 65 3e 3d 28 62 75 66  buf.nSpace>=(buf
87b0: 2e 6e 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a  .n + FTS5_DATA_Z
87c0: 45 52 4f 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a  ERO_PADDING) );.
87d0: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2e 70 5b    memset(&buf.p[
87e0: 62 75 66 2e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f  buf.n], 0, FTS5_
87f0: 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
8800: 47 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 66 74  G);.  p->rc = ft
8810: 73 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64  s5StructureDecod
8820: 65 28 62 75 66 2e 70 2c 20 62 75 66 2e 6e 2c 20  e(buf.p, buf.n, 
8830: 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65 74 29  &iCookie, &pRet)
8840: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
8850: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 43 6f  SQLITE_OK && pCo
8860: 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65 21 3d 69  nfig->iCookie!=i
8870: 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20 20 70 2d  Cookie ){.    p-
8880: 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
8890: 35 43 6f 6e 66 69 67 4c 6f 61 64 28 70 43 6f 6e  5ConfigLoad(pCon
88a0: 66 69 67 2c 20 69 43 6f 6f 6b 69 65 29 3b 0a 20  fig, iCookie);. 
88b0: 20 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72   }..  fts5Buffer
88c0: 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 69 66  Free(&buf);.  if
88d0: 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
88e0: 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74  OK ){.    fts5St
88f0: 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
8900: 52 65 74 29 3b 0a 20 20 20 20 70 52 65 74 20 3d  Ret);.    pRet =
8910: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
8920: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
8930: 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
8940: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8950: 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74 72  nts in index str
8960: 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20  ucture pStruct. 
8970: 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
8980: 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75 73   is only ever us
8990: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
89a0: 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e  sert() condition
89b0: 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  s..*/.#ifdef SQL
89c0: 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69 63  ITE_DEBUG.static
89d0: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
89e0: 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
89f0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
8a00: 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e  Struct){.  int n
8a10: 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20  Segment = 0;    
8a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
8a30: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  tal number of se
8a40: 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20  gments */.  if( 
8a50: 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 69  pStruct ){.    i
8a60: 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20  nt iLvl;        
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8a80: 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  Used to iterate 
8a90: 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
8aa0: 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  /.    for(iLvl=0
8ab0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
8ac0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
8ad0: 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74 20  .      nSegment 
8ae0: 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  += pStruct->aLev
8af0: 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20  el[iLvl].nSeg;. 
8b00: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
8b10: 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23  rn nSegment;.}.#
8b20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 72  endif../*.** Ser
8b30: 69 61 6c 69 7a 65 20 61 6e 64 20 73 74 6f 72 65  ialize and store
8b40: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22   the "structure"
8b50: 20 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49   record..**.** I
8b60: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
8b70: 73 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f  s, leave an erro
8b80: 72 20 63 6f 64 65 20 69 6e 20 74 68 65 20 46 74  r code in the Ft
8b90: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20  s5Index object. 
8ba0: 49 66 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68  If an.** error h
8bb0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
8bc0: 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
8bd0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
8be0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
8bf0: 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
8c00: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
8c10: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
8c20: 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 70 2d  truct){.  if( p-
8c30: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
8c40: 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72  {.    Fts5Buffer
8c50: 20 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20   buf;           
8c60: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
8c70: 20 73 65 72 69 61 6c 69 7a 65 20 72 65 63 6f 72   serialize recor
8c80: 64 20 69 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e  d into */.    in
8c90: 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20  t iLvl;         
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
8cb0: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
8cc0: 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
8cd0: 0a 20 20 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  .    int iCookie
8ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8cf0: 20 20 20 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c     /* Cookie val
8d00: 75 65 20 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a  ue to store */..
8d10: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72      assert( pStr
8d20: 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66  uct->nSegment==f
8d30: 74 73 35 53 74 72 75 63 74 75 72 65 43 6f 75 6e  ts5StructureCoun
8d40: 74 53 65 67 6d 65 6e 74 73 28 70 53 74 72 75 63  tSegments(pStruc
8d50: 74 29 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  t) );.    memset
8d60: 28 26 62 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66  (&buf, 0, sizeof
8d70: 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
8d80: 20 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68      /* Append th
8d90: 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67  e current config
8da0: 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a  uration cookie *
8db0: 2f 0a 20 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20  /.    iCookie = 
8dc0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f  p->pConfig->iCoo
8dd0: 6b 69 65 3b 0a 20 20 20 20 69 66 28 20 69 43 6f  kie;.    if( iCo
8de0: 6f 6b 69 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65  okie<0 ) iCookie
8df0: 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 42 75   = 0;.    fts5Bu
8e00: 66 66 65 72 41 70 70 65 6e 64 33 32 28 26 70 2d  fferAppend32(&p-
8e10: 3e 72 63 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b  >rc, &buf, iCook
8e20: 69 65 29 3b 0a 0a 20 20 20 20 66 74 73 35 42 75  ie);..    fts5Bu
8e30: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
8e40: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
8e50: 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b  Struct->nLevel);
8e60: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
8e70: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
8e80: 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75 63  rc, &buf, pStruc
8e90: 74 2d 3e 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20  t->nSegment);.  
8ea0: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8eb0: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8ec0: 20 26 62 75 66 2c 20 28 69 36 34 29 70 53 74 72   &buf, (i64)pStr
8ed0: 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
8ee0: 65 72 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c  er);..    for(iL
8ef0: 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
8f00: 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
8f10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
8f20: 53 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Seg;            
8f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8f40: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
8f50: 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ugh segments */.
8f60: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
8f70: 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d  ureLevel *pLvl =
8f80: 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
8f90: 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66  l[iLvl];.      f
8fa0: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8fb0: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
8fc0: 75 66 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  uf, pLvl->nMerge
8fd0: 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
8fe0: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
8ff0: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
9000: 76 6c 2d 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20  vl->nSeg);.     
9010: 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
9020: 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65  Merge<=pLvl->nSe
9030: 67 20 29 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  g );..      for(
9040: 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76  iSeg=0; iSeg<pLv
9050: 6c 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29  l->nSeg; iSeg++)
9060: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
9070: 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
9080: 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70  (&p->rc, &buf, p
9090: 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl->aSeg[iSeg].
90a0: 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20  iSegid);.       
90b0: 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
90c0: 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
90d0: 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67  &buf, pLvl->aSeg
90e0: 5b 69 53 65 67 5d 2e 6e 48 65 69 67 68 74 29 3b  [iSeg].nHeight);
90f0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66  .        fts5Buf
9100: 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
9110: 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c  &p->rc, &buf, pL
9120: 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70  vl->aSeg[iSeg].p
9130: 67 6e 6f 46 69 72 73 74 29 3b 0a 20 20 20 20 20  gnoFirst);.     
9140: 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
9150: 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
9160: 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e 61 53  , &buf, pLvl->aS
9170: 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f 4c 61 73  eg[iSeg].pgnoLas
9180: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
9190: 7d 0a 0a 20 20 20 20 66 74 73 35 44 61 74 61 57  }..    fts5DataW
91a0: 72 69 74 65 28 70 2c 20 46 54 53 35 5f 53 54 52  rite(p, FTS5_STR
91b0: 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 62 75  UCTURE_ROWID, bu
91c0: 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a 20 20 20  f.p, buf.n);.   
91d0: 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
91e0: 26 62 75 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  &buf);.  }.}..#i
91f0: 66 20 30 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f 0.static void 
9200: 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
9210: 72 65 28 69 6e 74 2a 2c 46 74 73 35 42 75 66 66  re(int*,Fts5Buff
9220: 65 72 2a 2c 46 74 73 35 53 74 72 75 63 74 75 72  er*,Fts5Structur
9230: 65 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  e*);.static void
9240: 20 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74   fts5PrintStruct
9250: 75 72 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ure(const char *
9260: 7a 43 61 70 74 69 6f 6e 2c 20 46 74 73 35 53 74  zCaption, Fts5St
9270: 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
9280: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
9290: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 42  LITE_OK;.  Fts5B
92a0: 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
92b0: 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
92c0: 65 6f 66 28 62 75 66 29 29 3b 0a 20 20 66 74 73  eof(buf));.  fts
92d0: 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65 28  5DebugStructure(
92e0: 26 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72 75  &rc, &buf, pStru
92f0: 63 74 29 3b 0a 20 20 66 70 72 69 6e 74 66 28 73  ct);.  fprintf(s
9300: 74 64 6f 75 74 2c 20 22 25 73 3a 20 25 73 5c 6e  tdout, "%s: %s\n
9310: 22 2c 20 7a 43 61 70 74 69 6f 6e 2c 20 62 75 66  ", zCaption, buf
9320: 2e 70 29 3b 0a 20 20 66 66 6c 75 73 68 28 73 74  .p);.  fflush(st
9330: 64 6f 75 74 29 3b 0a 20 20 66 74 73 35 42 75 66  dout);.  fts5Buf
9340: 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a 7d  ferFree(&buf);.}
9350: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
9360: 66 74 73 35 50 72 69 6e 74 53 74 72 75 63 74 75  fts5PrintStructu
9370: 72 65 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a  re(x,y).#endif..
9380: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 53  static int fts5S
9390: 65 67 6d 65 6e 74 53 69 7a 65 28 46 74 73 35 53  egmentSize(Fts5S
93a0: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
93b0: 2a 70 53 65 67 29 7b 0a 20 20 72 65 74 75 72 6e  *pSeg){.  return
93c0: 20 31 20 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c   1 + pSeg->pgnoL
93d0: 61 73 74 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f  ast - pSeg->pgno
93e0: 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  First;.}../*.** 
93f0: 52 65 74 75 72 6e 20 61 20 63 6f 70 79 20 6f 66  Return a copy of
9400: 20 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65   index structure
9410: 20 70 53 74 72 75 63 74 2e 20 45 78 63 65 70 74   pStruct. Except
9420: 2c 20 70 72 6f 6d 6f 74 65 20 61 73 20 6d 61 6e  , promote as man
9430: 79 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 61  y .** segments a
9440: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6c 65  s possible to le
9450: 76 65 6c 20 69 50 72 6f 6d 6f 74 65 2e 20 49 66  vel iPromote. If
9460: 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20   an OOM occurs, 
9470: 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20 72 65 74 75  NULL is .** retu
9480: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
9490: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
94a0: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 0a 20 20 46  rePromoteTo(.  F
94b0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69  ts5Index *p,.  i
94c0: 6e 74 20 69 50 72 6f 6d 6f 74 65 2c 0a 20 20 69  nt iPromote,.  i
94d0: 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 2c 0a 20 20  nt szPromote,.  
94e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
94f0: 53 74 72 75 63 74 0a 29 7b 0a 20 20 69 6e 74 20  Struct.){.  int 
9500: 69 6c 2c 20 69 73 3b 0a 20 20 46 74 73 35 53 74  il, is;.  Fts5St
9510: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4f  ructureLevel *pO
9520: 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
9530: 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f 74 65 5d 3b  Level[iPromote];
9540: 0a 0a 20 20 69 66 28 20 70 4f 75 74 2d 3e 6e 4d  ..  if( pOut->nM
9550: 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 66  erge==0 ){.    f
9560: 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f 74 65 2b 31  or(il=iPromote+1
9570: 3b 20 69 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  ; il<pStruct->nL
9580: 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b 0a 20 20 20  evel; il++){.   
9590: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
95a0: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
95b0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
95c0: 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c  l];.      if( pL
95d0: 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 20 72 65 74  vl->nMerge ) ret
95e0: 75 72 6e 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  urn;.      for(i
95f0: 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20  s=pLvl->nSeg-1; 
9600: 69 73 3e 3d 30 3b 20 69 73 2d 2d 29 7b 0a 20 20  is>=0; is--){.  
9610: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 66        int sz = f
9620: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 26  ts5SegmentSize(&
9630: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 29 3b  pLvl->aSeg[is]);
9640: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
9650: 73 7a 50 72 6f 6d 6f 74 65 20 29 20 72 65 74 75  szPromote ) retu
9660: 72 6e 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  rn;.        fts5
9670: 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
9680: 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
9690: 72 75 63 74 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  ruct, iPromote, 
96a0: 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  1, 1);.        i
96b0: 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72  f( p->rc ) retur
96c0: 6e 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  n;.        memcp
96d0: 79 28 70 4f 75 74 2d 3e 61 53 65 67 2c 20 26 70  y(pOut->aSeg, &p
96e0: 4c 76 6c 2d 3e 61 53 65 67 5b 69 73 5d 2c 20 73  Lvl->aSeg[is], s
96f0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
9700: 75 72 65 53 65 67 6d 65 6e 74 29 29 3b 0a 20 20  ureSegment));.  
9710: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6e 53 65 67        pOut->nSeg
9720: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ++;.        pLvl
9730: 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20  ->nSeg--;.      
9740: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
9750: 2a 0a 2a 2a 20 41 20 6e 65 77 20 73 65 67 6d 65  *.** A new segme
9760: 6e 74 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  nt has just been
9770: 20 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65   written to leve
9780: 6c 20 69 4c 76 6c 20 6f 66 20 69 6e 64 65 78 20  l iLvl of index 
9790: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 53 74  structure.** pSt
97a0: 72 75 63 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ruct. This funct
97b0: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 69  ion determines i
97c0: 66 20 61 6e 79 20 73 65 67 6d 65 6e 74 73 20 73  f any segments s
97d0: 68 6f 75 6c 64 20 62 65 20 70 72 6f 6d 6f 74 65  hould be promote
97e0: 64 0a 2a 2a 20 61 73 20 61 20 72 65 73 75 6c 74  d.** as a result
97f0: 2e 20 53 65 67 6d 65 6e 74 73 20 61 72 65 20 70  . Segments are p
9800: 72 6f 6d 6f 74 65 64 20 69 6e 20 74 77 6f 20 73  romoted in two s
9810: 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20  cenarios:.**.** 
9820: 20 20 61 29 20 49 66 20 74 68 65 20 73 65 67 6d    a) If the segm
9830: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9840: 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
9850: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 65 67   one or more seg
9860: 6d 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 77 69  ments.**      wi
9870: 74 68 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  thin the previou
9880: 73 20 70 6f 70 75 6c 61 74 65 64 20 6c 65 76 65  s populated leve
9890: 6c 2c 20 69 74 20 69 73 20 70 72 6f 6d 6f 74 65  l, it is promote
98a0: 64 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  d to the previou
98b0: 73 0a 2a 2a 20 20 20 20 20 20 70 6f 70 75 6c 61  s.**      popula
98c0: 74 65 64 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ted level..**.**
98d0: 20 20 20 62 29 20 49 66 20 74 68 65 20 73 65 67     b) If the seg
98e0: 6d 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65  ment just writte
98f0: 6e 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  n is larger than
9900: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
9910: 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20 20 20 20 74  ent on.**      t
9920: 68 65 20 6e 65 78 74 20 70 6f 70 75 6c 61 74 65  he next populate
9930: 64 20 6c 65 76 65 6c 2c 20 74 68 65 6e 20 74 68  d level, then th
9940: 61 74 20 73 65 67 6d 65 6e 74 2c 20 61 6e 64 20  at segment, and 
9950: 61 6e 79 20 6f 74 68 65 72 20 61 64 6a 61 63 65  any other adjace
9960: 6e 74 0a 2a 2a 20 20 20 20 20 20 73 65 67 6d 65  nt.**      segme
9970: 6e 74 73 20 74 68 61 74 20 61 72 65 20 61 6c 73  nts that are als
9980: 6f 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  o smaller than t
9990: 68 65 20 6f 6e 65 20 6a 75 73 74 20 77 72 69 74  he one just writ
99a0: 74 65 6e 2c 20 61 72 65 20 0a 2a 2a 20 20 20 20  ten, are .**    
99b0: 20 20 70 72 6f 6d 6f 74 65 64 2e 20 0a 2a 2a 0a    promoted. .**.
99c0: 2a 2a 20 49 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ** If one or mor
99d0: 65 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 70  e segments are p
99e0: 72 6f 6d 6f 74 65 64 2c 20 74 68 65 20 73 74 72  romoted, the str
99f0: 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 69 73  ucture object is
9a00: 20 75 70 64 61 74 65 64 0a 2a 2a 20 74 6f 20 72   updated.** to r
9a10: 65 66 6c 65 63 74 20 74 68 69 73 2e 0a 2a 2f 0a  eflect this..*/.
9a20: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
9a30: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9a40: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
9a50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9a60: 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
9a70: 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
9a80: 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20 20  int iLvl,       
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 2f 2a 20 49 6e 64 65 78 20 6c 65 76 65 6c 20 6a  /* Index level j
9ab0: 75 73 74 20 75 70 64 61 74 65 64 20 2a 2f 0a 20  ust updated */. 
9ac0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
9ad0: 70 53 74 72 75 63 74 20 20 20 20 20 20 20 20 20  pStruct         
9ae0: 20 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74   /* Index struct
9af0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  ure */.){.  if( 
9b00: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
9b10: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 54 73 74   ){.    int iTst
9b20: 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 6f 6d 6f  ;.    int iPromo
9b30: 74 65 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  te = -1;.    int
9b40: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 30 3b 20   szPromote = 0; 
9b50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
9b60: 6f 6d 6f 74 65 20 61 6e 79 74 68 69 6e 67 20 74  omote anything t
9b70: 68 69 73 20 73 69 7a 65 20 6f 72 20 73 6d 61 6c  his size or smal
9b80: 6c 65 72 20 2a 2f 0a 20 20 20 20 46 74 73 35 53  ler */.    Fts5S
9b90: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
9ba0: 2a 70 53 65 67 3b 20 20 20 2f 2a 20 53 65 67 6d  *pSeg;   /* Segm
9bb0: 65 6e 74 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ent just written
9bc0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 53 65   */.    int szSe
9bd0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
9be0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
9bf0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9c00: 69 74 74 65 6e 20 2a 2f 0a 0a 0a 20 20 20 20 70  itten */...    p
9c10: 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Seg = &pStruct->
9c20: 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
9c30: 67 5b 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g[pStruct->aLeve
9c40: 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 2d 31 5d 3b  l[iLvl].nSeg-1];
9c50: 0a 20 20 20 20 73 7a 53 65 67 20 3d 20 28 31 20  .    szSeg = (1 
9c60: 2b 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  + pSeg->pgnoLast
9c70: 20 2d 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72   - pSeg->pgnoFir
9c80: 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  st);..    /* Che
9c90: 63 6b 20 66 6f 72 20 63 6f 6e 64 69 74 69 6f 6e  ck for condition
9ca0: 20 28 61 29 20 2a 2f 0a 20 20 20 20 66 6f 72 28   (a) */.    for(
9cb0: 69 54 73 74 3d 69 4c 76 6c 2d 31 3b 20 69 54 73  iTst=iLvl-1; iTs
9cc0: 74 3e 3d 30 20 26 26 20 70 53 74 72 75 63 74 2d  t>=0 && pStruct-
9cd0: 3e 61 4c 65 76 65 6c 5b 69 54 73 74 5d 2e 6e 53  >aLevel[iTst].nS
9ce0: 65 67 3d 3d 30 3b 20 69 54 73 74 2d 2d 29 3b 0a  eg==0; iTst--);.
9cf0: 20 20 20 20 69 66 28 20 69 54 73 74 3e 3d 30 20      if( iTst>=0 
9d00: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
9d10: 20 20 20 20 20 20 69 6e 74 20 73 7a 4d 61 78 20        int szMax 
9d20: 3d 20 30 3b 0a 20 20 20 20 20 20 46 74 73 35 53  = 0;.      Fts5S
9d30: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
9d40: 54 73 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Tst = &pStruct->
9d50: 61 4c 65 76 65 6c 5b 69 54 73 74 5d 3b 0a 20 20  aLevel[iTst];.  
9d60: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 73 74      assert( pTst
9d70: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 3b 0a 20  ->nMerge==0 );. 
9d80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9d90: 70 54 73 74 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29  pTst->nSeg; i++)
9da0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
9db0: 20 3d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69 5d   = pTst->aSeg[i]
9dc0: 2e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 54 73 74  .pgnoLast - pTst
9dd0: 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 46 69  ->aSeg[i].pgnoFi
9de0: 72 73 74 20 2b 20 31 3b 0a 20 20 20 20 20 20 20  rst + 1;.       
9df0: 20 69 66 28 20 73 7a 3e 73 7a 4d 61 78 20 29 20   if( sz>szMax ) 
9e00: 73 7a 4d 61 78 20 3d 20 73 7a 3b 0a 20 20 20 20  szMax = sz;.    
9e10: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 7a    }.      if( sz
9e20: 4d 61 78 3e 3d 73 7a 53 65 67 20 29 7b 0a 20 20  Max>=szSeg ){.  
9e30: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 64 69 74 69        /* Conditi
9e40: 6f 6e 20 28 61 29 20 69 73 20 74 72 75 65 2e 20  on (a) is true. 
9e50: 50 72 6f 6d 6f 74 65 20 74 68 65 20 6e 65 77 65  Promote the newe
9e60: 73 74 20 73 65 67 6d 65 6e 74 20 6f 6e 20 6c 65  st segment on le
9e70: 76 65 6c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  vel .        ** 
9e80: 69 4c 76 6c 20 74 6f 20 6c 65 76 65 6c 20 69 54  iLvl to level iT
9e90: 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  st.  */.        
9ea0: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 54 73 74 3b  iPromote = iTst;
9eb0: 0a 20 20 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f  .        szPromo
9ec0: 74 65 20 3d 20 73 7a 4d 61 78 3b 0a 20 20 20 20  te = szMax;.    
9ed0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9ee0: 2a 20 49 66 20 63 6f 6e 64 69 74 69 6f 6e 20 28  * If condition (
9ef0: 61 29 20 69 73 20 6e 6f 74 20 6d 65 74 2c 20 61  a) is not met, a
9f00: 73 73 75 6d 65 20 28 62 29 20 69 73 20 74 72 75  ssume (b) is tru
9f10: 65 2e 20 53 74 72 75 63 74 75 72 65 50 72 6f 6d  e. StructureProm
9f20: 6f 74 65 54 6f 28 29 0a 20 20 20 20 2a 2a 20 69  oteTo().    ** i
9f30: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 69 74 20  s a no-op if it 
9f40: 69 73 20 6e 6f 74 2e 20 20 2a 2f 0a 20 20 20 20  is not.  */.    
9f50: 69 66 28 20 69 50 72 6f 6d 6f 74 65 3c 30 20 29  if( iPromote<0 )
9f60: 7b 0a 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65  {.      iPromote
9f70: 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 73   = iLvl;.      s
9f80: 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 53 65 67  zPromote = szSeg
9f90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
9fa0: 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
9fb0: 54 6f 28 70 2c 20 69 50 72 6f 6d 6f 74 65 2c 20  To(p, iPromote, 
9fc0: 73 7a 50 72 6f 6d 6f 74 65 2c 20 70 53 74 72 75  szPromote, pStru
9fd0: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  ct);.  }.}.../*.
9fe0: 2a 2a 20 49 66 20 74 68 65 20 70 49 74 65 72 2d  ** If the pIter-
9ff0: 3e 69 4f 66 66 20 6f 66 66 73 65 74 20 63 75 72  >iOff offset cur
a000: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
a010: 20 61 6e 20 65 6e 74 72 79 20 69 6e 64 69 63 61   an entry indica
a020: 74 69 6e 67 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d  ting one.** or m
a030: 6f 72 65 20 74 65 72 6d 2d 6c 65 73 73 20 6e 6f  ore term-less no
a040: 64 65 73 2c 20 61 64 76 61 6e 63 65 20 70 61 73  des, advance pas
a050: 74 20 69 74 20 61 6e 64 20 73 65 74 20 70 49 74  t it and set pIt
a060: 65 72 2d 3e 6e 45 6d 70 74 79 20 74 6f 0a 2a 2a  er->nEmpty to.**
a070: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
a080: 6d 70 74 79 20 63 68 69 6c 64 20 6e 6f 64 65 73  mpty child nodes
a090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a0a0: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 47 6f 62   fts5NodeIterGob
a0b0: 62 6c 65 4e 45 6d 70 74 79 28 46 74 73 35 4e 6f  bleNEmpty(Fts5No
a0c0: 64 65 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  deIter *pIter){.
a0d0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4f 66    if( pIter->iOf
a0e0: 66 3c 70 49 74 65 72 2d 3e 6e 44 61 74 61 20 26  f<pIter->nData &
a0f0: 26 20 30 3d 3d 28 70 49 74 65 72 2d 3e 61 44 61  & 0==(pIter->aDa
a100: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 20  ta[pIter->iOff] 
a110: 26 20 30 78 66 65 29 20 29 7b 0a 20 20 20 20 70  & 0xfe) ){.    p
a120: 49 74 65 72 2d 3e 62 44 6c 69 64 78 20 3d 20 70  Iter->bDlidx = p
a130: 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74 65  Iter->aData[pIte
a140: 72 2d 3e 69 4f 66 66 5d 20 26 20 30 78 30 31 3b  r->iOff] & 0x01;
a150: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
a160: 2b 2b 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  ++;.    pIter->i
a170: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
a180: 72 69 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61  rint32(&pIter->a
a190: 44 61 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66  Data[pIter->iOff
a1a0: 5d 2c 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79  ], pIter->nEmpty
a1b0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
a1c0: 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20  pIter->nEmpty = 
a1d0: 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 44  0;.    pIter->bD
a1e0: 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  lidx = 0;.  }.}.
a1f0: 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74  ./*.** Advance t
a200: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
a210: 20 77 69 74 68 69 6e 20 74 68 65 20 6e 6f 64 65   within the node
a220: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a230: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 4e 65 78   fts5NodeIterNex
a240: 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35  t(int *pRc, Fts5
a250: 4e 6f 64 65 49 74 65 72 20 2a 70 49 74 65 72 29  NodeIter *pIter)
a260: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  {.  if( pIter->i
a270: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 6e 44 61 74  Off>=pIter->nDat
a280: 61 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  a ){.    pIter->
a290: 61 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70  aData = 0;.    p
a2a0: 49 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20  Iter->iChild += 
a2b0: 70 49 74 65 72 2d 3e 6e 45 6d 70 74 79 3b 0a 20  pIter->nEmpty;. 
a2c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
a2d0: 6e 50 72 65 2c 20 6e 4e 65 77 3b 0a 20 20 20 20  nPre, nNew;.    
a2e0: 70 49 74 65 72 2d 3e 69 4f 66 66 20 2b 3d 20 66  pIter->iOff += f
a2f0: 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26  ts5GetVarint32(&
a300: 70 49 74 65 72 2d 3e 61 44 61 74 61 5b 70 49 74  pIter->aData[pIt
a310: 65 72 2d 3e 69 4f 66 66 5d 2c 20 6e 50 72 65 29  er->iOff], nPre)
a320: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66  ;.    pIter->iOf
a330: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a340: 6e 74 33 32 28 26 70 49 74 65 72 2d 3e 61 44 61  nt32(&pIter->aDa
a350: 74 61 5b 70 49 74 65 72 2d 3e 69 4f 66 66 5d 2c  ta[pIter->iOff],
a360: 20 6e 4e 65 77 29 3b 0a 20 20 20 20 70 49 74 65   nNew);.    pIte
a370: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 50 72 65  r->term.n = nPre
a380: 2d 32 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  -2;.    fts5Buff
a390: 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70 52 63  erAppendBlob(pRc
a3a0: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
a3b0: 6e 4e 65 77 2c 20 70 49 74 65 72 2d 3e 61 44 61  nNew, pIter->aDa
a3c0: 74 61 2b 70 49 74 65 72 2d 3e 69 4f 66 66 29 3b  ta+pIter->iOff);
a3d0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4f 66 66  .    pIter->iOff
a3e0: 20 2b 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 70 49   += nNew;.    pI
a3f0: 74 65 72 2d 3e 69 43 68 69 6c 64 20 2b 3d 20 28  ter->iChild += (
a400: 31 20 2b 20 70 49 74 65 72 2d 3e 6e 45 6d 70 74  1 + pIter->nEmpt
a410: 79 29 3b 0a 20 20 20 20 66 74 73 35 4e 6f 64 65  y);.    fts5Node
a420: 49 74 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79  IterGobbleNEmpty
a430: 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28  (pIter);.    if(
a440: 20 2a 70 52 63 20 29 20 70 49 74 65 72 2d 3e 61   *pRc ) pIter->a
a450: 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Data = 0;.  }.}.
a460: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
a470: 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ze the iterator 
a480: 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20  object pIter to 
a490: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
a4a0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
a4b0: 73 65 67 6d 65 6e 74 20 6e 6f 64 65 20 69 6e 20  segment node in 
a4c0: 70 44 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63  pData..*/.static
a4d0: 20 76 6f 69 64 20 66 74 73 35 4e 6f 64 65 49 74   void fts5NodeIt
a4e0: 65 72 49 6e 69 74 28 63 6f 6e 73 74 20 75 38 20  erInit(const u8 
a4f0: 2a 61 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74  *aData, int nDat
a500: 61 2c 20 46 74 73 35 4e 6f 64 65 49 74 65 72 20  a, Fts5NodeIter 
a510: 2a 70 49 74 65 72 29 7b 0a 20 20 6d 65 6d 73 65  *pIter){.  memse
a520: 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  t(pIter, 0, size
a530: 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70  of(*pIter));.  p
a540: 49 74 65 72 2d 3e 61 44 61 74 61 20 3d 20 61 44  Iter->aData = aD
a550: 61 74 61 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 44  ata;.  pIter->nD
a560: 61 74 61 20 3d 20 6e 44 61 74 61 3b 0a 20 20 70  ata = nData;.  p
a570: 49 74 65 72 2d 3e 69 4f 66 66 20 3d 20 66 74 73  Iter->iOff = fts
a580: 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 44 61  5GetVarint32(aDa
a590: 74 61 2c 20 70 49 74 65 72 2d 3e 69 43 68 69 6c  ta, pIter->iChil
a5a0: 64 29 3b 0a 20 20 66 74 73 35 4e 6f 64 65 49 74  d);.  fts5NodeIt
a5b0: 65 72 47 6f 62 62 6c 65 4e 45 6d 70 74 79 28 70  erGobbleNEmpty(p
a5c0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Iter);.}../*.** 
a5d0: 46 72 65 65 20 61 6e 79 20 6d 65 6d 6f 72 79 20  Free any memory 
a5e0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65  allocated by the
a5f0: 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74   iterator object
a600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a610: 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
a620: 65 28 46 74 73 35 4e 6f 64 65 49 74 65 72 20 2a  e(Fts5NodeIter *
a630: 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  pIter){.  fts5Bu
a640: 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
a650: 3e 74 65 72 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >term);.}../*.**
a660: 20 41 64 76 61 6e 63 65 20 74 68 65 20 69 74 65   Advance the ite
a670: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
a680: 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
a690: 74 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66  t. If the end of
a6a0: 20 74 68 65 20 0a 2a 2a 20 64 6f 63 6c 69 73 74   the .** doclist
a6b0: 2d 69 6e 64 65 78 20 70 61 67 65 20 69 73 20 72  -index page is r
a6c0: 65 61 63 68 65 64 2c 20 72 65 74 75 72 6e 20 6e  eached, return n
a6d0: 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  on-zero..*/.stat
a6e0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
a6f0: 4c 76 6c 4e 65 78 74 28 46 74 73 35 44 6c 69 64  LvlNext(Fts5Dlid
a700: 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20 20 46  xLvl *pLvl){.  F
a710: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 20 3d  ts5Data *pData =
a720: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 3b 0a 0a 20   pLvl->pData;.. 
a730: 20 69 66 28 20 70 4c 76 6c 2d 3e 69 4f 66 66 3d   if( pLvl->iOff=
a740: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
a750: 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30 20  ( pLvl->bEof==0 
a760: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
a770: 66 20 3d 20 31 3b 0a 20 20 20 20 70 4c 76 6c 2d  f = 1;.    pLvl-
a780: 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74  >iOff += fts5Get
a790: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 2d  Varint32(&pData-
a7a0: 3e 70 5b 31 5d 2c 20 70 4c 76 6c 2d 3e 69 4c 65  >p[1], pLvl->iLe
a7b0: 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 76  afPgno);.    pLv
a7c0: 6c 2d 3e 69 4f 66 66 20 2b 3d 20 66 74 73 35 47  l->iOff += fts5G
a7d0: 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
a7e0: 3e 70 5b 70 4c 76 6c 2d 3e 69 4f 66 66 5d 2c 20  >p[pLvl->iOff], 
a7f0: 28 75 36 34 2a 29 26 70 4c 76 6c 2d 3e 69 52 6f  (u64*)&pLvl->iRo
a800: 77 69 64 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  wid);.    pLvl->
a810: 69 46 69 72 73 74 4f 66 66 20 3d 20 70 4c 76 6c  iFirstOff = pLvl
a820: 2d 3e 69 4f 66 66 3b 0a 20 20 7d 65 6c 73 65 7b  ->iOff;.  }else{
a830: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
a840: 20 20 20 66 6f 72 28 69 4f 66 66 3d 70 4c 76 6c     for(iOff=pLvl
a850: 2d 3e 69 4f 66 66 3b 20 69 4f 66 66 3c 70 44 61  ->iOff; iOff<pDa
a860: 74 61 2d 3e 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a  ta->n; iOff++){.
a870: 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 2d        if( pData-
a880: 3e 70 5b 69 4f 66 66 5d 20 29 20 62 72 65 61 6b  >p[iOff] ) break
a890: 3b 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  ; .    }..    if
a8a0: 28 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 20  ( iOff<pData->n 
a8b0: 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69 56 61  ){.      i64 iVa
a8c0: 6c 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69  l;.      pLvl->i
a8d0: 4c 65 61 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66  LeafPgno += (iOf
a8e0: 66 20 2d 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20  f - pLvl->iOff) 
a8f0: 2b 20 31 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  + 1;.      iOff 
a900: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a910: 28 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d  (&pData->p[iOff]
a920: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
a930: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77        pLvl->iRow
a940: 69 64 20 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20  id += iVal;.    
a950: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69    pLvl->iOff = i
a960: 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Off;.    }else{.
a970: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66        pLvl->bEof
a980: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
a990: 0a 20 20 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e  .  return pLvl->
a9a0: 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  bEof;.}../*.** A
a9b0: 64 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61  dvance the itera
a9c0: 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68  tor passed as th
a9d0: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
a9e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
a9f0: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
aa00: 52 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  R(Fts5Index *p, 
aa10: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
aa20: 49 74 65 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b  Iter, int iLvl){
aa30: 0a 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  .  Fts5DlidxLvl 
aa40: 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e  *pLvl = &pIter->
aa50: 61 4c 76 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61  aLvl[iLvl];..  a
aa60: 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 49 74 65  ssert( iLvl<pIte
aa70: 72 2d 3e 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28  r->nLvl );.  if(
aa80: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
aa90: 74 28 70 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69  t(pLvl) ){.    i
aaa0: 66 28 20 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49  f( (iLvl+1) < pI
aab0: 74 65 72 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20  ter->nLvl ){.   
aac0: 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
aad0: 4e 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20  NextR(p, pIter, 
aae0: 69 4c 76 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69  iLvl+1);.      i
aaf0: 66 28 20 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d  f( pLvl[1].bEof=
ab00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  =0 ){.        ft
ab10: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c  s5DataRelease(pL
ab20: 76 6c 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  vl->pData);.    
ab30: 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c      memset(pLvl,
ab40: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
ab50: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
ab60: 20 20 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d     pLvl->pData =
ab70: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
ab80: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 54   .            FT
ab90: 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
aba0: 49 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c  Iter->iSegid, iL
abb0: 76 6c 2c 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61  vl, pLvl[1].iLea
abc0: 66 50 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29  fPgno).        )
abd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
abe0: 76 6c 2d 3e 70 44 61 74 61 20 29 20 66 74 73 35  vl->pData ) fts5
abf0: 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76  DlidxLvlNext(pLv
ac00: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
ac10: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
ac20: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
ac30: 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  Eof;.}.static in
ac40: 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  t fts5DlidxIterN
ac50: 65 78 74 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ext(Fts5Index *p
ac60: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ac70: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
ac80: 6e 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e  n fts5DlidxIterN
ac90: 65 78 74 52 28 70 2c 20 70 49 74 65 72 2c 20 30  extR(p, pIter, 0
aca0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
acb0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
acc0: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
acd0: 75 6d 65 6e 74 20 68 61 73 20 74 68 65 20 66 6f  ument has the fo
ace0: 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 73  llowing fields s
acf0: 65 74 0a 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73  et.** as follows
ad00: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
ad10: 73 65 74 73 20 75 70 20 74 68 65 20 72 65 73 74  sets up the rest
ad20: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
ad30: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 70   so that it.** p
ad40: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
ad50: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
ad60: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a  doclist-index..*
ad70: 2a 0a 2a 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a  *.**   pData:.**
ad80: 20 20 20 20 20 70 6f 69 6e 74 65 72 20 74 6f 20       pointer to 
ad90: 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72 65  doclist-index re
ada0: 63 6f 72 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65  cord, .**.** Whe
adb0: 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
adc0: 69 73 20 63 61 6c 6c 65 64 20 70 49 74 65 72 2d  is called pIter-
add0: 3e 69 4c 65 61 66 50 67 6e 6f 20 69 73 20 74 68  >iLeafPgno is th
ade0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  e page number th
adf0: 65 0a 2a 2a 20 64 6f 63 6c 69 73 74 20 69 73 20  e.** doclist is 
ae00: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
ae10: 28 74 68 65 20 6f 6e 65 20 66 65 61 74 75 72 69  (the one featuri
ae20: 6e 67 20 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f  ng the term)..*/
ae30: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
ae40: 44 6c 69 64 78 49 74 65 72 46 69 72 73 74 28 46  DlidxIterFirst(F
ae50: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
ae60: 74 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ter){.  int i;. 
ae70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65   for(i=0; i<pIte
ae80: 72 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20  r->nLvl; i++){. 
ae90: 20 20 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e     fts5DlidxLvlN
aea0: 65 78 74 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c  ext(&pIter->aLvl
aeb0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  [i]);.  }.  retu
aec0: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
aed0: 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74  ].bEof;.}...stat
aee0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
aef0: 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
af00: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
af10: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
af20: 65 74 75 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c  eturn p->rc!=SQL
af30: 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d  ITE_OK || pIter-
af40: 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d  >aLvl[0].bEof;.}
af50: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
af60: 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28  s5DlidxIterLast(
af70: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
af80: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
af90: 65 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  er){.  int i;.. 
afa0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 65 61 63 68   /* Advance each
afb0: 20 6c 65 76 65 6c 20 74 6f 20 74 68 65 20 6c 61   level to the la
afc0: 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20  st entry on the 
afd0: 6c 61 73 74 20 70 61 67 65 20 2a 2f 0a 20 20 66  last page */.  f
afe0: 6f 72 28 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c  or(i=pIter->nLvl
aff0: 2d 31 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  -1; p->rc==SQLIT
b000: 45 5f 4f 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d  E_OK && i>=0; i-
b010: 2d 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69 64  -){.    Fts5Dlid
b020: 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49  xLvl *pLvl = &pI
b030: 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20  ter->aLvl[i];.  
b040: 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69    while( fts5Dli
b050: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d  dxLvlNext(pLvl)=
b060: 3d 30 20 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  =0 );.    pLvl->
b070: 62 45 6f 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69  bEof = 0;..    i
b080: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
b090: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43  Fts5DlidxLvl *pC
b0a0: 68 69 6c 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d  hild = &pLvl[-1]
b0b0: 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  ;.      fts5Data
b0c0: 52 65 6c 65 61 73 65 28 70 43 68 69 6c 64 2d 3e  Release(pChild->
b0d0: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 6d 65  pData);.      me
b0e0: 6d 73 65 74 28 70 43 68 69 6c 64 2c 20 30 2c 20  mset(pChild, 0, 
b0f0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
b100: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 43 68  Lvl));.      pCh
b110: 69 6c 64 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  ild->pData = fts
b120: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
b130: 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49          FTS5_DLI
b140: 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e  DX_ROWID(pIter->
b150: 69 53 65 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76  iSegid, i-1, pLv
b160: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20  l->iLeafPgno).  
b170: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
b180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
b190: 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
b1a0: 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
b1b0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  rgument to the p
b1c0: 72 65 76 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a  revious entry..*
b1d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
b1e0: 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 46 74  5DlidxLvlPrev(Ft
b1f0: 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c  s5DlidxLvl *pLvl
b200: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  ){.  int iOff = 
b210: 70 4c 76 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61  pLvl->iOff;..  a
b220: 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f  ssert( pLvl->bEo
b230: 66 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 69 4f  f==0 );.  if( iO
b240: 66 66 3c 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ff<=pLvl->iFirst
b250: 4f 66 66 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d  Off ){.    pLvl-
b260: 3e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c  >bEof = 1;.  }el
b270: 73 65 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20  se{.    u8 *a = 
b280: 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a  pLvl->pData->p;.
b290: 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
b2a0: 20 20 69 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20    int iLimit;.  
b2b0: 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e    int ii;.    in
b2c0: 74 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20  t nZero = 0;..  
b2d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20 69    /* Currently i
b2e0: 4f 66 66 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  Off points to th
b2f0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
b300: 61 20 76 61 72 69 6e 74 2e 20 54 68 69 73 20 62  a varint. This b
b310: 6c 6f 63 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63  lock .    ** dec
b320: 72 65 6d 65 6e 74 73 20 69 4f 66 66 20 75 6e 74  rements iOff unt
b330: 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
b340: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
b350: 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 0a  f the previous .
b360: 20 20 20 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54      ** varint. T
b370: 61 6b 69 6e 67 20 63 61 72 65 20 6e 6f 74 20 74  aking care not t
b380: 6f 20 72 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72  o read any memor
b390: 79 20 6c 6f 63 61 74 69 6f 6e 73 20 74 68 61 74  y locations that
b3a0: 20 6f 63 63 75 72 0a 20 20 20 20 2a 2a 20 62 65   occur.    ** be
b3b0: 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72 20  fore the buffer 
b3c0: 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20  in memory.  */. 
b3d0: 20 20 20 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66     iLimit = (iOf
b3e0: 66 3e 39 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30  f>9 ? iOff-9 : 0
b3f0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 4f 66 66 2d  );.    for(iOff-
b400: 2d 3b 20 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20  -; iOff>iLimit; 
b410: 69 4f 66 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69  iOff--){.      i
b420: 66 28 20 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20  f( (a[iOff-1] & 
b430: 30 78 38 30 29 3d 3d 30 20 29 20 62 72 65 61 6b  0x80)==0 ) break
b440: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73  ;.    }..    fts
b450: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
b460: 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 56 61 6c  ff], (u64*)&iVal
b470: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f  );.    pLvl->iRo
b480: 77 69 64 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20  wid -= iVal;.   
b490: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
b4a0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70  --;..    /* Skip
b4b0: 20 62 61 63 6b 77 61 72 64 73 20 70 61 73 74 20   backwards past 
b4c0: 61 6e 79 20 30 78 30 30 20 76 61 72 69 6e 74 73  any 0x00 varints
b4d0: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  . */.    for(ii=
b4e0: 69 4f 66 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c  iOff-1; ii>=pLvl
b4f0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 26 26 20 61  ->iFirstOff && a
b500: 5b 69 69 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d  [ii]==0x00; ii--
b510: 29 7b 0a 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b  ){.      nZero++
b520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
b530: 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74  ii>=pLvl->iFirst
b540: 4f 66 66 20 26 26 20 28 61 5b 69 69 5d 20 26 20  Off && (a[ii] & 
b550: 30 78 38 30 29 20 29 7b 0a 20 20 20 20 20 20 2f  0x80) ){.      /
b560: 2a 20 54 68 65 20 62 79 74 65 20 69 6d 6d 65 64  * The byte immed
b570: 69 61 74 65 6c 79 20 62 65 66 6f 72 65 20 74 68  iately before th
b580: 65 20 6c 61 73 74 20 30 78 30 30 20 62 79 74 65  e last 0x00 byte
b590: 20 68 61 73 20 74 68 65 20 30 78 38 30 20 62 69   has the 0x80 bi
b5a0: 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 2e 20  t.      ** set. 
b5b0: 53 6f 20 74 68 65 20 6c 61 73 74 20 30 78 30 30  So the last 0x00
b5c0: 20 69 73 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e   is only a varin
b5d0: 74 20 30 20 69 66 20 74 68 65 72 65 20 61 72 65  t 0 if there are
b5e0: 20 38 20 6d 6f 72 65 20 30 78 38 30 0a 20 20 20   8 more 0x80.   
b5f0: 20 20 20 2a 2a 20 62 79 74 65 73 20 62 65 66 6f     ** bytes befo
b600: 72 65 20 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20  re a[ii]. */.   
b610: 20 20 20 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30     int bZero = 0
b620: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b630: 2a 20 54 72 75 65 20 69 66 20 6c 61 73 74 20 30  * True if last 0
b640: 78 30 30 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20  x00 counts */.  
b650: 20 20 20 20 69 66 28 20 28 69 69 2d 38 29 3e 3d      if( (ii-8)>=
b660: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b670: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
b680: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
b690: 31 3b 20 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69  1; j<=8 && (a[ii
b6a0: 2d 6a 5d 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b  -j] & 0x80); j++
b6b0: 29 3b 0a 20 20 20 20 20 20 20 20 62 5a 65 72 6f  );.        bZero
b6c0: 20 3d 20 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20   = (j>8);.      
b6d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 62 5a 65 72  }.      if( bZer
b6e0: 6f 3d 3d 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a  o==0 ) nZero--;.
b6f0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e      }.    pLvl->
b700: 69 4c 65 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65  iLeafPgno -= nZe
b710: 72 6f 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f  ro;.    pLvl->iO
b720: 66 66 20 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72  ff = iOff - nZer
b730: 6f 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  o;.  }..  return
b740: 20 70 4c 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a   pLvl->bEof;.}..
b750: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
b760: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 46 74  lidxIterPrevR(Ft
b770: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
b780: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
b790: 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46  , int iLvl){.  F
b7a0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
b7b0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
b7c0: 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  [iLvl];..  asser
b7d0: 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e  t( iLvl<pIter->n
b7e0: 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73  Lvl );.  if( fts
b7f0: 35 44 6c 69 64 78 4c 76 6c 50 72 65 76 28 70 4c  5DlidxLvlPrev(pL
b800: 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  vl) ){.    if( (
b810: 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d  iLvl+1) < pIter-
b820: 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66  >nLvl ){.      f
b830: 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76  ts5DlidxIterPrev
b840: 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c  R(p, pIter, iLvl
b850: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
b860: 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29  Lvl[1].bEof==0 )
b870: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
b880: 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
b890: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
b8a0: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
b8b0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
b8c0: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Lvl));.        p
b8d0: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
b8e0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
b8f0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
b900: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
b910: 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20  ->iSegid, iLvl, 
b920: 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e  pLvl[1].iLeafPgn
b930: 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
b940: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
b950: 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  pData ){.       
b960: 20 20 20 77 68 69 6c 65 28 20 66 74 73 35 44 6c     while( fts5Dl
b970: 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29  idxLvlNext(pLvl)
b980: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
b990: 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b   pLvl->bEof = 0;
b9a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b9b0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
b9c0: 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c  return pIter->aL
b9d0: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74  vl[0].bEof;.}.st
b9e0: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b9f0: 64 78 49 74 65 72 50 72 65 76 28 46 74 73 35 49  dxIterPrev(Fts5I
ba00: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
ba10: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
ba20: 20 20 72 65 74 75 72 6e 20 66 74 73 35 44 6c 69    return fts5Dli
ba30: 64 78 49 74 65 72 50 72 65 76 52 28 70 2c 20 70  dxIterPrevR(p, p
ba40: 49 74 65 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Iter, 0);.}../*.
ba50: 2a 2a 20 46 72 65 65 20 61 20 64 6f 63 6c 69 73  ** Free a doclis
ba60: 74 2d 69 6e 64 65 78 20 69 74 65 72 61 74 6f 72  t-index iterator
ba70: 20 6f 62 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65   object allocate
ba80: 64 20 62 79 20 66 74 73 35 44 6c 69 64 78 49 74  d by fts5DlidxIt
ba90: 65 72 49 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  erInit()..*/.sta
baa0: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c 69  tic void fts5Dli
bab0: 64 78 49 74 65 72 46 72 65 65 28 46 74 73 35 44  dxIterFree(Fts5D
bac0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
bad0: 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29 7b  {.  if( pIter ){
bae0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
baf0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
bb00: 2d 3e 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nLvl; i++){.  
bb10: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
bb20: 61 73 65 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  ase(pIter->aLvl[
bb30: 69 5d 2e 70 44 61 74 61 29 3b 0a 20 20 20 20 7d  i].pData);.    }
bb40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
bb50: 65 28 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a  e(pIter);.  }.}.
bb60: 0a 73 74 61 74 69 63 20 46 74 73 35 44 6c 69 64  .static Fts5Dlid
bb70: 78 49 74 65 72 20 2a 66 74 73 35 44 6c 69 64 78  xIter *fts5Dlidx
bb80: 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
bb90: 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
bbb0: 74 73 35 20 42 61 63 6b 65 6e 64 20 74 6f 20 69  ts5 Backend to i
bbc0: 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
bbd0: 0a 20 20 69 6e 74 20 62 52 65 76 2c 20 20 20 20  .  int bRev,    
bbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbf0: 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f     /* True for O
bc00: 52 44 45 52 20 42 59 20 41 53 43 20 2a 2f 0a 20  RDER BY ASC */. 
bc10: 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20   int iSegid,    
bc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc30: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a   /* Segment id *
bc40: 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 20  /.  int iLeafPg 
bc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc60: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
bc70: 20 6e 75 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20   number to load 
bc80: 64 6c 69 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a  dlidx for */.){.
bc90: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
bca0: 2a 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e  *pIter = 0;.  in
bcb0: 74 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65  t i;.  int bDone
bcc0: 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30   = 0;..  for(i=0
bcd0: 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ; p->rc==SQLITE_
bce0: 4f 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20  OK && bDone==0; 
bcf0: 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42  i++){.    int nB
bd00: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73  yte = sizeof(Fts
bd10: 35 44 6c 69 64 78 49 74 65 72 29 20 2b 20 69 20  5DlidxIter) + i 
bd20: 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69  * sizeof(Fts5Dli
bd30: 64 78 4c 76 6c 29 3b 0a 20 20 20 20 46 74 73 35  dxLvl);.    Fts5
bd40: 44 6c 69 64 78 49 74 65 72 20 2a 70 4e 65 77 3b  DlidxIter *pNew;
bd50: 0a 0a 20 20 20 20 70 4e 65 77 20 3d 20 28 46 74  ..    pNew = (Ft
bd60: 73 35 44 6c 69 64 78 49 74 65 72 2a 29 73 71 6c  s5DlidxIter*)sql
bd70: 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74  ite3_realloc(pIt
bd80: 65 72 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  er, nByte);.    
bd90: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
bda0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c       p->rc = SQL
bdb0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
bdc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 36 34 20  else{.      i64 
bdd0: 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 44 4c  iRowid = FTS5_DL
bde0: 49 44 58 5f 52 4f 57 49 44 28 69 53 65 67 69 64  IDX_ROWID(iSegid
bdf0: 2c 20 69 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20  , i, iLeafPg);. 
be00: 20 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76       Fts5DlidxLv
be10: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d  l *pLvl = &pNew-
be20: 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  >aLvl[i];.      
be30: 70 49 74 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pIter = pNew;.  
be40: 20 20 20 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c      memset(pLvl,
be50: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44   0, sizeof(Fts5D
be60: 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20  lidxLvl));.     
be70: 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66   pLvl->pData = f
be80: 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
be90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66  Rowid);.      if
bea0: 28 20 70 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26  ( pLvl->pData &&
beb0: 20 28 70 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70   (pLvl->pData->p
bec0: 5b 30 5d 20 26 20 30 78 30 30 30 31 29 3d 3d 30  [0] & 0x0001)==0
bed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44 6f 6e   ){.        bDon
bee0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
bef0: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c       pIter->nLvl
bf00: 20 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20   = i+1;.    }.  
bf10: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
bf20: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
bf30: 20 70 49 74 65 72 2d 3e 69 53 65 67 69 64 20 3d   pIter->iSegid =
bf40: 20 69 53 65 67 69 64 3b 0a 20 20 20 20 69 66 28   iSegid;.    if(
bf50: 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20   bRev==0 ){.    
bf60: 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
bf70: 69 72 73 74 28 70 49 74 65 72 29 3b 0a 20 20 20  irst(pIter);.   
bf80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74   }else{.      ft
bf90: 73 35 44 6c 69 64 78 49 74 65 72 4c 61 73 74 28  s5DlidxIterLast(
bfa0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  p, pIter);.    }
bfb0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
bfc0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bfd0: 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
bfe0: 72 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20  rFree(pIter);.  
bff0: 20 20 70 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d    pIter = 0;.  }
c000: 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  ..  return pIter
c010: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20  ;.}..static i64 
c020: 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
c030: 69 64 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  id(Fts5DlidxIter
c040: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
c050: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
c060: 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74  ].iRowid;.}.stat
c070: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
c080: 49 74 65 72 50 67 6e 6f 28 46 74 73 35 44 6c 69  IterPgno(Fts5Dli
c090: 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  dxIter *pIter){.
c0a0: 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
c0b0: 61 4c 76 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e  aLvl[0].iLeafPgn
c0c0: 6f 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  o;.}..static voi
c0d0: 64 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72  d fts5LeafHeader
c0e0: 28 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66  (Fts5Data *pLeaf
c0f0: 2c 20 69 6e 74 20 2a 70 69 52 6f 77 69 64 2c 20  , int *piRowid, 
c100: 69 6e 74 20 2a 70 69 54 65 72 6d 29 7b 0a 20 20  int *piTerm){.  
c110: 2a 70 69 52 6f 77 69 64 20 3d 20 28 69 6e 74 29  *piRowid = (int)
c120: 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65 61  fts5GetU16(&pLea
c130: 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 2a 70 69 54  f->p[0]);.  *piT
c140: 65 72 6d 20 3d 20 28 69 6e 74 29 66 74 73 35 47  erm = (int)fts5G
c150: 65 74 55 31 36 28 26 70 4c 65 61 66 2d 3e 70 5b  etU16(&pLeaf->p[
c160: 32 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  2]);.}../*.** Lo
c170: 61 64 20 74 68 65 20 6e 65 78 74 20 6c 65 61 66  ad the next leaf
c180: 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 73   page into the s
c190: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 2e  egment iterator.
c1a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c1b0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
c1c0: 61 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  age(.  Fts5Index
c1d0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
c1e0: 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
c1f0: 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
c200: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
c210: 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20 20  pIter           
c220: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74     /* Iterator t
c230: 6f 20 61 64 76 61 6e 63 65 20 74 6f 20 6e 65 78  o advance to nex
c240: 74 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 46  t page */.){.  F
c250: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
c260: 65 6e 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65  ent *pSeg = pIte
c270: 72 2d 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44  r->pSeg;.  fts5D
c280: 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
c290: 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65  ->pLeaf);.  pIte
c2a0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a  r->iLeafPgno++;.
c2b0: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65    if( pIter->pNe
c2c0: 78 74 4c 65 61 66 20 29 7b 0a 20 20 20 20 61 73  xtLeaf ){.    as
c2d0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 69 4c 65  sert( pIter->iLe
c2e0: 61 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67  afPgno<=pSeg->pg
c2f0: 6e 6f 4c 61 73 74 20 29 3b 0a 20 20 20 20 70 49  noLast );.    pI
c300: 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74  ter->pLeaf = pIt
c310: 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20  er->pNextLeaf;. 
c320: 20 20 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c     pIter->pNextL
c330: 65 61 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  eaf = 0;.  }else
c340: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61   if( pIter->iLea
c350: 66 50 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e  fPgno<=pSeg->pgn
c360: 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74  oLast ){.    pIt
c370: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35  er->pLeaf = fts5
c380: 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20  DataRead(p, .   
c390: 20 20 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e       FTS5_SEGMEN
c3a0: 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53  T_ROWID(pSeg->iS
c3b0: 65 67 69 64 2c 20 30 2c 20 70 49 74 65 72 2d 3e  egid, 0, pIter->
c3c0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 29  iLeafPgno).    )
c3d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
c3e0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
c3f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72  .  }.}../*.** Ar
c400: 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73 20  gument p points 
c410: 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
c420: 61 69 6e 69 6e 67 20 61 20 76 61 72 69 6e 74 20  aining a varint 
c430: 74 6f 20 62 65 20 69 6e 74 65 72 70 72 65 74 65  to be interprete
c440: 64 20 61 73 20 61 0a 2a 2a 20 70 6f 73 69 74 69  d as a.** positi
c450: 6f 6e 20 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on list size fie
c460: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 72  ld. Read the var
c470: 69 6e 74 20 61 6e 64 20 72 65 74 75 72 6e 20 74  int and return t
c480: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
c490: 65 73 0a 2a 2a 20 72 65 61 64 2e 20 42 65 66 6f  es.** read. Befo
c4a0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 73 65  re returning, se
c4b0: 74 20 2a 70 6e 53 7a 20 74 6f 20 74 68 65 20 6e  t *pnSz to the n
c4c0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
c4d0: 6e 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 0a 2a  n the position.*
c4e0: 2a 20 6c 69 73 74 2c 20 61 6e 64 20 2a 70 62 44  * list, and *pbD
c4f0: 65 6c 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  el to true if th
c500: 65 20 64 65 6c 65 74 65 20 66 6c 61 67 20 69 73  e delete flag is
c510: 20 73 65 74 2c 20 6f 72 20 66 61 6c 73 65 20 6f   set, or false o
c520: 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
c530: 74 69 63 20 69 6e 74 20 66 74 73 35 47 65 74 50  tic int fts5GetP
c540: 6f 73 6c 69 73 74 53 69 7a 65 28 63 6f 6e 73 74  oslistSize(const
c550: 20 75 38 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 53   u8 *p, int *pnS
c560: 7a 2c 20 69 6e 74 20 2a 70 62 44 65 6c 29 7b 0a  z, int *pbDel){.
c570: 20 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 69 6e 74    int nSz;.  int
c580: 20 6e 20 3d 20 66 74 73 35 47 65 74 56 61 72 69   n = fts5GetVari
c590: 6e 74 33 32 28 70 2c 20 6e 53 7a 29 3b 0a 20 20  nt32(p, nSz);.  
c5a0: 61 73 73 65 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d  assert_nc( nSz>=
c5b0: 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e  0 );.  *pnSz = n
c5c0: 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65 6c 20 3d  Sz/2;.  *pbDel =
c5d0: 20 6e 53 7a 20 26 20 30 78 30 30 30 31 3b 0a 20   nSz & 0x0001;. 
c5e0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
c5f0: 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e  .** Fts5SegIter.
c600: 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72  iLeafOffset curr
c610: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
c620: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
c630: 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d  f a.** position-
c640: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e  list size field.
c650: 20 52 65 61 64 20 74 68 65 20 76 61 6c 75 65 20   Read the value 
c660: 6f 66 20 74 68 65 20 66 69 65 6c 64 20 61 6e 64  of the field and
c670: 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20 69 6e 20   store it.** in 
c680: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  the following va
c690: 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  riables:.**.**  
c6a0: 20 46 74 73 35 53 65 67 49 74 65 72 2e 6e 50 6f   Fts5SegIter.nPo
c6b0: 73 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74  s.**   Fts5SegIt
c6c0: 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65  er.bDel.**.** Le
c6d0: 61 76 65 20 46 74 73 35 53 65 67 49 74 65 72 2e  ave Fts5SegIter.
c6e0: 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e  iLeafOffset poin
c6f0: 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
c700: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
c710: 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  * position list 
c720: 63 6f 6e 74 65 6e 74 20 28 69 66 20 61 6e 79 29  content (if any)
c730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
c740: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
c750: 4e 50 6f 73 28 46 74 73 35 49 6e 64 65 78 20 2a  NPos(Fts5Index *
c760: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
c770: 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d  pIter){.  if( p-
c780: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
c790: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  {.    int iOff =
c7a0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c7b0: 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73 65 74 20  set;  /* Offset 
c7c0: 74 6f 20 72 65 61 64 20 61 74 20 2a 2f 0a 20 20  to read at */.  
c7d0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65    if( iOff>=pIte
c7e0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  r->pLeaf->n ){. 
c7f0: 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
c800: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
c810: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
c820: 74 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72  t u8 *a = &pIter
c830: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
c840: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
c850: 4c 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74  LeafOffset += ft
c860: 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
c870: 28 61 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f 73  (a, &pIter->nPos
c880: 2c 20 26 70 49 74 65 72 2d 3e 62 44 65 6c 29 3b  , &pIter->bDel);
c890: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
c8a0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
c8b0: 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64 28 46  gIterLoadRowid(F
c8c0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
c8d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
c8e0: 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74 65  {.  u8 *a = pIte
c8f0: 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20 20 20  r->pLeaf->p;    
c900: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
c910: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   read data from 
c920: 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20  */.  int iOff = 
c930: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
c940: 65 74 3b 0a 0a 20 20 69 66 28 20 69 4f 66 66 3e  et;..  if( iOff>
c950: 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e  =pIter->pLeaf->n
c960: 20 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49   ){.    fts5SegI
c970: 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70  terNextPage(p, p
c980: 49 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  Iter);.    if( p
c990: 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29  Iter->pLeaf==0 )
c9a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
c9b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
c9c0: 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
c9d0: 55 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  UPT;.      retur
c9e0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66  n;.    }.    iOf
c9f0: 66 20 3d 20 34 3b 0a 20 20 20 20 61 20 3d 20 70  f = 4;.    a = p
ca00: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
ca10: 20 20 7d 0a 20 20 69 4f 66 66 20 2b 3d 20 73 71    }.  iOff += sq
ca20: 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69  lite3Fts5GetVari
ca30: 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
ca40: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
ca50: 64 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65  d);.  pIter->iLe
ca60: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
ca70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65  .}../*.** Fts5Se
ca80: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
ca90: 74 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  t currently poin
caa0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
cab0: 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  byte of the .** 
cac0: 22 6e 53 75 66 66 69 78 22 20 66 69 65 6c 64 20  "nSuffix" field 
cad0: 6f 66 20 61 20 74 65 72 6d 2e 20 46 75 6e 63 74  of a term. Funct
cae0: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 6e 4b  ion parameter nK
caf0: 65 65 70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  eep contains the
cb00: 20 76 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 65   value.** of the
cb10: 20 22 6e 50 72 65 66 69 78 22 20 66 69 65 6c 64   "nPrefix" field
cb20: 20 28 69 66 20 74 68 65 72 65 20 77 61 73 20 6f   (if there was o
cb30: 6e 65 20 2d 20 69 74 20 69 73 20 70 61 73 73 65  ne - it is passe
cb40: 64 20 30 20 69 66 20 74 68 69 73 20 69 73 0a 2a  d 0 if this is.*
cb50: 2a 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  * the first term
cb60: 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 29   in the segment)
cb70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
cb80: 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74 65 73 3a  ction populates:
cb90: 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73 35 53 65 67  .**.**   Fts5Seg
cba0: 49 74 65 72 2e 74 65 72 6d 0a 2a 2a 20 20 20 46  Iter.term.**   F
cbb0: 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64  ts5SegIter.rowid
cbc0: 0a 2a 2a 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  .**.** according
cbd0: 6c 79 20 61 6e 64 20 6c 65 61 76 65 73 20 28 46  ly and leaves (F
cbe0: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
cbf0: 4f 66 66 73 65 74 29 20 73 65 74 20 74 6f 20 74  Offset) set to t
cc00: 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a  he content of.**
cc10: 20 74 68 65 20 66 69 72 73 74 20 70 6f 73 69 74   the first posit
cc20: 69 6f 6e 20 6c 69 73 74 2e 20 54 68 65 20 70 6f  ion list. The po
cc30: 73 69 74 69 6f 6e 20 6c 69 73 74 20 62 65 6c 6f  sition list belo
cc40: 6e 67 69 6e 67 20 74 6f 20 64 6f 63 75 6d 65 6e  nging to documen
cc50: 74 20 0a 2a 2a 20 28 46 74 73 35 53 65 67 49 74  t .** (Fts5SegIt
cc60: 65 72 2e 69 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73  er.iRowid)..*/.s
cc70: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cc80: 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 46  egIterLoadTerm(F
cc90: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
cca0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c  5SegIter *pIter,
ccb0: 20 69 6e 74 20 6e 4b 65 65 70 29 7b 0a 20 20 75   int nKeep){.  u
ccc0: 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
ccd0: 65 61 66 2d 3e 70 3b 20 20 20 20 20 20 20 20 2f  eaf->p;        /
cce0: 2a 20 42 75 66 66 65 72 20 74 6f 20 72 65 61 64  * Buffer to read
ccf0: 20 64 61 74 61 20 66 72 6f 6d 20 2a 2f 0a 20 20   data from */.  
cd00: 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74 65 72  int iOff = pIter
cd10: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ->iLeafOffset;  
cd20: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72 65 61  /* Offset to rea
cd30: 64 20 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  d at */.  int nN
cd40: 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
cd50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
cd60: 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 20 2a  es of new data *
cd70: 2f 0a 0a 20 20 69 4f 66 66 20 2b 3d 20 66 74 73  /..  iOff += fts
cd80: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
cd90: 69 4f 66 66 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20  iOff], nNew);.  
cda0: 70 49 74 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20  pIter->term.n = 
cdb0: 6e 4b 65 65 70 3b 0a 20 20 66 74 73 35 42 75 66  nKeep;.  fts5Buf
cdc0: 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
cdd0: 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65  ->rc, &pIter->te
cde0: 72 6d 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66  rm, nNew, &a[iOf
cdf0: 66 5d 29 3b 0a 20 20 69 4f 66 66 20 2b 3d 20 6e  f]);.  iOff += n
ce00: 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  New;.  pIter->iT
ce10: 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ermLeafOffset = 
ce20: 69 4f 66 66 3b 0a 20 20 70 49 74 65 72 2d 3e 69  iOff;.  pIter->i
ce30: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70  TermLeafPgno = p
ce40: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b  Iter->iLeafPgno;
ce50: 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
ce60: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20  ffset = iOff;.. 
ce70: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
ce80: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
ce90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
cea0: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
ceb0: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
cec0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
ced0: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
cee0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
cef0: 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  . The iterator i
cf00: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
cf10: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
cf20: 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73  ry when .** this
cf30: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
cf40: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
cf50: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
cf60: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
cf70: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
cf80: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
cf90: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
cfa0: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
cfb0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
cfc0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
cfd0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
cfe0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
cff0: 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
d000: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
d010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d020: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
d030: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
d040: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
d050: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
d060: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
d070: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
d080: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
d090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
d0a0: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
d0b0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
d0c0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
d0d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
d0e0: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
d0f0: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
d100: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
d110: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
d120: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
d130: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
d140: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
d150: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
d160: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
d170: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
d180: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
d190: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
d1a0: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
d1b0: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
d1c0: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
d1d0: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
d1e0: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
d1f0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
d200: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
d210: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
d220: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
d230: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
d240: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
d250: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
d260: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
d270: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
d280: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74  pIter));.    pIt
d290: 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
d2a0: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d2b0: 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  fPgno = pSeg->pg
d2c0: 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66  noFirst-1;.    f
d2d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
d2e0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
d2f0: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
d300: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d310: 20 75 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e   u8 *a = pIter->
d320: 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20 70 49  pLeaf->p;.    pI
d330: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
d340: 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
d350: 5b 32 5d 29 3b 0a 20 20 20 20 66 74 73 35 53 65  [2]);.    fts5Se
d360: 67 49 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c  gIterLoadTerm(p,
d370: 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
d380: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
d390: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
d3a0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
d3b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c   function is onl
d3c0: 79 20 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e  y ever called on
d3d0: 20 69 74 65 72 61 74 6f 72 73 20 63 72 65 61 74   iterators creat
d3e0: 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 0a 2a  ed by calls to.*
d3f0: 2a 20 46 74 73 35 49 6e 64 65 78 51 75 65 72 79  * Fts5IndexQuery
d400: 28 29 20 77 69 74 68 20 74 68 65 20 46 54 53 35  () with the FTS5
d410: 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
d420: 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a   flag set..**.**
d430: 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   The iterator is
d440: 20 69 6e 20 61 6e 20 75 6e 75 73 75 61 6c 20 73   in an unusual s
d450: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66  tate when this f
d460: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d470: 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73 35 53 65  d: the.** Fts5Se
d480: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
d490: 74 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  t variable is se
d4a0: 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
d4b0: 6f 66 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  of the start of.
d4c0: 2a 2a 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d  ** the position-
d4d0: 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20  list size field 
d4e0: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
d4f0: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
d500: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 46 74 73  the page..** Fts
d510: 35 53 65 67 49 74 65 72 2e 72 6f 77 69 64 20 69  5SegIter.rowid i
d520: 73 20 73 65 74 2c 20 62 75 74 20 6e 50 6f 73 20  s set, but nPos 
d530: 61 6e 64 20 62 44 65 6c 20 61 72 65 20 6e 6f 74  and bDel are not
d540: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
d550: 63 74 69 6f 6e 20 61 64 76 61 6e 63 65 73 20 74  ction advances t
d560: 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74  he iterator so t
d570: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
d580: 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a 20 72 65   the last .** re
d590: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
d5a0: 74 68 65 20 70 61 67 65 20 61 6e 64 2c 20 69 66  the page and, if
d5b0: 20 6e 65 63 65 73 73 61 72 79 2c 20 69 6e 69 74   necessary, init
d5c0: 69 61 6c 69 7a 65 73 20 74 68 65 20 0a 2a 2a 20  ializes the .** 
d5d0: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 61  aRowidOffset[] a
d5e0: 6e 64 20 69 52 6f 77 69 64 4f 66 66 73 65 74 20  nd iRowidOffset 
d5f0: 76 61 72 69 61 62 6c 65 73 2e 20 41 74 20 74 68  variables. At th
d600: 69 73 20 70 6f 69 6e 74 20 74 68 65 20 69 74 65  is point the ite
d610: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69 6e 20 69  rator.** is in i
d620: 74 73 20 72 65 67 75 6c 61 72 20 73 74 61 74 65  ts regular state
d630: 20 2d 20 46 74 73 35 53 65 67 49 74 65 72 2e 69   - Fts5SegIter.i
d640: 4c 65 61 66 4f 66 66 73 65 74 20 70 6f 69 6e 74  LeafOffset point
d650: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 0a 2a  s to the first.*
d660: 2a 20 62 79 74 65 20 6f 66 20 74 68 65 20 70 6f  * byte of the po
d670: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
d680: 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
d690: 69 74 68 20 73 61 69 64 20 72 6f 77 69 64 2e 0a  ith said rowid..
d6a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d6b0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
d6c0: 65 49 6e 69 74 50 61 67 65 28 46 74 73 35 49 6e  eInitPage(Fts5In
d6d0: 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49  dex *p, Fts5SegI
d6e0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
d6f0: 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
d700: 65 61 66 2d 3e 6e 3b 0a 20 20 69 6e 74 20 69 20  eaf->n;.  int i 
d710: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
d720: 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20  fset;.  u8 *a = 
d730: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
d740: 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66  .  int iRowidOff
d750: 73 65 74 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c  set = 0;..  whil
d760: 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36 34 20  e( 1 ){.    i64 
d770: 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
d780: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e  int nPos;.    in
d790: 74 20 62 44 75 6d 6d 79 3b 0a 0a 20 20 20 20 69  t bDummy;..    i
d7a0: 20 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69   += fts5GetPosli
d7b0: 73 74 53 69 7a 65 28 26 61 5b 69 5d 2c 20 26 6e  stSize(&a[i], &n
d7c0: 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
d7d0: 20 20 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20     i += nPos;.  
d7e0: 20 20 69 66 28 20 69 3e 3d 6e 20 29 20 62 72 65    if( i>=n ) bre
d7f0: 61 6b 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74 73  ak;.    i += fts
d800: 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 5d  5GetVarint(&a[i]
d810: 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29  , (u64*)&iDelta)
d820: 3b 0a 20 20 20 20 69 66 28 20 69 44 65 6c 74 61  ;.    if( iDelta
d830: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
d840: 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b   pIter->iRowid +
d850: 3d 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 69  = iDelta;..    i
d860: 66 28 20 69 52 6f 77 69 64 4f 66 66 73 65 74 3e  f( iRowidOffset>
d870: 3d 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66  =pIter->nRowidOf
d880: 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  fset ){.      in
d890: 74 20 6e 4e 65 77 20 3d 20 70 49 74 65 72 2d 3e  t nNew = pIter->
d8a0: 6e 52 6f 77 69 64 4f 66 66 73 65 74 20 2b 20 38  nRowidOffset + 8
d8b0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 4e 65  ;.      int *aNe
d8c0: 77 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  w = (int*)sqlite
d8d0: 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2d  3_realloc(pIter-
d8e0: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 2c 20 6e  >aRowidOffset, n
d8f0: 4e 65 77 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29  New*sizeof(int))
d900: 3b 0a 20 20 20 20 20 20 69 66 28 20 61 4e 65 77  ;.      if( aNew
d910: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
d920: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
d930: 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 62 72 65  MEM;.        bre
d940: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
d950: 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f    pIter->aRowidO
d960: 66 66 73 65 74 20 3d 20 61 4e 65 77 3b 0a 20 20  ffset = aNew;.  
d970: 20 20 20 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69      pIter->nRowi
d980: 64 4f 66 66 73 65 74 20 3d 20 6e 4e 65 77 3b 0a  dOffset = nNew;.
d990: 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65 72      }..    pIter
d9a0: 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 69  ->aRowidOffset[i
d9b0: 52 6f 77 69 64 4f 66 66 73 65 74 2b 2b 5d 20 3d  RowidOffset++] =
d9c0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
d9d0: 73 65 74 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  set;.    pIter->
d9e0: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 3b  iLeafOffset = i;
d9f0: 0a 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 52  .  }.  pIter->iR
da00: 6f 77 69 64 4f 66 66 73 65 74 20 3d 20 69 52 6f  owidOffset = iRo
da10: 77 69 64 4f 66 66 73 65 74 3b 0a 20 20 66 74 73  widOffset;.  fts
da20: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
da30: 28 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f  (p, pIter);.}../
da40: 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 76  *.**.*/.static v
da50: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 52  oid fts5SegIterR
da60: 65 76 65 72 73 65 4e 65 77 50 61 67 65 28 46 74  everseNewPage(Ft
da70: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
da80: 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
da90: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
daa0: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
dab0: 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 20 29  EGITER_REVERSE )
dac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
dad0: 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
dae0: 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
daf0: 29 3b 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65  );..  fts5DataRe
db00: 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65  lease(pIter->pLe
db10: 61 66 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70 4c  af);.  pIter->pL
db20: 65 61 66 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  eaf = 0;.  while
db30: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
db40: 4f 4b 20 26 26 20 70 49 74 65 72 2d 3e 69 4c 65  OK && pIter->iLe
db50: 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 69 54  afPgno>pIter->iT
db60: 65 72 6d 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ermLeafPgno ){. 
db70: 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65     Fts5Data *pNe
db80: 77 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  w;.    pIter->iL
db90: 65 61 66 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 70  eafPgno--;.    p
dba0: 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52 65  New = fts5DataRe
dbb0: 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d 45  ad(p, FTS5_SEGME
dbc0: 4e 54 5f 52 4f 57 49 44 28 0a 20 20 20 20 20 20  NT_ROWID(.      
dbd0: 20 20 20 20 70 49 74 65 72 2d 3e 70 53 65 67 2d      pIter->pSeg-
dbe0: 3e 69 53 65 67 69 64 2c 20 30 2c 20 70 49 74 65  >iSegid, 0, pIte
dbf0: 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 0a 20 20 20  r->iLeafPgno.   
dc00: 20 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65   ));.    if( pNe
dc10: 77 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  w ){.      if( p
dc20: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d  Iter->iLeafPgno=
dc30: 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61  =pIter->iTermLea
dc40: 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  fPgno ){.       
dc50: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 65 72   if( pIter->iTer
dc60: 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77  mLeafOffset<pNew
dc70: 2d 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ->n ){.         
dc80: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
dc90: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20  pNew;.          
dca0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
dcb0: 65 74 20 3d 20 70 49 74 65 72 2d 3e 69 54 65 72  et = pIter->iTer
dcc0: 6d 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  mLeafOffset;.   
dcd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
dce0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
dcf0: 69 52 6f 77 69 64 4f 66 66 2c 20 64 75 6d 6d 79  iRowidOff, dummy
dd00: 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4c 65  ;.        fts5Le
dd10: 61 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26  afHeader(pNew, &
dd20: 69 52 6f 77 69 64 4f 66 66 2c 20 26 64 75 6d 6d  iRowidOff, &dumm
dd30: 79 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  y);.        if( 
dd40: 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20 20 20  iRowidOff ){.   
dd50: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
dd60: 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  eaf = pNew;.    
dd70: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
dd80: 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f 77 69  afOffset = iRowi
dd90: 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a  dOff;.        }.
dda0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
ddb0: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
ddc0: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 61  ){.        u8 *a
ddd0: 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65 61 66   = &pIter->pLeaf
dde0: 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65 61 66  ->p[pIter->iLeaf
ddf0: 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20 20 20  Offset];.       
de00: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
de10: 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56 61  set += fts5GetVa
de20: 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 70  rint(a, (u64*)&p
de30: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
de40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
de50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
de60: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
de70: 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  se(pNew);.      
de80: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
de90: 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  f( pIter->pLeaf 
dea0: 29 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74  ){.    fts5SegIt
deb0: 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67  erReverseInitPag
dec0: 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d  e(p, pIter);.  }
ded0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
dee0: 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74 65   true if the ite
def0: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
df00: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
df10: 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a  ent currently.**
df20: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65 6c   points to a del
df30: 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64 65  ete marker. A de
df40: 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20 61  lete marker is a
df50: 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20 30  n entry with a 0
df60: 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69 6f   byte.** positio
df70: 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  n-list..*/.stati
df80: 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69 49  c int fts5MultiI
df90: 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35 49  terIsEmpty(Fts5I
dfa0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 6e 64  ndex *p, Fts5Ind
dfb0: 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  exIter *pIter){.
dfc0: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
dfd0: 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  Seg = &pIter->aS
dfe0: 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73 74  eg[pIter->aFirst
dff0: 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a 20 20 72  [1].iFirst];.  r
e000: 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
e010: 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53 65 67 2d  LITE_OK && pSeg-
e020: 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d 3e  >pLeaf && pSeg->
e030: 6e 50 6f 73 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a  nPos==0);.}../*.
e040: 2a 2a 20 41 64 76 61 6e 63 65 20 69 74 65 72 61  ** Advance itera
e050: 74 6f 72 20 70 49 74 65 72 20 74 6f 20 74 68 65  tor pIter to the
e060: 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a   next entry. .**
e070: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
e080: 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65  occurs, Fts5Inde
e090: 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f 20 61  x.rc is set to a
e0a0: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
e0b0: 72 6f 72 20 63 6f 64 65 2e 20 49 74 20 0a 2a 2a  ror code. It .**
e0c0: 20 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72   is not consider
e0d0: 65 64 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ed an error if t
e0e0: 68 65 20 69 74 65 72 61 74 6f 72 20 72 65 61 63  he iterator reac
e0f0: 68 65 73 20 45 4f 46 2e 20 49 66 20 61 6e 20 65  hes EOF. If an e
e100: 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
e110: 65 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68  eady occurred wh
e120: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
e130: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
e140: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
e150: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
e160: 67 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  gIterNext(.  Fts
e170: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e190: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
e1a0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
e1b0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20 20  Iter *pIter,    
e1c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
e1d0: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
e1e0: 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 4e 65 77 54  */.  int *pbNewT
e1f0: 65 72 6d 20 20 20 20 20 20 20 20 20 20 20 20 20  erm             
e200: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 74       /* OUT: Set
e210: 20 66 6f 72 20 6e 65 77 20 74 65 72 6d 20 2a 2f   for new term */
e220: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 62  .){.  assert( pb
e230: 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20 2a 70  NewTerm==0 || *p
e240: 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b 0a 20  bNewTerm==0 );. 
e250: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
e260: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
e270: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
e280: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
e290: 45 52 53 45 20 29 7b 0a 20 20 20 20 20 20 61 73  ERSE ){.      as
e2a0: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4e 65  sert( pIter->pNe
e2b0: 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20  xtLeaf==0 );.   
e2c0: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 52     if( pIter->iR
e2d0: 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29 7b 0a  owidOffset>0 ){.
e2e0: 20 20 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20          u8 *a = 
e2f0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
e300: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66  .        int iOf
e310: 66 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  f;.        int n
e320: 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  Pos;.        int
e330: 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20   bDummy;.       
e340: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
e350: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
e360: 77 69 64 4f 66 66 73 65 74 2d 2d 3b 0a 20 20 20  widOffset--;.   
e370: 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
e380: 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 20 3d  fOffset = iOff =
e390: 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66   pIter->aRowidOf
e3a0: 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f 77  fset[pIter->iRow
e3b0: 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  idOffset];.     
e3c0: 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
e3d0: 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
e3e0: 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
e3f0: 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20  bDummy);.       
e400: 20 69 4f 66 66 20 2b 3d 20 6e 50 6f 73 3b 0a 20   iOff += nPos;. 
e410: 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56 61         fts5GetVa
e420: 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
e430: 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
e440: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52         pIter->iR
e450: 6f 77 69 64 20 2d 3d 20 69 44 65 6c 74 61 3b 0a  owid -= iDelta;.
e460: 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
e470: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
e480: 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
e490: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
e4a0: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
e4b0: 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  wPage(p, pIter);
e4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
e4d0: 73 65 7b 0a 20 20 20 20 20 20 46 74 73 35 44 61  se{.      Fts5Da
e4e0: 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65  ta *pLeaf = pIte
e4f0: 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20 20 20  r->pLeaf;.      
e500: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  int iOff;.      
e510: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
e520: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4b 65 65  ;.      int nKee
e530: 70 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 2f 2a  p = 0;..      /*
e540: 20 53 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   Search for the 
e550: 65 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 74  end of the posit
e560: 69 6f 6e 20 6c 69 73 74 20 77 69 74 68 69 6e 20  ion list within 
e570: 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
e580: 2e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 2a 61  . */.      u8 *a
e590: 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20   = pLeaf->p;.   
e5a0: 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 65 61 66     int n = pLeaf
e5b0: 2d 3e 6e 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66  ->n;..      iOff
e5c0: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
e5d0: 66 66 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e  ffset + pIter->n
e5e0: 50 6f 73 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  Pos;..      if( 
e5f0: 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 20 20  iOff<n ){.      
e600: 20 20 2f 2a 20 54 68 65 20 6e 65 78 74 20 65 6e    /* The next en
e610: 74 72 79 20 69 73 20 6f 6e 20 74 68 65 20 63 75  try is on the cu
e620: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
e630: 20 20 20 20 20 20 75 36 34 20 69 44 65 6c 74 61        u64 iDelta
e640: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
e650: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
e660: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
e670: 20 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20   &iDelta);.     
e680: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e690: 66 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20  ffset = iOff;.  
e6a0: 20 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61        if( iDelta
e6b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
e6c0: 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20   bNewTerm = 1;. 
e6d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66           if( iOf
e6e0: 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  f>=n ){.        
e6f0: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
e700: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
e710: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e720: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
e730: 74 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20  t = 4;.         
e740: 20 7d 65 6c 73 65 20 69 66 28 20 69 4f 66 66 21   }else if( iOff!
e750: 3d 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32  =fts5GetU16(&a[2
e760: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
e770: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
e780: 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74 56  fset += fts5GetV
e790: 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d  arint32(&a[iOff]
e7a0: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
e7b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
e7c0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
e7d0: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
e7e0: 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20  iDelta;.        
e7f0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
e800: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30  ( pIter->pSeg==0
e810: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
e820: 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
e830: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
e840: 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a  har *zTerm = 0;.
e850: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73          int nLis
e860: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
e870: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
e880: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
e890: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
e8a0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
e8b0: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
e8c0: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
e8d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
e8e0: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
e8f0: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
e900: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
e910: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e920: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
e930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
e940: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
e950: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
e960: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
e970: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
e980: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
e990: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
e9a0: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
e9b0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e9c0: 3e 70 4c 65 61 66 2d 3e 6e 20 3d 20 6e 4c 69 73  >pLeaf->n = nLis
e9d0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  t;.          sql
e9e0: 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 65  ite3Fts5BufferSe
e9f0: 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72  t(&p->rc, &pIter
ea00: 2d 3e 74 65 72 6d 2c 20 73 74 72 6c 65 6e 28 7a  ->term, strlen(z
ea10: 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a 54 65 72  Term), (u8*)zTer
ea20: 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  m);.          pI
ea30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ea40: 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
ea50: 28 70 4c 69 73 74 2c 20 28 75 36 34 2a 29 26 70  (pList, (u64*)&p
ea60: 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
ea70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ea80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f  else{.        iO
ea90: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
eaa0: 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20 69 73  /* Next entry is
eab0: 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75 72 72   not on the curr
eac0: 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ent page */.    
ead0: 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d      while( iOff=
eae0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
eaf0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
eb00: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
eb10: 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d           pLeaf =
eb20: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
eb30: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65           if( pLe
eb40: 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  af==0 ) break;. 
eb50: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f           if( (iO
eb60: 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  ff = fts5GetU16(
eb70: 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 29 20 26  &pLeaf->p[0])) &
eb80: 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 6e 20  & iOff<pLeaf->n 
eb90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
eba0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
ebb0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
ebc0: 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
ebd0: 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
ebe0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
ebf0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
ec00: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
ec10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
ec20: 20 65 6c 73 65 20 69 66 28 20 28 69 4f 66 66 20   else if( (iOff 
ec30: 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c  = fts5GetU16(&pL
ec40: 65 61 66 2d 3e 70 5b 32 5d 29 29 20 29 7b 0a 20  eaf->p[2])) ){. 
ec50: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72             pIter
ec60: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
ec70: 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 20 20  iOff;.          
ec80: 20 20 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a    bNewTerm = 1;.
ec90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
eca0: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d        if( iOff>=
ecb0: 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20 20  pLeaf->n ){.    
ecc0: 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
ecd0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
ece0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ecf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ed00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ed10: 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
ed20: 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
ed30: 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49  is now at EOF. I
ed40: 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72  f so, return ear
ed50: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ly. */.      if(
ed60: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b   pIter->pLeaf ){
ed70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 4e 65  .        if( bNe
ed80: 77 54 65 72 6d 20 29 7b 0a 20 20 20 20 20 20 20  wTerm ){.       
ed90: 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c     if( pIter->fl
eda0: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
edb0: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 7b 0a 20 20  ER_ONETERM ){.  
edc0: 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
edd0: 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
ede0: 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
edf0: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
ee00: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  f = 0;.         
ee10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ee20: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
ee30: 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74 65 72  oadTerm(p, pIter
ee40: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20  , nKeep);.      
ee50: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
ee60: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
ee70: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
ee80: 20 69 66 28 20 70 62 4e 65 77 54 65 72 6d 20 29   if( pbNewTerm )
ee90: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
eea0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
eeb0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eec0: 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
eed0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
eee0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
eef0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ef00: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 53 57 41 50  .}..#define SWAP
ef10: 56 41 4c 28 54 2c 20 61 2c 20 62 29 20 7b 20 54  VAL(T, a, b) { T
ef20: 20 74 6d 70 3b 20 74 6d 70 3d 61 3b 20 61 3d 62   tmp; tmp=a; a=b
ef30: 3b 20 62 3d 74 6d 70 3b 20 7d 0a 0a 2f 2a 0a 2a  ; b=tmp; }../*.*
ef40: 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
ef50: 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
ef60: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
ef70: 6f 77 69 64 20 69 6e 20 61 20 64 6f 63 6c 69 73  owid in a doclis
ef80: 74 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t. This.** funct
ef90: 69 6f 6e 20 73 65 74 73 20 74 68 65 20 69 74 65  ion sets the ite
efa0: 72 61 74 6f 72 20 75 70 20 73 6f 20 74 68 61 74  rator up so that
efb0: 20 69 74 65 72 61 74 65 73 20 69 6e 20 72 65 76   iterates in rev
efc0: 65 72 73 65 20 6f 72 64 65 72 20 74 68 72 6f 75  erse order throu
efd0: 67 68 0a 2a 2a 20 74 68 65 20 64 6f 63 6c 69 73  gh.** the doclis
efe0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
eff0: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
f000: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  erse(Fts5Index *
f010: 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  p, Fts5SegIter *
f020: 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 44 6c  pIter){.  Fts5Dl
f030: 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
f040: 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b  = pIter->pDlidx;
f050: 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 61  .  Fts5Data *pLa
f060: 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 67  st = 0;.  int pg
f070: 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a 0a 20 20 69  noLast = 0;..  i
f080: 66 28 20 70 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( pDlidx ){.   
f090: 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 70 49   int iSegid = pI
f0a0: 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
f0b0: 64 3b 0a 20 20 20 20 70 67 6e 6f 4c 61 73 74 20  d;.    pgnoLast 
f0c0: 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
f0d0: 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  gno(pDlidx);.   
f0e0: 20 70 4c 61 73 74 20 3d 20 66 74 73 35 44 61 74   pLast = fts5Dat
f0f0: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45  aRead(p, FTS5_SE
f100: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
f110: 69 64 2c 20 30 2c 20 70 67 6e 6f 4c 61 73 74 29  id, 0, pgnoLast)
f120: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
f130: 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
f160: 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70 4c  offset within pL
f170: 65 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44  eaf */.    Fts5D
f180: 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74  ata *pLeaf = pIt
f190: 65 72 2d 3e 70 4c 65 61 66 3b 20 20 20 20 20 20  er->pLeaf;      
f1a0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 65     /* Current le
f1b0: 61 66 20 64 61 74 61 20 2a 2f 0a 0a 20 20 20 20  af data */..    
f1c0: 2f 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 46 74  /* Currently, Ft
f1d0: 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f  s5SegIter.iLeafO
f1e0: 66 66 73 65 74 20 28 61 6e 64 20 69 4f 66 66 29  ffset (and iOff)
f1f0: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
f200: 69 72 73 74 20 0a 20 20 20 20 2a 2a 20 62 79 74  irst .    ** byt
f210: 65 20 6f 66 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  e of position-li
f220: 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  st content for t
f230: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
f240: 2e 20 42 61 63 6b 20 69 74 20 75 70 0a 20 20 20  . Back it up.   
f250: 20 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 70   ** so that it p
f260: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
f270: 72 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  rt of the positi
f280: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
f290: 6c 64 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72  ld. */.    pIter
f2a0: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2d 3d  ->iLeafOffset -=
f2b0: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
f2c0: 61 72 69 6e 74 4c 65 6e 28 70 49 74 65 72 2d 3e  arintLen(pIter->
f2d0: 6e 50 6f 73 2a 32 2b 70 49 74 65 72 2d 3e 62 44  nPos*2+pIter->bD
f2e0: 65 6c 29 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20  el);.    iOff = 
f2f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f300: 65 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  et;.    assert( 
f310: 69 4f 66 66 3e 3d 34 20 29 3b 0a 0a 20 20 20 20  iOff>=4 );..    
f320: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 20  /* Search for a 
f330: 6e 65 77 20 74 65 72 6d 20 77 69 74 68 69 6e 20  new term within 
f340: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
f350: 2e 20 49 66 20 6f 6e 65 20 63 61 6e 20 62 65 20  . If one can be 
f360: 66 6f 75 6e 64 2c 0a 20 20 20 20 2a 2a 20 74 68  found,.    ** th
f370: 65 6e 20 74 68 69 73 20 70 61 67 65 20 63 6f 6e  en this page con
f380: 74 61 69 6e 73 20 74 68 65 20 6c 61 72 67 65 73  tains the larges
f390: 74 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  t rowid for the 
f3a0: 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 20 2a 2f  current term. */
f3b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f 66 66  .    while( iOff
f3c0: 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20 20 20  <pLeaf->n ){.   
f3d0: 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
f3e0: 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 20     i64 iDelta;. 
f3f0: 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
f400: 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20  ..      /* Read 
f410: 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  the position-lis
f420: 74 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a  t size field */.
f430: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
f440: 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a 65  s5GetPoslistSize
f450: 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
f460: 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79  , &nPos, &bDummy
f470: 29 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  );.      iOff +=
f480: 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 69 66 28   nPos;.      if(
f490: 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e 20   iOff>=pLeaf->n 
f4a0: 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
f4b0: 2f 2a 20 52 6f 77 69 64 20 64 65 6c 74 61 2e 20  /* Rowid delta. 
f4c0: 4f 72 2c 20 69 66 20 30 78 30 30 2c 20 74 68 65  Or, if 0x00, the
f4d0: 20 65 6e 64 20 6f 66 20 64 6f 63 6c 69 73 74 20   end of doclist 
f4e0: 6d 61 72 6b 65 72 2e 20 2a 2f 0a 20 20 20 20 20  marker. */.     
f4f0: 20 6e 50 6f 73 20 3d 20 66 74 73 35 47 65 74 56   nPos = fts5GetV
f500: 61 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b  arint(&pLeaf->p[
f510: 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44  iOff], (u64*)&iD
f520: 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 69 66 28  elta);.      if(
f530: 20 69 44 65 6c 74 61 3d 3d 30 20 29 20 62 72 65   iDelta==0 ) bre
f540: 61 6b 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ak;.      iOff +
f550: 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a 0a 20  = nPos;.    }.. 
f560: 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 63 6f     /* If this co
f570: 6e 64 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20  ndition is true 
f580: 74 68 65 6e 20 74 68 65 20 6c 61 72 67 65 73 74  then the largest
f590: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 63   rowid for the c
f5a0: 75 72 72 65 6e 74 0a 20 20 20 20 2a 2a 20 74 65  urrent.    ** te
f5b0: 72 6d 20 6d 61 79 20 6e 6f 74 20 62 65 20 73 74  rm may not be st
f5c0: 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
f5d0: 65 6e 74 20 70 61 67 65 2e 20 53 6f 20 73 65 61  ent page. So sea
f5e0: 72 63 68 20 66 6f 72 77 61 72 64 20 74 6f 0a 20  rch forward to. 
f5f0: 20 20 20 2a 2a 20 73 65 65 20 77 68 65 72 65 20     ** see where 
f600: 73 61 69 64 20 72 6f 77 69 64 20 72 65 61 6c 6c  said rowid reall
f610: 79 20 69 73 2e 20 20 2a 2f 0a 20 20 20 20 69 66  y is.  */.    if
f620: 28 20 69 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 6e  ( iOff>=pLeaf->n
f630: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67   ){.      int pg
f640: 6e 6f 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74  no;.      Fts5St
f650: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
f660: 70 53 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53  pSeg = pIter->pS
f670: 65 67 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68  eg;..      /* Th
f680: 65 20 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20  e last rowid in 
f690: 74 68 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20  the doclist may 
f6a0: 6e 6f 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75  not be on the cu
f6b0: 72 72 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72  rrent page. Sear
f6c0: 63 68 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77  ch.      ** forw
f6d0: 61 72 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20  ard to find the 
f6e0: 70 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  page containing 
f6f0: 74 68 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20  the last rowid. 
f700: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67   */.      for(pg
f710: 6e 6f 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  no=pIter->iLeafP
f720: 67 6e 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26  gno+1; !p->rc &&
f730: 20 70 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e   pgno<=pSeg->pgn
f740: 6f 4c 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a  oLast; pgno++){.
f750: 20 20 20 20 20 20 20 20 69 36 34 20 69 41 62 73          i64 iAbs
f760: 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
f770: 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
f780: 69 64 2c 20 30 2c 20 70 67 6e 6f 29 3b 0a 20 20  id, 0, pgno);.  
f790: 20 20 20 20 20 20 46 74 73 35 44 61 74 61 20 2a        Fts5Data *
f7a0: 70 4e 65 77 20 3d 20 66 74 73 35 44 61 74 61 52  pNew = fts5DataR
f7b0: 65 61 64 28 70 2c 20 69 41 62 73 29 3b 0a 20 20  ead(p, iAbs);.  
f7c0: 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 20 29        if( pNew )
f7d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
f7e0: 69 52 6f 77 69 64 2c 20 69 54 65 72 6d 3b 0a 20  iRowid, iTerm;. 
f7f0: 20 20 20 20 20 20 20 20 20 66 74 73 35 4c 65 61           fts5Lea
f800: 66 48 65 61 64 65 72 28 70 4e 65 77 2c 20 26 69  fHeader(pNew, &i
f810: 52 6f 77 69 64 2c 20 26 69 54 65 72 6d 29 3b 0a  Rowid, &iTerm);.
f820: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 52            if( iR
f830: 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  owid ){.        
f840: 20 20 20 20 53 57 41 50 56 41 4c 28 46 74 73 35      SWAPVAL(Fts5
f850: 44 61 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61  Data*, pNew, pLa
f860: 73 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  st);.           
f870: 20 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f   pgnoLast = pgno
f880: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
f890: 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61          fts5Data
f8a0: 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20  Release(pNew);. 
f8b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 54 65           if( iTe
f8c0: 72 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rm ) break;.    
f8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
f8e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
f8f0: 20 70 4c 61 73 74 20 69 73 20 4e 55 4c 4c 20 61   pLast is NULL a
f900: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  t this point, th
f910: 65 6e 20 74 68 65 20 6c 61 73 74 20 72 6f 77 69  en the last rowi
f920: 64 20 66 6f 72 20 74 68 69 73 20 64 6f 63 6c 69  d for this docli
f930: 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20 6f 6e 20  st.  ** lies on 
f940: 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e 74  the page current
f950: 6c 79 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  ly indicated by 
f960: 74 68 65 20 69 74 65 72 61 74 6f 72 2e 20 49 6e  the iterator. In
f970: 20 74 68 69 73 20 63 61 73 65 20 0a 20 20 2a 2a   this case .  **
f980: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
f990: 73 65 74 20 69 73 20 61 6c 72 65 61 64 79 20 73  set is already s
f9a0: 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  et to point to t
f9b0: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
f9c0: 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69 65 6c 64   size.  ** field
f9d0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
f9e0: 20 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76   the first relev
f9f0: 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  ant rowid on the
fa00: 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   page..  **.  **
fa10: 20 4f 72 2c 20 69 66 20 70 4c 61 73 74 20 69 73   Or, if pLast is
fa20: 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20   non-NULL, then 
fa30: 69 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74  it is the page t
fa40: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
fa50: 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f 77 69 64   last.  ** rowid
fa60: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 63  . In this case c
fa70: 6f 6e 66 69 67 75 72 65 20 74 68 65 20 69 74 65  onfigure the ite
fa80: 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20 69 74  rator so that it
fa90: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 20   points to the. 
faa0: 20 2a 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20   ** first rowid 
fab0: 6f 6e 20 74 68 69 73 20 70 61 67 65 2e 0a 20 20  on this page..  
fac0: 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73 74 20 29  */.  if( pLast )
fad0: 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79 3b  {.    int dummy;
fae0: 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  .    int iOff;. 
faf0: 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
fb00: 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29  se(pIter->pLeaf)
fb10: 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  ;.    pIter->pLe
fb20: 61 66 20 3d 20 70 4c 61 73 74 3b 0a 20 20 20 20  af = pLast;.    
fb30: 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
fb40: 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20   = pgnoLast;.   
fb50: 20 66 74 73 35 4c 65 61 66 48 65 61 64 65 72 28   fts5LeafHeader(
fb60: 70 4c 61 73 74 2c 20 26 69 4f 66 66 2c 20 26 64  pLast, &iOff, &d
fb70: 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20  ummy);.    iOff 
fb80: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
fb90: 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f 66 66 5d  (&pLast->p[iOff]
fba0: 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
fbb0: 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74  iRowid);.    pIt
fbc0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
fbd0: 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 66  = iOff;.  }..  f
fbe0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
fbf0: 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74  eInitPage(p, pIt
fc00: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74  er);.}../*.** It
fc10: 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72  erator pIter cur
fc20: 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
fc30: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64   the first rowid
fc40: 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a   of a doclist..*
fc50: 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f 63  * There is a doc
fc60: 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63  list-index assoc
fc70: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66  iated with the f
fc80: 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65  inal term on the
fc90: 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67   current .** pag
fca0: 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  e. If the curren
fcb0: 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61  t term is the la
fcc0: 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70  st term on the p
fcd0: 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a  age, load the .*
fce0: 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  * doclist-index 
fcf0: 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e  from disk and in
fd00: 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72  itialize an iter
fd10: 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e  ator at (pIter->
fd20: 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74  pDlidx)..*/.stat
fd30: 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
fd40: 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73  terLoadDlidx(Fts
fd50: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
fd60: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
fd70: 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74    int iSeg = pIt
fd80: 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64  er->pSeg->iSegid
fd90: 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  ;.  int bRev = (
fda0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
fdb0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
fdc0: 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61  RSE);.  Fts5Data
fdd0: 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d   *pLeaf = pIter-
fde0: 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65  >pLeaf; /* Curre
fdf0: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
fe00: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
fe10: 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
fe20: 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
fe30: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
fe40: 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a  r->pDlidx==0 );.
fe50: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
fe60: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
fe70: 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20  st ends on this 
fe80: 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73  page. If it does
fe90: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61  , return.  ** ea
fea0: 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64  rly without load
feb0: 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d  ing the doclist-
fec0: 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65 6c  index (as it bel
fed0: 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65 72  ongs to a differ
fee0: 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a  ent.  ** term. *
fef0: 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  /.  if( pIter->i
ff00: 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49  TermLeafPgno==pI
ff10: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29  ter->iLeafPgno )
ff20: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  {.    int iOff =
ff30: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
ff40: 73 65 74 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f  set + pIter->nPo
ff50: 73 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4f  s;.    while( iO
ff60: 66 66 3c 70 4c 65 61 66 2d 3e 6e 20 29 7b 0a 20  ff<pLeaf->n ){. 
ff70: 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
ff80: 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  .      int nPos;
ff90: 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74  .      i64 iDelt
ffa0: 61 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 69 4f 66  a;..      /* iOf
ffb0: 66 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 74  f is currently t
ffc0: 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65  he offset of the
ffd0: 20 73 74 61 72 74 20 6f 66 20 70 6f 73 69 74 69   start of positi
ffe0: 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 2a 2f 0a  on list data */.
fff0: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74        iOff += ft
10000 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
10010 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36  af->p[iOff], (u6
10020 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20  4*)&iDelta);.   
10030 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d 3d 30     if( iDelta==0
10040 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
10050 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66   assert_nc( iOff
10060 3c 70 4c 65 61 66 2d 3e 6e 20 29 3b 0a 20 20 20  <pLeaf->n );.   
10070 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
10080 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70  etPoslistSize(&p
10090 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 26  Leaf->p[iOff], &
100a0 6e 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a  nPos, &bDummy);.
100b0 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
100c0 6f 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  os;.    }.  }.. 
100d0 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d   pIter->pDlidx =
100e0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
100f0 69 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67  it(p, bRev, iSeg
10100 2c 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  , pIter->iTermLe
10110 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 23 69 66 64  afPgno);.}..#ifd
10120 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
10130 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
10140 41 73 73 65 72 74 4e 6f 64 65 53 65 65 6b 4f 6b  AssertNodeSeekOk
10150 28 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  (.  Fts5Buffer *
10160 70 4e 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 75  pNode,.  const u
10170 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
10180 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
10190 20 74 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a   to search for *
101a0 2f 0a 20 20 69 6e 74 20 69 45 78 70 65 63 74 50  /.  int iExpectP
101b0 67 2c 0a 20 20 69 6e 74 20 62 45 78 70 65 63 74  g,.  int bExpect
101c0 44 6c 69 64 78 0a 29 7b 0a 20 20 69 6e 74 20 62  Dlidx.){.  int b
101d0 44 6c 69 64 78 3b 0a 20 20 69 6e 74 20 69 50 67  Dlidx;.  int iPg
101e0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
101f0 49 54 45 5f 4f 4b 3b 0a 20 20 46 74 73 35 4e 6f  ITE_OK;.  Fts5No
10200 64 65 49 74 65 72 20 6e 6f 64 65 3b 0a 0a 20 20  deIter node;..  
10210 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e 69 74  fts5NodeIterInit
10220 28 70 4e 6f 64 65 2d 3e 70 2c 20 70 4e 6f 64 65  (pNode->p, pNode
10230 2d 3e 6e 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 61  ->n, &node);.  a
10240 73 73 65 72 74 28 20 6e 6f 64 65 2e 74 65 72 6d  ssert( node.term
10250 2e 6e 3d 3d 30 20 29 3b 0a 20 20 69 50 67 20 3d  .n==0 );.  iPg =
10260 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b 0a 20 20   node.iChild;.  
10270 62 44 6c 69 64 78 20 3d 20 6e 6f 64 65 2e 62 44  bDlidx = node.bD
10280 6c 69 64 78 3b 0a 20 20 66 6f 72 28 66 74 73 35  lidx;.  for(fts5
10290 4e 6f 64 65 49 74 65 72 4e 65 78 74 28 26 72 63  NodeIterNext(&rc
102a0 2c 20 26 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  , &node);.      
102b0 6e 6f 64 65 2e 61 44 61 74 61 20 26 26 20 66 74  node.aData && ft
102c0 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42  s5BufferCompareB
102d0 6c 6f 62 28 26 6e 6f 64 65 2e 74 65 72 6d 2c 20  lob(&node.term, 
102e0 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3c 3d 30  pTerm, nTerm)<=0
102f0 3b 0a 20 20 20 20 20 20 66 74 73 35 4e 6f 64 65  ;.      fts5Node
10300 49 74 65 72 4e 65 78 74 28 26 72 63 2c 20 26 6e  IterNext(&rc, &n
10310 6f 64 65 29 0a 20 20 29 7b 0a 20 20 20 20 69 50  ode).  ){.    iP
10320 67 20 3d 20 6e 6f 64 65 2e 69 43 68 69 6c 64 3b  g = node.iChild;
10330 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 6e 6f  .    bDlidx = no
10340 64 65 2e 62 44 6c 69 64 78 3b 0a 20 20 7d 0a 20  de.bDlidx;.  }. 
10350 20 66 74 73 35 4e 6f 64 65 49 74 65 72 46 72 65   fts5NodeIterFre
10360 65 28 26 6e 6f 64 65 29 3b 0a 0a 20 20 61 73 73  e(&node);..  ass
10370 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
10380 4f 4b 20 7c 7c 20 69 50 67 3d 3d 69 45 78 70 65  OK || iPg==iExpe
10390 63 74 50 67 20 29 3b 0a 20 20 61 73 73 65 72 74  ctPg );.  assert
103a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
103b0 7c 7c 20 62 44 6c 69 64 78 3d 3d 62 45 78 70 65  || bDlidx==bExpe
103c0 63 74 44 6c 69 64 78 20 29 3b 0a 7d 0a 23 65 6c  ctDlidx );.}.#el
103d0 73 65 0a 23 64 65 66 69 6e 65 20 66 74 73 35 41  se.#define fts5A
103e0 73 73 65 72 74 4e 6f 64 65 53 65 65 6b 4f 6b 28  ssertNodeSeekOk(
103f0 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e 64 69  v,w,x,y,z).#endi
10400 66 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e  f../*.** Argumen
10410 74 20 70 4e 6f 64 65 20 69 73 20 61 6e 20 69 6e  t pNode is an in
10420 74 65 72 6e 61 6c 20 62 2d 74 72 65 65 20 6e 6f  ternal b-tree no
10430 64 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  de. This functio
10440 6e 20 73 65 61 72 63 68 65 73 0a 2a 2a 20 77 69  n searches.** wi
10450 74 68 69 6e 20 74 68 65 20 6e 6f 64 65 20 66 6f  thin the node fo
10460 72 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65  r the largest te
10470 72 6d 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  rm that is small
10480 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
10490 0a 2a 2a 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54  .** to (pTerm/nT
104a0 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 72  erm)..**.** It r
104b0 65 74 75 72 6e 73 20 74 68 65 20 61 73 73 6f 63  eturns the assoc
104c0 69 61 74 65 64 20 70 61 67 65 20 6e 75 6d 62 65  iated page numbe
104d0 72 2e 20 4f 72 2c 20 69 66 20 28 70 54 65 72 6d  r. Or, if (pTerm
104e0 2f 6e 54 65 72 6d 29 20 69 73 20 73 6d 61 6c 6c  /nTerm) is small
104f0 65 72 0a 2a 2a 20 74 68 61 6e 20 61 6c 6c 20 74  er.** than all t
10500 65 72 6d 73 20 77 69 74 68 69 6e 20 74 68 65 20  erms within the 
10510 6e 6f 64 65 2c 20 74 68 65 20 6c 65 66 74 6d 6f  node, the leftmo
10520 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 6e 75  st child page nu
10530 6d 62 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 42 65 66  mber. .**.** Bef
10540 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 28  ore returning, (
10550 2a 70 62 44 6c 69 64 78 29 20 69 73 20 73 65 74  *pbDlidx) is set
10560 20 74 6f 20 74 72 75 65 20 69 66 20 74 68 65 20   to true if the 
10570 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65  last term on the
10580 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 63 68 69  .** returned chi
10590 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 68  ld page number h
105a0 61 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  as a doclist-ind
105b0 65 78 2e 20 4f 72 20 6c 65 66 74 20 61 73 20 69  ex. Or left as i
105c0 73 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  s otherwise..*/.
105d0 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4e  static int fts5N
105e0 6f 64 65 53 65 65 6b 28 0a 20 20 46 74 73 35 42  odeSeek(.  Fts5B
105f0 75 66 66 65 72 20 2a 70 4e 6f 64 65 2c 20 20 20  uffer *pNode,   
10600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f             /* No
10610 64 65 20 74 6f 20 73 65 61 72 63 68 20 2a 2f 0a  de to search */.
10620 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
10630 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20  m, int nTerm,   
10640 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 61    /* Term to sea
10650 72 63 68 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74  rch for */.  int
10660 20 2a 70 62 44 6c 69 64 78 20 20 20 20 20 20 20   *pbDlidx       
10670 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10680 4f 55 54 3a 20 54 72 75 65 20 69 66 20 64 6c 69  OUT: True if dli
10690 64 78 20 66 6c 61 67 20 69 73 20 73 65 74 20 2a  dx flag is set *
106a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 50 67 3b 0a  /.){.  int iPg;.
106b0 20 20 75 38 20 2a 70 50 74 72 20 3d 20 70 4e 6f    u8 *pPtr = pNo
106c0 64 65 2d 3e 70 3b 0a 20 20 75 38 20 2a 70 45 6e  de->p;.  u8 *pEn
106d0 64 20 3d 20 26 70 50 74 72 5b 70 4e 6f 64 65 2d  d = &pPtr[pNode-
106e0 3e 6e 5d 3b 0a 20 20 69 6e 74 20 6e 4d 61 74 63  >n];.  int nMatc
106f0 68 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  h = 0;          
10700 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10710 20 6f 66 20 62 79 74 65 73 20 6f 66 20 70 54 65   of bytes of pTe
10720 72 6d 20 61 6c 72 65 61 64 79 20 6d 61 74 63 68  rm already match
10730 65 64 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  ed */.  .  asser
10740 74 28 20 2a 70 62 44 6c 69 64 78 3d 3d 30 20 29  t( *pbDlidx==0 )
10750 3b 0a 0a 20 20 70 50 74 72 20 2b 3d 20 66 74 73  ;..  pPtr += fts
10760 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 50 74  5GetVarint32(pPt
10770 72 2c 20 69 50 67 29 3b 0a 20 20 77 68 69 6c 65  r, iPg);.  while
10780 28 20 70 50 74 72 3c 70 45 6e 64 20 29 7b 0a 20  ( pPtr<pEnd ){. 
10790 20 20 20 69 6e 74 20 6e 45 6d 70 74 79 20 3d 20     int nEmpty = 
107a0 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  0;.    int nKeep
107b0 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 65 77 3b 0a  ;.    int nNew;.
107c0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
107d0 20 69 73 20 61 20 22 6e 6f 20 74 65 72 6d 73 22   is a "no terms"
107e0 20 72 65 63 6f 72 64 20 61 74 20 70 50 74 72 2c   record at pPtr,
107f0 20 72 65 61 64 20 69 74 20 6e 6f 77 2e 20 53 74   read it now. St
10800 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  ore the.    ** n
10810 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 6c 65 73  umber of termles
10820 73 20 70 61 67 65 73 20 69 6e 20 6e 45 6d 70 74  s pages in nEmpt
10830 79 2e 20 49 66 20 69 74 20 69 6e 64 69 63 61 74  y. If it indicat
10840 65 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  es a doclist-ind
10850 65 78 2c 20 0a 20 20 20 20 2a 2a 20 73 65 74 20  ex, .    ** set 
10860 28 2a 70 62 44 6c 69 64 78 29 20 74 6f 20 74 72  (*pbDlidx) to tr
10870 75 65 2e 2a 2f 0a 20 20 20 20 69 66 28 20 2a 70  ue.*/.    if( *p
10880 50 74 72 3c 32 20 29 7b 0a 20 20 20 20 20 20 2a  Ptr<2 ){.      *
10890 70 62 44 6c 69 64 78 20 3d 20 28 2a 70 50 74 72  pbDlidx = (*pPtr
108a0 3d 3d 30 78 30 31 29 3b 0a 20 20 20 20 20 20 70  ==0x01);.      p
108b0 50 74 72 2b 2b 3b 0a 20 20 20 20 20 20 70 50 74  Ptr++;.      pPt
108c0 72 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  r += fts5GetVari
108d0 6e 74 33 32 28 70 50 74 72 2c 20 6e 45 6d 70 74  nt32(pPtr, nEmpt
108e0 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  y);.      if( pP
108f0 74 72 3e 3d 70 45 6e 64 20 29 20 62 72 65 61 6b  tr>=pEnd ) break
10900 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10910 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 22 74  Read the next "t
10920 65 72 6d 22 20 70 6f 69 6e 74 65 72 2e 20 53 65  erm" pointer. Se
10930 74 20 6e 4b 65 65 70 20 74 6f 20 74 68 65 20 6e  t nKeep to the n
10940 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
10950 6f 0a 20 20 20 20 2a 2a 20 6b 65 65 70 20 66 72  o.    ** keep fr
10960 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  om the previous 
10970 74 65 72 6d 2c 20 61 6e 64 20 6e 4e 65 77 20 74  term, and nNew t
10980 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
10990 62 79 74 65 73 20 6f 66 0a 20 20 20 20 2a 2a 20  bytes of.    ** 
109a0 6e 65 77 20 64 61 74 61 20 74 68 61 74 20 77 69  new data that wi
109b0 6c 6c 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  ll be appended t
109c0 6f 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6e 4b 65  o it. */.    nKe
109d0 65 70 20 3d 20 28 69 6e 74 29 2a 70 50 74 72 2b  ep = (int)*pPtr+
109e0 2b 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 28 69  +;.    nNew = (i
109f0 6e 74 29 2a 70 50 74 72 2b 2b 3b 0a 20 20 20 20  nt)*pPtr++;.    
10a00 69 66 28 20 28 6e 4b 65 65 70 20 7c 20 6e 4e 65  if( (nKeep | nNe
10a10 77 29 20 26 20 30 78 30 30 38 30 20 29 7b 0a 20  w) & 0x0080 ){. 
10a20 20 20 20 20 20 70 50 74 72 20 2d 3d 20 32 3b 0a       pPtr -= 2;.
10a30 20 20 20 20 20 20 70 50 74 72 20 2b 3d 20 66 74        pPtr += ft
10a40 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 50  s5GetVarint32(pP
10a50 74 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  tr, nKeep);.    
10a60 20 20 70 50 74 72 20 2b 3d 20 66 74 73 35 47 65    pPtr += fts5Ge
10a70 74 56 61 72 69 6e 74 33 32 28 70 50 74 72 2c 20  tVarint32(pPtr, 
10a80 6e 4e 65 77 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nNew);.    }.   
10a90 20 6e 4b 65 65 70 20 2d 3d 20 32 3b 0a 0a 20 20   nKeep -= 2;..  
10aa0 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 28 70 54    /* Compare (pT
10ab0 65 72 6d 2f 6e 54 65 72 6d 29 20 74 6f 20 74 68  erm/nTerm) to th
10ac0 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 20 6f  e current term o
10ad0 6e 20 74 68 65 20 6e 6f 64 65 20 28 74 68 65 20  n the node (the 
10ae0 6f 6e 65 20 64 65 73 63 72 69 62 65 64 0a 20 20  one described.  
10af0 20 20 2a 2a 20 62 79 20 6e 4b 65 65 70 2f 6e 4e    ** by nKeep/nN
10b00 65 77 29 2e 20 49 66 20 74 68 65 20 6e 6f 64 65  ew). If the node
10b10 20 74 65 72 6d 20 69 73 20 6c 61 72 67 65 72 2c   term is larger,
10b20 20 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68   break out of th
10b30 65 20 77 68 69 6c 65 28 29 0a 20 20 20 20 2a 2a  e while().    **
10b40 20 6c 6f 6f 70 2e 20 0a 20 20 20 20 2a 2a 0a 20   loop. .    **. 
10b50 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c     ** Otherwise,
10b60 20 69 66 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d   if (pTerm/nTerm
10b70 29 20 69 73 20 6c 61 72 67 65 72 20 6f 72 20 74  ) is larger or t
10b80 68 65 20 74 77 6f 20 74 65 72 6d 73 20 61 72 65  he two terms are
10b90 20 65 71 75 61 6c 2c 20 0a 20 20 20 20 2a 2a 20   equal, .    ** 
10ba0 6c 65 61 76 65 20 76 61 72 69 61 62 6c 65 20 6e  leave variable n
10bb0 4d 61 74 63 68 20 73 65 74 20 74 6f 20 74 68 65  Match set to the
10bc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72   size of the lar
10bd0 67 65 73 74 20 70 72 65 66 69 78 20 63 6f 6d 6d  gest prefix comm
10be0 6f 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 62 6f 74  on to.    ** bot
10bf0 68 20 74 65 72 6d 73 20 69 6e 20 62 79 74 65 73  h terms in bytes
10c00 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4b  .  */.    if( nK
10c10 65 65 70 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20  eep==nMatch ){. 
10c20 20 20 20 20 20 69 6e 74 20 6e 54 73 74 20 3d 20       int nTst = 
10c30 4d 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d  MIN(nNew, nTerm-
10c40 6e 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 69  nMatch);.      i
10c50 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
10c60 69 3d 30 3b 20 69 3c 6e 54 73 74 3b 20 69 2b 2b  i=0; i<nTst; i++
10c70 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
10c80 54 65 72 6d 5b 6e 4b 65 65 70 2b 69 5d 21 3d 70  Term[nKeep+i]!=p
10c90 50 74 72 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a  Ptr[i] ) break;.
10ca0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d        }.      nM
10cb0 61 74 63 68 20 2b 3d 20 69 3b 0a 20 20 20 20 20  atch += i;.     
10cc0 20 61 73 73 65 72 74 28 20 6e 4d 61 74 63 68 3c   assert( nMatch<
10cd0 3d 6e 54 65 72 6d 20 29 3b 0a 0a 20 20 20 20 20  =nTerm );..     
10ce0 20 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 28   if( i<nNew && (
10cf0 6e 4d 61 74 63 68 3d 3d 6e 54 65 72 6d 20 7c 7c  nMatch==nTerm ||
10d00 20 70 50 74 72 5b 69 5d 20 3e 20 70 54 65 72 6d   pPtr[i] > pTerm
10d10 5b 6e 4d 61 74 63 68 5d 29 20 29 20 62 72 65 61  [nMatch]) ) brea
10d20 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
10d30 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b   nKeep<nMatch ){
10d40 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
10d50 20 20 7d 0a 0a 20 20 20 20 69 50 67 20 2b 3d 20    }..    iPg += 
10d60 31 20 2b 20 6e 45 6d 70 74 79 3b 0a 20 20 20 20  1 + nEmpty;.    
10d70 2a 70 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20  *pbDlidx = 0;.  
10d80 20 20 70 50 74 72 20 2b 3d 20 6e 4e 65 77 3b 0a    pPtr += nNew;.
10d90 20 20 7d 0a 0a 20 20 66 74 73 35 41 73 73 65 72    }..  fts5Asser
10da0 74 4e 6f 64 65 53 65 65 6b 4f 6b 28 70 4e 6f 64  tNodeSeekOk(pNod
10db0 65 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  e, pTerm, nTerm,
10dc0 20 69 50 67 2c 20 2a 70 62 44 6c 69 64 78 29 3b   iPg, *pbDlidx);
10dd0 0a 20 20 72 65 74 75 72 6e 20 69 50 67 3b 0a 7d  .  return iPg;.}
10de0 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 49 6e  ..#define fts5In
10df0 64 65 78 47 65 74 56 61 72 69 6e 74 33 32 28 61  dexGetVarint32(a
10e00 2c 20 69 4f 66 66 2c 20 6e 56 61 6c 29 20 7b 20  , iOff, nVal) { 
10e10 20 20 20 20 5c 0a 20 20 6e 56 61 6c 20 3d 20 61      \.  nVal = a
10e20 5b 69 4f 66 66 2b 2b 5d 3b 20 20 20 20 20 20 20  [iOff++];       
10e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e40 20 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20          \.  if( 
10e50 6e 56 61 6c 20 26 20 30 78 38 30 20 29 7b 20 20  nVal & 0x80 ){  
10e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
10e80 20 20 69 4f 66 66 2d 2d 3b 20 20 20 20 20 20 20    iOff--;       
10e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10eb0 5c 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  \.    iOff += ft
10ec0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
10ed0 5b 69 4f 66 66 5d 2c 20 6e 56 61 6c 29 3b 20 20  [iOff], nVal);  
10ee0 20 20 20 20 5c 0a 20 20 7d 20 20 20 20 20 20 20      \.  }       
10ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f10 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23 64 65          \.}..#de
10f20 66 69 6e 65 20 66 74 73 35 49 6e 64 65 78 53 6b  fine fts5IndexSk
10f30 69 70 56 61 72 69 6e 74 28 61 2c 20 69 4f 66 66  ipVarint(a, iOff
10f40 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 5c  ) {            \
10f50 0a 20 20 69 6e 74 20 69 45 6e 64 20 3d 20 69 4f  .  int iEnd = iO
10f60 66 66 2b 39 3b 20 20 20 20 20 20 20 20 20 20 20  ff+9;           
10f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f80 20 20 20 5c 0a 20 20 77 68 69 6c 65 28 20 28 61     \.  while( (a
10f90 5b 69 4f 66 66 2b 2b 5d 20 26 20 30 78 38 30 29  [iOff++] & 0x80)
10fa0 20 26 26 20 69 4f 66 66 3c 69 45 6e 64 20 29 3b   && iOff<iEnd );
10fb0 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a         \.}../*.*
10fc0 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 6f  * The iterator o
10fd0 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
10fe0 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
10ff0 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  ent currently co
11000 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76 61 6c  ntains.** no val
11010 69 64 20 76 61 6c 75 65 73 20 65 78 63 65 70 74  id values except
11020 20 66 6f 72 20 74 68 65 20 46 74 73 35 53 65 67   for the Fts5Seg
11030 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d 62 65  Iter.pLeaf membe
11040 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69 73  r variable. This
11050 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 61  .** function sea
11060 72 63 68 65 73 20 74 68 65 20 6c 65 61 66 20 70  rches the leaf p
11070 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d 20 6d  age for a term m
11080 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d 2f 6e  atching (pTerm/n
11090 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Term)..**.** If 
110a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65  the specified te
110b0 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e 20 74  rm is found on t
110c0 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  he page, then th
110d0 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
110e0 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74  ft.** pointing t
110f0 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d 65 6e  o it. If argumen
11100 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20 61 6e  t bGe is zero an
11110 64 20 74 68 65 20 74 65 72 6d 20 69 73 20 6e 6f  d the term is no
11120 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68 65 20  t found,.** the 
11130 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74  iterator is left
11140 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45 4f 46   pointing at EOF
11150 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65 20 69  ..**.** If bGe i
11160 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74  s non-zero and t
11170 68 65 20 73 70 65 63 69 66 69 65 64 20 74 65 72  he specified ter
11180 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20  m is not found, 
11190 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74 65 72  then the.** iter
111a0 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  ator is left poi
111b0 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73 6d 61  nting to the sma
111c0 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20 74 68  llest term in th
111d0 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74 0a 2a  e segment that.*
111e0 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  * is larger than
111f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
11200 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74 68 69  erm, even if thi
11210 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 6f 6e  s term is not on
11220 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
11230 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
11240 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53 65 65  void fts5LeafSee
11250 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  k(.  Fts5Index *
11260 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
11270 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 61 6e       /* Leave an
11280 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68 65 72  y error code her
11290 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65 2c 20  e */.  int bGe, 
112a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112b0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
112c0 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68 20 2a  or a >= search *
112d0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
112e0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
112f0 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
11300 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63 6f 6e  to seek */.  con
11310 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e  st u8 *pTerm, in
11320 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f 2a 20  t nTerm      /* 
11330 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68 20 66  Term to search f
11340 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  or */.){.  int i
11350 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  Off;.  const u8 
11360 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
11370 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  f->p;.  int n = 
11380 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b  pIter->pLeaf->n;
11390 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d  ..  int nMatch =
113a0 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
113b0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  = 0;.  int nNew 
113c0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
113d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
113e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   );.  assert( pI
113f0 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20  ter->pLeaf );.. 
11400 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55   iOff = fts5GetU
11410 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 69 66 28  16(&a[2]);.  if(
11420 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e   iOff<4 || iOff>
11430 3d 6e 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  =n ){.    p->rc 
11440 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
11450 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11460 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
11470 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
11480 74 20 6e 43 6d 70 3b 0a 0a 20 20 20 20 2f 2a 20  t nCmp;..    /* 
11490 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
114a0 61 6e 79 20 6e 65 77 20 62 79 74 65 73 20 61 72  any new bytes ar
114b0 65 20 69 6e 20 74 68 69 73 20 74 65 72 6d 20 2a  e in this term *
114c0 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 47  /.    fts5IndexG
114d0 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f  etVarint32(a, iO
114e0 66 66 2c 20 6e 4e 65 77 29 3b 0a 0a 20 20 20 20  ff, nNew);..    
114f0 69 66 28 20 6e 4b 65 65 70 3c 6e 4d 61 74 63 68  if( nKeep<nMatch
11500 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
11510 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20  earch_failed;.  
11520 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28    }..    assert(
11530 20 6e 4b 65 65 70 3e 3d 6e 4d 61 74 63 68 20 29   nKeep>=nMatch )
11540 3b 0a 20 20 20 20 69 66 28 20 6e 4b 65 65 70 3d  ;.    if( nKeep=
11550 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  =nMatch ){.     
11560 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4e 65 77   nCmp = MIN(nNew
11570 2c 20 6e 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b  , nTerm-nMatch);
11580 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
11590 69 3c 6e 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCmp; i++){.  
115a0 20 20 20 20 20 20 69 66 28 20 61 5b 69 4f 66 66        if( a[iOff
115b0 2b 69 5d 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63  +i]!=pTerm[nMatc
115c0 68 2b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20  h+i] ) break;.  
115d0 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74      }.      nMat
115e0 63 68 20 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20  ch += i;..      
115f0 69 66 28 20 6e 54 65 72 6d 3d 3d 6e 4d 61 74 63  if( nTerm==nMatc
11600 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  h ){.        if(
11610 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20 20 20   i==nNew ){.    
11620 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11630 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20 20 20  h_success;.     
11640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11650 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
11660 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20  failed;.        
11670 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
11680 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b 69 4f  ( i<nNew && a[iO
11690 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d 61 74  ff+i]>pTerm[nMat
116a0 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 67  ch] ){.        g
116b0 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69 6c 65  oto search_faile
116c0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
116d0 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65  .    iOff += nNe
116e0 77 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20  w;..    /* Skip 
116f0 70 61 73 74 20 74 68 65 20 64 6f 63 6c 69 73 74  past the doclist
11700 2e 20 49 66 20 74 68 65 20 65 6e 64 20 6f 66 20  . If the end of 
11710 74 68 65 20 70 61 67 65 20 69 73 20 72 65 61 63  the page is reac
11720 68 65 64 2c 20 62 61 69 6c 20 6f 75 74 2e 20 2a  hed, bail out. *
11730 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  /.    while( 1 )
11740 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73  {.      int nPos
11750 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 53 6b 69 70  ;..      /* Skip
11760 20 70 61 73 74 20 64 6f 63 69 64 20 64 65 6c 74   past docid delt
11770 61 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 49  a */.      fts5I
11780 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 61  ndexSkipVarint(a
11790 2c 20 69 4f 66 66 29 3b 0a 0a 20 20 20 20 20 20  , iOff);..      
117a0 2f 2a 20 53 6b 69 70 20 70 61 73 74 20 70 6f 73  /* Skip past pos
117b0 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
117c0 20 20 20 20 66 74 73 35 49 6e 64 65 78 47 65 74      fts5IndexGet
117d0 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66  Varint32(a, iOff
117e0 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 69  , nPos);.      i
117f0 4f 66 66 20 2b 3d 20 28 6e 50 6f 73 20 3e 3e 20  Off += (nPos >> 
11800 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f  1);.      if( iO
11810 66 66 3e 3d 28 6e 2d 31 29 20 29 7b 0a 20 20 20  ff>=(n-1) ){.   
11820 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a 20       iOff = n;. 
11830 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72         goto sear
11840 63 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  ch_failed;.     
11850 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
11860 74 68 69 73 20 69 73 20 74 68 65 20 65 6e 64 20  this is the end 
11870 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 2c 20  of the doclist, 
11880 62 72 65 61 6b 20 6f 75 74 20 6f 66 20 74 68 65  break out of the
11890 20 6c 6f 6f 70 20 2a 2f 0a 20 20 20 20 20 20 69   loop */.      i
118a0 66 28 20 61 5b 69 4f 66 66 5d 3d 3d 30 78 30 30  f( a[iOff]==0x00
118b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66   ){.        iOff
118c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ++;.        brea
118d0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
118e0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
118f0 68 65 20 6e 4b 65 65 70 20 66 69 65 6c 64 20 6f  he nKeep field o
11900 66 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 2e  f the next term.
11910 20 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65   */.    fts5Inde
11920 78 47 65 74 56 61 72 69 6e 74 33 32 28 61 2c 20  xGetVarint32(a, 
11930 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  iOff, nKeep);.  
11940 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69 6c 65  }.. search_faile
11950 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d 30 20  d:.  if( bGe==0 
11960 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  ){.    fts5DataR
11970 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
11980 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
11990 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
119a0 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73 65 20  return;.  }else 
119b0 69 66 28 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20  if( iOff>=n ){. 
119c0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 66 74     do {.      ft
119d0 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67  s5SegIterNextPag
119e0 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  e(p, pIter);.   
119f0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
11a00 65 61 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  eaf==0 ) return;
11a10 0a 20 20 20 20 20 20 61 20 3d 20 70 49 74 65 72  .      a = pIter
11a20 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 20 20  ->pLeaf->p;.    
11a30 20 20 69 4f 66 66 20 3d 20 66 74 73 35 47 65 74    iOff = fts5Get
11a40 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
11a50 20 20 69 66 28 20 69 4f 66 66 20 29 7b 0a 20 20    if( iOff ){.  
11a60 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34        if( iOff<4
11a70 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
11a80 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
11a90 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
11aa0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
11ab0 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20          nKeep = 
11ac0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  0;.          iOf
11ad0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
11ae0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
11af0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
11b00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
11b10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
11b20 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20  ile( 1 );.  }.. 
11b30 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a  search_success:.
11b40 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
11b50 66 73 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e  fset = iOff + nN
11b60 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65  ew;.  pIter->iTe
11b70 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  rmLeafOffset = p
11b80 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
11b90 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  t;.  pIter->iTer
11ba0 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
11bb0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20  r->iLeafPgno;.. 
11bc0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
11bd0 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
11be0 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72  erm, nKeep, pTer
11bf0 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
11c00 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
11c10 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
11c20 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
11c30 3b 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  ;..  fts5SegIter
11c40 4c 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74  LoadRowid(p, pIt
11c50 65 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74  er);.  fts5SegIt
11c60 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
11c70 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
11c80 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62  nitialize the ob
11c90 6a 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f  ject pIter to po
11ca0 69 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72  int to term pTer
11cb0 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73  m/nTerm within s
11cc0 65 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20  egment.** pSeg. 
11cd0 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
11ce0 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
11cf0 69 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61  index, the itera
11d00 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f  tor is set to EO
11d10 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  F..**.** If an e
11d20 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
11d30 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
11d40 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
11d50 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
11d60 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
11d70 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
11d80 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
11d90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
11da0 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
11db0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11dc0 66 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49  fts5SegIterSeekI
11dd0 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  nit(.  Fts5Index
11de0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11df0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
11e00 61 63 6b 65 6e 64 20 2a 2f 0a 20 20 46 74 73 35  ackend */.  Fts5
11e10 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
11e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
11e30 75 66 66 65 72 20 74 6f 20 75 73 65 20 66 6f 72  uffer to use for
11e40 20 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a   loading pages *
11e50 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
11e60 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
11e70 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
11e80 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
11e90 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
11eb0 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
11ec0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
11ed0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
11ee0 6d 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20  ment *pSeg,     
11ef0 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
11f00 66 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46  f segment */.  F
11f10 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
11f20 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r              /
11f30 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75  * Object to popu
11f40 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  late */.){.  int
11f50 20 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20   iPg = 1;.  int 
11f60 68 3b 0a 20 20 69 6e 74 20 62 47 65 20 3d 20 28  h;.  int bGe = (
11f70 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
11f80 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3b 0a 20  X_QUERY_SCAN);. 
11f90 20 69 6e 74 20 62 44 6c 69 64 78 20 3d 20 30 3b   int bDlidx = 0;
11fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fb0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 72   /* True if ther
11fc0 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
11fd0 6e 64 65 78 20 2a 2f 0a 0a 20 20 73 74 61 74 69  ndex */..  stati
11fe0 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b  c int nCall = 0;
11ff0 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 0a 20 20 61  .  nCall++;..  a
12000 73 73 65 72 74 28 20 62 47 65 3d 3d 30 20 7c 7c  ssert( bGe==0 ||
12010 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
12020 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 29 3d  DEX_QUERY_DESC)=
12030 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
12040 70 54 65 72 6d 20 26 26 20 6e 54 65 72 6d 20 29  pTerm && nTerm )
12050 3b 0a 20 20 6d 65 6d 73 65 74 28 70 49 74 65 72  ;.  memset(pIter
12060 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
12070 65 72 29 29 3b 0a 20 20 70 49 74 65 72 2d 3e 70  er));.  pIter->p
12080 53 65 67 20 3d 20 70 53 65 67 3b 0a 0a 20 20 2f  Seg = pSeg;..  /
12090 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 73 65 74  * This block set
120a0 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
120b0 20 69 50 67 20 74 6f 20 74 68 65 20 6c 65 61 66   iPg to the leaf
120c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68 61   page number tha
120d0 74 20 6d 61 79 0a 20 20 2a 2a 20 63 6f 6e 74 61  t may.  ** conta
120e0 69 6e 20 74 65 72 6d 20 28 70 54 65 72 6d 2f 6e  in term (pTerm/n
120f0 54 65 72 6d 29 2c 20 69 66 20 69 74 20 69 73 20  Term), if it is 
12100 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 73  present in the s
12110 65 67 6d 65 6e 74 2e 20 2a 2f 0a 20 20 69 66 28  egment. */.  if(
12120 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 3d 3d   p->pIdxSelect==
12130 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43 6f 6e  0 ){.    Fts5Con
12140 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
12150 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 66  ->pConfig;.    f
12160 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65 53  ts5IndexPrepareS
12170 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64 78 53  tmt(p, &p->pIdxS
12180 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33 5f 6d  elect, sqlite3_m
12190 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
121a0 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f 20 46    "SELECT pgno F
121b0 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78  ROM '%q'.'%q_idx
121c0 27 20 57 48 45 52 45 20 22 0a 20 20 20 20 20 20  ' WHERE ".      
121d0 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41 4e 44      "segid=? AND
121e0 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52 20 42   term<=? ORDER B
121f0 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49 4d 49  Y term DESC LIMI
12200 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  T 1",.          
12210 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
12220 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
12230 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   ));.  }.  if( p
12240 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
12250 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
12260 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c  t(p->pIdxSelect,
12270 20 31 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64   1, pSeg->iSegid
12280 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
12290 64 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 53 65  d_blob(p->pIdxSe
122a0 6c 65 63 74 2c 20 32 2c 20 70 54 65 72 6d 2c 20  lect, 2, pTerm, 
122b0 6e 54 65 72 6d 2c 20 53 51 4c 49 54 45 5f 53 54  nTerm, SQLITE_ST
122c0 41 54 49 43 29 3b 0a 20 20 69 66 28 20 53 51 4c  ATIC);.  if( SQL
122d0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
122e0 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 53 65 6c  _step(p->pIdxSel
122f0 65 63 74 29 20 29 7b 0a 20 20 20 20 69 36 34 20  ect) ){.    i64 
12300 76 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  val = sqlite3_co
12310 6c 75 6d 6e 5f 69 6e 74 28 70 2d 3e 70 49 64 78  lumn_int(p->pIdx
12320 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20  Select, 0);.    
12330 69 50 67 20 3d 20 28 76 61 6c 3e 3e 31 29 3b 0a  iPg = (val>>1);.
12340 20 20 20 20 62 44 6c 69 64 78 20 3d 20 28 76 61      bDlidx = (va
12350 6c 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 7d  l & 0x0001);.  }
12360 0a 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74  .  p->rc = sqlit
12370 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78  e3_reset(p->pIdx
12380 53 65 6c 65 63 74 29 3b 0a 0a 20 20 69 66 28 20  Select);..  if( 
12390 69 50 67 3c 70 53 65 67 2d 3e 70 67 6e 6f 46 69  iPg<pSeg->pgnoFi
123a0 72 73 74 20 29 7b 0a 20 20 20 20 69 50 67 20 3d  rst ){.    iPg =
123b0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
123c0 3b 0a 20 20 20 20 62 44 6c 69 64 78 20 3d 20 30  ;.    bDlidx = 0
123d0 3b 0a 20 20 7d 0a 0a 20 20 70 49 74 65 72 2d 3e  ;.  }..  pIter->
123e0 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 20  iLeafPgno = iPg 
123f0 2d 20 31 3b 0a 20 20 66 74 73 35 53 65 67 49 74  - 1;.  fts5SegIt
12400 65 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49  erNextPage(p, pI
12410 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 49 74  ter);..  if( pIt
12420 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
12430 20 66 74 73 35 4c 65 61 66 53 65 65 6b 28 70 2c   fts5LeafSeek(p,
12440 20 62 47 65 2c 20 70 49 74 65 72 2c 20 70 54 65   bGe, pIter, pTe
12450 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 7d 0a  rm, nTerm);.  }.
12460 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
12470 4c 49 54 45 5f 4f 4b 20 26 26 20 62 47 65 3d 3d  LITE_OK && bGe==
12480 30 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  0 ){.    pIter->
12490 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
124a0 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20  GITER_ONETERM;. 
124b0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c     if( pIter->pL
124c0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28  eaf ){.      if(
124d0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
124e0 45 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b  EX_QUERY_DESC ){
124f0 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e  .        pIter->
12500 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45  flags |= FTS5_SE
12510 47 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20  GITER_REVERSE;. 
12520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
12530 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20   bDlidx ){.     
12540 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
12550 61 64 44 6c 69 64 78 28 70 2c 20 70 49 74 65 72  adDlidx(p, pIter
12560 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12570 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54 53   if( flags & FTS
12580 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
12590 43 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  C ){.        fts
125a0 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28  5SegIterReverse(
125b0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
125c0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
125d0 2f 2a 20 45 69 74 68 65 72 3a 0a 20 20 2a 2a 0a  /* Either:.  **.
125e0 20 20 2a 2a 20 20 20 31 29 20 61 6e 20 65 72 72    **   1) an err
125f0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
12600 20 6f 72 0a 20 20 2a 2a 20 20 20 32 29 20 74 68   or.  **   2) th
12610 65 20 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74  e iterator point
12620 73 20 74 6f 20 45 4f 46 2c 20 6f 72 0a 20 20 2a  s to EOF, or.  *
12630 2a 20 20 20 33 29 20 74 68 65 20 69 74 65 72 61  *   3) the itera
12640 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  tor points to an
12650 20 65 6e 74 72 79 20 77 69 74 68 20 74 65 72 6d   entry with term
12660 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20   (pTerm/nTerm), 
12670 6f 72 0a 20 20 2a 2a 20 20 20 34 29 20 74 68 65  or.  **   4) the
12680 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
12690 5f 53 43 41 4e 20 66 6c 61 67 20 77 61 73 20 73  _SCAN flag was s
126a0 65 74 20 61 6e 64 20 74 68 65 20 69 74 65 72 61  et and the itera
126b0 74 6f 72 20 70 6f 69 6e 74 73 0a 20 20 2a 2a 20  tor points.  ** 
126c0 20 20 20 20 20 74 6f 20 61 6e 20 65 6e 74 72 79       to an entry
126d0 20 77 69 74 68 20 61 20 74 65 72 6d 20 67 72 65   with a term gre
126e0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75  ater than or equ
126f0 61 6c 20 74 6f 20 28 70 54 65 72 6d 2f 6e 54 65  al to (pTerm/nTe
12700 72 6d 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  rm)..  */.  asse
12710 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  rt( p->rc!=SQLIT
12720 45 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 20 20  E_OK            
12730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12750 20 31 20 2a 2f 0a 20 20 20 7c 7c 20 70 49 74 65   1 */.   || pIte
12760 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 20 20 20 20  r->pLeaf==0     
12770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 32 20 2a            /* 2 *
127a0 2f 0a 20 20 20 7c 7c 20 66 74 73 35 42 75 66 66  /.   || fts5Buff
127b0 65 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70  erCompareBlob(&p
127c0 49 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72  Iter->term, pTer
127d0 6d 2c 20 6e 54 65 72 6d 29 3d 3d 30 20 20 20 20  m, nTerm)==0    
127e0 20 20 20 20 20 20 2f 2a 20 33 20 2a 2f 0a 20 20        /* 3 */.  
127f0 20 7c 7c 20 28 62 47 65 20 26 26 20 66 74 73 35   || (bGe && fts5
12800 42 75 66 66 65 72 43 6f 6d 70 61 72 65 42 6c 6f  BufferCompareBlo
12810 62 28 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  b(&pIter->term, 
12820 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3e 30 29  pTerm, nTerm)>0)
12830 20 20 2f 2a 20 34 20 2a 2f 0a 20 20 29 3b 0a 7d    /* 4 */.  );.}
12840 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
12850 7a 65 20 74 68 65 20 6f 62 6a 65 63 74 20 70 49  ze the object pI
12860 74 65 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  ter to point to 
12870 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
12880 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 69   within the.** i
12890 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
128a0 62 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ble. If there is
128b0 20 6e 6f 20 73 75 63 68 20 74 65 72 6d 20 69 6e   no such term in
128c0 20 74 68 65 20 68 61 73 68 2d 74 61 62 6c 65 2c   the hash-table,
128d0 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 6f   the .** iterato
128e0 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e  r is set to EOF.
128f0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12900 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49  or occurs, Fts5I
12910 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74  ndex.rc is set t
12920 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  o an appropriate
12930 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
12940 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73  .** an error has
12950 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
12960 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  d when this func
12970 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
12980 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
12990 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
129a0 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69  s5SegIterHashIni
129b0 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
129c0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
129d0 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
129e0 6b 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  kend */.  const 
129f0 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e  u8 *pTerm, int n
12a00 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72  Term,     /* Ter
12a10 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a  m to seek to */.
12a20 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
12a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a40 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
12a50 35 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73  5INDEX_XXX flags
12a60 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
12a70 72 20 2a 70 49 74 65 72 20 20 20 20 20 20 20 20  r *pIter        
12a80 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20        /* Object 
12a90 74 6f 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29  to populate */.)
12aa0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c  {.  const u8 *pL
12ab0 69 73 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ist = 0;.  int n
12ac0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  List = 0;.  cons
12ad0 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  t u8 *z = 0;.  i
12ae0 6e 74 20 6e 20 3d 20 30 3b 0a 0a 20 20 61 73 73  nt n = 0;..  ass
12af0 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b  ert( p->pHash );
12b00 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
12b10 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
12b20 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 7c    if( pTerm==0 |
12b30 7c 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49  | (flags & FTS5I
12b40 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29  NDEX_QUERY_SCAN)
12b50 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
12b60 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53  sqlite3Fts5HashS
12b70 63 61 6e 49 6e 69 74 28 70 2d 3e 70 48 61 73 68  canInit(p->pHash
12b80 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  , (const char*)p
12b90 54 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20  Term, nTerm);.  
12ba0 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
12bb0 68 53 63 61 6e 45 6e 74 72 79 28 70 2d 3e 70 48  hScanEntry(p->pH
12bc0 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  ash, (const char
12bd0 2a 2a 29 26 7a 2c 20 26 70 4c 69 73 74 2c 20 26  **)&z, &pList, &
12be0 6e 4c 69 73 74 29 3b 0a 20 20 20 20 6e 20 3d 20  nList);.    n = 
12bf0 28 7a 20 3f 20 73 74 72 6c 65 6e 28 28 63 6f 6e  (z ? strlen((con
12c00 73 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29  st char*)z) : 0)
12c10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
12c20 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46  Iter->flags |= F
12c30 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
12c40 45 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ERM;.    sqlite3
12c50 46 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d  Fts5HashQuery(p-
12c60 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63  >pHash, (const c
12c70 68 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72  har*)pTerm, nTer
12c80 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73  m, &pList, &nLis
12c90 74 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72  t);.    z = pTer
12ca0 6d 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d  m;.    n = nTerm
12cb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69  ;.  }..  if( pLi
12cc0 73 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61  st ){.    Fts5Da
12cd0 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73  ta *pLeaf;.    s
12ce0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
12cf0 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74  Set(&p->rc, &pIt
12d00 65 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b  er->term, n, z);
12d10 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73  .    pLeaf = fts
12d20 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69  5IdxMalloc(p, si
12d30 7a 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b  zeof(Fts5Data));
12d40 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d  .    if( pLeaf==
12d50 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
12d60 70 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29  pLeaf->p = (u8*)
12d70 70 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66  pList;.    pLeaf
12d80 2d 3e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  ->n = nList;.   
12d90 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
12da0 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
12db0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
12dc0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
12dd0 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
12de0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 0a  Iter->iRowid);..
12df0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
12e00 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
12e10 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49  DESC ){.      pI
12e20 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
12e30 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
12e40 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  SE;.      fts5Se
12e50 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
12e60 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
12e70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12e80 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
12e90 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
12ea0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
12eb0 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65 72  ** Zero the iter
12ec0 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
12ed0 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74  he only argument
12ee0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12ef0 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65 61   fts5SegIterClea
12f00 72 28 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  r(Fts5SegIter *p
12f10 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75 66  Iter){.  fts5Buf
12f20 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
12f30 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61 74  term);.  fts5Dat
12f40 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
12f50 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44 61  pLeaf);.  fts5Da
12f60 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
12f70 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20 66  >pNextLeaf);.  f
12f80 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
12f90 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29 3b  (pIter->pDlidx);
12fa0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12fb0 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66  pIter->aRowidOff
12fc0 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  set);.  memset(p
12fd0 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
12fe0 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a 7d  Fts5SegIter));.}
12ff0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
13000 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  DEBUG../*.** Thi
13010 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
13020 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
13030 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20 70  e big assert() p
13040 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d 65  rocedure impleme
13050 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35 41  nted by.** fts5A
13060 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
13070 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72 65  tup(). It ensure
13080 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  s that the resul
13090 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  t currently stor
130a0 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20 69  ed.** in *pRes i
130b0 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 65  s the correct re
130c0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e  sult of comparin
130d0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 6f  g the current po
130e0 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a 2a  sitions of the.*
130f0 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73 2e  * two iterators.
13100 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13110 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
13120 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46 74  isonResult(.  Ft
13130 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
13140 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67 49 74  er, .  Fts5SegIt
13150 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35 53 65  er *p1,.  Fts5Se
13160 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46 74 73  gIter *p2,.  Fts
13170 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 0a 29  5CResult *pRes.)
13180 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70 31 20  {.  int i1 = p1 
13190 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 20  - pIter->aSeg;. 
131a0 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d 20 70   int i2 = p2 - p
131b0 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20 20 69  Iter->aSeg;..  i
131c0 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c 7c 20  f( p1->pLeaf || 
131d0 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  p2->pLeaf ){.   
131e0 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d 3d   if( p1->pLeaf==
131f0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
13200 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
13210 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i2 );.    }else
13220 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d 3d   if( p2->pLeaf==
13230 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
13240 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73 74 3d  t( pRes->iFirst=
13250 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65  =i1 );.    }else
13260 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 69 6e  {.      int nMin
13270 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72 6d 2e   = MIN(p1->term.
13280 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a  n, p2->term.n);.
13290 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
132a0 6d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e  memcmp(p1->term.
132b0 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e  p, p2->term.p, n
132c0 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Min);.      if( 
132d0 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70  res==0 ) res = p
132e0 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e  1->term.n - p2->
132f0 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69  term.n;..      i
13300 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
13310 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
13320 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b  s->bTermEq==1 );
13330 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13340 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d   p1->iRowid!=p2-
13350 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  >iRowid );.     
13360 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
13370 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77  Rowid > p2->iRow
13380 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13390 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20  ) ? -1 : 1;.    
133a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
133b0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
133c0 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20  TermEq==0 );.   
133d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
133e0 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
133f0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
13400 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
13410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13420 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13430 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
13440 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13450 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
13460 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
13470 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
13480 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
13490 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c   when this modul
134a0 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64  e.** is compiled
134b0 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
134c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
134d0 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20   essentially an 
134e0 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
134f0 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76  tement used to v
13500 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
13510 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
13520 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
13530 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72  rray.** are corr
13540 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
13550 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d 75  oid fts5AssertMu
13560 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74 73  ltiIterSetup(Fts
13570 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
13580 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29  ndexIter *pIter)
13590 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
135a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
135b0 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46 69  Fts5SegIter *pFi
135c0 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  rst = &pIter->aS
135d0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
135e0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
135f0 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 61     int i;..    a
13600 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d 3e  ssert( (pFirst->
13610 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
13620 2d 3e 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f  ->bEof );..    /
13630 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70 49 74  * Check that pIt
13640 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13650 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
13660 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  y. */.    for(i=
13670 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
13680 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  ; i++){.      Ft
13690 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
136a0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
136b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
136c0 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20 20 20  1==pFirst .     
136d0 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65        || p1->pLe
136e0 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  af==0 .         
136f0 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
13700 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74 2d 3e  ompare(&pFirst->
13710 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29  term, &p1->term)
13720 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13730 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  p1->iRowid==pIte
13740 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
13750 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
13760 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  1->iRowid<pIter-
13770 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
13780 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 20 20  pIter->bRev.    
13790 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
137a0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
137b0 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20  ->nSeg; i+=2){. 
137c0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
137d0 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
137e0 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74  Seg[i];.      Ft
137f0 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20  s5SegIter *p2 = 
13800 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31  &pIter->aSeg[i+1
13810 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
13820 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13830 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74  ter->aFirst[(pIt
13840 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20  er->nSeg + i) / 
13850 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73  2];.      fts5As
13860 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
13870 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
13880 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
13890 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ..    for(i=1; i
138a0 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20  <(pIter->nSeg / 
138b0 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  2); i+=2){.     
138c0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
138d0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
138e0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
138f0 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  *2].iFirst ];.  
13900 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13910 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
13920 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
13930 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20  t[i*2+1].iFirst 
13940 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
13950 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13960 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
13970 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
13980 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
13990 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
139a0 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRes);.    }.  }
139b0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
139c0 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  e fts5AssertMult
139d0 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a  iIterSetup(x,y).
139e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
139f0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
13a00 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70  necessary to pop
13a10 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69  ulate pIter->aFi
13a20 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a  rst[iOut]..**.**
13a30 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
13a40 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
13a50 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
13a60 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65  he index of an e
13a70 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ntry.** in the p
13a80 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72  Iter->aSeg[] arr
13a90 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e  ay that is (a) n
13aa0 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28  ot at EOF, and (
13ab0 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  b) pointing.** t
13ac0 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  o a key that is 
13ad0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
13ae0 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70  nother, higher p
13af0 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67  riority, .** seg
13b00 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e  ment-iterator in
13b10 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b   the pSeg->aSeg[
13b20 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
13b30 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
13b40 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74  IterDoCompare(Ft
13b50 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
13b60 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a 20  er, int iOut){. 
13b70 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20 20   int i1;        
13b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b90 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65 66   /* Index of lef
13ba0 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49 74  t-hand Fts5SegIt
13bb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b 20  er */.  int i2; 
13bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13bd0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
13be0 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20 46   of right-hand F
13bf0 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20  ts5SegIter */.  
13c00 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73 35  int iRes;.  Fts5
13c10 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20 20  SegIter *p1;    
13c20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
13c30 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  eft-hand Fts5Seg
13c40 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53 65  Iter */.  Fts5Se
13c50 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20 20  gIter *p2;      
13c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
13c70 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ht-hand Fts5SegI
13c80 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52 65  ter */.  Fts5CRe
13c90 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13ca0 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74  ter->aFirst[iOut
13cb0 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4f  ];..  assert( iO
13cc0 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20 26  ut<pIter->nSeg &
13cd0 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61 73  & iOut>0 );.  as
13ce0 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52 65  sert( pIter->bRe
13cf0 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e 62  v==0 || pIter->b
13d00 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66 28  Rev==1 );..  if(
13d10 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e 6e   iOut>=(pIter->n
13d20 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69 31  Seg/2) ){.    i1
13d30 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65 72   = (iOut - pIter
13d40 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a 20  ->nSeg/2) * 2;. 
13d50 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b 0a     i2 = i1 + 1;.
13d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31 20    }else{.    i1 
13d70 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b  = pIter->aFirst[
13d80 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b 0a  iOut*2].iFirst;.
13d90 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d 3e      i2 = pIter->
13da0 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31 5d  aFirst[iOut*2+1]
13db0 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 70  .iFirst;.  }.  p
13dc0 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
13dd0 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70 49  [i1];.  p2 = &pI
13de0 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a 0a  ter->aSeg[i2];..
13df0 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20    pRes->bTermEq 
13e00 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e 70  = 0;.  if( p1->p
13e10 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 20  Leaf==0 ){      
13e20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69 73       /* If p1 is
13e30 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
13e40 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c 73  Res = i2;.  }els
13e50 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66 3d  e if( p2->pLeaf=
13e60 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66 20  =0 ){     /* If 
13e70 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a  p2 is at EOF */.
13e80 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20      iRes = i1;. 
13e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
13ea0 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65 72  res = fts5Buffer
13eb0 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65 72  Compare(&p1->ter
13ec0 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a 20  m, &p2->term);. 
13ed0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
13ee0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
13ef0 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61 73  2>i1 );.      as
13f00 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a 20  sert( i2!=0 );. 
13f10 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72 6d       pRes->bTerm
13f20 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66  Eq = 1;.      if
13f30 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 32  ( p1->iRowid==p2
13f40 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  ->iRowid ){.    
13f50 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20 70      p1->bDel = p
13f60 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 20  2->bDel;.       
13f70 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20 20   return i2;.    
13f80 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d 20    }.      res = 
13f90 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70  ((p1->iRowid > p
13fa0 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65  2->iRowid)==pIte
13fb0 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20  r->bRev) ? -1 : 
13fc0 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  +1;.    }.    as
13fd0 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b 0a  sert( res!=0 );.
13fe0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
13ff0 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 31  .      iRes = i1
14000 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14010 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
14020 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73 2d    }.  }..  pRes-
14030 3e 69 46 69 72 73 74 20 3d 20 69 52 65 73 3b 0a  >iFirst = iRes;.
14040 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
14050 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65  *.** Move the se
14060 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69  g-iter so that i
14070 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
14080 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
14090 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a  age iLeafPgno..*
140a0 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
140b0 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67   if leaf iLeafPg
140c0 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  no does not exis
140d0 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  t or contains no
140e0 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
140f0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
14100 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46  terGotoPage(.  F
14110 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
14120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14130 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
14140 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
14150 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
14160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14170 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
14180 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  e */.  int iLeaf
14190 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74  Pgno.){.  assert
141a0 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
141b0 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  r->iLeafPgno );.
141c0 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f  .  if( iLeafPgno
141d0 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67  >pIter->pSeg->pg
141e0 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
141f0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
14200 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
14210 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
14220 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
14230 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
14240 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20  NextLeaf = 0;.  
14250 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
14260 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31  no = iLeafPgno-1
14270 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
14280 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
14290 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
142a0 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
142b0 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61  K || pIter->iLea
142c0 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f  fPgno==iLeafPgno
142d0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   );..    if( p->
142e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
142f0 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
14300 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
14310 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
14320 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49        int n = pI
14330 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 3b 0a 0a  ter->pLeaf->n;..
14340 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73        iOff = fts
14350 35 47 65 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a  5GetU16(&a[0]);.
14360 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34        if( iOff<4
14370 20 7c 7c 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20   || iOff>=n ){. 
14380 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46         p->rc = F
14390 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
143a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
143b0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
143c0 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
143d0 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
143e0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
143f0 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
14400 73 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20  set = iOff;.    
14410 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c      fts5SegIterL
14420 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72  oadNPos(p, pIter
14430 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
14440 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
14450 76 61 6e 63 65 20 74 68 65 20 69 74 65 72 61 74  vance the iterat
14460 6f 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65  or passed as the
14470 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
14480 20 75 6e 74 69 6c 20 69 74 20 69 73 20 61 74 20   until it is at 
14490 6f 72 20 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69  or .** past rowi
144a0 64 20 69 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c  d iFrom. Regardl
144b0 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65  ess of the value
144c0 20 6f 66 20 69 46 72 6f 6d 2c 20 74 68 65 20 69   of iFrom, the i
144d0 74 65 72 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c  terator is.** al
144e0 77 61 79 73 20 61 64 76 61 6e 63 65 64 20 61 74  ways advanced at
144f0 20 6c 65 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a   least once..*/.
14500 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
14510 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28  SegIterNextFrom(
14520 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
14550 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
14560 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
14570 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
14580 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
14590 76 61 6e 63 65 20 2a 2f 0a 20 20 69 36 34 20 69  vance */.  i64 i
145a0 4d 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20  Match           
145b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
145c0 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20 61  vance iterator a
145d0 74 20 6c 65 61 73 74 20 74 68 69 73 20 66 61 72  t least this far
145e0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65   */.){.  int bRe
145f0 76 20 3d 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  v = (pIter->flag
14600 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
14610 5f 52 45 56 45 52 53 45 29 3b 0a 20 20 46 74 73  _REVERSE);.  Fts
14620 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69  5DlidxIter *pDli
14630 64 78 20 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69  dx = pIter->pDli
14640 64 78 3b 0a 20 20 69 6e 74 20 69 4c 65 61 66 50  dx;.  int iLeafP
14650 67 6e 6f 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65  gno = pIter->iLe
14660 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d  afPgno;.  int bM
14670 6f 76 65 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65  ove = 1;..  asse
14680 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
14690 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
146a0 4f 4e 45 54 45 52 4d 20 29 3b 0a 20 20 61 73 73  ONETERM );.  ass
146b0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 44 6c 69  ert( pIter->pDli
146c0 64 78 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  dx );.  assert( 
146d0 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a  pIter->pLeaf );.
146e0 0a 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 29  .  if( bRev==0 )
146f0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 21 66 74  {.    while( !ft
14700 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70  s5DlidxIterEof(p
14710 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69 4d 61  , pDlidx) && iMa
14720 74 63 68 3e 66 74 73 35 44 6c 69 64 78 49 74 65  tch>fts5DlidxIte
14730 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 20 29  rRowid(pDlidx) )
14740 7b 0a 20 20 20 20 20 20 69 4c 65 61 66 50 67 6e  {.      iLeafPgn
14750 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
14760 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
14770 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
14780 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
14790 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
147a0 65 72 74 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e  ert_nc( iLeafPgn
147b0 6f 3e 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  o>=pIter->iLeafP
147c0 67 6e 6f 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a  gno || p->rc );.
147d0 20 20 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e      if( iLeafPgn
147e0 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
147f0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  no ){.      fts5
14800 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28  SegIterGotoPage(
14810 70 2c 20 70 49 74 65 72 2c 20 69 4c 65 61 66 50  p, pIter, iLeafP
14820 67 6e 6f 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76  gno);.      bMov
14830 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 0;.    }.  }
14840 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
14850 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65  ( pIter->pNextLe
14860 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  af==0 );.    ass
14870 65 72 74 28 20 69 4d 61 74 63 68 3c 70 49 74 65  ert( iMatch<pIte
14880 72 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20  r->iRowid );.   
14890 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69   while( !fts5Dli
148a0 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
148b0 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3c 66  idx) && iMatch<f
148c0 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
148d0 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20  d(pDlidx) ){.   
148e0 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
148f0 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 3b  Prev(p, pDlidx);
14900 0a 20 20 20 20 7d 0a 20 20 20 20 69 4c 65 61 66  .    }.    iLeaf
14910 50 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78  Pgno = fts5Dlidx
14920 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
14930 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  ;..    assert( f
14940 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28  ts5DlidxIterEof(
14950 70 2c 20 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c  p, pDlidx) || iL
14960 65 61 66 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e  eafPgno<=pIter->
14970 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20  iLeafPgno );..  
14980 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c    if( iLeafPgno<
14990 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
149a0 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d   ){.      pIter-
149b0 3e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65  >iLeafPgno = iLe
149c0 61 66 50 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20  afPgno+1;.      
149d0 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
149e0 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49 74  seNewPage(p, pIt
149f0 65 72 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65  er);.      bMove
14a00 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
14a10 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
14a20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14a30 20 20 69 66 28 20 62 4d 6f 76 65 20 29 20 66 74    if( bMove ) ft
14a40 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
14a50 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20 20   pIter, 0);.    
14a60 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  if( pIter->pLeaf
14a70 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14a80 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26 20   if( bRev==0 && 
14a90 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d 69  pIter->iRowid>=i
14aa0 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20  Match ) break;. 
14ab0 20 20 20 69 66 28 20 62 52 65 76 21 3d 30 20 26     if( bRev!=0 &
14ac0 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3c  & pIter->iRowid<
14ad0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
14ae0 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b 0a  .    bMove = 1;.
14af0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72    }.}.../*.** Fr
14b00 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ee the iterator 
14b10 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
14b20 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14b30 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
14b40 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
14b50 65 72 46 72 65 65 28 46 74 73 35 49 6e 64 65 78  erFree(Fts5Index
14b60 20 2a 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74   *p, Fts5IndexIt
14b70 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66  er *pIter){.  if
14b80 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69  ( pIter ){.    i
14b90 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
14ba0 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
14bb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74  ; i++){.      ft
14bc0 73 35 53 65 67 49 74 65 72 43 6c 65 61 72 28 26  s5SegIterClear(&
14bd0 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b  pIter->aSeg[i]);
14be0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
14bf0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
14c00 70 49 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b  pIter->pStruct);
14c10 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
14c20 72 65 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ree(&pIter->posl
14c30 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ist);.    sqlite
14c40 33 5f 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20  3_free(pIter);. 
14c50 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
14c60 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41  d fts5MultiIterA
14c70 64 76 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49  dvanced(.  Fts5I
14c80 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
14c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
14ca0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
14cb0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
14cc0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
14cd0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
14ce0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
14cf0 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
14d00 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
14d10 69 6e 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20  int iChanged,   
14d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d30 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
14d40 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
14d50 76 61 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20  vanced */.  int 
14d60 69 4d 69 6e 73 65 74 20 20 20 20 20 20 20 20 20  iMinset         
14d70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
14d80 69 6e 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20  inimum entry in 
14d90 61 46 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20  aFirst[] to set 
14da0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
14db0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
14dc0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
14dd0 20 69 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70   i>=iMinset && p
14de0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  ->rc==SQLITE_OK;
14df0 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74   i=i/2){.    int
14e00 20 69 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69   iEq;.    if( (i
14e10 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74  Eq = fts5MultiIt
14e20 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65  erDoCompare(pIte
14e30 72 2c 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20  r, i)) ){.      
14e40 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
14e50 70 2c 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b  p, &pIter->aSeg[
14e60 69 45 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  iEq], 0);.      
14e70 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20  i = pIter->nSeg 
14e80 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d  + iEq;.    }.  }
14e90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74  .}../*.** Sub-it
14ea0 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20  erator iChanged 
14eb0 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49 74 65  of iterator pIte
14ec0 72 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  r has just been 
14ed0 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69  advanced. It sti
14ee0 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ll.** points to 
14ef0 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68  the same term th
14f00 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69  ough - just a di
14f10 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54  fferent rowid. T
14f20 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
14f30 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61  attempts to upda
14f40 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  te the contents 
14f50 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46  of the pIter->aF
14f60 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67  irst[] according
14f70 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65  ly..** If it doe
14f80 73 20 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c  s so successfull
14f90 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e 65 64  y, 0 is returned
14fa0 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a  . Otherwise 1..*
14fb0 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f  *.** If non-zero
14fc0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
14fd0 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20  e caller should 
14fe0 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74  call fts5MultiIt
14ff0 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20  erAdvanced().** 
15000 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  on the iterator 
15010 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20 66 75  instead. That fu
15020 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
15030 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65  same as this one
15040 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74  , except.** that
15050 20 69 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d   it deals with m
15060 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20  ore complicated 
15070 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  cases as well..*
15080 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  / .static int ft
15090 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e  s5MultiIterAdvan
150a0 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49  ceRowid(.  Fts5I
150b0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
150c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
150d0 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
150e0 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
150f0 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
15100 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
15110 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
15120 20 75 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d   update aFirst[]
15130 20 61 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20   array for */.  
15140 69 6e 74 20 69 43 68 61 6e 67 65 64 20 20 20 20  int iChanged    
15150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15160 2f 2a 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d  /* Index of sub-
15170 69 74 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64  iterator just ad
15180 76 61 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 46  vanced */.){.  F
15190 74 73 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77  ts5SegIter *pNew
151a0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
151b0 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66  iChanged];..  if
151c0 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
151d0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
151e0 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d  wid.   || (pNew-
151f0 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69  >iRowid<pIter->i
15200 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49  SwitchRowid)==pI
15210 74 65 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20  ter->bRev.  ){. 
15220 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74     int i;.    Ft
15230 73 35 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65  s5SegIter *pOthe
15240 72 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  r = &pIter->aSeg
15250 5b 69 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30  [iChanged ^ 0x00
15260 30 31 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  01];.    pIter->
15270 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15280 49 74 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41  Iter->bRev ? SMA
15290 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41  LLEST_INT64 : LA
152a0 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20  RGEST_INT64;.   
152b0 20 66 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e   for(i=(pIter->n
152c0 53 65 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b  Seg+iChanged)/2;
152d0 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20   1; i=i/2){.    
152e0 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70    Fts5CResult *p
152f0 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46  Res = &pIter->aF
15300 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20  irst[i];..      
15310 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c  assert( pNew->pL
15320 65 61 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eaf );.      ass
15330 65 72 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d  ert( pRes->bTerm
15340 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d  Eq==0 || pOther-
15350 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20  >pLeaf );..     
15360 20 69 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d   if( pRes->bTerm
15370 45 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Eq ){.        if
15380 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d  ( pNew->iRowid==
15390 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29  pOther->iRowid )
153a0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
153b0 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  rn 1;.        }e
153c0 6c 73 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d  lse if( (pOther-
153d0 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52  >iRowid>pNew->iR
153e0 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
153f0 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
15400 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
15410 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
15420 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20  owid;.          
15430 70 4e 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20  pNew = pOther;. 
15440 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
15450 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64   (pOther->iRowid
15460 3e 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52  >pIter->iSwitchR
15470 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
15480 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
15490 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
154a0 77 69 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52  wid = pOther->iR
154b0 6f 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a  owid;.        }.
154c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52        }.      pR
154d0 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 28 70 4e  es->iFirst = (pN
154e0 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67  ew - pIter->aSeg
154f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d  );.      if( i==
15500 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  1 ) break;..    
15510 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65    pOther = &pIte
15520 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
15530 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30  aFirst[i ^ 0x000
15540 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20  1].iFirst ];.   
15550 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
15560 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
15570 20 74 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66   the pIter->bEof
15580 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 64 20   variable based 
15590 6f 6e 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  on the state of 
155a0 74 68 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72  the sub-iterator
155b0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
155c0 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53  d fts5MultiIterS
155d0 65 74 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49  etEof(Fts5IndexI
155e0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
155f0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
15600 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15610 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15620 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49  ].iFirst ];.  pI
15630 74 65 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65 67  ter->bEof = pSeg
15640 2d 3e 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49  ->pLeaf==0;.  pI
15650 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15660 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64  d = pSeg->iRowid
15670 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
15680 74 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20  the iterator to 
15690 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20  the next entry. 
156a0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
156b0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
156c0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
156d0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
156e0 2e 20 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  . It is not .** 
156f0 63 6f 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72  considered an er
15700 72 6f 72 20 69 66 20 74 68 65 20 69 74 65 72 61  ror if the itera
15710 74 6f 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c  tor reaches EOF,
15720 20 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c 72   or if it is alr
15730 65 61 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20  eady at .** EOF 
15740 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
15750 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
15760 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15770 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a  5MultiIterNext(.
15780 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
15790 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
157a0 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62   *pIter,.  int b
157b0 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
157c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
157d0 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  ue if argument i
157e0 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f  From is valid */
157f0 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20  .  i64 iFrom    
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15810 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74     /* Advance at
15820 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73   least as far as
15830 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66   this */.){.  if
15840 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15850 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55  OK ){.    int bU
15860 73 65 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a  seFrom = bFrom;.
15870 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69      do {.      i
15880 6e 74 20 69 46 69 72 73 74 20 3d 20 70 49 74 65  nt iFirst = pIte
15890 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
158a0 72 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  rst;.      int b
158b0 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20  NewTerm = 0;.   
158c0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
158d0 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61  pSeg = &pIter->a
158e0 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20  Seg[iFirst];.   
158f0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63     assert( p->rc
15900 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
15910 20 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f       if( bUseFro
15920 6d 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64  m && pSeg->pDlid
15930 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  x ){.        fts
15940 35 53 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d  5SegIterNextFrom
15950 28 70 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29  (p, pSeg, iFrom)
15960 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
15970 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
15980 65 72 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20  erNext(p, pSeg, 
15990 26 62 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20  &bNewTerm);.    
159a0 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
159b0 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c  Seg->pLeaf==0 ||
159c0 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20   bNewTerm .     
159d0 20 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74    || fts5MultiIt
159e0 65 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70  erAdvanceRowid(p
159f0 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73 74 29  , pIter, iFirst)
15a00 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
15a10 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41    fts5MultiIterA
15a20 64 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72  dvanced(p, pIter
15a30 2c 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20  , iFirst, 1);.  
15a40 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
15a50 74 65 72 53 65 74 45 6f 66 28 70 49 74 65 72 29  terSetEof(pIter)
15a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15a70 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49  fts5AssertMultiI
15a80 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74 65  terSetup(p, pIte
15a90 72 29 3b 0a 0a 20 20 20 20 20 20 62 55 73 65 46  r);..      bUseF
15aa0 72 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  rom = 0;.    }wh
15ab0 69 6c 65 28 20 70 49 74 65 72 2d 3e 62 53 6b 69  ile( pIter->bSki
15ac0 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
15ad0 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
15ae0 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a  , pIter) );.  }.
15af0 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 6e  }..static Fts5In
15b00 64 65 78 49 74 65 72 20 2a 66 74 73 35 4d 75 6c  dexIter *fts5Mul
15b10 74 69 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46  tiIterAlloc(.  F
15b20 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15b40 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
15b50 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
15b60 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29   */.  int nSeg.)
15b70 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  {.  Fts5IndexIte
15b80 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
15b90 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Slot;           
15ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
15bb0 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53  wer of two >= nS
15bc0 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c  eg */..  for(nSl
15bd0 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67  ot=2; nSlot<nSeg
15be0 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29  ; nSlot=nSlot*2)
15bf0 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49  ;.  pNew = fts5I
15c00 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20  dxMalloc(p, .   
15c10 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e     sizeof(Fts5In
15c20 64 65 78 49 74 65 72 29 20 2b 20 20 20 20 20 20  dexIter) +      
15c30 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a         /* pNew *
15c40 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
15c50 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e  ts5SegIter) * (n
15c60 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70  Slot-1) +   /* p
15c70 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20  New->aSeg[] */. 
15c80 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
15c90 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74  CResult) * nSlot
15ca0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
15cb0 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20  ->aFirst[] */.  
15cc0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
15cd0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20  .    pNew->nSeg 
15ce0 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65  = nSlot;.    pNe
15cf0 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73  w->aFirst = (Fts
15d00 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d  5CResult*)&pNew-
15d10 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20  >aSeg[nSlot];.  
15d20 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d    pNew->pIndex =
15d30 20 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   p;.  }.  return
15d40 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
15d50 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46  Allocate a new F
15d60 74 73 35 49 6e 64 65 78 49 74 65 72 20 6f 62 6a  ts5IndexIter obj
15d70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ect..**.** The n
15d80 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62  ew object will b
15d90 65 20 75 73 65 64 20 74 6f 20 69 74 65 72 61 74  e used to iterat
15da0 65 20 74 68 72 6f 75 67 68 20 64 61 74 61 20 69  e through data i
15db0 6e 20 73 74 72 75 63 74 75 72 65 20 70 53 74 72  n structure pStr
15dc0 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65  uct..** If iLeve
15dd0 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61  l is -ve, then a
15de0 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73  ll data in all s
15df0 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65  egments is merge
15e00 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c  d. Or, if iLevel
15e10 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67  .** is zero or g
15e20 72 65 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f  reater, data fro
15e30 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53 65 67  m the first nSeg
15e40 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e  ment segments on
15e50 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a   level iLevel.**
15e60 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a   is merged..**.*
15e70 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  * The iterator i
15e80 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20  nitially points 
15e90 74 6f 20 74 68 65 20 66 69 72 73 74 20 74 65 72  to the first ter
15ea0 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e  m/rowid entry in
15eb0 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65   the .** iterate
15ec0 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  d data..*/.stati
15ed0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15ee0 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49  IterNew(.  Fts5I
15ef0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
15f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
15f10 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74  S5 backend to it
15f20 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a  erate within */.
15f30 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
15f40 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  *pStruct,       
15f50 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f    /* Structure o
15f60 66 20 73 70 65 63 69 66 69 63 20 69 6e 64 65 78  f specific index
15f70 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45   */.  int bSkipE
15f80 6d 70 74 79 2c 20 20 20 20 20 20 20 20 20 20 20  mpty,           
15f90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
15fa0 20 69 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b   ignore delete-k
15fb0 65 79 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  eys */.  int fla
15fc0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
15fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
15fe0 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20  INDEX_QUERY_XXX 
15ff0 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  flags */.  const
16000 20 75 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20   u8 *pTerm, int 
16010 6e 54 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65  nTerm,     /* Te
16020 72 6d 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f  rm to seek to (o
16030 72 20 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69  r NULL/0) */.  i
16040 6e 74 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20  nt iLevel,      
16050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16060 2a 20 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61  * Level to itera
16070 74 65 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20  te (-1 for all) 
16080 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e  */.  int nSegmen
16090 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
160a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
160b0 66 20 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65  f segments to me
160c0 72 67 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20  rge (iLevel>=0) 
160d0 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  */.  Fts5IndexIt
160e0 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  er **ppOut      
160f0 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65       /* New obje
16100 63 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ct */.){.  int n
16110 53 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Seg = 0;        
16120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
16130 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d  mber of segment-
16140 69 74 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a  iters in use */.
16150 20 20 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b    int iIter = 0;
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53    /* */.  int iS
16180 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
16190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
161a0 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
161b0 6f 75 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f  ough segments */
161c0 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75  .  Fts5Buffer bu
161d0 66 20 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20  f = {0,0,0};    
161e0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65     /* Buffer use
161f0 64 20 62 79 20 66 74 73 35 53 65 67 49 74 65 72  d by fts5SegIter
16200 53 65 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20 20  SeekInit() */.  
16210 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
16220 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35  el *pLvl;.  Fts5
16230 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b  IndexIter *pNew;
16240 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 54 65  ..  assert( (pTe
16250 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d  rm==0 && nTerm==
16260 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29  0) || iLevel<0 )
16270 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
16280 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e   space for the n
16290 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65  ew multi-seg-ite
162a0 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20  rator. */.  if( 
162b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
162c0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76   ){.    if( iLev
162d0 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73  el<0 ){.      as
162e0 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
162f0 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72  Segment==fts5Str
16300 75 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65  uctureCountSegme
16310 6e 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a  nts(pStruct) );.
16320 20 20 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74        nSeg = pSt
16330 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a  ruct->nSegment;.
16340 20 20 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70        nSeg += (p
16350 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29  ->pHash ? 1 : 0)
16360 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16370 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53     nSeg = MIN(pS
16380 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
16390 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67  evel].nSeg, nSeg
163a0 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ment);.    }.  }
163b0 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77  .  *ppOut = pNew
163c0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
163d0 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a  Alloc(p, nSeg);.
163e0 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
163f0 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e  return;.  pNew->
16400 62 52 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67  bRev = (0!=(flag
16410 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
16420 45 52 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e  ERY_DESC));.  pN
16430 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d  ew->bSkipEmpty =
16440 20 62 53 6b 69 70 45 6d 70 74 79 3b 0a 20 20 70   bSkipEmpty;.  p
16450 4e 65 77 2d 3e 70 53 74 72 75 63 74 20 3d 20 70  New->pStruct = p
16460 53 74 72 75 63 74 3b 0a 20 20 66 74 73 35 53 74  Struct;.  fts5St
16470 72 75 63 74 75 72 65 52 65 66 28 70 53 74 72 75  ructureRef(pStru
16480 63 74 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  ct);..  /* Initi
16490 61 6c 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68  alize each of th
164a0 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d  e component segm
164b0 65 6e 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a  ent iterators. *
164c0 2f 0a 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30  /.  if( iLevel<0
164d0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
164e0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64  ctureLevel *pEnd
164f0 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
16500 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65  vel[pStruct->nLe
16510 76 65 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d  vel];.    if( p-
16520 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  >pHash ){.      
16530 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74  /* Add a segment
16540 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68   iterator for th
16550 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
16560 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74  ts of the hash t
16570 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  able. */.      F
16580 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
16590 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
165a0 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20  iIter++];.      
165b0 66 74 73 35 53 65 67 49 74 65 72 48 61 73 68 49  fts5SegIterHashI
165c0 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54  nit(p, pTerm, nT
165d0 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65  erm, flags, pIte
165e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  r);.    }.    fo
165f0 72 28 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d  r(pLvl=&pStruct-
16600 3e 61 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c  >aLevel[0]; pLvl
16610 3c 70 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a  <pEnd; pLvl++){.
16620 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70        for(iSeg=p
16630 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65  Lvl->nSeg-1; iSe
16640 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
16650 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63         Fts5Struc
16660 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
16670 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  g = &pLvl->aSeg[
16680 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46  iSeg];.        F
16690 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
166a0 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
166b0 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20  iIter++];.      
166c0 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
166d0 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  {.          fts5
166e0 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70  SegIterInit(p, p
166f0 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  Seg, pIter);.   
16700 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16710 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
16720 72 53 65 65 6b 49 6e 69 74 28 70 2c 20 26 62 75  rSeekInit(p, &bu
16730 66 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  f, pTerm, nTerm,
16740 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49   flags, pSeg, pI
16750 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ter);.        }.
16760 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16770 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20  }else{.    pLvl 
16780 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
16790 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  el[iLevel];.    
167a0 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b  for(iSeg=nSeg-1;
167b0 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d   iSeg>=0; iSeg--
167c0 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
167d0 49 74 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76  IterInit(p, &pLv
167e0 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26  l->aSeg[iSeg], &
167f0 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72  pNew->aSeg[iIter
16800 2b 2b 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ++]);.    }.  }.
16810 20 20 61 73 73 65 72 74 28 20 69 49 74 65 72 3d    assert( iIter=
16820 3d 6e 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20 49  =nSeg );..  /* I
16830 66 20 74 68 65 20 61 62 6f 76 65 20 77 61 73 20  f the above was 
16840 73 75 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68  successful, each
16850 20 63 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61   component itera
16860 74 6f 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20  tors now points 
16870 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  .  ** to the fir
16880 73 74 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20  st entry in its 
16890 73 65 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73  segment. In this
168a0 20 63 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65   case initialize
168b0 20 74 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73   the .  ** aFirs
168c0 74 5b 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69  t[] array. Or, i
168d0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  f an error has o
168e0 63 63 75 72 72 65 64 2c 20 66 72 65 65 20 74 68  ccurred, free th
168f0 65 20 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20  e iterator.  ** 
16900 6f 62 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74  object and set t
16910 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
16920 6c 65 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a  le to NULL.  */.
16930 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16940 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f  ITE_OK ){.    fo
16950 72 28 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53  r(iIter=pNew->nS
16960 65 67 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69  eg-1; iIter>0; i
16970 49 74 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69  Iter--){.      i
16980 6e 74 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66  nt iEq;.      if
16990 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
169a0 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
169b0 70 4e 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b  pNew, iIter)) ){
169c0 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67  .        fts5Seg
169d0 49 74 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65  IterNext(p, &pNe
169e0 77 2d 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30 29  w->aSeg[iEq], 0)
169f0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
16a00 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64 28  ltiIterAdvanced(
16a10 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49  p, pNew, iEq, iI
16a20 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
16a30 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74    }.    fts5Mult
16a40 69 49 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77  iIterSetEof(pNew
16a50 29 3b 0a 20 20 20 20 66 74 73 35 41 73 73 65 72  );.    fts5Asser
16a60 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
16a70 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69  p, pNew);..    i
16a80 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d  f( pNew->bSkipEm
16a90 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69  pty && fts5Multi
16aa0 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70  IterIsEmpty(p, p
16ab0 4e 65 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74  New) ){.      ft
16ac0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
16ad0 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a  p, pNew, 0, 0);.
16ae0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
16af0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
16b00 46 72 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20  Free(p, pNew);. 
16b10 20 20 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20     *ppOut = 0;. 
16b20 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
16b30 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a  ree(&buf);.}../*
16b40 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74  .** Create an Ft
16b50 73 35 49 6e 64 65 78 49 74 65 72 20 74 68 61 74  s5IndexIter that
16b60 20 69 74 65 72 61 74 65 73 20 74 68 72 6f 75 67   iterates throug
16b70 68 20 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72  h the doclist pr
16b80 6f 76 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65  ovided.** as the
16b90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
16ba0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16bb0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
16bc0 77 32 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  w2(.  Fts5Index 
16bd0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
16be0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
16bf0 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65  ckend to iterate
16c00 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73   within */.  Fts
16c10 35 44 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20  5Data *pData,   
16c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16c30 44 6f 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61  Doclist to itera
16c40 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20  te through */.  
16c50 69 6e 74 20 62 44 65 73 63 2c 20 20 20 20 20 20  int bDesc,      
16c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c70 2f 2a 20 54 72 75 65 20 66 6f 72 20 64 65 73 63  /* True for desc
16c80 65 6e 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64  ending rowid ord
16c90 65 72 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65  er */.  Fts5Inde
16ca0 78 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20  xIter **ppOut   
16cb0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f          /* New o
16cc0 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74  bject */.){.  Ft
16cd0 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65  s5IndexIter *pNe
16ce0 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35  w;.  pNew = fts5
16cf0 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70  MultiIterAlloc(p
16d00 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  , 2);.  if( pNew
16d10 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
16d20 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e  ter *pIter = &pN
16d30 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20  ew->aSeg[1];..  
16d40 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d    pIter->flags =
16d50 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e   FTS5_SEGITER_ON
16d60 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70  ETERM;.    if( p
16d70 44 61 74 61 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20  Data->n>0 ){.   
16d80 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20     pIter->pLeaf 
16d90 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = pData;.      p
16da0 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
16db0 74 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e  t = fts5GetVarin
16dc0 74 28 70 44 61 74 61 2d 3e 70 2c 20 28 75 36 34  t(pData->p, (u64
16dd0 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
16de0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61  );.      pNew->a
16df0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
16e00 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62  = 1;.      if( b
16e10 44 65 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Desc ){.        
16e20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a  pNew->bRev = 1;.
16e30 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66          pIter->f
16e40 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47  lags |= FTS5_SEG
16e50 49 54 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20  ITER_REVERSE;.  
16e60 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
16e70 72 52 65 76 65 72 73 65 49 6e 69 74 50 61 67 65  rReverseInitPage
16e80 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
16e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
16ea0 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
16eb0 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
16ec0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44        }.      pD
16ed0 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ata = 0;.    }el
16ee0 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
16ef0 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bEof = 1;.    }.
16f00 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 70 4e  .    *ppOut = pN
16f10 65 77 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  ew;.  }..  fts5D
16f20 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
16f30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
16f40 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69  rn true if the i
16f50 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45 4f  terator is at EO
16f60 46 20 6f 72 20 69 66 20 61 6e 20 65 72 72 6f 72  F or if an error
16f70 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
16f80 2a 2a 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  ** False otherwi
16f90 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
16fa0 74 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45  t fts5MultiIterE
16fb0 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  of(Fts5Index *p,
16fc0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
16fd0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
16fe0 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c  ( p->rc .      |
16ff0 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  | (pIter->aSeg[ 
17000 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
17010 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d  .iFirst ].pLeaf=
17020 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 45 6f 66  =0)==pIter->bEof
17030 20 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20   .  );.  return 
17040 28 70 2d 3e 72 63 20 7c 7c 20 70 49 74 65 72 2d  (p->rc || pIter-
17050 3e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >bEof);.}../*.**
17060 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
17070 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
17080 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
17090 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
170a0 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
170b0 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
170c0 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
170d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
170e0 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
170f0 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
17100 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
17110 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
17120 69 64 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  id(Fts5IndexIter
17130 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65   *pIter){.  asse
17140 72 74 28 20 70 49 74 65 72 2d 3e 61 53 65 67 5b  rt( pIter->aSeg[
17150 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
17160 5d 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66  ].iFirst ].pLeaf
17170 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 49 74   );.  return pIt
17180 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
17190 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
171a0 74 20 5d 2e 69 52 6f 77 69 64 3b 0a 7d 0a 0a 2f  t ].iRowid;.}../
171b0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69 74  *.** Move the it
171c0 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e 65  erator to the ne
171d0 78 74 20 65 6e 74 72 79 20 61 74 20 6f 72 20 66  xt entry at or f
171e0 6f 6c 6c 6f 77 69 6e 67 20 69 4d 61 74 63 68 2e  ollowing iMatch.
171f0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17200 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
17210 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e 64  tFrom(.  Fts5Ind
17220 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 6e  ex *p, .  Fts5In
17230 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
17240 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b  .  i64 iMatch.){
17250 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
17260 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
17270 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
17280 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31  Next(p, pIter, 1
17290 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69  , iMatch);.    i
172a0 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
172b0 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20  Eof(p, pIter) ) 
172c0 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69  break;.    iRowi
172d0 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
172e0 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
172f0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
17300 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e  ev==0 && iRowid>
17310 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
17320 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
17330 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69  bRev!=0 && iRowi
17340 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
17350 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
17360 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
17370 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
17380 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
17390 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
173a0 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74   the .** entry t
173b0 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
173c0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
173d0 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
173e0 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75  const u8 *fts5Mu
173f0 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35  ltiIterTerm(Fts5
17400 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
17410 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46 74  , int *pn){.  Ft
17420 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20 26  s5SegIter *p = &
17430 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74  pIter->aSeg[ pIt
17440 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  er->aFirst[1].iF
17450 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d 20  irst ];.  *pn = 
17460 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65 74  p->term.n;.  ret
17470 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a 7d  urn p->term.p;.}
17480 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
17490 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 0a  s5ChunkIterate(.
174a0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a 65 63    /* Index objec
174d0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  t */.  Fts5SegIt
174e0 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20 20 20  er *pSeg,       
174f0 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c 69 73         /* Poslis
17500 74 20 6f 66 20 74 68 69 73 20 69 74 65 72 61 74  t of this iterat
17510 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43  or */.  void *pC
17520 74 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  tx,             
17530 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
17540 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72 20 78  xt pointer for x
17550 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  Chunk callback *
17560 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68 75 6e  /.  void (*xChun
17570 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 76  k)(Fts5Index*, v
17580 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38 2a 2c  oid*, const u8*,
17590 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74 20 6e   int).){.  int n
175a0 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50 6f 73  Rem = pSeg->nPos
175b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
175c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 73 74  mber of bytes st
175d0 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f 0a 20  ill to come */. 
175e0 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74 61   Fts5Data *pData
175f0 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43 68 75   = 0;.  u8 *pChu
17600 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61  nk = &pSeg->pLea
17610 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66  f->p[pSeg->iLeaf
17620 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74 20 6e  Offset];.  int n
17630 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
17640 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 6e  , pSeg->pLeaf->n
17650 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   - pSeg->iLeafOf
17660 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e  fset);.  int pgn
17670 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50  o = pSeg->iLeafP
17680 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53  gno;.  int pgnoS
17690 61 76 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ave = 0;..  if( 
176a0 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46  (pSeg->flags & F
176b0 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
176c0 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  RSE)==0 ){.    p
176d0 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31  gnoSave = pgno+1
176e0 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
176f0 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28  1 ){.    xChunk(
17700 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c  p, pCtx, pChunk,
17710 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52   nChunk);.    nR
17720 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20  em -= nChunk;.  
17730 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
17740 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66  e(pData);.    if
17750 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20  ( nRem<=0 ){.   
17760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
17770 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b  lse{.      pgno+
17780 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  +;.      pData =
17790 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
177a0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
177b0 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e  WID(pSeg->pSeg->
177c0 69 53 65 67 69 64 2c 20 30 2c 20 70 67 6e 6f 29  iSegid, 0, pgno)
177d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61  );.      if( pDa
177e0 74 61 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ta==0 ) break;. 
177f0 20 20 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70       pChunk = &p
17800 44 61 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20  Data->p[4];.    
17810 20 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e    nChunk = MIN(n
17820 52 65 6d 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20  Rem, pData->n - 
17830 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  4);.      if( pg
17840 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a  no==pgnoSave ){.
17850 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17860 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  pSeg->pNextLeaf=
17870 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 53  =0 );.        pS
17880 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20  eg->pNextLeaf = 
17890 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 70  pData;.        p
178a0 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  Data = 0;.      
178b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a  }.    }.  }.}...
178c0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
178d0 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
178e0 20 66 6f 72 20 74 68 65 20 73 74 72 75 63 74 75   for the structu
178f0 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 65 20  re pStruct. The 
17900 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a 20 69  new segment.** i
17910 64 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  d must be betwee
17920 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20 69 6e  n 1 and 65335 in
17930 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d 75 73  clusive, and mus
17940 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20 62 79  t not be used by
17950 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65 6e 74   .** any current
17960 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65 67 6d  ly existing segm
17970 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65 20 73  ent. If a free s
17980 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e 6f 74  egment id cannot
17990 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51   be found,.** SQ
179a0 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72 65 74  LITE_FULL is ret
179b0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
179c0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72  an error has alr
179d0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
179e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
179f0 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20 0a 2a  a no-op. 0 is .*
17a00 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20 74 68  * returned in th
17a10 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
17a20 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c 6f 63  ic int fts5Alloc
17a30 61 74 65 53 65 67 69 64 28 46 74 73 35 49 6e 64  ateSegid(Fts5Ind
17a40 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63  ex *p, Fts5Struc
17a50 74 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a  ture *pStruct){.
17a60 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d 20 30    int iSegid = 0
17a70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
17a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17a90 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e 6e 53   if( pStruct->nS
17aa0 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d 41 58  egment>=FTS5_MAX
17ab0 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20 20 20  _SEGMENT ){.    
17ac0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
17ad0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c 73 65  _FULL;.    }else
17ae0 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69  {.      while( i
17af0 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Segid==0 ){.    
17b00 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
17b10 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  eg;.        sqli
17b20 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
17b30 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76 6f 69  izeof(u32), (voi
17b40 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20 20 20  d*)&iSegid);.   
17b50 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 69 53       iSegid = iS
17b60 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20 46 54  egid & ((1 << FT
17b70 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d 31 29  S5_DATA_ID_B)-1)
17b80 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 4c  ;.        for(iL
17b90 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
17ba0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
17bb0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  ++){.          f
17bc0 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c  or(iSeg=0; iSeg<
17bd0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
17be0 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67  iLvl].nSeg; iSeg
17bf0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
17c00 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70 53 74   if( iSegid==pSt
17c10 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
17c20 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
17c30 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  egid ){.        
17c40 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20 30        iSegid = 0
17c50 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
17c60 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
17c80 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
17c90 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a  n iSegid;.}../*.
17ca0 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64  ** Discard all d
17cb0 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ata currently ca
17cc0 63 68 65 64 20 69 6e 20 74 68 65 20 68 61 73 68  ched in the hash
17cd0 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  -tables..*/.stat
17ce0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
17cf0 78 44 69 73 63 61 72 64 44 61 74 61 28 46 74 73  xDiscardData(Fts
17d00 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73  5Index *p){.  as
17d10 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c  sert( p->pHash |
17d20 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  | p->nPendingDat
17d30 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  a==0 );.  if( p-
17d40 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71  >pHash ){.    sq
17d50 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65  lite3Fts5HashCle
17d60 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20  ar(p->pHash);.  
17d70 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74    p->nPendingDat
17d80 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  a = 0;.  }.}../*
17d90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
17da0 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65 66 69  ize of the prefi
17db0 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61  x, in bytes, tha
17dc0 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77 2f 70  t buffer (nNew/p
17dd0 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a 20 77  New) shares.** w
17de0 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f 6c 64  ith buffer (nOld
17df0 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  /pOld)..*/.stati
17e00 63 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78  c int fts5Prefix
17e10 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e 74 20  Compress(.  int 
17e20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38 20 2a  nOld, const u8 *
17e30 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e 65 77  pOld,.  int nNew
17e40 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
17e50 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  .){.  int i;.  a
17e60 73 73 65 72 74 28 20 66 74 73 35 42 6c 6f 62 43  ssert( fts5BlobC
17e70 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20 6e 4f 6c  ompare(pOld, nOl
17e80 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 29 3c 30  d, pNew, nNew)<0
17e90 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   );.  for(i=0; i
17ea0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
17eb0 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d 70 4e   if( pOld[i]!=pN
17ec0 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b 0a 20  ew[i] ) break;. 
17ed0 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d   }.  return i;.}
17ee0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
17ef0 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c 65 61  s5WriteDlidxClea
17f00 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  r(.  Fts5Index *
17f10 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57 72 69  p, .  Fts5SegWri
17f20 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
17f30 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20 20 20  int bFlush      
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72 69 74  /* If true, writ
17f60 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73 6b 20  e dlidx to disk 
17f70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
17f80 20 61 73 73 65 72 74 28 20 62 46 6c 75 73 68 3d   assert( bFlush=
17f90 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e  =0 || (pWriter->
17fa0 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69  nDlidx>0 && pWri
17fb0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
17fc0 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66 6f 72  uf.n>0) );.  for
17fd0 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65 72 2d  (i=0; i<pWriter-
17fe0 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b 0a 20  >nDlidx; i++){. 
17ff0 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
18000 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57  er *pDlidx = &pW
18010 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d  riter->aDlidx[i]
18020 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ;.    if( pDlidx
18030 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62 72 65  ->buf.n==0 ) bre
18040 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46 6c 75  ak;.    if( bFlu
18050 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
18060 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f  rt( pDlidx->pgno
18070 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 74 73  !=0 );.      fts
18080 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 0a 20  5DataWrite(p, . 
18090 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c           FTS5_DL
180a0 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69 74 65  IDX_ROWID(pWrite
180b0 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20 70 44  r->iSegid, i, pD
180c0 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20 20 20  lidx->pgno),.   
180d0 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62         pDlidx->b
180e0 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e 62 75  uf.p, pDlidx->bu
180f0 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  f.n.      );.   
18100 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
18110 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44  s5BufferZero(&pD
18120 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20  lidx->buf);.    
18130 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c  pDlidx->bPrevVal
18140 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  id = 0;.  }.}../
18150 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20 70 57  *.** Grow the pW
18160 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d 20  riter->aDlidx[] 
18170 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65 61 73  array to at leas
18180 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74 73 20  t nLvl elements 
18190 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e 79 20  in size..** Any 
181a0 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d 65 6e  new array elemen
181b0 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20 62 65  ts are zeroed be
181c0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
181d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
181e0 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
181f0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
18200 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  ,.  Fts5SegWrite
18210 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e  r *pWriter,.  in
18220 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66 28 20  t nLvl.){.  if( 
18230 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
18240 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69 74 65   && nLvl>=pWrite
18250 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20 20 20  r->nDlidx ){.   
18260 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
18270 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74 73 35   *aDlidx = (Fts5
18280 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73 71 6c  DlidxWriter*)sql
18290 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20 20  ite3_realloc(.  
182a0 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e 61        pWriter->a
182b0 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28 46 74  Dlidx, sizeof(Ft
182c0 73 35 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a  s5DlidxWriter) *
182d0 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20 20 20   nLvl.    );.   
182e0 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30 20 29   if( aDlidx==0 )
182f0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20  {.      p->rc = 
18300 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
18320 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
18330 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f(Fts5DlidxWrite
18340 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70 57 72  r) * (nLvl - pWr
18350 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b 0a 20  iter->nDlidx);. 
18360 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61 44 6c       memset(&aDl
18370 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e 44 6c  idx[pWriter->nDl
18380 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65 29 3b  idx], 0, nByte);
18390 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
183a0 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64 78 3b  aDlidx = aDlidx;
183b0 0a 20 20 20 20 20 20 70 57 72 69 74 65 72 2d 3e  .      pWriter->
183c0 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b 0a 20  nDlidx = nLvl;. 
183d0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
183e0 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  n p->rc;.}../*.*
183f0 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
18400 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 61   doclist-index a
18410 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e 20 70  ccumulating in p
18420 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 5d  Writer->aDlidx[]
18430 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65 6e 6f   is large.** eno
18440 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20 74 6f  ugh, flush it to
18450 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75 72 6e   disk and return
18460 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20 64 69   1. Otherwise di
18470 73 63 61 72 64 20 69 74 20 61 6e 64 20 72 65 74  scard it and ret
18480 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2f 0a  urn.** zero..*/.
18490 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 57  static int fts5W
184a0 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 46  riteFlushDlidx(F
184b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
184c0 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
184d0 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c 61  ter){.  int bFla
184e0 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20  g = 0;..  /* If 
184f0 74 68 65 72 65 20 77 65 72 65 20 46 54 53 35 5f  there were FTS5_
18500 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 6f  MIN_DLIDX_SIZE o
18510 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c 65 61  r more empty lea
18520 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  f pages written.
18530 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61    ** to the data
18540 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69 74 65  base, also write
18550 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   the doclist-ind
18560 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a 2f 0a  ex to disk.  */.
18570 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 61    if( pWriter->a
18580 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30  Dlidx[0].buf.n>0
18590 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d   && pWriter->nEm
185a0 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f 44 4c  pty>=FTS5_MIN_DL
185b0 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  IDX_SIZE ){.    
185c0 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d 0a 20  bFlag = 1;.  }. 
185d0 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43   fts5WriteDlidxC
185e0 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65 72 2c  lear(p, pWriter,
185f0 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72 69 74   bFlag);.  pWrit
18600 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30 3b 0a  er->nEmpty = 0;.
18610 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67 3b 0a    return bFlag;.
18620 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
18630 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
18640 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63 65 73   whenever proces
18650 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f 63 6c  sing of the docl
18660 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  ist for the .** 
18670 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61  last term on lea
18680 66 20 70 61 67 65 20 28 70 57 72 69 74 65 72 2d  f page (pWriter-
18690 3e 69 42 74 50 61 67 65 29 20 69 73 20 63 6f 6d  >iBtPage) is com
186a0 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54  pleted. .**.** T
186b0 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  he doclist-index
186c0 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d 20 69   for that term i
186d0 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72  s currently stor
186e0 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77 69 74  ed in-memory wit
186f0 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73 35 53  hin the.** Fts5S
18700 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64 78 5b  egWriter.aDlidx[
18710 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74 20 69  ] array. If it i
18720 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2c 20  s large enough, 
18730 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
18740 20 77 72 69 74 65 73 20 69 74 20 6f 75 74 20 74   writes it out t
18750 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66 20 69  o disk. Or, if i
18760 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 74  t is too small t
18770 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c 20 64  o bother with, d
18780 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e 0a 2a  iscards.** it..*
18790 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74  *.** Fts5SegWrit
187a0 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72 65 6e  er.btterm curren
187b0 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  tly contains the
187c0 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70   first term on p
187d0 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a 2f 0a  age iBtPage..*/.
187e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
187f0 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28  WriteFlushBtree(
18800 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
18810 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
18820 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46 6c  iter){.  int bFl
18830 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  ag;..  assert( p
18840 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 20  Writer->iBtPage 
18850 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70  || pWriter->nEmp
18860 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  ty==0 );.  if( p
18870 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65 3d  Writer->iBtPage=
18880 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 62  =0 ) return;.  b
18890 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69 74 65  Flag = fts5Write
188a0 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20 70 57  FlushDlidx(p, pW
188b0 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  riter);..  if( p
188c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
188d0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
188e0 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65 72 2d  r *z = (pWriter-
188f0 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63 6f 6e  >btterm.n>0?(con
18900 73 74 20 63 68 61 72 2a 29 70 57 72 69 74 65 72  st char*)pWriter
18910 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29 3b 0a  ->btterm.p:"");.
18920 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f      /* The follo
18930 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61 64 79  wing was already
18940 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57 72 69   done in fts5Wri
18950 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20 20 20  teInit(): */.   
18960 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   /* sqlite3_bind
18970 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
18980 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
18990 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20 20 20  iSegid); */.    
189a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
189b0 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c  b(p->pIdxWriter,
189c0 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72 2d 3e   2, z, pWriter->
189d0 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49 54 45  btterm.n, SQLITE
189e0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 73 71  _STATIC);.    sq
189f0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34  lite3_bind_int64
18a00 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
18a10 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69 36 34  3, bFlag + ((i64
18a20 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67  )pWriter->iBtPag
18a30 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  e<<1));.    sqli
18a40 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78  te3_step(p->pIdx
18a50 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e  Writer);.    p->
18a60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
18a70 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  et(p->pIdxWriter
18a80 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74 65 72  );.  }.  pWriter
18a90 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d  ->iBtPage = 0;.}
18aa0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
18ab0 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20  called once for 
18ac0 65 61 63 68 20 6c 65 61 66 20 70 61 67 65 20 65  each leaf page e
18ad0 78 63 65 70 74 20 74 68 65 20 66 69 72 73 74 20  xcept the first 
18ae0 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
18af0 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 74 65   at least one te
18b00 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28 6e 54  rm. Argument (nT
18b10 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20 74 68  erm/pTerm) is th
18b20 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20  e split-key - a 
18b30 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20  term that.** is 
18b40 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c 6c 20  larger than all 
18b50 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20 74 6f  terms written to
18b60 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65 73 2c   earlier leaves,
18b70 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20 6f 72   and equal to or
18b80 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e  .** smaller than
18b90 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
18ba0 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61 66 2e  on the new leaf.
18bb0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
18bc0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72  or occurs, an er
18bd0 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74  ror code is left
18be0 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63   in Fts5Index.rc
18bf0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  . If an error.**
18c00 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
18c10 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
18c20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
18c30 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
18c40 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
18c50 64 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65  d fts5WriteBtree
18c60 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
18c70 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
18c80 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
18c90 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
18ca0 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65  /.  Fts5SegWrite
18cb0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
18cc0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
18cd0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  ject */.  int nT
18ce0 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
18cf0 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46 69 72  Term      /* Fir
18d00 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70  st term on new p
18d10 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35  age */.){.  fts5
18d20 57 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28  WriteFlushBtree(
18d30 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 66  p, pWriter);.  f
18d40 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
18d50 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62  >rc, &pWriter->b
18d60 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54  tterm, nTerm, pT
18d70 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  erm);.  pWriter-
18d80 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72 69 74  >iBtPage = pWrit
18d90 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 3b  er->writer.pgno;
18da0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
18db0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
18dc0 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20  d when flushing 
18dd0 61 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74  a leaf page that
18de0 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20   contains no.** 
18df0 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20  terms at all to 
18e00 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
18e10 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
18e20 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73  reeNoTerm(.  Fts
18e30 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e50 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
18e60 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
18e70 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20  Writer *pWriter 
18e80 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
18e90 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
18ea0 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65    /* If there we
18eb0 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20  re no rowids on 
18ec0 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69  the leaf page ei
18ed0 74 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63  ther and the doc
18ee0 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20  list-index.  ** 
18ef0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
18f00 20 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64   started, append
18f10 20 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f   an 0x00 byte to
18f20 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70   it.  */.  if( p
18f30 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
18f40 77 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72  widInPage && pWr
18f50 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
18f60 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46  buf.n>0 ){.    F
18f70 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
18f80 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65  pDlidx = &pWrite
18f90 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20  r->aDlidx[0];.  
18fa0 20 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78    assert( pDlidx
18fb0 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a  ->bPrevValid );.
18fc0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
18fd0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
18fe0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
18ff0 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a  x->buf, 0);.  }.
19000 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20  .  /* Increment 
19010 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73  the "number of s
19020 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73  equential leaves
19030 20 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22   without a term"
19040 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70   counter. */.  p
19050 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b  Writer->nEmpty++
19060 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20  ;.}..static i64 
19070 66 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74  fts5DlidxExtract
19080 46 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42  FirstRowid(Fts5B
19090 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20  uffer *pBuf){.  
190a0 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e  i64 iRowid;.  in
190b0 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20  t iOff;..  iOff 
190c0 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72  = 1 + fts5GetVar
190d0 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c  int(&pBuf->p[1],
190e0 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
190f0 0a 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  .  fts5GetVarint
19100 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c  (&pBuf->p[iOff],
19110 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
19120 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64  .  return iRowid
19130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64  ;.}../*.** Rowid
19140 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74   iRowid has just
19150 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74   been appended t
19160 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65  o the current le
19170 61 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74  af page. It is t
19180 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74  he.** first on t
19190 68 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75  he page. This fu
191a0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
191b0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e  n appropriate en
191c0 74 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65  try to the curre
191d0 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e  nt.** doclist-in
191e0 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dex..*/.static v
191f0 6f 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69  oid fts5WriteDli
19200 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35  dxAppend(.  Fts5
19210 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73  Index *p, .  Fts
19220 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69  5SegWriter *pWri
19230 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77  ter, .  i64 iRow
19240 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  id.){.  int i;. 
19250 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a   int bDone = 0;.
19260 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72  .  for(i=0; p->r
19270 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
19280 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a  bDone==0; i++){.
19290 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20      i64 iVal;.  
192a0 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65    Fts5DlidxWrite
192b0 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72  r *pDlidx = &pWr
192c0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
192d0 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ..    if( pDlidx
192e0 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e  ->buf.n>=p->pCon
192f0 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20  fig->pgsz ){.   
19300 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e     /* The curren
19310 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20  t doclist-index 
19320 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72  page is full. Wr
19330 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61  ite it to disk a
19340 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a  nd push.      **
19350 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69   a copy of iRowi
19360 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65  d (which will be
19370 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72  come the first r
19380 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74  owid on the next
19390 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73  .      ** doclis
193a0 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67  t-index leaf pag
193b0 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e  e) up into the n
193c0 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ext level of the
193d0 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a   b-tree .      *
193e0 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20  * hierarchy. If 
193f0 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66  the node being f
19400 6c 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e  lushed is curren
19410 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64  tly the root nod
19420 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f  e,.      ** also
19430 20 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20   push its first 
19440 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a  rowid upwards. *
19450 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e  /.      pDlidx->
19460 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b  buf.p[0] = 0x01;
19470 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72      /* Not the r
19480 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20  oot node */.    
19490 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
194a0 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54  p, .          FT
194b0 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70  S5_DLIDX_ROWID(p
194c0 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20  Writer->iSegid, 
194d0 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29  i, pDlidx->pgno)
194e0 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69  ,.          pDli
194f0 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64  dx->buf.p, pDlid
19500 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29  x->buf.n.      )
19510 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  ;.      fts5Writ
19520 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57  eDlidxGrow(p, pW
19530 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20  riter, i+2);.   
19540 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72     pDlidx = &pWr
19550 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b  iter->aDlidx[i];
19560 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63  .      if( p->rc
19570 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
19580 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d  Dlidx[1].buf.n==
19590 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  0 ){.        i64
195a0 20 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c   iFirst = fts5Dl
195b0 69 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52  idxExtractFirstR
195c0 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75  owid(&pDlidx->bu
195d0 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  f);..        /* 
195e0 54 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f  This was the roo
195f0 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73  t node. Push its
19600 20 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20   first rowid up 
19610 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e  to the new root.
19620 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69   */.        pDli
19630 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c  dx[1].pgno = pDl
19640 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20  idx->pgno;.     
19650 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
19660 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
19670 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
19680 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20  [1].buf, 0);.   
19690 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
196a0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
196b0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
196c0 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64  dx[1].buf, pDlid
196d0 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  x->pgno);.      
196e0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
196f0 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
19700 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
19710 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b  1].buf, iFirst);
19720 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b  .        pDlidx[
19730 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20  1].bPrevValid = 
19740 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  1;.        pDlid
19750 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69  x[1].iPrev = iFi
19760 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rst;.      }..  
19770 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
19780 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64  ufferZero(&pDlid
19790 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70  x->buf);.      p
197a0 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
197b0 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c  d = 0;.      pDl
197c0 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20  idx->pgno++;.   
197d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44   }else{.      bD
197e0 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  one = 1;.    }..
197f0 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e      if( pDlidx->
19800 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20  bPrevValid ){.  
19810 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69      iVal = iRowi
19820 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65  d - pDlidx->iPre
19830 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  v;.    }else{.  
19840 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20      i64 iPgno = 
19850 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d  (i==0 ? pWriter-
19860 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70  >writer.pgno : p
19870 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b  Dlidx[-1].pgno);
19880 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19890 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20  Dlidx->buf.n==0 
198a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
198b0 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
198c0 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
198d0 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44  pDlidx->buf, !bD
198e0 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  one);.      sqli
198f0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
19900 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
19910 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20  , &pDlidx->buf, 
19920 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56  iPgno);.      iV
19930 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20  al = iRowid;.   
19940 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46   }..    sqlite3F
19950 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
19960 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
19970 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c  Dlidx->buf, iVal
19980 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  );.    pDlidx->b
19990 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20  PrevValid = 1;. 
199a0 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76     pDlidx->iPrev
199b0 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d   = iRowid;.  }.}
199c0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
199d0 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
199e0 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
199f0 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19a00 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63  riter){.  static
19a10 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d   const u8 zero[]
19a20 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c   = { 0x00, 0x00,
19a30 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20   0x00, 0x00 };. 
19a40 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
19a50 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
19a60 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34  r->writer;.  i64
19a70 20 69 52 6f 77 69 64 3b 0a 0a 20 20 69 66 28 20   iRowid;..  if( 
19a80 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
19a90 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20 20 20  ermInPage ){.   
19aa0 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61 73 20   /* No term was 
19ab0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20  written to this 
19ac0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  page. */.    ass
19ad0 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65 74 55  ert( 0==fts5GetU
19ae0 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66 2e 70  16(&pPage->buf.p
19af0 5b 32 5d 29 20 29 3b 0a 20 20 20 20 66 74 73 35  [2]) );.    fts5
19b00 57 72 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d  WriteBtreeNoTerm
19b10 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
19b20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
19b30 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
19b40 6f 20 74 68 65 20 64 62 2e 20 2a 2f 0a 20 20 69  o the db. */.  i
19b50 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45 47  Rowid = FTS5_SEG
19b60 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69 74  MENT_ROWID(pWrit
19b70 65 72 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 70  er->iSegid, 0, p
19b80 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66  Page->pgno);.  f
19b90 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
19ba0 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62  iRowid, pPage->b
19bb0 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
19bc0 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .n);..  /* Initi
19bd0 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70  alize the next p
19be0 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
19bf0 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
19c00 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
19c10 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
19c20 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
19c30 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70  f, 4, zero);.  p
19c40 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
19c50 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
19c60 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
19c70 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
19c80 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
19c90 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en++;..  /* The 
19ca0 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e  new leaf holds n
19cb0 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64  o terms or rowid
19cc0 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  s */.  pWriter->
19cd0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
19ce0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
19cf0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
19d00 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 1;.}../*.**
19d10 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
19d20 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
19d30 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
19d40 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
19d50 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
19d60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
19d70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
19d80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
19d90 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
19da0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
19db0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
19dc0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
19dd0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
19de0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
19df0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19e00 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
19e10 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
19e20 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
19e30 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
19e40 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
19e50 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
19e60 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
19e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e80 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
19e90 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
19ea0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
19eb0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
19ec0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
19ed0 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 61 73 73  ->writer;..  ass
19ee0 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e  ert( pPage->buf.
19ef0 6e 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 62  n==0 || pPage->b
19f00 75 66 2e 6e 3e 34 20 29 3b 0a 20 20 69 66 28 20  uf.n>4 );.  if( 
19f10 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3d 3d 30 20  pPage->buf.n==0 
19f20 29 7b 0a 20 20 20 20 2f 2a 20 5a 65 72 6f 20 74  ){.    /* Zero t
19f30 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 61 6e  he first term an
19f40 64 20 66 69 72 73 74 20 64 6f 63 69 64 20 66 69  d first docid fi
19f50 65 6c 64 73 20 2a 2f 0a 20 20 20 20 73 74 61 74  elds */.    stat
19f60 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
19f70 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30  [] = { 0x00, 0x0
19f80 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b  0, 0x00, 0x00 };
19f90 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
19fa0 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
19fb0 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 34  , &pPage->buf, 4
19fc0 2c 20 7a 65 72 6f 29 3b 0a 20 20 20 20 61 73 73  , zero);.    ass
19fd0 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e 62 46  ert( pWriter->bF
19fe0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
19ff0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72  ;.  }.  if( p->r
1a000 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 0a 20  c ) return;.  . 
1a010 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1a020 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29  irstTermInPage )
1a030 7b 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20  {.    /* Update 
1a040 74 68 65 20 22 66 69 72 73 74 20 74 65 72 6d 22  the "first term"
1a050 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 70 61   field of the pa
1a060 67 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20  ge header. */.  
1a070 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1a080 3e 62 75 66 2e 70 5b 32 5d 3d 3d 30 20 26 26 20  >buf.p[2]==0 && 
1a090 70 50 61 67 65 2d 3e 62 75 66 2e 70 5b 33 5d 3d  pPage->buf.p[3]=
1a0a0 3d 30 20 29 3b 0a 20 20 20 20 66 74 73 35 50 75  =0 );.    fts5Pu
1a0b0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
1a0c0 2e 70 5b 32 5d 2c 20 70 50 61 67 65 2d 3e 62 75  .p[2], pPage->bu
1a0d0 66 2e 6e 29 3b 0a 20 20 20 20 6e 50 72 65 66 69  f.n);.    nPrefi
1a0e0 78 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  x = 0;.    if( p
1a0f0 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31 20 29 7b  Page->pgno!=1 ){
1a100 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69  .      /* This i
1a110 73 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d  s the first term
1a120 20 6f 6e 20 61 20 6c 65 61 66 20 74 68 61 74 20   on a leaf that 
1a130 69 73 20 6e 6f 74 20 74 68 65 20 6c 65 66 74 6d  is not the leftm
1a140 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20 20 20 20  ost leaf in.    
1a150 20 20 2a 2a 20 74 68 65 20 73 65 67 6d 65 6e 74    ** the segment
1a160 20 62 2d 74 72 65 65 2e 20 49 6e 20 74 68 69 73   b-tree. In this
1a170 20 63 61 73 65 20 69 74 20 69 73 20 6e 65 63 65   case it is nece
1a180 73 73 61 72 79 20 74 6f 20 61 64 64 20 61 20 74  ssary to add a t
1a190 65 72 6d 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  erm to.      ** 
1a1a0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
1a1b0 72 63 68 79 20 74 68 61 74 20 69 73 20 28 61 29  rchy that is (a)
1a1c0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1a1d0 20 6c 61 72 67 65 73 74 20 74 65 72 6d 20 0a 20   largest term . 
1a1e0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1a1f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
1a200 65 67 6d 65 6e 74 20 61 6e 64 20 28 62 29 20 73  egment and (b) s
1a210 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f 72 20 65  maller than or e
1a220 71 75 61 6c 20 74 6f 0a 20 20 20 20 20 20 2a 2a  qual to.      **
1a230 20 74 68 69 73 20 74 65 72 6d 2e 20 49 6e 20 6f   this term. In o
1a240 74 68 65 72 20 77 6f 72 64 73 2c 20 61 20 70 72  ther words, a pr
1a250 65 66 69 78 20 6f 66 20 28 70 54 65 72 6d 2f 6e  efix of (pTerm/n
1a260 54 65 72 6d 29 20 74 68 61 74 20 69 73 20 6f 6e  Term) that is on
1a270 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20  e.      ** byte 
1a280 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74 68 65 20  longer than the 
1a290 6c 6f 6e 67 65 73 74 20 70 72 65 66 69 78 20 28  longest prefix (
1a2a0 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 73 68 61  pTerm/nTerm) sha
1a2b0 72 65 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  res with the.   
1a2c0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 74     ** previous t
1a2d0 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  erm. .      **. 
1a2e0 20 20 20 20 20 2a 2a 20 55 73 75 61 6c 6c 79 2c       ** Usually,
1a2f0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65   the previous te
1a300 72 6d 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  rm is available 
1a310 69 6e 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 20  in pPage->term. 
1a320 54 68 65 20 65 78 63 65 70 74 69 6f 6e 0a 20 20  The exception.  
1a330 20 20 20 20 2a 2a 20 69 73 20 69 66 20 74 68 69      ** is if thi
1a340 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1a350 65 72 6d 20 77 72 69 74 74 65 6e 20 69 6e 20 61  erm written in a
1a360 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 6d 65  n incremental-me
1a370 72 67 65 20 73 74 65 70 2e 0a 20 20 20 20 20 20  rge step..      
1a380 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
1a390 74 68 65 20 70 72 65 76 69 6f 75 73 20 74 65 72  the previous ter
1a3a0 6d 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  m is not availab
1a3b0 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77 72 69 74  le, so just writ
1a3c0 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
1a3d0 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e 54 65 72  y of (pTerm/nTer
1a3e0 6d 29 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  m) into the pare
1a3f0 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73 20 69 73  nt node. This is
1a400 20 73 6c 69 67 68 74 6c 79 0a 20 20 20 20 20 20   slightly.      
1a410 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e 74 2c 20  ** inefficient, 
1a420 62 75 74 20 73 74 69 6c 6c 20 63 6f 72 72 65 63  but still correc
1a430 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  t.  */.      int
1a440 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
1a450 20 20 69 66 28 20 70 50 61 67 65 2d 3e 74 65 72    if( pPage->ter
1a460 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  m.n ){.        n
1a470 20 3d 20 31 20 2b 20 66 74 73 35 50 72 65 66 69   = 1 + fts5Prefi
1a480 78 43 6f 6d 70 72 65 73 73 28 70 50 61 67 65 2d  xCompress(pPage-
1a490 3e 74 65 72 6d 2e 6e 2c 20 70 50 61 67 65 2d 3e  >term.n, pPage->
1a4a0 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d 2c 20 70  term.p, nTerm, p
1a4b0 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Term);.      }. 
1a4c0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42 74       fts5WriteBt
1a4d0 72 65 65 54 65 72 6d 28 70 2c 20 70 57 72 69 74  reeTerm(p, pWrit
1a4e0 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29 3b 0a 20  er, n, pTerm);. 
1a4f0 20 20 20 20 20 70 50 61 67 65 20 3d 20 26 70 57       pPage = &pW
1a500 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20  riter->writer;. 
1a510 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
1a520 20 20 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35    nPrefix = fts5
1a530 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70  PrefixCompress(p
1a540 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50  Page->term.n, pP
1a550 61 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65  age->term.p, nTe
1a560 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1a570 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1a580 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1a590 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65  pPage->buf, nPre
1a5a0 66 69 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  fix);.  }..  /* 
1a5b0 41 70 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65  Append the numbe
1a5c0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65  r of bytes of ne
1a5d0 77 20 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65  w data, then the
1a5e0 20 74 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c   term data itsel
1a5f0 66 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61  f.  ** to the pa
1a600 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66  ge. */.  fts5Buf
1a610 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1a620 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1a630 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72  buf, nTerm - nPr
1a640 65 66 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66  efix);.  fts5Buf
1a650 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
1a660 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1a670 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
1a680 69 78 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66  ix, &pTerm[nPref
1a690 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61  ix]);..  /* Upda
1a6a0 74 65 20 74 68 65 20 46 74 73 35 50 61 67 65 57  te the Fts5PageW
1a6b0 72 69 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64  riter.term field
1a6c0 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1a6d0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rSet(&p->rc, &pP
1a6e0 61 67 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d  age->term, nTerm
1a6f0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69  , pTerm);.  pWri
1a700 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1a710 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57  nPage = 0;..  pW
1a720 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1a730 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  idInPage = 0;.  
1a740 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1a750 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20  owidInDoclist = 
1a760 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  1;..  assert( p-
1a770 3e 72 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d  >rc || (pWriter-
1a780 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72  >nDlidx>0 && pWr
1a790 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1a7a0 62 75 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70  buf.n==0) );.  p
1a7b0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1a7c0 5d 2e 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e  ].pgno = pPage->
1a7d0 70 67 6e 6f 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pgno;..  /* If t
1a7e0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
1a7f0 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
1a800 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
1a810 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
1a820 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66 69  buf.n>=p->pConfi
1a830 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 66  g->pgsz ){.    f
1a840 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1a850 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1a860 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65   }.}../*.** Appe
1a870 6e 64 20 61 20 64 6f 63 69 64 20 61 6e 64 20 70  nd a docid and p
1a880 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a  osition-list siz
1a890 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20 77  e field to the w
1a8a0 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20 0a  riters output. .
1a8b0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1a8c0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52 6f  ts5WriteAppendRo
1a8d0 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78  wid(.  Fts5Index
1a8e0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1a8f0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
1a900 20 20 69 36 34 20 69 52 6f 77 69 64 2c 0a 20 20    i64 iRowid,.  
1a910 69 6e 74 20 6e 50 6f 73 0a 29 7b 0a 20 20 69 66  int nPos.){.  if
1a920 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1a930 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61  OK ){.    Fts5Pa
1a940 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1a950 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1a960 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  er;..    /* If t
1a970 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65  his is to be the
1a980 20 66 69 72 73 74 20 64 6f 63 69 64 20 77 72 69   first docid wri
1a990 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65  tten to the page
1a9a0 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a  , set the .    *
1a9b0 2a 20 64 6f 63 69 64 2d 70 6f 69 6e 74 65 72 20  * docid-pointer 
1a9c0 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64  in the page-head
1a9d0 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20  er. Also append 
1a9e0 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64  a value to the d
1a9f0 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66  lidx.    ** buff
1aa00 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f  er, in case a do
1aa10 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72  clist-index is r
1aa20 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20  equired.  */.   
1aa30 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46   if( pWriter->bF
1aa40 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1aa50 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74  ){.      fts5Put
1aa60 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70  U16(pPage->buf.p
1aa70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b  , pPage->buf.n);
1aa80 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1aa90 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70  DlidxAppend(p, p
1aaa0 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b  Writer, iRowid);
1aab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57  .    }..    /* W
1aac0 72 69 74 65 20 74 68 65 20 64 6f 63 69 64 2e 20  rite the docid. 
1aad0 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69 74  */.    if( pWrit
1aae0 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49  er->bFirstRowidI
1aaf0 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69  nDoclist || pWri
1ab00 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1ab10 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  InPage ){.      
1ab20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1ab30 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1ab40 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77  pPage->buf, iRow
1ab50 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  id);.    }else{.
1ab60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1ab70 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70 57  >rc || iRowid>pW
1ab80 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77 69  riter->iPrevRowi
1ab90 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  d );.      fts5B
1aba0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1abb0 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  t(&p->rc, &pPage
1abc0 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d 20  ->buf, iRowid - 
1abd0 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1abe0 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wid);.    }.    
1abf0 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f  pWriter->iPrevRo
1ac00 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20  wid = iRowid;.  
1ac10 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1ac20 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74 20  tRowidInDoclist 
1ac30 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65 72  = 0;.    pWriter
1ac40 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50  ->bFirstRowidInP
1ac50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66 74  age = 0;..    ft
1ac60 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1ac70 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1ac80 61 67 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29 3b  age->buf, nPos);
1ac90 0a 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ..    if( pPage-
1aca0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
1acb0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1acc0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1acd0 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1ace0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
1acf0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57  tatic void fts5W
1ad00 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69 73  riteAppendPoslis
1ad10 74 44 61 74 61 28 0a 20 20 46 74 73 35 49 6e 64  tData(.  Fts5Ind
1ad20 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65  ex *p, .  Fts5Se
1ad30 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72  gWriter *pWriter
1ad40 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  , .  const u8 *a
1ad50 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e 44 61  Data, .  int nDa
1ad60 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61 67 65  ta.){.  Fts5Page
1ad70 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
1ad80 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1ad90 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20  ;.  const u8 *a 
1ada0 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e  = aData;.  int n
1adb0 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20 20 61   = nData;.  .  a
1adc0 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66 69  ssert( p->pConfi
1add0 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20 20 77  g->pgsz>0 );.  w
1ade0 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
1adf0 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 61 67 65  ITE_OK && (pPage
1ae00 2d 3e 62 75 66 2e 6e 20 2b 20 6e 29 3e 3d 70 2d  ->buf.n + n)>=p-
1ae10 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
1ae20 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71 20 3d  {.    int nReq =
1ae30 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1ae40 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  z - pPage->buf.n
1ae50 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20  ;.    int nCopy 
1ae60 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
1ae70 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20  nCopy<nReq ){.  
1ae80 20 20 20 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20      i64 dummy;. 
1ae90 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74       nCopy += ft
1aea0 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 6e  s5GetVarint(&a[n
1aeb0 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29 26 64 75  Copy], (u64*)&du
1aec0 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  mmy);.    }.    
1aed0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1aee0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1aef0 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c  age->buf, nCopy,
1af00 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43   a);.    a += nC
1af10 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43  opy;.    n -= nC
1af20 6f 70 79 3b 0a 20 20 20 20 66 74 73 35 57 72 69  opy;.    fts5Wri
1af30 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70  teFlushLeaf(p, p
1af40 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69  Writer);.  }.  i
1af50 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74  f( n>0 ){.    ft
1af60 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1af70 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ob(&p->rc, &pPag
1af80 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20  e->buf, n, a);. 
1af90 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
1afa0 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65 6e  d fts5WriteAppen
1afb0 64 5a 65 72 6f 62 79 74 65 28 46 74 73 35 49 6e  dZerobyte(Fts5In
1afc0 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1afd0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1afe0 0a 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70  .  fts5BufferApp
1aff0 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
1b000 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  , &pWriter->writ
1b010 65 72 2e 62 75 66 2c 20 30 29 3b 0a 7d 0a 0a 2f  er.buf, 0);.}../
1b020 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
1b030 61 74 61 20 63 61 63 68 65 64 20 62 79 20 74 68  ata cached by th
1b040 65 20 77 72 69 74 65 72 20 6f 62 6a 65 63 74 20  e writer object 
1b050 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
1b060 20 46 72 65 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c   Free any.** all
1b070 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  ocations associa
1b080 74 65 64 20 77 69 74 68 20 74 68 65 20 77 72 69  ted with the wri
1b090 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ter..*/.static v
1b0a0 6f 69 64 20 66 74 73 35 57 72 69 74 65 46 69 6e  oid fts5WriteFin
1b0b0 69 73 68 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ish(.  Fts5Index
1b0c0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1b0d0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20  riter *pWriter, 
1b0e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1b0f0 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  r object */.  in
1b100 74 20 2a 70 6e 48 65 69 67 68 74 2c 20 20 20 20  t *pnHeight,    
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b120 20 4f 55 54 3a 20 48 65 69 67 68 74 20 6f 66 20   OUT: Height of 
1b130 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 20 20  the b-tree */.  
1b140 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20 20 20  int *pnLeaf     
1b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b160 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72 20 6f  /* OUT: Number o
1b170 66 20 6c 65 61 66 20 70 61 67 65 73 20 69 6e 20  f leaf pages in 
1b180 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20 20 69  b-tree */.){.  i
1b190 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61 67 65  nt i;.  Fts5Page
1b1a0 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20 3d 20  Writer *pLeaf = 
1b1b0 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
1b1c0 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
1b1d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b1e0 69 66 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3d  if( pLeaf->pgno=
1b1f0 3d 31 20 26 26 20 70 4c 65 61 66 2d 3e 62 75 66  =1 && pLeaf->buf
1b200 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a  .n==0 ){.      *
1b210 70 6e 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  pnLeaf = 0;.    
1b220 20 20 2a 70 6e 48 65 69 67 68 74 20 3d 20 30 3b    *pnHeight = 0;
1b230 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b240 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66    if( pLeaf->buf
1b250 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>4 ){.        
1b260 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
1b270 61 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  af(p, pWriter);.
1b280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70        }.      *p
1b290 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70  nLeaf = pLeaf->p
1b2a0 67 6e 6f 2d 31 3b 0a 0a 20 20 20 20 20 20 66 74  gno-1;..      ft
1b2b0 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
1b2c0 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  e(p, pWriter);. 
1b2d0 20 20 20 20 20 2a 70 6e 48 65 69 67 68 74 20 3d       *pnHeight =
1b2e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
1b2f0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1b300 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20 20  pLeaf->term);.  
1b310 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1b320 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20 66  pLeaf->buf);.  f
1b330 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
1b340 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 29 3b  Writer->btterm);
1b350 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ..  for(i=0; i<p
1b360 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b 20  Writer->nDlidx; 
1b370 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
1b380 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
1b390 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78  &pWriter->aDlidx
1b3a0 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a 20 20  [i].buf);.  }.  
1b3b0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 57 72  sqlite3_free(pWr
1b3c0 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d  iter->aDlidx);.}
1b3d0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1b3e0 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20 20 46  s5WriteInit(.  F
1b3f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
1b400 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
1b410 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74 20 69  Writer, .  int i
1b420 53 65 67 69 64 0a 29 7b 0a 20 20 6d 65 6d 73 65  Segid.){.  memse
1b430 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
1b440 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
1b450 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  er));.  pWriter-
1b460 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1b470 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c  ;..  fts5WriteDl
1b480 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74  idxGrow(p, pWrit
1b490 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65  er, 1);.  pWrite
1b4a0 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  r->writer.pgno =
1b4b0 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
1b4c0 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
1b4d0 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
1b4e0 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20  iBtPage = 1;..  
1b4f0 69 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65  if( p->pIdxWrite
1b500 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
1b510 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
1b520 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
1b530 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
1b540 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
1b550 64 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65  dxWriter, sqlite
1b560 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
1b570 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
1b580 4f 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28  O '%q'.'%q_idx'(
1b590 73 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29  segid,term,pgno)
1b5a0 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c   VALUES(?,?,?)",
1b5b0 20 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e   .          pCon
1b5c0 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69  fig->zDb, pConfi
1b5d0 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b  g->zName.    ));
1b5e0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72  .  }..  if( p->r
1b5f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b600 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b610 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
1b620 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
1b630 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  iSegid);.  }.}..
1b640 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
1b650 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74 6f  Iter was used to
1b660 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1b670 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65   the input segme
1b680 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20  nts of on an.** 
1b690 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
1b6a0 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  e operation. Thi
1b6b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1b6c0 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63 72  lled if the incr
1b6d0 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65  emental.** merge
1b6e0 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73 68   step has finish
1b6f0 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75 74  ed but the input
1b700 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
1b710 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74  mpletely exhaust
1b720 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1b730 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  id fts5TrimSegme
1b740 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nts(Fts5Index *p
1b750 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  , Fts5IndexIter 
1b760 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
1b770 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
1b780 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
1b790 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
1b7a0 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
1b7b0 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1b7c0 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Seg; i++){.    F
1b7d0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1b7e0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
1b7f0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
1b800 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
1b810 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
1b820 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
1b830 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
1b840 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73       /* All keys
1b850 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74   from this input
1b860 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65   segment have be
1b870 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f  en transfered to
1b880 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20   the output..   
1b890 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74     ** Set both t
1b8a0 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73  he first and las
1b8b0 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74  t page-numbers t
1b8c0 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  o 0 to indicate 
1b8d0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
1b8e0 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77  * segment is now
1b8f0 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
1b900 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1b910 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  oLast = 0;.     
1b920 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1b930 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  oFirst = 0;.    
1b940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1b950 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54   iOff = pSeg->iT
1b960 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ermLeafOffset;  
1b970 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
1b980 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70  new first leaf p
1b990 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  age */.      i64
1b9a0 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20   iLeafRowid;.   
1b9b0 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
1b9c0 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ta;.      int iI
1b9d0 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
1b9e0 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38  iSegid;.      u8
1b9f0 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30   aHdr[4] = {0x00
1ba00 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1ba10 30 34 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61  04};..      iLea
1ba20 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  fRowid = FTS5_SE
1ba30 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1ba40 20 30 2c 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c   0, pSeg->iTermL
1ba50 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  eafPgno);.      
1ba60 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61  pData = fts5Data
1ba70 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52 6f 77  Read(p, iLeafRow
1ba80 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
1ba90 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
1baa0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1bab0 62 75 66 29 3b 0a 20 20 20 20 20 20 20 20 66 74  buf);.        ft
1bac0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
1bad0 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  ob(&p->rc, &buf,
1bae0 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61   sizeof(aHdr), a
1baf0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74  Hdr);.        ft
1bb00 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1bb10 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
1bb20 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29  f, pSeg->term.n)
1bb30 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
1bb40 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1bb50 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1bb60 67 2d 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d  g->term.n, pSeg-
1bb70 3e 74 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20  >term.p);.      
1bb80 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1bb90 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
1bba0 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e 20 2d 20  buf, pData->n - 
1bbb0 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70 5b  iOff, &pData->p[
1bbc0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20  iOff]);.        
1bbd0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1bbe0 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
1bbf0 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f  pSeg->pSeg->pgno
1bc00 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54  First = pSeg->iT
1bc10 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20  ermLeafPgno;.   
1bc20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65 6c       fts5DataDel
1bc30 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ete(p, FTS5_SEGM
1bc40 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20 30  ENT_ROWID(iId, 0
1bc50 2c 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64  , 1), iLeafRowid
1bc60 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
1bc70 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61  ataWrite(p, iLea
1bc80 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62  fRowid, buf.p, b
1bc90 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  uf.n);.      }. 
1bca0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
1bcb0 75 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b  ufferFree(&buf);
1bcc0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1bcd0 66 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61  fts5MergeChunkCa
1bce0 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e  llback(.  Fts5In
1bcf0 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20  dex *p, .  void 
1bd00 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20  *pCtx, .  const 
1bd10 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20  u8 *pChunk, int 
1bd20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35  nChunk.){.  Fts5
1bd30 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1bd40 65 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69  er = (Fts5SegWri
1bd50 74 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73  ter*)pCtx;.  fts
1bd60 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1bd70 69 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74  istData(p, pWrit
1bd80 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  er, pChunk, nChu
1bd90 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f  nk);.}../*.**.*/
1bda0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1bdb0 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c  5IndexMergeLevel
1bdc0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1bdd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1bde0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
1bdf0 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
1be00 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a  Fts5Structure **
1be10 70 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20  ppStruct,       
1be20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74  /* IN/OUT: Stuct
1be30 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
1be40 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20    int iLvl,     
1be50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be60 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65    /* Level to re
1be70 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f  ad input from */
1be80 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20  .  int *pnRem   
1be90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bea0 20 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74     /* Write up t
1beb0 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70  o this many outp
1bec0 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a  ut leaves */.){.
1bed0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1bee0 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
1bef0 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1bf00 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1bf10 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
1bf20 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73  vel[iLvl];.  Fts
1bf30 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
1bf40 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35  *pLvlOut;.  Fts5
1bf50 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
1bf60 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 0;       /* I
1bf70 74 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20  terator to read 
1bf80 69 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20  input data */.  
1bf90 69 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d  int nRem = pnRem
1bfa0 20 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20   ? *pnRem : 0;  
1bfb0 2f 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70  /* Output leaf p
1bfc0 61 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69  ages left to wri
1bfd0 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70  te */.  int nInp
1bfe0 75 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ut;             
1bff0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c000 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65  r of input segme
1c010 6e 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  nts */.  Fts5Seg
1c020 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
1c030 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1c040 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  er object */.  F
1c050 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
1c060 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
1c070 2a 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  * Output segment
1c080 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
1c090 20 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 52 65   term;.  int bRe
1c0a0 71 75 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d  quireDoclistTerm
1c0b0 20 3d 20 30 3b 20 20 20 20 2f 2a 20 44 6f 63 6c   = 0;    /* Docl
1c0c0 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 28  ist terminator (
1c0d0 30 78 30 30 29 20 72 65 71 75 69 72 65 64 20 2a  0x00) required *
1c0e0 2f 0a 20 20 69 6e 74 20 62 4f 6c 64 65 73 74 3b  /.  int bOldest;
1c0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c100 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
1c110 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1c120 74 20 69 73 20 74 68 65 20 6f 6c 64 65 73 74 20  t is the oldest 
1c130 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c  */..  assert( iL
1c140 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1c150 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
1c160 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d 70 4c  pLvl->nMerge<=pL
1c170 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20 20 6d  vl->nSeg );..  m
1c180 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
1c190 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67  , sizeof(Fts5Seg
1c1a0 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65 6d 73  Writer));.  mems
1c1b0 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a  et(&term, 0, siz
1c1c0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1c1d0 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d  ;.  if( pLvl->nM
1c1e0 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c 76 6c  erge ){.    pLvl
1c1f0 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Out = &pStruct->
1c200 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a  aLevel[iLvl+1];.
1c210 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
1c220 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b 0a 20  Out->nSeg>0 );. 
1c230 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c     nInput = pLvl
1c240 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20 70 53  ->nMerge;.    pS
1c250 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
1c260 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
1c270 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  g-1];..    fts5W
1c280 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1c290 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65 67 69  ter, pSeg->iSegi
1c2a0 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 77  d);.    writer.w
1c2b0 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70 53 65  riter.pgno = pSe
1c2c0 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b 0a 20  g->pgnoLast+1;. 
1c2d0 20 20 20 77 72 69 74 65 72 2e 69 42 74 50 61 67     writer.iBtPag
1c2e0 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 0;.  }else{.
1c2f0 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d      int iSegid =
1c300 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
1c310 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
1c320 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64 20 74  .    /* Extend t
1c330 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1c340 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71 75 69   object as requi
1c350 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  red to ensure th
1c360 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 20  e output.    ** 
1c370 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73 2e 20  segment exists. 
1c380 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76 6c 3d  */.    if( iLvl=
1c390 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
1c3a0 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  -1 ){.      fts5
1c3b0 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1c3c0 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74 72 75  l(&p->rc, ppStru
1c3d0 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72 75  ct);.      pStru
1c3e0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
1c3f0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
1c400 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76  ructureExtendLev
1c410 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75  el(&p->rc, pStru
1c420 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c 20 30  ct, iLvl+1, 1, 0
1c430 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1c440 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
1c450 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
1c460 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
1c470 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74    pLvlOut = &pSt
1c480 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1c490 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73 35 57  l+1];..    fts5W
1c4a0 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69  riteInit(p, &wri
1c4b0 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20  ter, iSegid);.. 
1c4c0 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65     /* Add the ne
1c4d0 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74 68 65  w segment to the
1c4e0 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20 2a 2f   output level */
1c4f0 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70 4c 76  .    pSeg = &pLv
1c500 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f  lOut->aSeg[pLvlO
1c510 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20 20 70  ut->nSeg];.    p
1c520 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b 3b 0a  LvlOut->nSeg++;.
1c530 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
1c540 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70 53 65  rst = 1;.    pSe
1c550 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67  g->iSegid = iSeg
1c560 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  id;.    pStruct-
1c570 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a 20 20  >nSegment++;..  
1c580 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75 74 20    /* Read input 
1c590 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65 6e 74  from all segment
1c5a0 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
1c5b0 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49 6e 70  evel */.    nInp
1c5c0 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b  ut = pLvl->nSeg;
1c5d0 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74 20 3d  .  }.  bOldest =
1c5e0 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3d   (pLvlOut->nSeg=
1c5f0 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e  =1 && pStruct->n
1c600 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29 3b 0a  Level==iLvl+2);.
1c610 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76 6c 3e  .  assert( iLvl>
1c620 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74 73 35  =0 );.  for(fts5
1c630 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20  MultiIterNew(p, 
1c640 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c 20 30  pStruct, 0, 0, 0
1c650 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75  , 0, iLvl, nInpu
1c660 74 2c 20 26 70 49 74 65 72 29 3b 0a 20 20 20 20  t, &pIter);.    
1c670 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
1c680 6f 66 28 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b  of(p, pIter)==0;
1c690 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
1c6a0 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
1c6b0 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20  r, 0, 0).  ){.  
1c6c0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1c6d0 53 65 67 49 74 65 72 20 3d 20 26 70 49 74 65 72  SegIter = &pIter
1c6e0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1c6f0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1c700 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  ];.    int nPos;
1c710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c720 20 20 20 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e       /* position
1c730 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
1c740 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
1c750 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e  t nTerm;.    con
1c760 73 74 20 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20  st u8 *pTerm;.. 
1c770 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
1c780 6b 65 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e  key annihilation
1c790 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65  . */.    if( pSe
1c7a0 67 49 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26  gIter->nPos==0 &
1c7b0 26 20 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53  & (bOldest || pS
1c7c0 65 67 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29  egIter->bDel==0)
1c7d0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20   ) continue;..  
1c7e0 20 20 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75    pTerm = fts5Mu
1c7f0 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74 65  ltiIterTerm(pIte
1c800 72 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  r, &nTerm);.    
1c810 69 66 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e  if( nTerm!=term.
1c820 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54 65 72  n || memcmp(pTer
1c830 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65 72 6d  m, term.p, nTerm
1c840 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ) ){.      if( p
1c850 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72 2e 6e  nRem && writer.n
1c860 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52 65 6d  LeafWritten>nRem
1c870 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
1c880 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  k;.      }..    
1c890 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1c8a0 65 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20  ew term. Append 
1c8b0 61 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75  a term to the ou
1c8c0 74 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f  tput segment. */
1c8d0 0a 20 20 20 20 20 20 69 66 28 20 62 52 65 71 75  .      if( bRequ
1c8e0 69 72 65 44 6f 63 6c 69 73 74 54 65 72 6d 20 29  ireDoclistTerm )
1c8f0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 57 72  {.        fts5Wr
1c900 69 74 65 41 70 70 65 6e 64 5a 65 72 6f 62 79 74  iteAppendZerobyt
1c910 65 28 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20  e(p, &writer);. 
1c920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73       }.      fts
1c930 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
1c940 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65  (p, &writer, nTe
1c950 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1c960 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
1c970 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e  &p->rc, &term, n
1c980 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
1c990 20 20 20 20 62 52 65 71 75 69 72 65 44 6f 63 6c      bRequireDocl
1c9a0 69 73 74 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  istTerm = 1;.   
1c9b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e   }..    /* Appen
1c9c0 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74  d the rowid to t
1c9d0 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
1c9e0 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
1c9f0 53 49 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73  SIZE */.    nPos
1ca00 20 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f   = pSegIter->nPo
1ca10 73 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e  s*2 + pSegIter->
1ca20 62 44 65 6c 3b 0a 20 20 20 20 66 74 73 35 57 72  bDel;.    fts5Wr
1ca30 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70  iteAppendRowid(p
1ca40 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d  , &writer, fts5M
1ca50 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
1ca60 74 65 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20  ter), nPos);..  
1ca70 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20    /* Append the 
1ca80 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61  position-list da
1ca90 74 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ta to the output
1caa0 20 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e   */.    fts5Chun
1cab0 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
1cac0 49 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72  Iter, (void*)&wr
1cad0 69 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43  iter, fts5MergeC
1cae0 68 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  hunkCallback);. 
1caf0 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74   }..  /* Flush t
1cb00 68 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67  he last leaf pag
1cb10 65 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74  e to disk. Set t
1cb20 68 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e  he output segmen
1cb30 74 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a  t b-tree height.
1cb40 20 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65    ** and last le
1cb50 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  af page number a
1cb60 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
1cb70 20 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65    */.  fts5Write
1cb80 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65  Finish(p, &write
1cb90 72 2c 20 26 70 53 65 67 2d 3e 6e 48 65 69 67 68  r, &pSeg->nHeigh
1cba0 74 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  t, &pSeg->pgnoLa
1cbb0 73 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35  st);..  if( fts5
1cbc0 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20  MultiIterEof(p, 
1cbd0 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e  pIter) ){.    in
1cbe0 74 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d  t i;..    /* Rem
1cbf0 6f 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e  ove the redundan
1cc00 74 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20  t segments from 
1cc10 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
1cc20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
1cc30 20 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b   i<nInput; i++){
1cc40 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
1cc50 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20  emoveSegment(p, 
1cc60 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53  pLvl->aSeg[i].iS
1cc70 65 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  egid);.    }..  
1cc80 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1cc90 72 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e  redundant segmen
1cca0 74 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75  ts from the inpu
1ccb0 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  t level */.    i
1ccc0 66 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e  f( pLvl->nSeg!=n
1ccd0 49 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69  Input ){.      i
1cce0 6e 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c  nt nMove = (pLvl
1ccf0 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29  ->nSeg - nInput)
1cd00 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74   * sizeof(Fts5St
1cd10 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b  ructureSegment);
1cd20 0a 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70  .      memmove(p
1cd30 4c 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c  Lvl->aSeg, &pLvl
1cd40 2d 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20  ->aSeg[nInput], 
1cd50 6e 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20  nMove);.    }.  
1cd60 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d    pStruct->nSegm
1cd70 65 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20  ent -= nInput;. 
1cd80 20 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d     pLvl->nSeg -=
1cd90 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76   nInput;.    pLv
1cda0 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20  l->nMerge = 0;. 
1cdb0 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e     if( pSeg->pgn
1cdc0 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  oLast==0 ){.    
1cdd0 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d    pLvlOut->nSeg-
1cde0 2d 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74  -;.      pStruct
1cdf0 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20  ->nSegment--;.  
1ce00 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1ce10 20 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70   assert( pSeg->p
1ce20 67 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20  gnoLast>0 );.   
1ce30 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74   fts5TrimSegment
1ce40 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  s(p, pIter);.   
1ce50 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
1ce60 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66  nInput;.  }..  f
1ce70 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1ce80 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74  (p, pIter);.  ft
1ce90 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65  s5BufferFree(&te
1cea0 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d  rm);.  if( pnRem
1ceb0 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69   ) *pnRem -= wri
1cec0 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e  ter.nLeafWritten
1ced0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70  ;.}../*.** Do up
1cee0 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66   to nPg pages of
1cef0 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20   automerge work 
1cf00 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f  on the index..*/
1cf10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1cf20 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46  5IndexMerge(.  F
1cf30 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
1cf40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1cf50 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
1cf60 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
1cf70 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
1cf80 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct,       /* IN
1cf90 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
1cfa0 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
1cfb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20   */.  int nPg   
1cfc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfd0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f        /* Pages o
1cfe0 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a  f work to do */.
1cff0 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  ){.  int nRem = 
1d000 6e 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63  nPg;.  Fts5Struc
1d010 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
1d020 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69  *ppStruct;.  whi
1d030 6c 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d  le( nRem>0 && p-
1d040 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1d050 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20  {.    int iLvl; 
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d070 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20    /* To iterate 
1d080 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a  through levels *
1d090 2f 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c  /.    int iBestL
1d0a0 76 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  vl = 0;         
1d0b0 20 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72    /* Level offer
1d0c0 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70  ing the most inp
1d0d0 75 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  ut segments */. 
1d0e0 20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30     int nBest = 0
1d0f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1d100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75  * Number of inpu
1d110 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65  t segments on be
1d120 73 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20  st level */..   
1d130 20 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c   /* Set iBestLvl
1d140 20 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f   to the level to
1d150 20 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d   read input segm
1d160 65 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20  ents from. */.  
1d170 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1d180 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20  t->nLevel>0 );. 
1d190 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
1d1a0 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
1d1b0 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
1d1c0 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1d1d0 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26  eLevel *pLvl = &
1d1e0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1d1f0 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iLvl];.      if(
1d200 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
1d210 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76  .        if( pLv
1d220 6c 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20  l->nMerge>nBest 
1d230 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65  ){.          iBe
1d240 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20  stLvl = iLvl;.  
1d250 20 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20          nBest = 
1d260 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
1d270 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d280 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1d290 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e       if( pLvl->n
1d2a0 53 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20  Seg>nBest ){.   
1d2b0 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76       nBest = pLv
1d2c0 6c 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20  l->nSeg;.       
1d2d0 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c   iBestLvl = iLvl
1d2e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d2f0 0a 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74  .    /* If nBest
1d300 20 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65   is still 0, the
1d310 6e 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74  n the index must
1d320 20 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69   be empty. */.#i
1d330 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
1d340 47 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  G.    for(iLvl=0
1d350 3b 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c  ; nBest==0 && iL
1d360 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1d370 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1d380 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
1d390 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1d3a0 2e 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20  .nSeg==0 );.    
1d3b0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  }.#endif..    if
1d3c0 28 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66  ( nBest<p->pConf
1d3d0 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a  ig->nAutomerge .
1d3e0 20 20 20 20 20 20 20 20 26 26 20 70 53 74 72 75          && pStru
1d3f0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74  ct->aLevel[iBest
1d400 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a  Lvl].nMerge==0 .
1d410 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62        ){.      b
1d420 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1d430 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1d440 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
1d450 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d   iBestLvl, &nRem
1d460 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1d470 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d480 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1d490 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d  BestLvl].nMerge=
1d4a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1d4b0 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65  StructurePromote
1d4c0 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20  (p, iBestLvl+1, 
1d4d0 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a  pStruct);.    }.
1d4e0 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20    }.  *ppStruct 
1d4f0 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a  = pStruct;.}../*
1d500 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e  .** A total of n
1d510 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20  Leaf leaf pages 
1d520 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74  of data has just
1d530 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
1d540 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65   a level-0.** se
1d550 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  gment. This func
1d560 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65  tion updates the
1d570 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
1d580 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
1d590 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c  if.** necessary,
1d5a0 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d   performs increm
1d5b0 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b  ental merge work
1d5c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
1d5d0 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
1d5e0 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
1d5f0 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
1d600 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
1d610 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
1d620 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
1d630 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1d640 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1d650 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a  IndexAutomerge(.
1d660 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1d670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d680 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1d690 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1d6a0 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
1d6b0 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
1d6c0 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
1d6d0 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
1d6e0 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  dex */.  int nLe
1d6f0 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
1d700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1d710 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61  er of output lea
1d720 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ves just written
1d730 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
1d740 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1d750 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75   p->pConfig->nAu
1d760 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20  tomerge>0 ){.   
1d770 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1d780 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1d790 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72  uct;.    u64 nWr
1d7a0 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
1d7b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
1d7c0 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65  l value of write
1d7d0 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20  -counter */.    
1d7e0 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20  int nWork;      
1d7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d800 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d   Number of work-
1d810 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72  quanta to perfor
1d820 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  m */.    int nRe
1d830 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1d840 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d850 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c   of leaf pages l
1d860 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
1d870 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1d880 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  he write-counter
1d890 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  . While doing so
1d8a0 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a  , set nWork. */.
1d8b0 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74      nWrite = pSt
1d8c0 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
1d8d0 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d  ter;.    nWork =
1d8e0 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20   (int)(((nWrite 
1d8f0 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57  + nLeaf) / p->nW
1d900 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69  orkUnit) - (nWri
1d910 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  te / p->nWorkUni
1d920 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74  t));.    pStruct
1d930 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
1d940 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52  += nLeaf;.    nR
1d950 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57  em = (int)(p->nW
1d960 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20  orkUnit * nWork 
1d970 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  * pStruct->nLeve
1d980 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64  l);..    fts5Ind
1d990 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72  exMerge(p, ppStr
1d9a0 75 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a  uct, nRem);.  }.
1d9b0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1d9c0 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65  ts5IndexCrisisme
1d9d0 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rge(.  Fts5Index
1d9e0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
1d9f0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
1da00 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
1da10 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
1da20 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20   **ppStruct     
1da30 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75     /* IN/OUT: Cu
1da40 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20  rrent structure 
1da50 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20  of index */.){. 
1da60 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73   const int nCris
1da70 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  is = p->pConfig-
1da80 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20  >nCrisisMerge;. 
1da90 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1daa0 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1dab0 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20  uct;.  int iLvl 
1dac0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1dad0 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
1dae0 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
1daf0 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vel>0 );.  while
1db00 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1db10 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61  OK && pStruct->a
1db20 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1db30 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20  >=nCrisis ){.   
1db40 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
1db50 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
1db60 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20  , iLvl, 0);.    
1db70 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1db80 6d 6f 74 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20  mote(p, iLvl+1, 
1db90 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 69 4c  pStruct);.    iL
1dba0 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53  vl++;.  }.  *ppS
1dbb0 74 72 75 63 74 20 3d 20 70 53 74 72 75 63 74 3b  truct = pStruct;
1dbc0 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .}..static int f
1dbd0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 46  ts5IndexReturn(F
1dbe0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
1dbf0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a  int rc = p->rc;.
1dc00 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1dc10 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  _OK;.  return rc
1dc20 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
1dc30 75 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78  uct Fts5FlushCtx
1dc40 20 46 74 73 35 46 6c 75 73 68 43 74 78 3b 0a 73   Fts5FlushCtx;.s
1dc50 74 72 75 63 74 20 46 74 73 35 46 6c 75 73 68 43  truct Fts5FlushC
1dc60 74 78 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78  tx {.  Fts5Index
1dc70 20 2a 70 49 64 78 3b 0a 20 20 46 74 73 35 53 65   *pIdx;.  Fts5Se
1dc80 67 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20  gWriter writer; 
1dc90 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  .};../*.** Buffe
1dca0 72 20 61 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e  r aBuf[] contain
1dcb0 73 20 61 20 6c 69 73 74 20 6f 66 20 76 61 72 69  s a list of vari
1dcc0 6e 74 73 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65  nts, all small e
1dcd0 6e 6f 75 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20  nough to fit.** 
1dce0 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
1dcf0 67 65 72 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ger. Return the 
1dd00 73 69 7a 65 20 6f 66 20 74 68 65 20 6c 61 72 67  size of the larg
1dd10 65 73 74 20 70 72 65 66 69 78 20 6f 66 20 74 68  est prefix of th
1dd20 69 73 20 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78  is .** list nMax
1dd30 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 20 69   bytes or less i
1dd40 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  n size..*/.stati
1dd50 63 20 69 6e 74 20 66 74 73 35 50 6f 73 6c 69 73  c int fts5Poslis
1dd60 74 50 72 65 66 69 78 28 63 6f 6e 73 74 20 75 38  tPrefix(const u8
1dd70 20 2a 61 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78   *aBuf, int nMax
1dd80 29 7b 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20  ){.  int ret;.  
1dd90 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74  u32 dummy;.  ret
1dda0 20 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74   = fts5GetVarint
1ddb0 33 32 28 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b  32(aBuf, dummy);
1ddc0 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
1ddd0 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35 47     int i = fts5G
1dde0 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75 66  etVarint32(&aBuf
1ddf0 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a 20  [ret], dummy);. 
1de00 20 20 20 69 66 28 20 28 72 65 74 20 2b 20 69 29     if( (ret + i)
1de10 20 3e 20 6e 4d 61 78 20 29 20 62 72 65 61 6b 3b   > nMax ) break;
1de20 0a 20 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20  .    ret += i;. 
1de30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
1de40 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35  .}..#define fts5
1de50 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
1de60 42 6c 6f 62 28 70 42 75 66 2c 20 70 42 6c 6f 62  Blob(pBuf, pBlob
1de70 2c 20 6e 42 6c 6f 62 29 20 7b 20 5c 0a 20 20 61  , nBlob) { \.  a
1de80 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e 53 70  ssert( pBuf->nSp
1de90 61 63 65 3e 3d 28 70 42 75 66 2d 3e 6e 2b 6e 42  ace>=(pBuf->n+nB
1dea0 6c 6f 62 29 20 29 3b 20 20 20 20 20 20 20 20 20  lob) );         
1deb0 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70 79 28 26      \.  memcpy(&
1dec0 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1ded0 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
1dee0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1def0 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 6e 42 6c 6f   pBuf->n += nBlo
1df00 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df20 20 20 20 20 20 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a        \.}../*.**
1df30 20 46 6c 75 73 68 20 74 68 65 20 63 6f 6e 74 65   Flush the conte
1df40 6e 74 73 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  nts of in-memory
1df50 20 68 61 73 68 20 74 61 62 6c 65 20 69 48 61 73   hash table iHas
1df60 68 20 74 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c  h to a new level
1df70 2d 30 20 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f  -0 .** segment o
1df80 6e 20 64 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64  n disk. Also upd
1df90 61 74 65 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ate the correspo
1dfa0 6e 64 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  nding structure 
1dfb0 72 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  record..**.** If
1dfc0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1dfd0 2c 20 73 65 74 20 74 68 65 20 46 74 73 35 49 6e  , set the Fts5In
1dfe0 64 65 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64  dex.rc error cod
1dff0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68  e. If an error h
1e000 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f  as .** already o
1e010 63 63 75 72 72 65 64 2c 20 74 68 69 73 20 66 75  ccurred, this fu
1e020 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
1e030 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
1e040 64 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61  d fts5FlushOneHa
1e050 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  sh(Fts5Index *p)
1e060 7b 0a 20 20 46 74 73 35 48 61 73 68 20 2a 70 48  {.  Fts5Hash *pH
1e070 61 73 68 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a  ash = p->pHash;.
1e080 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1e090 2a 70 53 74 72 75 63 74 3b 0a 20 20 69 6e 74 20  *pStruct;.  int 
1e0a0 69 53 65 67 69 64 3b 0a 20 20 69 6e 74 20 70 67  iSegid;.  int pg
1e0b0 6e 6f 4c 61 73 74 20 3d 20 30 3b 20 20 20 20 20  noLast = 0;     
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1e0d0 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
1e0e0 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
1e0f0 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
1e100 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
1e110 68 65 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  he index structu
1e120 72 65 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20  re and allocate 
1e130 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d 69 64  a new segment-id
1e140 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65  .  ** for the ne
1e150 77 20 6c 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e  w level-0 segmen
1e160 74 2e 20 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  t.  */.  pStruct
1e170 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
1e180 52 65 61 64 28 70 29 3b 0a 20 20 69 53 65 67 69  Read(p);.  iSegi
1e190 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65  d = fts5Allocate
1e1a0 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74  Segid(p, pStruct
1e1b0 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64  );..  if( iSegid
1e1c0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e   ){.    const in
1e1d0 74 20 70 67 73 7a 20 3d 20 70 2d 3e 70 43 6f 6e  t pgsz = p->pCon
1e1e0 66 69 67 2d 3e 70 67 73 7a 3b 0a 0a 20 20 20 20  fig->pgsz;..    
1e1f0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1e200 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
1e210 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69 74   New segment wit
1e220 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a 20  hin pStruct */. 
1e230 20 20 20 69 6e 74 20 6e 48 65 69 67 68 74 3b 20     int nHeight; 
1e240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e250 20 2f 2a 20 48 65 69 67 68 74 20 6f 66 20 6e 65   /* Height of ne
1e260 77 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  w segment b-tree
1e270 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75 66 66   */.    Fts5Buff
1e280 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
1e290 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1e2a0 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73 73 65  in which to asse
1e2b0 6d 62 6c 65 20 6c 65 61 66 20 70 61 67 65 20 2a  mble leaf page *
1e2c0 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a  /.    const u8 *
1e2d0 7a 50 72 65 76 20 3d 20 30 3b 0a 0a 20 20 20 20  zPrev = 0;..    
1e2e0 46 74 73 35 53 65 67 57 72 69 74 65 72 20 77 72  Fts5SegWriter wr
1e2f0 69 74 65 72 3b 0a 20 20 20 20 66 74 73 35 57 72  iter;.    fts5Wr
1e300 69 74 65 49 6e 69 74 28 70 2c 20 26 77 72 69 74  iteInit(p, &writ
1e310 65 72 2c 20 69 53 65 67 69 64 29 3b 0a 0a 20 20  er, iSegid);..  
1e320 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63 61 74    /* Pre-allocat
1e330 65 20 74 68 65 20 62 75 66 66 65 72 20 75 73 65  e the buffer use
1e340 64 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 6c 65  d to assemble le
1e350 61 66 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  af pages to the 
1e360 74 61 72 67 65 74 0a 20 20 20 20 2a 2a 20 70 61  target.    ** pa
1e370 67 65 20 73 69 7a 65 2e 20 20 2a 2f 0a 20 20 20  ge size.  */.   
1e380 20 61 73 73 65 72 74 28 20 70 67 73 7a 3e 30 20   assert( pgsz>0 
1e390 29 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  );.    pBuf = &w
1e3a0 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
1e3b0 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
1e3c0 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42 75  Grow(&p->rc, pBu
1e3d0 66 2c 20 70 67 73 7a 20 2b 20 32 30 29 3b 0a 0a  f, pgsz + 20);..
1e3e0 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61      /* Begin sca
1e3f0 6e 6e 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61  nning through ha
1e400 73 68 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73  sh table entries
1e410 2e 20 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73  . This loop runs
1e420 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20   once for each. 
1e430 20 20 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69     ** term/docli
1e440 73 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  st currently sto
1e450 72 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 68  red within the h
1e460 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20  ash table. */.  
1e470 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1e480 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e490 6d 65 6d 73 65 74 28 70 42 75 66 2d 3e 70 2c 20  memset(pBuf->p, 
1e4a0 30 2c 20 34 29 3b 0a 20 20 20 20 20 20 70 42 75  0, 4);.      pBu
1e4b0 66 2d 3e 6e 20 3d 20 34 3b 0a 20 20 20 20 20 20  f->n = 4;.      
1e4c0 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46  p->rc = sqlite3F
1e4d0 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28  ts5HashScanInit(
1e4e0 70 48 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20  pHash, 0, 0);.  
1e4f0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70    }.    while( p
1e500 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1e510 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73  && 0==sqlite3Fts
1e520 35 48 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61  5HashScanEof(pHa
1e530 73 68 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  sh) ){.      con
1e540 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20  st char *zTerm; 
1e550 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
1e560 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65  er containing te
1e570 72 6d 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  rm */.      int 
1e580 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20  nTerm;          
1e590 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1e5a0 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
1e5b0 73 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  s */.      const
1e5c0 20 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20   u8 *pDoclist;  
1e5d0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
1e5e0 72 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72  r to doclist for
1e5f0 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20   this term */.  
1e600 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74      int nDoclist
1e610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e620 2f 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69  /* Size of docli
1e630 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  st in bytes */. 
1e640 20 20 20 20 20 69 6e 74 20 6e 53 75 66 66 69 78       int nSuffix
1e650 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e660 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
1e670 20 73 75 66 66 69 78 20 2a 2f 0a 0a 20 20 20 20   suffix */..    
1e680 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1e690 68 53 63 61 6e 45 6e 74 72 79 28 70 48 61 73 68  hScanEntry(pHash
1e6a0 2c 20 26 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c  , &zTerm, &pDocl
1e6b0 69 73 74 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b  ist, &nDoclist);
1e6c0 0a 20 20 20 20 20 20 6e 54 65 72 6d 20 3d 20 73  .      nTerm = s
1e6d0 74 72 6c 65 6e 28 7a 54 65 72 6d 29 3b 0a 0a 20  trlen(zTerm);.. 
1e6e0 20 20 20 20 20 2f 2a 20 44 65 63 69 64 65 20 69       /* Decide i
1e6f0 66 20 74 68 65 20 74 65 72 6d 20 77 69 6c 6c 20  f the term will 
1e700 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65  fit on the curre
1e710 6e 74 20 6c 65 61 66 2e 20 49 66 20 69 74 20 77  nt leaf. If it w
1e720 69 6c 6c 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20  ill not, .      
1e730 2a 2a 20 66 6c 75 73 68 20 74 68 65 20 6c 65 61  ** flush the lea
1e740 66 20 74 6f 20 64 69 73 6b 20 68 65 72 65 2e 20  f to disk here. 
1e750 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 28 70   */.      if( (p
1e760 42 75 66 2d 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b  Buf->n + nTerm +
1e770 20 32 29 20 3e 20 70 67 73 7a 20 29 7b 0a 20 20   2) > pgsz ){.  
1e780 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46        fts5WriteF
1e790 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69  lushLeaf(p, &wri
1e7a0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 42  ter);.        pB
1e7b0 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72 69  uf = &writer.wri
1e7c0 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 20 20 20  ter.buf;.       
1e7d0 20 69 66 28 20 28 6e 54 65 72 6d 20 2b 20 33 32   if( (nTerm + 32
1e7e0 29 20 3e 20 70 42 75 66 2d 3e 6e 53 70 61 63 65  ) > pBuf->nSpace
1e7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
1e800 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1e810 3e 72 63 2c 20 70 42 75 66 2c 20 6e 54 65 72 6d  >rc, pBuf, nTerm
1e820 20 2b 20 33 32 20 2d 20 70 42 75 66 2d 3e 6e 29   + 32 - pBuf->n)
1e830 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e840 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 20  p->rc ) break;. 
1e850 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e860 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ..      /* Write
1e870 20 74 68 65 20 74 65 72 6d 20 74 6f 20 74 68 65   the term to the
1e880 20 6c 65 61 66 2e 20 41 6e 64 20 69 66 20 69 74   leaf. And if it
1e890 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 6e   is the first on
1e8a0 20 74 68 65 20 6c 65 61 66 2c 20 61 6e 64 0a 20   the leaf, and. 
1e8b0 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 65 61 66       ** the leaf
1e8c0 20 69 73 20 6e 6f 74 20 70 61 67 65 20 6e 75 6d   is not page num
1e8d0 62 65 72 20 31 2c 20 70 75 73 68 20 69 74 20 75  ber 1, push it u
1e8e0 70 20 69 6e 74 6f 20 74 68 65 20 62 2d 74 72 65  p into the b-tre
1e8f0 65 20 68 69 65 72 61 72 63 68 79 20 0a 20 20 20  e hierarchy .   
1e900 20 20 20 2a 2a 20 61 73 20 77 65 6c 6c 2e 20 20     ** as well.  
1e910 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 77 72 69  */.      if( wri
1e920 74 65 72 2e 62 46 69 72 73 74 54 65 72 6d 49 6e  ter.bFirstTermIn
1e930 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1e940 20 20 20 69 6e 74 20 6e 50 72 65 20 3d 20 66 74     int nPre = ft
1e950 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73 73  s5PrefixCompress
1e960 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76 2c 20 6e  (nTerm, zPrev, n
1e970 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20 75 38 2a  Term, (const u8*
1e980 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20  )zTerm);.       
1e990 20 70 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69   pBuf->n += sqli
1e9a0 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
1e9b0 28 26 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  (&pBuf->p[pBuf->
1e9c0 6e 5d 2c 20 6e 50 72 65 29 3b 0a 20 20 20 20 20  n], nPre);.     
1e9d0 20 20 20 6e 53 75 66 66 69 78 20 3d 20 6e 54 65     nSuffix = nTe
1e9e0 72 6d 20 2d 20 6e 50 72 65 3b 0a 20 20 20 20 20  rm - nPre;.     
1e9f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ea00 66 74 73 35 50 75 74 55 31 36 28 26 70 42 75 66  fts5PutU16(&pBuf
1ea10 2d 3e 70 5b 32 5d 2c 20 70 42 75 66 2d 3e 6e 29  ->p[2], pBuf->n)
1ea20 3b 0a 20 20 20 20 20 20 20 20 77 72 69 74 65 72  ;.        writer
1ea30 2e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67  .bFirstTermInPag
1ea40 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  e = 0;.        i
1ea50 66 28 20 77 72 69 74 65 72 2e 77 72 69 74 65 72  f( writer.writer
1ea60 2e 70 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20  .pgno!=1 ){.    
1ea70 20 20 20 20 20 20 69 6e 74 20 6e 50 72 65 20 3d        int nPre =
1ea80 20 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72   fts5PrefixCompr
1ea90 65 73 73 28 6e 54 65 72 6d 2c 20 7a 50 72 65 76  ess(nTerm, zPrev
1eaa0 2c 20 6e 54 65 72 6d 2c 20 28 63 6f 6e 73 74 20  , nTerm, (const 
1eab0 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
1eac0 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 42        fts5WriteB
1ead0 74 72 65 65 54 65 72 6d 28 70 2c 20 26 77 72 69  treeTerm(p, &wri
1eae0 74 65 72 2c 20 6e 50 72 65 2b 31 2c 20 28 63 6f  ter, nPre+1, (co
1eaf0 6e 73 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a  nst u8*)zTerm);.
1eb00 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20 3d            pBuf =
1eb10 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e   &writer.writer.
1eb20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20 61  buf;.          a
1eb30 73 73 65 72 74 28 20 6e 50 72 65 3c 6e 54 65 72  ssert( nPre<nTer
1eb40 6d 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  m );.        }. 
1eb50 20 20 20 20 20 20 20 6e 53 75 66 66 69 78 20 3d         nSuffix =
1eb60 20 6e 54 65 72 6d 3b 0a 20 20 20 20 20 20 7d 0a   nTerm;.      }.
1eb70 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1eb80 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1eb90 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1eba0 42 75 66 2d 3e 6e 5d 2c 20 6e 53 75 66 66 69 78  Buf->n], nSuffix
1ebb0 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66  );.      fts5Buf
1ebc0 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f  ferSafeAppendBlo
1ebd0 62 28 70 42 75 66 2c 20 28 63 6f 6e 73 74 20 75  b(pBuf, (const u
1ebe0 38 2a 29 26 7a 54 65 72 6d 5b 6e 54 65 72 6d 2d  8*)&zTerm[nTerm-
1ebf0 6e 53 75 66 66 69 78 5d 2c 20 6e 53 75 66 66 69  nSuffix], nSuffi
1ec00 78 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 65  x);..      /* We
1ec10 20 6a 75 73 74 20 77 72 6f 74 65 20 61 20 74 65   just wrote a te
1ec20 72 6d 20 69 6e 74 6f 20 70 61 67 65 20 77 72 69  rm into page wri
1ec30 74 65 72 2e 61 57 72 69 74 65 72 5b 30 5d 2e 70  ter.aWriter[0].p
1ec40 67 6e 6f 2e 20 49 66 20 61 20 0a 20 20 20 20 20  gno. If a .     
1ec50 20 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65   ** doclist-inde
1ec60 78 20 69 73 20 74 6f 20 62 65 20 67 65 6e 65 72  x is to be gener
1ec70 61 74 65 64 20 66 6f 72 20 74 68 69 73 20 64 6f  ated for this do
1ec80 63 6c 69 73 74 2c 20 69 74 20 77 69 6c 6c 20 62  clist, it will b
1ec90 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 73 6f 63  e.      ** assoc
1eca0 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
1ecb0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 61  page. */.      a
1ecc0 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 6e 44  ssert( writer.nD
1ecd0 6c 69 64 78 3e 30 20 26 26 20 77 72 69 74 65 72  lidx>0 && writer
1ece0 2e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  .aDlidx[0].buf.n
1ecf0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 77 72 69  ==0 );.      wri
1ed00 74 65 72 2e 61 44 6c 69 64 78 5b 30 5d 2e 70 67  ter.aDlidx[0].pg
1ed10 6e 6f 20 3d 20 77 72 69 74 65 72 2e 77 72 69 74  no = writer.writ
1ed20 65 72 2e 70 67 6e 6f 3b 0a 0a 20 20 20 20 20 20  er.pgno;..      
1ed30 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75 66 2d  if( pgsz>=(pBuf-
1ed40 3e 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20  >n + nDoclist + 
1ed50 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  1) ){.        /*
1ed60 20 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c   The entire docl
1ed70 69 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ist will fit on 
1ed80 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
1ed90 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73  . */.        fts
1eda0 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
1edb0 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63  dBlob(pBuf, pDoc
1edc0 6c 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b  list, nDoclist);
1edd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ede0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
1edf0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36   = 0;.        i6
1ee00 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20  4 iDelta = 0;.  
1ee10 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d        int iOff =
1ee20 20 30 3b 0a 0a 20 20 20 20 20 20 20 20 77 72 69   0;..        wri
1ee30 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
1ee40 6e 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  nPage = 0;..    
1ee50 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72      /* The entir
1ee60 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20 6e  e doclist will n
1ee70 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c  ot fit on this l
1ee80 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  eaf. The followi
1ee90 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ng .        ** l
1eea0 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68 72  oop iterates thr
1eeb0 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73 74  ough the poslist
1eec0 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20 74  s that make up t
1eed0 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20 20  he current .    
1eee0 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e 20      ** doclist. 
1eef0 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69 6c   */.        whil
1ef00 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
1ef10 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f 63  _OK && iOff<nDoc
1ef20 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  list ){.        
1ef30 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
1ef40 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b        int nCopy;
1ef50 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62  .          int b
1ef60 44 75 6d 6d 79 3b 0a 20 20 20 20 20 20 20 20 20  Dummy;.         
1ef70 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
1ef80 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69 73 74  Varint(&pDoclist
1ef90 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69  [iOff], (u64*)&i
1efa0 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20 20 20  Delta);.        
1efb0 20 20 6e 43 6f 70 79 20 3d 20 66 74 73 35 47 65    nCopy = fts5Ge
1efc0 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 70 44  tPoslistSize(&pD
1efd0 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 26 6e  oclist[iOff], &n
1efe0 50 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20  Pos, &bDummy);. 
1eff0 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 2b           nCopy +
1f000 3d 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20  = nPos;.        
1f010 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c    iRowid += iDel
1f020 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 0a 20  ta;.          . 
1f030 20 20 20 20 20 20 20 20 20 69 66 28 20 77 72 69           if( wri
1f040 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
1f050 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
1f060 20 20 20 20 20 66 74 73 35 50 75 74 55 31 36 28       fts5PutU16(
1f070 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 70 42 75  &pBuf->p[0], pBu
1f080 66 2d 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73  f->n);   /* firs
1f090 74 20 64 6f 63 69 64 20 6f 6e 20 70 61 67 65 20  t docid on page 
1f0a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  */.            p
1f0b0 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
1f0c0 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
1f0d0 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1f0e0 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
1f0f0 20 20 20 20 20 20 20 77 72 69 74 65 72 2e 62 46         writer.bF
1f100 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20  irstRowidInPage 
1f110 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1f120 20 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 41   fts5WriteDlidxA
1f130 70 70 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72  ppend(p, &writer
1f140 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  , iRowid);.     
1f150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f160 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20          pBuf->n 
1f170 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 75  += sqlite3Fts5Pu
1f180 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
1f190 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74  [pBuf->n], iDelt
1f1a0 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  a);.          }.
1f1b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1f1c0 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
1f1d0 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20  >nSpace );..    
1f1e0 20 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d        if( (pBuf-
1f1f0 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20 70  >n + nCopy) <= p
1f200 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gsz ){.         
1f210 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1f220 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 66 69   poslist will fi
1f230 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
1f240 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70 79 0a 20   leaf. So copy. 
1f250 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74             ** it
1f260 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a 2f 0a 20   in one go. */. 
1f270 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1f280 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1f290 6c 6f 62 28 70 42 75 66 2c 20 26 70 44 6f 63 6c  lob(pBuf, &pDocl
1f2a0 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43 6f 70 79  ist[iOff], nCopy
1f2b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
1f2c0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
1f2d0 2f 2a 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f  /* The entire po
1f2e0 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66  slist will not f
1f2f0 69 74 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e  it on this leaf.
1f300 20 53 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20   So it needs.   
1f310 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62           ** to b
1f320 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65  e broken into se
1f330 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  ctions. The only
1f340 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62   qualification b
1f350 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  eing.           
1f360 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76 61   ** that each va
1f370 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f  rint must be sto
1f380 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  red contiguously
1f390 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .  */.          
1f3a0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f 73    const u8 *pPos
1f3b0 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73 74  list = &pDoclist
1f3c0 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20 20  [iOff];.        
1f3d0 20 20 20 20 69 6e 74 20 69 50 6f 73 20 3d 20 30      int iPos = 0
1f3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 68  ;.            wh
1f3f0 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ile( p->rc==SQLI
1f400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1f410 20 20 20 20 20 20 20 69 6e 74 20 6e 53 70 61 63         int nSpac
1f420 65 20 3d 20 70 67 73 7a 20 2d 20 70 42 75 66 2d  e = pgsz - pBuf-
1f430 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  >n;.            
1f440 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20    int n = 0;.   
1f450 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
1f460 6e 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e  nCopy - iPos)<=n
1f470 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20  Space ){.       
1f480 20 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f           n = nCo
1f490 70 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20  py - iPos;.     
1f4a0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50  n = fts5PoslistP
1f4d0 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b  refix(&pPoslist[
1f4e0 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a  iPos], nSpace);.
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
1f510 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20  sert( n>0 );.   
1f520 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42             fts5B
1f530 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1f540 6c 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c  lob(pBuf, &pPosl
1f550 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20  ist[iPos], n);. 
1f560 20 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f               iPo
1f570 73 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  s += n;.        
1f580 20 20 20 20 20 20 69 66 28 20 70 42 75 66 2d 3e        if( pBuf->
1f590 6e 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  n>=pgsz ){.     
1f5a0 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57             fts5W
1f5b0 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c  riteFlushLeaf(p,
1f5c0 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20   &writer);.     
1f5d0 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66 20             pBuf 
1f5e0 3d 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  = &writer.writer
1f5f0 2e 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20  .buf;.          
1f600 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f610 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43      if( iPos>=nC
1f620 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  opy ) break;.   
1f630 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f640 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1f650 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79 3b 0a   iOff += nCopy;.
1f660 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f670 7d 0a 0a 20 20 20 20 20 20 70 42 75 66 2d 3e 70  }..      pBuf->p
1f680 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c  [pBuf->n++] = '\
1f690 30 27 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  0';.      assert
1f6a0 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d  ( pBuf->n<=pBuf-
1f6b0 3e 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20  >nSpace );.     
1f6c0 20 7a 50 72 65 76 20 3d 20 28 63 6f 6e 73 74 20   zPrev = (const 
1f6d0 75 38 2a 29 7a 54 65 72 6d 3b 0a 20 20 20 20 20  u8*)zTerm;.     
1f6e0 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
1f6f0 53 63 61 6e 4e 65 78 74 28 70 48 61 73 68 29 3b  ScanNext(pHash);
1f700 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1f710 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72 28  e3Fts5HashClear(
1f720 70 48 61 73 68 29 3b 0a 20 20 20 20 66 74 73 35  pHash);.    fts5
1f730 57 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26  WriteFinish(p, &
1f740 77 72 69 74 65 72 2c 20 26 6e 48 65 69 67 68 74  writer, &nHeight
1f750 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20  , &pgnoLast);.. 
1f760 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
1f770 20 46 74 73 35 53 74 72 75 63 74 75 72 65 2e 20   Fts5Structure. 
1f780 49 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  It is written ba
1f790 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ck to the databa
1f7a0 73 65 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a  se by the.    **
1f7b0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1f7c0 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62 65 6c  lease() call bel
1f7d0 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ow.  */.    if( 
1f7e0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d  pStruct->nLevel=
1f7f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  =0 ){.      fts5
1f800 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76 65  StructureAddLeve
1f810 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74 72 75  l(&p->rc, &pStru
1f820 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ct);.    }.    f
1f830 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65  ts5StructureExte
1f840 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20  ndLevel(&p->rc, 
1f850 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c 20 30  pStruct, 0, 1, 0
1f860 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  );.    if( p->rc
1f870 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f880 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 53 74       pSeg = &pSt
1f890 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e  ruct->aLevel[0].
1f8a0 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d 3e 61  aSeg[ pStruct->a
1f8b0 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20  Level[0].nSeg++ 
1f8c0 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 69  ];.      pSeg->i
1f8d0 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b 0a  Segid = iSegid;.
1f8e0 20 20 20 20 20 20 70 53 65 67 2d 3e 6e 48 65 69        pSeg->nHei
1f8f0 67 68 74 20 3d 20 6e 48 65 69 67 68 74 3b 0a 20  ght = nHeight;. 
1f900 20 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46       pSeg->pgnoF
1f910 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1f920 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d  pSeg->pgnoLast =
1f930 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20   pgnoLast;.     
1f940 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1f950 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nt++;.    }.    
1f960 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
1f970 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53 74 72 75  mote(p, 0, pStru
1f980 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  ct);.  }..  fts5
1f990 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 70  IndexAutomerge(p
1f9a0 2c 20 26 70 53 74 72 75 63 74 2c 20 70 67 6e 6f  , &pStruct, pgno
1f9b0 4c 61 73 74 29 3b 0a 20 20 66 74 73 35 49 6e 64  Last);.  fts5Ind
1f9c0 65 78 43 72 69 73 69 73 6d 65 72 67 65 28 70 2c  exCrisismerge(p,
1f9d0 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74   &pStruct);.  ft
1f9e0 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65  s5StructureWrite
1f9f0 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  (p, pStruct);.  
1fa00 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1fa10 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 7d  ease(pStruct);.}
1fa20 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e  ../*.** Flush an
1fa30 79 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  y data stored in
1fa40 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68   the in-memory h
1fa50 61 73 68 20 74 61 62 6c 65 73 20 74 6f 20 74 68  ash tables to th
1fa60 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73  e database..*/.s
1fa70 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1fa80 6e 64 65 78 46 6c 75 73 68 28 46 74 73 35 49 6e  ndexFlush(Fts5In
1fa90 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e  dex *p){.  /* Un
1faa0 6c 65 73 73 20 69 74 20 69 73 20 65 6d 70 74 79  less it is empty
1fab0 2c 20 66 6c 75 73 68 20 74 68 65 20 68 61 73 68  , flush the hash
1fac0 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a   table to disk *
1fad0 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64  /.  if( p->nPend
1fae0 69 6e 67 44 61 74 61 20 29 7b 0a 20 20 20 20 61  ingData ){.    a
1faf0 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68 20  ssert( p->pHash 
1fb00 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69  );.    p->nPendi
1fb10 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20  ngData = 0;.    
1fb20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68  fts5FlushOneHash
1fb30 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 69 6e 74  (p);.  }.}...int
1fb40 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
1fb50 78 4f 70 74 69 6d 69 7a 65 28 46 74 73 35 49 6e  xOptimize(Fts5In
1fb60 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
1fb70 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1fb80 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  t;.  Fts5Structu
1fb90 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20  re *pNew = 0;.  
1fba0 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 0a 0a 20  int nSeg = 0;.. 
1fbb0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
1fbc0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
1fbd0 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70 29  ts5IndexFlush(p)
1fbe0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
1fbf0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
1fc00 70 29 3b 0a 0a 20 20 69 66 28 20 70 53 74 72 75  p);..  if( pStru
1fc10 63 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ct ){.    assert
1fc20 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ( pStruct->nSegm
1fc30 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74 75  ent==fts5Structu
1fc40 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28  reCountSegments(
1fc50 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20 20  pStruct) );.    
1fc60 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e  nSeg = pStruct->
1fc70 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 66  nSegment;.    if
1fc80 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20 20 20 20  ( nSeg>1 ){.    
1fc90 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69    int nByte = si
1fca0 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
1fcb0 72 65 29 3b 0a 20 20 20 20 20 20 6e 42 79 74 65  re);.      nByte
1fcc0 20 2b 3d 20 28 70 53 74 72 75 63 74 2d 3e 6e 4c   += (pStruct->nL
1fcd0 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a 65 6f 66  evel+1) * sizeof
1fce0 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65  (Fts5StructureLe
1fcf0 76 65 6c 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  vel);.      pNew
1fd00 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
1fd10 65 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  e*)sqlite3Fts5Ma
1fd20 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1fd30 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20   nByte);.    }. 
1fd40 20 7d 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b   }.  if( pNew ){
1fd50 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
1fd60 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20  reLevel *pLvl;. 
1fd70 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e     int nByte = n
1fd80 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74 73  Seg * sizeof(Fts
1fd90 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1fda0 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 4c  t);.    pNew->nL
1fdb0 65 76 65 6c 20 3d 20 70 53 74 72 75 63 74 2d 3e  evel = pStruct->
1fdc0 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20 20 70 4e  nLevel+1;.    pN
1fdd0 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
1fde0 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74 65 43 6f    pNew->nWriteCo
1fdf0 75 6e 74 65 72 20 3d 20 70 53 74 72 75 63 74 2d  unter = pStruct-
1fe00 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a  >nWriteCounter;.
1fe10 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 4e 65 77      pLvl = &pNew
1fe20 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72 75 63 74  ->aLevel[pStruct
1fe30 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 70  ->nLevel];.    p
1fe40 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28 46 74 73  Lvl->aSeg = (Fts
1fe50 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
1fe60 74 2a 29 73 71 6c 69 74 65 33 46 74 73 35 4d 61  t*)sqlite3Fts5Ma
1fe70 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e 72 63 2c  llocZero(&p->rc,
1fe80 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
1fe90 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29 7b 0a 20   pLvl->aSeg ){. 
1fea0 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69       int iLvl, i
1feb0 53 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Seg;.      int i
1fec0 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20 20 20 20  SegOut = 0;.    
1fed0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1fee0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1fef0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1ff00 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
1ff10 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
1ff20 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
1ff30 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
1ff40 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 5b       pLvl->aSeg[
1ff50 69 53 65 67 4f 75 74 5d 20 3d 20 70 53 74 72 75  iSegOut] = pStru
1ff60 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1ff70 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20  .aSeg[iSeg];.   
1ff80 20 20 20 20 20 20 20 69 53 65 67 4f 75 74 2b 2b         iSegOut++
1ff90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ffa0 20 20 7d 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e    }.      pNew->
1ffb0 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c 76 6c 2d  nSegment = pLvl-
1ffc0 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b 0a 20 20  >nSeg = nSeg;.  
1ffd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
1ffe0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
1fff0 29 3b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  );.      pNew = 
20000 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
20010 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
20020 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e 65 77 2d  int iLvl = pNew-
20030 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20 20 20 77  >nLevel-1;.    w
20040 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  hile( p->rc==SQL
20050 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65 77 2d 3e  ITE_OK && pNew->
20060 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
20070 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  g>0 ){.      int
20080 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f 4f 50 54   nRem = FTS5_OPT
20090 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
200a0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
200b0 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65 77 2c 20  Level(p, &pNew, 
200c0 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20  iLvl, &nRem);.  
200d0 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 53 74 72    }..    fts5Str
200e0 75 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70  uctureWrite(p, p
200f0 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 53 74  New);.    fts5St
20100 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
20110 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73  New);.  }..  fts
20120 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
20130 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65  e(pStruct);.  re
20140 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
20150 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 69 6e 74  turn(p); .}..int
20160 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
20170 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65 78  xMerge(Fts5Index
20180 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65 29   *p, int nMerge)
20190 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
201a0 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a 20 20 70  e *pStruct;..  p
201b0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
201c0 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
201d0 20 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20   if( pStruct && 
201e0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20  pStruct->nLevel 
201f0 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  ){.    fts5Index
20200 4d 65 72 67 65 28 70 2c 20 26 70 53 74 72 75 63  Merge(p, &pStruc
20210 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20 20 20 20  t, nMerge);.    
20220 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
20230 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  te(p, pStruct);.
20240 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74    }.  fts5Struct
20250 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
20260 63 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 66  ct);..  return f
20270 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
20280 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
20290 64 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  d fts5PoslistCal
202a0 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
202b0 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
202c0 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75  pCtx, .  const u
202d0 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
202e0 43 68 75 6e 6b 0a 29 7b 0a 20 20 66 74 73 35 42  Chunk.){.  fts5B
202f0 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
20300 26 70 2d 3e 72 63 2c 20 28 46 74 73 35 42 75 66  &p->rc, (Fts5Buf
20310 66 65 72 2a 29 70 43 74 78 2c 20 6e 43 68 75 6e  fer*)pCtx, nChun
20320 6b 2c 20 70 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f  k, pChunk);.}../
20330 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70 49  *.** Iterator pI
20340 74 65 72 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ter currently po
20350 69 6e 74 73 20 74 6f 20 61 20 76 61 6c 69 64 20  ints to a valid 
20360 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e  entry (not EOF).
20370 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
20380 6e 20 61 70 70 65 6e 64 73 20 74 68 65 20 70 6f  n appends the po
20390 73 69 74 69 6f 6e 20 6c 69 73 74 20 64 61 74 61  sition list data
203a0 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
203b0 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66   entry to.** buf
203c0 66 65 72 20 70 42 75 66 2e 20 49 74 20 64 6f 65  fer pBuf. It doe
203d0 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70  s not make a cop
203e0 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  y of the positio
203f0 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66  n-list size.** f
20400 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
20410 76 6f 69 64 20 66 74 73 35 53 65 67 69 74 65 72  void fts5Segiter
20420 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49  Poslist(.  Fts5I
20430 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
20440 65 67 49 74 65 72 20 2a 70 53 65 67 2c 0a 20 20  egIter *pSeg,.  
20450 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
20460 0a 29 7b 0a 20 20 66 74 73 35 43 68 75 6e 6b 49  .){.  fts5ChunkI
20470 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20  terate(p, pSeg, 
20480 28 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73  (void*)pBuf, fts
20490 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
204a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  );.}../*.** Iter
204b0 61 74 6f 72 20 70 4d 75 6c 74 69 20 63 75 72 72  ator pMulti curr
204c0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
204d0 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e  a valid entry (n
204e0 6f 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a  ot EOF). This.**
204f0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
20500 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
20510 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66  position-list of
20520 20 74 68 65 20 65 6e 74 72 79 20 70 4d 75 6c 74   the entry pMult
20530 69 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  i .** currently 
20540 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 62 75 66  points to to buf
20550 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20  fer pBuf..**.** 
20560 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
20570 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
20580 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e  e is left in p->
20590 72 63 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  rc. It is assume
205a0 64 0a 2a 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61  d.** no error ha
205b0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
205c0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
205d0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
205e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
205f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73  fts5MultiIterPos
20600 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65  list(.  Fts5Inde
20610 78 20 2a 70 2c 0a 20 20 46 74 73 35 49 6e 64 65  x *p,.  Fts5Inde
20620 78 49 74 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20  xIter *pMulti,. 
20630 20 69 6e 74 20 62 53 7a 2c 20 20 20 20 20 20 20   int bSz,       
20640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20650 20 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 7a   /* Append a siz
20660 65 20 66 69 65 6c 64 20 62 65 66 6f 72 65 20 74  e field before t
20670 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 46 74 73  he data */.  Fts
20680 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b  5Buffer *pBuf.){
20690 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
206a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
206b0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
206c0 20 3d 20 26 70 4d 75 6c 74 69 2d 3e 61 53 65 67   = &pMulti->aSeg
206d0 5b 20 70 4d 75 6c 74 69 2d 3e 61 46 69 72 73 74  [ pMulti->aFirst
206e0 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
206f0 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4d 75    assert( fts5Mu
20700 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 4d  ltiIterEof(p, pM
20710 75 6c 74 69 29 3d 3d 30 20 29 3b 0a 0a 20 20 20  ulti)==0 );..   
20720 20 69 66 28 20 62 53 7a 20 29 7b 0a 20 20 20 20   if( bSz ){.    
20730 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
20740 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 66  TSIZE */.      f
20750 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
20760 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 70 42  arint(&p->rc, pB
20770 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2a 32  uf, pSeg->nPos*2
20780 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
20790 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28  5SegiterPoslist(
207a0 70 2c 20 70 53 65 67 2c 20 70 42 75 66 29 3b 0a  p, pSeg, pBuf);.
207b0 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
207c0 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74  id fts5DoclistIt
207d0 65 72 4e 65 78 74 28 46 74 73 35 44 6f 63 6c 69  erNext(Fts5Docli
207e0 73 74 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  stIter *pIter){.
207f0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 3c 70    if( pIter->i<p
20800 49 74 65 72 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  Iter->n ){.    i
20810 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20 20 69  nt bDummy;.    i
20820 66 28 20 70 49 74 65 72 2d 3e 69 20 29 7b 0a 20  f( pIter->i ){. 
20830 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b       i64 iDelta;
20840 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20  .      pIter->i 
20850 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
20860 28 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72  (&pIter->a[pIter
20870 2d 3e 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  ->i], (u64*)&iDe
20880 6c 74 61 29 3b 0a 20 20 20 20 20 20 70 49 74 65  lta);.      pIte
20890 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
208a0 6c 74 61 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  lta;.    }else{.
208b0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b        pIter->i +
208c0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
208d0 26 70 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d  &pIter->a[pIter-
208e0 3e 69 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  >i], (u64*)&pIte
208f0 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
20900 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 20 2b  }.    pIter->i +
20910 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
20920 53 69 7a 65 28 0a 20 20 20 20 20 20 20 20 26 70  Size(.        &p
20930 49 74 65 72 2d 3e 61 5b 70 49 74 65 72 2d 3e 69  Iter->a[pIter->i
20940 5d 2c 20 26 70 49 74 65 72 2d 3e 6e 50 6f 73 6c  ], &pIter->nPosl
20950 69 73 74 2c 20 26 62 44 75 6d 6d 79 0a 20 20 20  ist, &bDummy.   
20960 20 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 61   );.    pIter->a
20970 50 6f 73 6c 69 73 74 20 3d 20 26 70 49 74 65 72  Poslist = &pIter
20980 2d 3e 61 5b 70 49 74 65 72 2d 3e 69 5d 3b 0a 20  ->a[pIter->i];. 
20990 20 20 20 70 49 74 65 72 2d 3e 69 20 2b 3d 20 70     pIter->i += p
209a0 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b 0a  Iter->nPoslist;.
209b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 74    }else{.    pIt
209c0 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30  er->aPoslist = 0
209d0 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
209e0 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
209f0 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
20a00 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20  Buffer *pBuf, . 
20a10 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
20a20 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d   *pIter.){.  mem
20a30 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
20a40 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
20a50 20 70 49 74 65 72 2d 3e 61 20 3d 20 70 42 75 66   pIter->a = pBuf
20a60 2d 3e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 6e 20  ->p;.  pIter->n 
20a70 3d 20 70 42 75 66 2d 3e 6e 3b 0a 20 20 66 74 73  = pBuf->n;.  fts
20a80 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
20a90 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pIter);.}../*.*
20aa0 2a 20 41 70 70 65 6e 64 20 61 20 64 6f 63 6c 69  * Append a docli
20ab0 73 74 20 74 6f 20 62 75 66 66 65 72 20 70 42 75  st to buffer pBu
20ac0 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  f..*/.static voi
20ad0 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  d fts5MergeAppen
20ae0 64 44 6f 63 69 64 28 0a 20 20 69 6e 74 20 2a 70  dDocid(.  int *p
20af0 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
20b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
20b10 4f 55 54 3a 20 45 72 72 6f 72 20 63 6f 64 65 20  OUT: Error code 
20b20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
20b30 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
20b40 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
20b50 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
20b60 69 36 34 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  i64 *piLastRowid
20b70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20b80 2f 2a 20 49 4e 2f 4f 55 54 3a 20 50 72 65 76 69  /* IN/OUT: Previ
20b90 6f 75 73 20 72 6f 77 69 64 20 77 72 69 74 74 65  ous rowid writte
20ba0 6e 20 28 69 66 20 61 6e 79 29 20 2a 2f 0a 20 20  n (if any) */.  
20bb0 69 36 34 20 69 52 6f 77 69 64 20 20 20 20 20 20  i64 iRowid      
20bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20bd0 2f 2a 20 52 6f 77 69 64 20 74 6f 20 61 70 70 65  /* Rowid to appe
20be0 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  nd */.){.  if( p
20bf0 42 75 66 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  Buf->n==0 ){.   
20c00 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
20c10 64 56 61 72 69 6e 74 28 70 52 63 2c 20 70 42 75  dVarint(pRc, pBu
20c20 66 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 7d 65  f, iRowid);.  }e
20c30 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 42 75 66  lse{.    fts5Buf
20c40 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
20c50 70 52 63 2c 20 70 42 75 66 2c 20 69 52 6f 77 69  pRc, pBuf, iRowi
20c60 64 20 2d 20 2a 70 69 4c 61 73 74 52 6f 77 69 64  d - *piLastRowid
20c70 29 3b 0a 20 20 7d 0a 20 20 2a 70 69 4c 61 73 74  );.  }.  *piLast
20c80 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
20c90 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 73  }../*.** Buffers
20ca0 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e 74 61   p1 and p2 conta
20cb0 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54 68 69  in doclists. Thi
20cc0 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72 67 65  s function merge
20cd0 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a  s the content.**
20ce0 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f 63 6c   of the two docl
20cf0 69 73 74 73 20 74 6f 67 65 74 68 65 72 20 61 6e  ists together an
20d00 64 20 73 65 74 73 20 62 75 66 66 65 72 20 70 31  d sets buffer p1
20d10 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 62   to the result b
20d20 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69  efore.** returni
20d30 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
20d40 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
20d50 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
20d60 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20 49 66  eft in p->rc. If
20d70 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a 2a 2a   an error has.**
20d80 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
20d90 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
20da0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
20db0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
20dc0 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73  MergePrefixLists
20dd0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
20de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20df0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
20e00 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  end object */.  
20e10 46 74 73 35 42 75 66 66 65 72 20 2a 70 31 2c 20  Fts5Buffer *p1, 
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20 74 6f  /* First list to
20e40 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74 73 35   merge */.  Fts5
20e50 42 75 66 66 65 72 20 2a 70 32 20 20 20 20 20 20  Buffer *p2      
20e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
20e70 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20 6d 65  econd list to me
20e80 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  rge */.){.  if( 
20e90 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69 36 34  p2->n ){.    i64
20ea0 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
20eb0 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69 73 74  .    Fts5Doclist
20ec0 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46 74 73  Iter i1;.    Fts
20ed0 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69 32 3b  5DoclistIter i2;
20ee0 0a 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20  .    Fts5Buffer 
20ef0 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42 75 66  out;.    Fts5Buf
20f00 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d 65 6d  fer tmp;.    mem
20f10 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73 69 7a  set(&out, 0, siz
20f20 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20 20 6d  eof(out));.    m
20f30 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c 20 73  emset(&tmp, 0, s
20f40 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a 20 20  izeof(tmp));..  
20f50 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65    fts5DoclistIte
20f60 72 49 6e 69 74 28 70 31 2c 20 26 69 31 29 3b 0a  rInit(p1, &i1);.
20f70 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49      fts5DoclistI
20f80 74 65 72 49 6e 69 74 28 70 32 2c 20 26 69 32 29  terInit(p2, &i2)
20f90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  ;.    while( p->
20fa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20fb0 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 21 3d 30   (i1.aPoslist!=0
20fc0 20 7c 7c 20 69 32 2e 61 50 6f 73 6c 69 73 74 21   || i2.aPoslist!
20fd0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  =0) ){.      if(
20fe0 20 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20   i2.aPoslist==0 
20ff0 7c 7c 20 28 69 31 2e 61 50 6f 73 6c 69 73 74 20  || (i1.aPoslist 
21000 26 26 20 69 31 2e 69 52 6f 77 69 64 3c 69 32 2e  && i1.iRowid<i2.
21010 69 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 20  iRowid) ){.     
21020 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
21030 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20 20 20 20   from i1 */.    
21040 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
21050 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e 72 63 2c  endDocid(&p->rc,
21060 20 26 6f 75 74 2c 20 26 69 4c 61 73 74 52 6f 77   &out, &iLastRow
21070 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b 0a  id, i1.iRowid);.
21080 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45          /* WRITE
21090 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20  POSLISTSIZE */. 
210a0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
210b0 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
210c0 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e  ->rc, &out, i1.n
210d0 50 6f 73 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20  Poslist * 2);.  
210e0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
210f0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
21100 63 2c 20 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73  c, &out, i1.nPos
21110 6c 69 73 74 2c 20 69 31 2e 61 50 6f 73 6c 69 73  list, i1.aPoslis
21120 74 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  t);.        fts5
21130 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
21140 26 69 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  &i1);.      }.  
21150 20 20 20 20 65 6c 73 65 20 69 66 28 20 69 31 2e      else if( i1.
21160 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69  aPoslist==0 || i
21170 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e 69 52 6f  2.iRowid!=i1.iRo
21180 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  wid ){.        /
21190 2a 20 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f  * Copy entry fro
211a0 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20 20 20 20  m i2 */.        
211b0 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44  fts5MergeAppendD
211c0 6f 63 69 64 28 26 70 2d 3e 72 63 2c 20 26 6f 75  ocid(&p->rc, &ou
211d0 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c 20  t, &iLastRowid, 
211e0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
211f0 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
21200 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
21210 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
21220 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
21230 2c 20 26 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c  , &out, i2.nPosl
21240 69 73 74 20 2a 20 32 29 3b 0a 20 20 20 20 20 20  ist * 2);.      
21250 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
21260 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26  ndBlob(&p->rc, &
21270 6f 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74  out, i2.nPoslist
21280 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  , i2.aPoslist);.
21290 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c          fts5Docl
212a0 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29  istIterNext(&i2)
212b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
212c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 46 74  else{.        Ft
212d0 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20  s5PoslistReader 
212e0 72 31 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35  r1;.        Fts5
212f0 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 72 32  PoslistReader r2
21300 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35 50 6f  ;.        Fts5Po
21310 73 6c 69 73 74 57 72 69 74 65 72 20 77 72 69 74  slistWriter writ
21320 65 72 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d  er;..        mem
21330 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c 20  set(&writer, 0, 
21340 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29 3b  sizeof(writer));
21350 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 72  ..        /* Mer
21360 67 65 20 74 68 65 20 74 77 6f 20 70 6f 73 69 74  ge the two posit
21370 69 6f 6e 20 6c 69 73 74 73 2e 20 2a 2f 20 0a 20  ion lists. */ . 
21380 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
21390 41 70 70 65 6e 64 44 6f 63 69 64 28 26 70 2d 3e  AppendDocid(&p->
213a0 72 63 2c 20 26 6f 75 74 2c 20 26 69 4c 61 73 74  rc, &out, &iLast
213b0 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64  Rowid, i2.iRowid
213c0 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
213d0 75 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b  ufferZero(&tmp);
213e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
213f0 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65  Fts5PoslistReade
21400 72 49 6e 69 74 28 2d 31 2c 20 69 31 2e 61 50 6f  rInit(-1, i1.aPo
21410 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f 73 6c 69  slist, i1.nPosli
21420 73 74 2c 20 26 72 31 29 3b 0a 20 20 20 20 20 20  st, &r1);.      
21430 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
21440 6c 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d  listReaderInit(-
21450 31 2c 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20  1, i2.aPoslist, 
21460 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 72 32  i2.nPoslist, &r2
21470 29 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  );.        while
21480 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
21490 4f 4b 20 26 26 20 28 72 31 2e 62 45 6f 66 3d 3d  OK && (r1.bEof==
214a0 30 20 7c 7c 20 72 32 2e 62 45 6f 66 3d 3d 30 29  0 || r2.bEof==0)
214b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36   ){.          i6
214c0 34 20 69 4e 65 77 3b 0a 20 20 20 20 20 20 20 20  4 iNew;.        
214d0 20 20 69 66 28 20 72 32 2e 62 45 6f 66 20 7c 7c    if( r2.bEof ||
214e0 20 28 72 31 2e 62 45 6f 66 3d 3d 30 20 26 26 20   (r1.bEof==0 && 
214f0 72 31 2e 69 50 6f 73 3c 72 32 2e 69 50 6f 73 29  r1.iPos<r2.iPos)
21500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21510 69 4e 65 77 20 3d 20 72 31 2e 69 50 6f 73 3b 0a  iNew = r1.iPos;.
21520 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
21530 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
21540 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b 0a 20  aderNext(&r1);. 
21550 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
21560 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 65 77              iNew
21570 20 3d 20 72 32 2e 69 50 6f 73 3b 0a 20 20 20 20   = r2.iPos;.    
21580 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
21590 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
215a0 4e 65 78 74 28 26 72 32 29 3b 0a 20 20 20 20 20  Next(&r2);.     
215b0 20 20 20 20 20 20 20 69 66 28 20 72 31 2e 69 50         if( r1.iP
215c0 6f 73 3d 3d 72 32 2e 69 50 6f 73 20 29 20 73 71  os==r2.iPos ) sq
215d0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
215e0 52 65 61 64 65 72 4e 65 78 74 28 26 72 31 29 3b  ReaderNext(&r1);
215f0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
21600 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73         p->rc = s
21610 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
21620 74 57 72 69 74 65 72 41 70 70 65 6e 64 28 26 74  tWriterAppend(&t
21630 6d 70 2c 20 26 77 72 69 74 65 72 2c 20 69 4e 65  mp, &writer, iNe
21640 77 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  w);.        }.. 
21650 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50         /* WRITEP
21660 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20  OSLISTSIZE */.  
21670 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21680 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
21690 3e 72 63 2c 20 26 6f 75 74 2c 20 74 6d 70 2e 6e  >rc, &out, tmp.n
216a0 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66   * 2);.        f
216b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42  ts5BufferAppendB
216c0 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 6f 75 74  lob(&p->rc, &out
216d0 2c 20 74 6d 70 2e 6e 2c 20 74 6d 70 2e 70 29 3b  , tmp.n, tmp.p);
216e0 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
216f0 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 31  listIterNext(&i1
21700 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
21710 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
21720 69 32 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i2);.      }.   
21730 20 7d 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66   }..    fts5Buff
21740 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31  erSet(&p->rc, p1
21750 2c 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b  , out.n, out.p);
21760 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
21770 72 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66  ree(&tmp);.    f
21780 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f  ts5BufferFree(&o
21790 75 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ut);.  }.}..stat
217a0 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
217b0 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65  erSwap(Fts5Buffe
217c0 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65  r *p1, Fts5Buffe
217d0 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75  r *p2){.  Fts5Bu
217e0 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a  ffer tmp = *p1;.
217f0 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a    *p1 = *p2;.  *
21800 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61  p2 = tmp;.}..sta
21810 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 74  tic void fts5Set
21820 75 70 50 72 65 66 69 78 49 74 65 72 28 0a 20 20  upPrefixIter(.  
21830 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
21840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21850 2f 2a 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64  /* Index to read
21860 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62   from */.  int b
21870 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20 20  Desc,           
21880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
21890 75 65 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59  ue for "ORDER BY
218a0 20 72 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a   rowid DESC" */.
218b0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b    const u8 *pTok
218c0 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
218d0 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74    /* Buffer cont
218e0 61 69 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f  aining prefix to
218f0 20 6d 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20   match */.  int 
21900 6e 54 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20  nToken,         
21910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
21920 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 54  ize of buffer pT
21930 6f 6b 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f  oken in bytes */
21940 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
21950 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20 20 20   **ppIter       
21960 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65 72  /* OUT: New iter
21970 61 74 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ator */.){.  Fts
21980 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
21990 75 63 74 3b 0a 20 20 46 74 73 35 42 75 66 66 65  uct;.  Fts5Buffe
219a0 72 20 2a 61 42 75 66 3b 0a 20 20 63 6f 6e 73 74  r *aBuf;.  const
219b0 20 69 6e 74 20 6e 42 75 66 20 3d 20 33 32 3b 0a   int nBuf = 32;.
219c0 0a 20 20 61 42 75 66 20 3d 20 28 46 74 73 35 42  .  aBuf = (Fts5B
219d0 75 66 66 65 72 2a 29 66 74 73 35 49 64 78 4d 61  uffer*)fts5IdxMa
219e0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
219f0 74 73 35 42 75 66 66 65 72 29 2a 6e 42 75 66 29  ts5Buffer)*nBuf)
21a00 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
21a10 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
21a20 70 29 3b 0a 0a 20 20 69 66 28 20 61 42 75 66 20  p);..  if( aBuf 
21a30 26 26 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20  && pStruct ){.  
21a40 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
21a50 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
21a60 45 52 59 5f 53 43 41 4e 3b 0a 20 20 20 20 69 6e  ERY_SCAN;.    in
21a70 74 20 69 3b 0a 20 20 20 20 69 36 34 20 69 4c 61  t i;.    i64 iLa
21a80 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20  stRowid = 0;.   
21a90 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
21aa0 70 31 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 49  p1 = 0;     /* I
21ab0 74 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20  terator used to 
21ac0 67 61 74 68 65 72 20 64 61 74 61 20 66 72 6f 6d  gather data from
21ad0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 46 74   index */.    Ft
21ae0 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
21af0 20 20 20 46 74 73 35 42 75 66 66 65 72 20 64 6f     Fts5Buffer do
21b00 63 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73  clist;..    mems
21b10 65 74 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20  et(&doclist, 0, 
21b20 73 69 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29  sizeof(doclist))
21b30 3b 0a 20 20 20 20 66 6f 72 28 66 74 73 35 4d 75  ;.    for(fts5Mu
21b40 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
21b50 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c  truct, 1, flags,
21b60 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
21b70 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20   -1, 0, &p1);.  
21b80 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
21b90 74 65 72 45 6f 66 28 70 2c 20 70 31 29 3d 3d 30  terEof(p, p1)==0
21ba0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  ;.        fts5Mu
21bb0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
21bc0 31 2c 20 30 2c 20 30 29 0a 20 20 20 20 29 7b 0a  1, 0, 0).    ){.
21bd0 20 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64        i64 iRowid
21be0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
21bf0 52 6f 77 69 64 28 70 31 29 3b 0a 20 20 20 20 20  Rowid(p1);.     
21c00 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20 20   int nTerm;.    
21c10 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72    const u8 *pTer
21c20 6d 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  m = fts5MultiIte
21c30 72 54 65 72 6d 28 70 31 2c 20 26 6e 54 65 72 6d  rTerm(p1, &nTerm
21c40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21c50 20 6d 65 6d 63 6d 70 28 70 54 6f 6b 65 6e 2c 20   memcmp(pToken, 
21c60 70 54 65 72 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65  pTerm, MIN(nToke
21c70 6e 2c 20 6e 54 65 72 6d 29 29 3c 3d 30 20 29 3b  n, nTerm))<=0 );
21c80 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
21c90 3c 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d  <nToken || memcm
21ca0 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c  p(pToken, pTerm,
21cb0 20 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b   nToken) ) break
21cc0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 64 6f 63  ;..      if( doc
21cd0 6c 69 73 74 2e 6e 3e 30 20 26 26 20 69 52 6f 77  list.n>0 && iRow
21ce0 69 64 3c 3d 69 4c 61 73 74 52 6f 77 69 64 20 29  id<=iLastRowid )
21cf0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
21d00 30 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  0; p->rc==SQLITE
21d10 5f 4f 4b 20 26 26 20 64 6f 63 6c 69 73 74 2e 6e  _OK && doclist.n
21d20 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21d30 20 20 61 73 73 65 72 74 28 20 69 3c 6e 42 75 66    assert( i<nBuf
21d40 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
21d50 28 20 61 42 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29  ( aBuf[i].n==0 )
21d60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
21d70 73 35 42 75 66 66 65 72 53 77 61 70 28 26 64 6f  s5BufferSwap(&do
21d80 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
21d90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
21da0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 64 6f  s5BufferZero(&do
21db0 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  clist);.        
21dc0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
21dd0 20 20 20 20 20 66 74 73 35 4d 65 72 67 65 50 72       fts5MergePr
21de0 65 66 69 78 4c 69 73 74 73 28 70 2c 20 26 64 6f  efixLists(p, &do
21df0 63 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29  clist, &aBuf[i])
21e00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  ;.            ft
21e10 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 61 42  s5BufferZero(&aB
21e20 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  uf[i]);.        
21e30 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
21e40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73      }..      fts
21e50 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69  5MergeAppendDoci
21e60 64 28 26 70 2d 3e 72 63 2c 20 26 64 6f 63 6c 69  d(&p->rc, &docli
21e70 73 74 2c 20 26 69 4c 61 73 74 52 6f 77 69 64 2c  st, &iLastRowid,
21e80 20 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20   iRowid);.      
21e90 66 74 73 35 4d 75 6c 74 69 49 74 65 72 50 6f 73  fts5MultiIterPos
21ea0 6c 69 73 74 28 70 2c 20 70 31 2c 20 31 2c 20 26  list(p, p1, 1, &
21eb0 64 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  doclist);.    }.
21ec0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
21ed0 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
21ee0 20 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69    fts5MergePrefi
21ef0 78 4c 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69  xLists(p, &docli
21f00 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20  st, &aBuf[i]);. 
21f10 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46       fts5BufferF
21f20 72 65 65 28 26 61 42 75 66 5b 69 5d 29 3b 0a 20  ree(&aBuf[i]);. 
21f30 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c     }.    fts5Mul
21f40 74 69 49 74 65 72 46 72 65 65 28 70 2c 20 70 31  tiIterFree(p, p1
21f50 29 3b 0a 0a 20 20 20 20 70 44 61 74 61 20 3d 20  );..    pData = 
21f60 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
21f70 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74 61   sizeof(Fts5Data
21f80 29 20 2b 20 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a  ) + doclist.n);.
21f90 20 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b      if( pData ){
21fa0 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 70 20  .      pData->p 
21fb0 3d 20 28 75 38 2a 29 26 70 44 61 74 61 5b 31 5d  = (u8*)&pData[1]
21fc0 3b 0a 20 20 20 20 20 20 70 44 61 74 61 2d 3e 6e  ;.      pData->n
21fd0 20 3d 20 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20   = doclist.n;.  
21fe0 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
21ff0 2d 3e 70 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20  ->p, doclist.p, 
22000 64 6f 63 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20  doclist.n);.    
22010 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
22020 65 77 32 28 70 2c 20 70 44 61 74 61 2c 20 62 44  ew2(p, pData, bD
22030 65 73 63 2c 20 70 70 49 74 65 72 29 3b 0a 20 20  esc, ppIter);.  
22040 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66    }.    fts5Buff
22050 65 72 46 72 65 65 28 26 64 6f 63 6c 69 73 74 29  erFree(&doclist)
22060 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 74 72  ;.  }..  fts5Str
22070 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
22080 74 72 75 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  truct);.  sqlite
22090 33 5f 66 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a  3_free(aBuf);.}.
220a0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65  ../*.** Indicate
220b0 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65 71   that all subseq
220c0 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
220d0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 57 72  lite3Fts5IndexWr
220e0 69 74 65 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a  ite() pertain.**
220f0 20 74 6f 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   to the document
22100 20 77 69 74 68 20 72 6f 77 69 64 20 69 52 6f 77   with rowid iRow
22110 69 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  id..*/.int sqlit
22120 65 33 46 74 73 35 49 6e 64 65 78 42 65 67 69 6e  e3Fts5IndexBegin
22130 57 72 69 74 65 28 46 74 73 35 49 6e 64 65 78 20  Write(Fts5Index 
22140 2a 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b  *p, i64 iRowid){
22150 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
22160 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a  ==SQLITE_OK );..
22170 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
22180 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 66 20  e hash table if 
22190 69 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61  it has not alrea
221a0 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
221b0 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 48  d */.  if( p->pH
221c0 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d  ash==0 ){.    p-
221d0 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
221e0 35 48 61 73 68 4e 65 77 28 26 70 2d 3e 70 48 61  5HashNew(&p->pHa
221f0 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64 69 6e 67  sh, &p->nPending
22200 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Data);.  }..  /*
22210 20 46 6c 75 73 68 20 74 68 65 20 68 61 73 68 20   Flush the hash 
22220 74 61 62 6c 65 20 74 6f 20 64 69 73 6b 20 69 66  table to disk if
22230 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69   required */.  i
22240 66 28 20 69 52 6f 77 69 64 3c 3d 70 2d 3e 69 57  f( iRowid<=p->iW
22250 72 69 74 65 52 6f 77 69 64 20 7c 7c 20 28 70 2d  riteRowid || (p-
22260 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20 3e 20  >nPendingData > 
22270 70 2d 3e 6e 4d 61 78 50 65 6e 64 69 6e 67 44 61  p->nMaxPendingDa
22280 74 61 29 20 29 7b 0a 20 20 20 20 66 74 73 35 49  ta) ){.    fts5I
22290 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
222a0 7d 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  }.  p->iWriteRow
222b0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72  id = iRowid;.  r
222c0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
222d0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
222e0 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61 20 74  ** Commit data t
222f0 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  o disk..*/.int s
22300 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
22310 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ync(Fts5Index *p
22320 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29 7b 0a  , int bCommit){.
22330 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d    assert( p->rc=
22340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
22350 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68 28 70  fts5IndexFlush(p
22360 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d 69 74  );.  if( bCommit
22370 20 29 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64   ) fts5CloseRead
22380 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  er(p);.  return 
22390 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
223a0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  p);.}../*.** Dis
223b0 63 61 72 64 20 61 6e 79 20 64 61 74 61 20 73 74  card any data st
223c0 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d  ored in the in-m
223d0 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65  emory hash table
223e0 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20  s. Do not write 
223f0 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  it.** to the dat
22400 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f 6e 61  abase. Additiona
22410 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74  lly, assume that
22420 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
22430 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74   the %_data.** t
22440 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 63 68  able may have ch
22450 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53  anged on disk. S
22460 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20  o any in-memory 
22470 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61 74 61  caches of %_data
22480 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d 75 73   .** records mus
22490 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  t be invalidated
224a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
224b0 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63  Fts5IndexRollbac
224c0 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b  k(Fts5Index *p){
224d0 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61 64  .  fts5CloseRead
224e0 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49 6e 64  er(p);.  fts5Ind
224f0 65 78 44 69 73 63 61 72 64 44 61 74 61 28 70 29  exDiscardData(p)
22500 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ;.  assert( p->r
22510 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
22520 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
22530 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
22540 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73   %_data table is
22550 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
22560 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  y when this func
22570 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
22580 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
22590 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69   populates it wi
225a0 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73  th the initial s
225b0 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73  tructure objects
225c0 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c   for each index,
225d0 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74  .** and the init
225e0 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ial version of t
225f0 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
22600 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74  cord (a zero-byt
22610 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20  e blob)..*/.int 
22620 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
22630 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78  Reinit(Fts5Index
22640 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
22650 63 74 75 72 65 20 73 3b 0a 0a 20 20 61 73 73 65  cture s;..  asse
22660 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
22670 45 5f 4f 4b 20 29 3b 0a 20 20 70 2d 3e 72 63 20  E_OK );.  p->rc 
22680 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  = sqlite3Fts5Ind
22690 65 78 53 65 74 41 76 65 72 61 67 65 73 28 70 2c  exSetAverages(p,
226a0 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 22 2c 20   (const u8*)"", 
226b0 30 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73  0);..  memset(&s
226c0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  , 0, sizeof(Fts5
226d0 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20 20 66  Structure));.  f
226e0 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
226f0 65 28 70 2c 20 26 73 29 3b 0a 0a 20 20 72 65 74  e(p, &s);..  ret
22700 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
22710 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
22720 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35   Open a new Fts5
22730 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66  Index handle. If
22740 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67   the bCreate arg
22750 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63  ument is true, c
22760 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  reate.** and ini
22770 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  tialize the unde
22780 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61  rlying %_data ta
22790 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ble..**.** If su
227a0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
227b0 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  p to point to th
227c0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
227d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
227e0 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  K..** Otherwise,
227f0 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
22800 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
22810 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
22820 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22830 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20  Fts5IndexOpen(. 
22840 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
22850 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72  nfig, .  int bCr
22860 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64  eate, .  Fts5Ind
22870 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20  ex **pp,.  char 
22880 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74  **pzErr.){.  int
22890 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
228a0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
228b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228c0 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
228d0 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d   */..  *pp = p =
228e0 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c   (Fts5Index*)sql
228f0 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
22900 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46  ro(&rc, sizeof(F
22910 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66  ts5Index));.  if
22920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22930 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69  ){.    p->pConfi
22940 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20  g = pConfig;.   
22950 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20   p->nWorkUnit = 
22960 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  FTS5_WORK_UNIT;.
22970 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69      p->nMaxPendi
22980 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31 30  ngData = 1024*10
22990 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  24;.    p->zData
229a0 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
229b0 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
229c0 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
229d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
229e0 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
229f0 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
22a00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
22a10 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
22a20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
22a30 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
22a40 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
22a50 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
22a60 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
22a70 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22a90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22aa0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
22ab0 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
22ac0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
22ad0 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
22ae0 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
22af0 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
22b00 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
22b10 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
22b20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22b30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22b40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
22b50 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
22b60 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
22b70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
22b80 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
22b90 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
22ba0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
22bb0 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
22bc0 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
22bd0 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
22be0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22bf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
22c00 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
22c10 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
22c20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
22c30 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
22c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22c50 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
22c60 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
22c70 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
22c80 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
22c90 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
22ca0 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  der==0 );.    sq
22cb0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22cc0 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
22cd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22ce0 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
22cf0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
22d00 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
22d10 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
22d20 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
22d30 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
22d40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22d50 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
22d60 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
22d70 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
22d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
22d90 35 42 75 66 66 65 72 46 72 65 65 28 26 70 2d 3e  5BufferFree(&p->
22da0 73 63 72 61 74 63 68 29 3b 0a 20 20 20 20 73 71  scratch);.    sq
22db0 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 44  lite3_free(p->zD
22dc0 61 74 61 54 62 6c 29 3b 0a 20 20 20 20 73 71 6c  ataTbl);.    sql
22dd0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
22de0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
22df0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
22e00 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62   p points to a b
22e10 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
22e20 20 75 74 66 2d 38 20 74 65 78 74 20 74 68 61 74   utf-8 text that
22e30 20 69 73 20 6e 20 62 79 74 65 73 20 69 6e 20 0a   is n bytes in .
22e40 2a 2a 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20  ** size. Return 
22e50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
22e60 74 65 73 20 69 6e 20 74 68 65 20 6e 43 68 61 72  tes in the nChar
22e70 20 63 68 61 72 61 63 74 65 72 20 70 72 65 66 69   character prefi
22e80 78 20 6f 66 20 74 68 65 0a 2a 2a 20 62 75 66 66  x of the.** buff
22e90 65 72 2c 20 6f 72 20 30 20 69 66 20 74 68 65 72  er, or 0 if ther
22ea0 65 20 61 72 65 20 6c 65 73 73 20 74 68 61 6e 20  e are less than 
22eb0 6e 43 68 61 72 20 63 68 61 72 61 63 74 65 72 73  nChar characters
22ec0 20 69 6e 20 74 6f 74 61 6c 2e 0a 2a 2f 0a 73 74   in total..*/.st
22ed0 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64  atic int fts5Ind
22ee0 65 78 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c  exCharlenToBytel
22ef0 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  en(const char *p
22f00 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 69 6e 74  , int nByte, int
22f10 20 6e 43 68 61 72 29 7b 0a 20 20 69 6e 74 20 6e   nChar){.  int n
22f20 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
22f30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68 61   for(i=0; i<nCha
22f40 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  r; i++){.    if(
22f50 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74 75   n>=nByte ) retu
22f60 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49 6e  rn 0;      /* In
22f70 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65 77  put contains few
22f80 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  er than nChar ch
22f90 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 28  ars */.    if( (
22fa0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 5b  unsigned char)p[
22fb0 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20 20  n++]>=0xc0 ){.  
22fc0 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e 5d      while( (p[n]
22fd0 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29   & 0xc0)==0x80 )
22fe0 20 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   n++;.    }.  }.
22ff0 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
23000 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54  *.** pIn is a UT
23010 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69  F-8 encoded stri
23020 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e  ng, nIn bytes in
23030 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68   size. Return th
23040 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75  e number of.** u
23050 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
23060 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e  s in the string.
23070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
23080 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
23090 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c  const char *pIn,
230a0 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74   int nIn){.  int
230b0 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20   nChar = 0;     
230c0 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20         .  int i 
230d0 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c  = 0;.  while( i<
230e0 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28  nIn ){.    if( (
230f0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 49  unsigned char)pI
23100 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  n[i++]>=0xc0 ){.
23110 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e        while( i<n
23120 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20  In && (pIn[i] & 
23130 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b  0xc0)==0x80 ) i+
23140 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68  +;.    }.    nCh
23150 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ar++;.  }.  retu
23160 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a  rn nChar;.}../*.
23170 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d  ** Insert or rem
23180 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66  ove data to or f
23190 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45  rom the index. E
231a0 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d  ach time a docum
231b0 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64  ent is .** added
231c0 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66   to or removed f
231d0 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74  rom the index, t
231e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
231f0 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  called one or mo
23200 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a  re.** times..**.
23210 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
23220 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
23230 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
23240 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
23250 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20  ew document..** 
23260 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
23270 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74   is a delete, it
23280 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
23290 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20  (at least) once 
232a0 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71  for each.** uniq
232b0 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ue token in the 
232c0 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  document with an
232d0 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73   iCol value less
232e0 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20   than zero. The 
232f0 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iPos.** argument
23300 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
23310 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74  a delete..*/.int
23320 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
23330 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e  xWrite(.  Fts5In
23340 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
23350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
23360 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  ex to write to *
23370 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
23380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23390 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
233a0 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28  ken appears in (
233b0 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a  -ve -> delete) *
233c0 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
233e0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
233f0 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
23400 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
23410 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
23420 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54  int nToken  /* T
23430 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72  oken to add or r
23440 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d  emove to or from
23450 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
23460 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
23470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23480 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
23490 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65  e through indexe
234a0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
234b0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
234c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
234d0 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43   code */.  Fts5C
234e0 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
234f0 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20   p->pConfig;..  
23500 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
23510 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f  QLITE_OK );..  /
23520 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72 79 20  * Add the entry 
23530 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d  to the main term
23540 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 72 63  s index. */.  rc
23550 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
23560 73 68 57 72 69 74 65 28 0a 20 20 20 20 20 20 70  shWrite(.      p
23570 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57 72 69  ->pHash, p->iWri
23580 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  teRowid, iCol, i
23590 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50  Pos, FTS5_MAIN_P
235a0 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c 20 6e  REFIX, pToken, n
235b0 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20 66 6f  Token.  );..  fo
235c0 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66 69 67  r(i=0; i<pConfig
235d0 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72 63 3d  ->nPrefix && rc=
235e0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
235f0 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  {.    int nByte 
23600 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c  = fts5IndexCharl
23610 65 6e 54 6f 42 79 74 65 6c 65 6e 28 70 54 6f 6b  enToBytelen(pTok
23620 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20 70 43 6f 6e  en, nToken, pCon
23630 66 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 29  fig->aPrefix[i])
23640 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20  ;.    if( nByte 
23650 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
23660 6c 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69  lite3Fts5HashWri
23670 74 65 28 70 2d 3e 70 48 61 73 68 2c 20 0a 20 20  te(p->pHash, .  
23680 20 20 20 20 20 20 20 20 70 2d 3e 69 57 72 69 74          p->iWrit
23690 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50  eRowid, iCol, iP
236a0 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  os, FTS5_MAIN_PR
236b0 45 46 49 58 2b 69 2b 31 2c 20 70 54 6f 6b 65 6e  EFIX+i+1, pToken
236c0 2c 20 6e 42 79 74 65 0a 20 20 20 20 20 20 29 3b  , nByte.      );
236d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
236e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
236f0 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 69 74 65  * Open a new ite
23700 72 61 74 6f 72 20 74 6f 20 69 74 65 72 61 74 65  rator to iterate
23710 20 74 68 6f 75 67 68 20 61 6c 6c 20 64 6f 63 69   though all doci
23720 64 73 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  ds that match th
23730 65 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  e .** specified 
23740 74 6f 6b 65 6e 20 6f 72 20 74 6f 6b 65 6e 20 70  token or token p
23750 72 65 66 69 78 2e 0a 2a 2f 0a 69 6e 74 20 73 71  refix..*/.int sq
23760 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51 75  lite3Fts5IndexQu
23770 65 72 79 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ery(.  Fts5Index
23780 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
23790 20 20 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e         /* FTS in
237a0 64 65 78 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  dex to query */.
237b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 54    const char *pT
237c0 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b 65 6e  oken, int nToken
237d0 2c 20 2f 2a 20 54 6f 6b 65 6e 20 28 6f 72 20 70  , /* Token (or p
237e0 72 65 66 69 78 29 20 74 6f 20 71 75 65 72 79 20  refix) to query 
237f0 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  for */.  int fla
23800 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
23810 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
23820 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f 51 55   of FTS5INDEX_QU
23830 45 52 59 5f 58 20 66 6c 61 67 73 20 2a 2f 0a 20  ERY_X flags */. 
23840 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
23850 2a 70 70 49 74 65 72 20 20 20 20 20 20 20 20 20  *ppIter         
23860 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 69 74 65   /* OUT: New ite
23870 72 61 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  rator object */.
23880 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
23890 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
238a0 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 49 6e 64  onfig;.  Fts5Ind
238b0 65 78 49 74 65 72 20 2a 70 52 65 74 20 3d 20 30  exIter *pRet = 0
238c0 3b 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30  ;.  int iIdx = 0
238d0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
238e0 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a  uf = {0, 0, 0};.
238f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 51 55 45  .  /* If the QUE
23900 52 59 5f 53 43 41 4e 20 66 6c 61 67 20 69 73 20  RY_SCAN flag is 
23910 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65 72 20 66  set, all other f
23920 6c 61 67 73 20 6d 75 73 74 20 62 65 20 63 6c 65  lags must be cle
23930 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ar. */.  assert(
23940 20 28 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e   (flags & FTS5IN
23950 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 29 3d  DEX_QUERY_SCAN)=
23960 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 28 66 6c  =0.       || (fl
23970 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
23980 51 55 45 52 59 5f 53 43 41 4e 29 3d 3d 46 54 53  QUERY_SCAN)==FTS
23990 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
239a0 4e 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 73 71  N.  );..  if( sq
239b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 47  lite3Fts5BufferG
239c0 72 6f 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  row(&p->rc, &buf
239d0 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20 29  , nToken+1)==0 )
239e0 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 62 75  {.    memcpy(&bu
239f0 66 2e 70 5b 31 5d 2c 20 70 54 6f 6b 65 6e 2c 20  f.p[1], pToken, 
23a00 6e 54 6f 6b 65 6e 29 3b 0a 0a 23 69 66 64 65 66  nToken);..#ifdef
23a10 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
23a20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
23a30 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54 45  S5INDEX_QUERY_TE
23a40 53 54 5f 4e 4f 49 44 58 20 29 7b 0a 20 20 20 20  ST_NOIDX ){.    
23a50 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 20    assert( flags 
23a60 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
23a70 59 5f 50 52 45 46 49 58 20 29 3b 0a 20 20 20 20  Y_PREFIX );.    
23a80 20 20 69 49 64 78 20 3d 20 31 2b 70 43 6f 6e 66    iIdx = 1+pConf
23a90 69 67 2d 3e 6e 50 72 65 66 69 78 3b 0a 20 20 20  ig->nPrefix;.   
23aa0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20   }else.#endif.  
23ab0 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 46 54    if( flags & FT
23ac0 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50 52  S5INDEX_QUERY_PR
23ad0 45 46 49 58 20 29 7b 0a 20 20 20 20 20 20 69 6e  EFIX ){.      in
23ae0 74 20 6e 43 68 61 72 20 3d 20 66 74 73 35 49 6e  t nChar = fts5In
23af0 64 65 78 43 68 61 72 6c 65 6e 28 70 54 6f 6b 65  dexCharlen(pToke
23b00 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 20 20 20 20  n, nToken);.    
23b10 20 20 66 6f 72 28 69 49 64 78 3d 31 3b 20 69 49    for(iIdx=1; iI
23b20 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  dx<=pConfig->nPr
23b30 65 66 69 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20  efix; iIdx++){. 
23b40 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6e 66         if( pConf
23b50 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 49 64 78  ig->aPrefix[iIdx
23b60 2d 31 5d 3d 3d 6e 43 68 61 72 20 29 20 62 72 65  -1]==nChar ) bre
23b70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
23b80 7d 0a 0a 20 20 20 20 69 66 28 20 69 49 64 78 3c  }..    if( iIdx<
23b90 3d 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  =pConfig->nPrefi
23ba0 78 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  x ){.      Fts5S
23bb0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
23bc0 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  t = fts5Structur
23bd0 65 52 65 61 64 28 70 29 3b 0a 20 20 20 20 20 20  eRead(p);.      
23be0 62 75 66 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f  buf.p[0] = FTS5_
23bf0 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49  MAIN_PREFIX + iI
23c00 64 78 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  dx;.      if( pS
23c10 74 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20  truct ){.       
23c20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
23c30 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20 31 2c  w(p, pStruct, 1,
23c40 20 66 6c 61 67 73 2c 20 62 75 66 2e 70 2c 20 6e   flags, buf.p, n
23c50 54 6f 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20  Token+1, -1, 0, 
23c60 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20 20 20  &pRet);.        
23c70 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
23c80 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
23c90 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
23ca0 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 65 73  {.      int bDes
23cb0 63 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54 53  c = (flags & FTS
23cc0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
23cd0 43 29 21 3d 30 3b 0a 20 20 20 20 20 20 62 75 66  C)!=0;.      buf
23ce0 2e 70 5b 30 5d 20 3d 20 46 54 53 35 5f 4d 41 49  .p[0] = FTS5_MAI
23cf0 4e 5f 50 52 45 46 49 58 3b 0a 20 20 20 20 20 20  N_PREFIX;.      
23d00 66 74 73 35 53 65 74 75 70 50 72 65 66 69 78 49  fts5SetupPrefixI
23d10 74 65 72 28 70 2c 20 62 44 65 73 63 2c 20 62 75  ter(p, bDesc, bu
23d20 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31 2c 20 26  f.p, nToken+1, &
23d30 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  pRet);.    }..  
23d40 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20    if( p->rc ){. 
23d50 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
23d60 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74 29 3b  IterClose(pRet);
23d70 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
23d80 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65  .      fts5Close
23d90 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d  Reader(p);.    }
23da0 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70  .    *ppIter = p
23db0 52 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Ret;.    sqlite3
23dc0 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  Fts5BufferFree(&
23dd0 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  buf);.  }.  retu
23de0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
23df0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
23e00 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
23e10 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
23e20 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
23e30 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45 4f  rgument is at EO
23e40 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  F..*/.int sqlite
23e50 33 46 74 73 35 49 74 65 72 45 6f 66 28 46 74 73  3Fts5IterEof(Fts
23e60 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65  5IndexIter *pIte
23e70 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49  r){.  assert( pI
23e80 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
23e90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
23ea0 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 62 45  return pIter->bE
23eb0 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  of;.}../*.** Mov
23ec0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
23ed0 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a  tching rowid. .*
23ee0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
23ef0 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  5IterNext(Fts5In
23f00 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
23f10 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
23f20 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
23f30 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
23f40 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
23f50 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
23f60 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  ter, 0, 0);.  re
23f70 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
23f80 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
23f90 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
23fa0 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
23fb0 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77  atching term/row
23fc0 69 64 2e 20 55 73 65 64 20 62 79 20 74 68 65 20  id. Used by the 
23fd0 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65  fts5vocab module
23fe0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23ff0 46 74 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e  Fts5IterNextScan
24000 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
24010 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 6e  pIter){.  Fts5In
24020 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
24030 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72  pIndex;..  asser
24040 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
24050 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
24060 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
24070 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
24080 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  , 0, 0);.  if( p
24090 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
240a0 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
240b0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
240c0 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
240d0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
240e0 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67   ];.    if( pSeg
240f0 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d  ->pLeaf && pSeg-
24100 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35  >term.p[0]!=FTS5
24110 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a  _MAIN_PREFIX ){.
24120 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
24130 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61  lease(pSeg->pLea
24140 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  f);.      pSeg->
24150 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  pLeaf = 0;.     
24160 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d 20 31   pIter->bEof = 1
24170 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
24180 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
24190 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
241a0 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
241b0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
241c0 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 20 74  matching rowid t
241d0 68 61 74 20 6f 63 63 75 72 73 20 61 74 20 6f 72  hat occurs at or
241e0 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e 20 54   after iMatch. T
241f0 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69 6f 6e  he.** definition
24200 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74 65 72   of "at or after
24210 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65  " depends on whe
24220 74 68 65 72 20 74 68 69 73 20 69 74 65 72 61 74  ther this iterat
24230 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a 20 69  or iterates.** i
24240 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 20 64  n ascending or d
24250 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69 64 20  escending rowid 
24260 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  order..*/.int sq
24270 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e 65 78  lite3Fts5IterNex
24280 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65 78 49  tFrom(Fts5IndexI
24290 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36 34 20  ter *pIter, i64 
242a0 69 4d 61 74 63 68 29 7b 0a 20 20 66 74 73 35 4d  iMatch){.  fts5M
242b0 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
242c0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
242d0 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29 3b 0a  pIter, iMatch);.
242e0 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
242f0 65 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e  exReturn(pIter->
24300 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pIndex);.}../*.*
24310 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
24320 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f 0a 69  rent rowid..*/.i
24330 36 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  64 sqlite3Fts5It
24340 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e 64 65  erRowid(Fts5Inde
24350 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
24360 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75 6c 74   return fts5Mult
24370 69 49 74 65 72 52 6f 77 69 64 28 70 49 74 65 72  iIterRowid(pIter
24380 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
24390 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
243a0 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  erm..*/.const ch
243b0 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73 35 49  ar *sqlite3Fts5I
243c0 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65  terTerm(Fts5Inde
243d0 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
243e0 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b  t *pn){.  int n;
243f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24400 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
24410 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
24420 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20  m(pIter, &n);.  
24430 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74  *pn = n-1;.  ret
24440 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 0a 2f  urn &z[1];.}.../
24450 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
24460 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
24470 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 63  r containing a c
24480 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69 74  opy of the posit
24490 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a 2a 20  ion list for.** 
244a0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
244b0 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69 61 62  y. Output variab
244c0 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20 74 6f  le *pn is set to
244d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
244e0 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e 20 62   buffer .** in b
244f0 79 74 65 73 20 62 65 66 6f 72 65 20 72 65 74 75  ytes before retu
24500 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  rning..**.** The
24510 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69 74 69   returned positi
24520 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f 74  on list does not
24530 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22 6e 75   include the "nu
24540 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22 20 76  mber of bytes" v
24550 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64 20 74  arint.** field t
24560 68 61 74 20 73 74 61 72 74 73 20 74 68 65 20 70  hat starts the p
24570 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f 6e 20  osition list on 
24580 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  disk..*/.int sql
24590 69 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c  ite3Fts5IterPosl
245a0 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ist(.  Fts5Index
245b0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20  Iter *pIter, .  
245c0 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c 20 20  const u8 **pp,  
245d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245e0 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65 72 20  /* OUT: Pointer 
245f0 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  to position-list
24600 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a   data */.  int *
24610 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pn,             
24620 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
24630 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 69 74  T: Size of posit
24640 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79 74 65  ion-list in byte
24650 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 52 6f  s */.  i64 *piRo
24660 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  wid             
24670 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
24680 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a  urrent rowid */.
24690 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
246a0 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
246b0 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
246c0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
246d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
246e0 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
246f0 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 2a 70  QLITE_OK );.  *p
24700 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  iRowid = pSeg->i
24710 52 6f 77 69 64 3b 0a 20 20 2a 70 6e 20 3d 20 70  Rowid;.  *pn = p
24720 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 69 66 28  Seg->nPos;.  if(
24730 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73   pSeg->iLeafOffs
24740 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 20 3c 3d  et+pSeg->nPos <=
24750 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 6e 20   pSeg->pLeaf->n 
24760 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 26 70 53  ){.    *pp = &pS
24770 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
24780 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
24790 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 74  .  }else{.    ft
247a0 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
247b0 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
247c0 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50 6f     fts5SegiterPo
247d0 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49 6e  slist(pIter->pIn
247e0 64 65 78 2c 20 70 53 65 67 2c 20 26 70 49 74 65  dex, pSeg, &pIte
247f0 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20  r->poslist);.   
24800 20 2a 70 70 20 3d 20 70 49 74 65 72 2d 3e 70 6f   *pp = pIter->po
24810 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 20 20 72  slist.p;.  }.  r
24820 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
24830 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
24840 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  dex);.}../*.** T
24850 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
24860 73 69 6d 69 6c 61 72 20 74 6f 20 73 71 6c 69 74  similar to sqlit
24870 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69 73  e3Fts5IterPoslis
24880 74 28 29 2c 20 65 78 63 65 70 74 20 74 68 61 74  t(), except that
24890 20 69 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68   it.** copies th
248a0 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
248b0 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
248c0 73 75 70 70 6c 69 65 64 20 61 73 20 74 68 65 20  supplied as the 
248d0 73 65 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d  second .** argum
248e0 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
248f0 74 65 33 46 74 73 35 49 74 65 72 50 6f 73 6c 69  te3Fts5IterPosli
24900 73 74 42 75 66 66 65 72 28 46 74 73 35 49 6e 64  stBuffer(Fts5Ind
24910 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  exIter *pIter, F
24920 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 29  ts5Buffer *pBuf)
24930 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
24940 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
24950 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ;..  assert( p->
24960 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
24970 0a 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72  .  fts5BufferZer
24980 6f 28 70 42 75 66 29 3b 0a 20 20 66 74 73 35 4d  o(pBuf);.  fts5M
24990 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74 28  ultiIterPoslist(
249a0 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 70 42 75  p, pIter, 0, pBu
249b0 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  f);.  return fts
249c0 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
249d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
249e0 61 6e 20 69 74 65 72 61 74 6f 72 20 6f 70 65 6e  an iterator open
249f0 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72  ed by an earlier
24a00 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
24a10 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 29  Fts5IndexQuery()
24a20 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24a30 33 46 74 73 35 49 74 65 72 43 6c 6f 73 65 28 46  3Fts5IterClose(F
24a40 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
24a50 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65  ter){.  if( pIte
24a60 72 20 29 7b 0a 20 20 20 20 46 74 73 35 49 6e 64  r ){.    Fts5Ind
24a70 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 49 74  ex *pIndex = pIt
24a80 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20  er->pIndex;.    
24a90 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
24aa0 65 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c  e(pIter->pIndex,
24ab0 20 70 49 74 65 72 29 3b 0a 20 20 20 20 66 74 73   pIter);.    fts
24ac0 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70 49 6e  5CloseReader(pIn
24ad0 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  dex);.  }.}../*.
24ae0 2a 2a 20 52 65 61 64 20 74 68 65 20 22 61 76 65  ** Read the "ave
24af0 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 69 6e  rages" record in
24b00 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 73 75  to the buffer su
24b10 70 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65  pplied as the se
24b20 63 6f 6e 64 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  cond .** argumen
24b30 74 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  t. Return SQLITE
24b40 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75  _OK if successfu
24b50 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  l, or an SQLite 
24b60 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 66  error code.** if
24b70 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
24b80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
24b90 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72  Fts5IndexGetAver
24ba0 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
24bb0 70 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  p, Fts5Buffer *p
24bc0 42 75 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Buf){.  assert( 
24bd0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
24be0 20 29 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65   );.  fts5DataRe
24bf0 61 64 4f 72 42 75 66 66 65 72 28 70 2c 20 70 42  adOrBuffer(p, pB
24c00 75 66 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45  uf, FTS5_AVERAGE
24c10 53 5f 52 4f 57 49 44 29 3b 0a 20 20 72 65 74 75  S_ROWID);.  retu
24c20 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
24c30 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn(p);.}../*.** 
24c40 52 65 70 6c 61 63 65 20 74 68 65 20 63 75 72 72  Replace the curr
24c50 65 6e 74 20 22 61 76 65 72 61 67 65 73 22 20 72  ent "averages" r
24c60 65 63 6f 72 64 20 77 69 74 68 20 74 68 65 20 63  ecord with the c
24c70 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 62  ontents of the b
24c80 75 66 66 65 72 20 0a 2a 2a 20 73 75 70 70 6c 69  uffer .** suppli
24c90 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24ca0 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e   argument..*/.in
24cb0 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
24cc0 65 78 53 65 74 41 76 65 72 61 67 65 73 28 46 74  exSetAverages(Ft
24cd0 73 35 49 6e 64 65 78 20 2a 70 2c 20 63 6f 6e 73  s5Index *p, cons
24ce0 74 20 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74  t u8 *pData, int
24cf0 20 6e 44 61 74 61 29 7b 0a 20 20 61 73 73 65 72   nData){.  asser
24d00 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
24d10 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 44 61 74  _OK );.  fts5Dat
24d20 61 57 72 69 74 65 28 70 2c 20 46 54 53 35 5f 41  aWrite(p, FTS5_A
24d30 56 45 52 41 47 45 53 5f 52 4f 57 49 44 2c 20 70  VERAGES_ROWID, p
24d40 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20 20  Data, nData);.  
24d50 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
24d60 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a  Return(p);.}../*
24d70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
24d80 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  otal number of b
24d90 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f 64 75 6c  locks this modul
24da0 65 20 68 61 73 20 72 65 61 64 20 66 72 6f 6d 20  e has read from 
24db0 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61  the %_data.** ta
24dc0 62 6c 65 20 73 69 6e 63 65 20 69 74 20 77 61 73  ble since it was
24dd0 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74   created..*/.int
24de0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
24df0 78 52 65 61 64 73 28 46 74 73 35 49 6e 64 65 78  xReads(Fts5Index
24e00 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
24e10 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->nRead;.}../*.*
24e20 2a 20 53 65 74 20 74 68 65 20 33 32 2d 62 69 74  * Set the 32-bit
24e30 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 73 74   cookie value st
24e40 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
24e50 74 20 6f 66 20 61 6c 6c 20 73 74 72 75 63 74 75  t of all structu
24e60 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 74  re .** records t
24e70 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
24e80 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
24e90 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
24ea0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
24eb0 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
24ec0 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
24ed0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 65  ror code if an e
24ee0 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a  rror.** occurs..
24ef0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
24f00 73 35 49 6e 64 65 78 53 65 74 43 6f 6f 6b 69 65  s5IndexSetCookie
24f10 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
24f20 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69 6e 74 20  nt iNew){.  int 
24f30 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f50 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
24f60 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  */.  Fts5Config 
24f70 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
24f80 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20 43 6f 6e  onfig;    /* Con
24f90 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65 63  figuration objec
24fa0 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f 6f 6b 69  t */.  u8 aCooki
24fb0 65 5b 34 5d 3b 20 20 20 20 20 20 20 20 20 20 20  e[4];           
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
24fd0 69 6e 61 72 79 20 72 65 70 72 65 73 65 6e 74 61  inary representa
24fe0 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20 2a 2f 0a  tion of iNew */.
24ff0 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a    sqlite3_blob *
25000 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20 20 61 73  pBlob = 0;..  as
25010 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
25020 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73 71 6c 69  ITE_OK );.  sqli
25030 74 65 33 46 74 73 35 50 75 74 33 32 28 61 43 6f  te3Fts5Put32(aCo
25040 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a 0a 20 20  okie, iNew);..  
25050 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
25060 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67 2d 3e  b_open(pConfig->
25070 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62  db, pConfig->zDb
25080 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 0a  , p->zDataTbl, .
25090 20 20 20 20 20 20 22 62 6c 6f 63 6b 22 2c 20 46        "block", F
250a0 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f  TS5_STRUCTURE_RO
250b0 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f 62 0a 20  WID, 1, &pBlob. 
250c0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
250d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
250e0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69 74  qlite3_blob_writ
250f0 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f 6b 69 65  e(pBlob, aCookie
25100 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20 72 63 20  , 4, 0);.    rc 
25110 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63  = sqlite3_blob_c
25120 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a 20 20 7d  lose(pBlob);.  }
25130 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
25140 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  ..int sqlite3Fts
25150 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e 66 69 67  5IndexLoadConfig
25160 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
25170 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
25180 2a 70 53 74 72 75 63 74 3b 0a 20 20 70 53 74 72  *pStruct;.  pStr
25190 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74  uct = fts5Struct
251a0 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66 74  ureRead(p);.  ft
251b0 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
251c0 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20 72  se(pStruct);.  r
251d0 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
251e0 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a  eturn(p);.}.../*
251f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25230 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
25240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
25280 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20 74 68 69  ***.** Below thi
25290 73 20 70 6f 69 6e 74 20 69 73 20 74 68 65 20 69  s point is the i
252a0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
252b0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63   the integrity-c
252c0 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63 74 69 6f  heck .** functio
252d0 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  nality..*/../*.*
252e0 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6d 70 6c  * Return a simpl
252f0 65 20 63 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  e checksum value
25300 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 61 72   based on the ar
25310 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74  guments..*/.stat
25320 69 63 20 75 36 34 20 66 74 73 35 49 6e 64 65 78  ic u64 fts5Index
25330 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20 20 69 36  EntryCksum(.  i6
25340 34 20 69 52 6f 77 69 64 2c 20 0a 20 20 69 6e 74  4 iRowid, .  int
25350 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74 20 69 50   iCol, .  int iP
25360 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49 64 78 2c  os, .  int iIdx,
25370 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
25380 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e 54 65 72  Term,.  int nTer
25390 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  m.){.  int i;.  
253a0 75 36 34 20 72 65 74 20 3d 20 69 52 6f 77 69 64  u64 ret = iRowid
253b0 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ;.  ret += (ret<
253c0 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20 20 72 65  <3) + iCol;.  re
253d0 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
253e0 69 50 6f 73 3b 0a 20 20 69 66 28 20 69 49 64 78  iPos;.  if( iIdx
253f0 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20 28 72 65  >=0 ) ret += (re
25400 74 3c 3c 33 29 20 2b 20 28 46 54 53 35 5f 4d 41  t<<3) + (FTS5_MA
25410 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78  IN_PREFIX + iIdx
25420 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
25430 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72 65 74 20  nTerm; i++) ret 
25440 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 70 54  += (ret<<3) + pT
25450 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74 75 72 6e  erm[i];.  return
25460 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   ret;.}..#ifdef 
25470 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
25480 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25490 20 69 73 20 70 75 72 65 6c 79 20 61 6e 20 69 6e   is purely an in
254a0 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49 74 20  ternal test. It 
254b0 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72 69 62  does not contrib
254c0 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53 20 66  ute to .** FTS f
254d0 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20 6f 72  unctionality, or
254e0 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65 67 72   even the integr
254f0 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20 61 6e  ity-check, in an
25500 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73  y way..**.** Ins
25510 74 65 61 64 2c 20 69 74 20 74 65 73 74 73 20 74  tead, it tests t
25520 68 61 74 20 74 68 65 20 73 61 6d 65 20 73 65 74  hat the same set
25530 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69 64 20 63   of pgno/rowid c
25540 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61 72 65 20  ombinations are 
25550 0a 2a 2a 20 76 69 73 69 74 65 64 20 72 65 67 61  .** visited rega
25560 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
25570 72 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e  r the doclist-in
25580 64 65 78 20 69 64 65 6e 74 69 66 69 65 64 20 62  dex identified b
25590 79 20 70 61 72 61 6d 65 74 65 72 73 0a 2a 2a 20  y parameters.** 
255a0 69 53 65 67 69 64 2f 69 4c 65 61 66 20 69 73 20  iSegid/iLeaf is 
255b0 69 74 65 72 61 74 65 64 20 69 6e 20 66 6f 72 77  iterated in forw
255c0 61 72 64 73 20 6f 72 20 72 65 76 65 72 73 65 20  ards or reverse 
255d0 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
255e0 20 76 6f 69 64 20 66 74 73 35 54 65 73 74 44 6c   void fts5TestDl
255f0 69 64 78 52 65 76 65 72 73 65 28 0a 20 20 46 74  idxReverse(.  Ft
25600 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 69  s5Index *p, .  i
25610 6e 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20  nt iSegid,      
25620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25630 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 74 6f 20  * Segment id to 
25640 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69  load from */.  i
25650 6e 74 20 69 4c 65 61 66 20 20 20 20 20 20 20 20  nt iLeaf        
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25670 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73 74 2d 69  * Load doclist-i
25680 6e 64 65 78 20 66 6f 72 20 74 68 69 73 20 6c 65  ndex for this le
25690 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44  af */.){.  Fts5D
256a0 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
256b0 20 3d 20 30 3b 0a 20 20 75 36 34 20 63 6b 73 75   = 0;.  u64 cksu
256c0 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36 34 20 63  m1 = 13;.  u64 c
256d0 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a 20 20 66  ksum2 = 13;..  f
256e0 6f 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c  or(pDlidx=fts5Dl
256f0 69 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 30  idxIterInit(p, 0
25700 2c 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29  , iSegid, iLeaf)
25710 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64  ;.      fts5Dlid
25720 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69  xIterEof(p, pDli
25730 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74  dx)==0;.      ft
25740 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
25750 70 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a  p, pDlidx).  ){.
25760 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
25770 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f   fts5DlidxIterRo
25780 77 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20  wid(pDlidx);.   
25790 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35   int pgno = fts5
257a0 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
257b0 6c 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72  lidx);.    asser
257c0 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66 20 29 3b  t( pgno>iLeaf );
257d0 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b 3d 20 69  .    cksum1 += i
257e0 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70 67  Rowid + ((i64)pg
257f0 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20 66  no<<32);.  }.  f
25800 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
25810 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c 69  (pDlidx);.  pDli
25820 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 70  dx = 0;..  for(p
25830 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
25840 74 65 72 49 6e 69 74 28 70 2c 20 31 2c 20 69 53  terInit(p, 1, iS
25850 65 67 69 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20  egid, iLeaf);.  
25860 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
25870 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 3d  rEof(p, pDlidx)=
25880 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 44 6c  =0;.      fts5Dl
25890 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70  idxIterPrev(p, p
258a0 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20 20 20 20  Dlidx).  ){.    
258b0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
258c0 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
258d0 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 69 6e 74  pDlidx);.    int
258e0 20 70 67 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64   pgno = fts5Dlid
258f0 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
25900 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66  );.    assert( f
25910 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
25920 28 70 44 6c 69 64 78 29 3e 69 4c 65 61 66 20 29  (pDlidx)>iLeaf )
25930 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20 2b 3d 20  ;.    cksum2 += 
25940 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34 29 70  iRowid + ((i64)p
25950 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a 20 20  gno<<32);.  }.  
25960 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
25970 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70 44 6c  e(pDlidx);.  pDl
25980 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  idx = 0;..  if( 
25990 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
259a0 20 26 26 20 63 6b 73 75 6d 31 21 3d 63 6b 73 75   && cksum1!=cksu
259b0 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  m2 ) p->rc = FTS
259c0 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 0a 73 74  5_CORRUPT;.}..st
259d0 61 74 69 63 20 69 6e 74 20 66 74 73 35 51 75 65  atic int fts5Que
259e0 72 79 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 49  ryCksum(.  Fts5I
259f0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
25a00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74             /* Ft
25a10 73 35 20 69 6e 64 65 78 20 6f 62 6a 65 63 74 20  s5 index object 
25a20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 2c 0a 20  */.  int iIdx,. 
25a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
25a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a50 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79 20 74 6f   /* Index key to
25a60 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
25a70 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
25a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a90 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e 64 65 78  /* Size of index
25aa0 20 6b 65 79 20 69 6e 20 62 79 74 65 73 20 2a 2f   key in bytes */
25ab0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
25ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ad0 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20     /* Flags for 
25ae0 46 74 73 35 49 6e 64 65 78 51 75 65 72 79 20 2a  Fts5IndexQuery *
25af0 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73 75 6d 20  /.  u64 *pCksum 
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b10 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
25b20 68 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 2a 2f  hecksum value */
25b30 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20  .){.  u64 cksum 
25b40 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73  = *pCksum;.  Fts
25b50 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 64 78  5IndexIter *pIdx
25b60 49 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Iter = 0;.  int 
25b70 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
25b80 49 6e 64 65 78 51 75 65 72 79 28 70 2c 20 7a 2c  IndexQuery(p, z,
25b90 20 6e 2c 20 66 6c 61 67 73 2c 20 26 70 49 64 78   n, flags, &pIdx
25ba0 49 74 65 72 29 3b 0a 0a 20 20 77 68 69 6c 65 28  Iter);..  while(
25bb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
25bc0 26 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35  & 0==sqlite3Fts5
25bd0 49 74 65 72 45 6f 66 28 70 49 64 78 49 74 65 72  IterEof(pIdxIter
25be0 29 20 29 7b 0a 20 20 20 20 69 36 34 20 64 75 6d  ) ){.    i64 dum
25bf0 6d 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 38  my;.    const u8
25c00 20 2a 70 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20   *pPos;.    int 
25c10 6e 50 6f 73 3b 0a 20 20 20 20 69 36 34 20 72 6f  nPos;.    i64 ro
25c20 77 69 64 20 3d 20 73 71 6c 69 74 65 33 46 74 73  wid = sqlite3Fts
25c30 35 49 74 65 72 52 6f 77 69 64 28 70 49 64 78 49  5IterRowid(pIdxI
25c40 74 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ter);.    rc = s
25c50 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
25c60 73 6c 69 73 74 28 70 49 64 78 49 74 65 72 2c 20  slist(pIdxIter, 
25c70 26 70 50 6f 73 2c 20 26 6e 50 6f 73 2c 20 26 64  &pPos, &nPos, &d
25c80 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72  ummy);.    if( r
25c90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25ca0 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
25cb0 74 52 65 61 64 65 72 20 73 52 65 61 64 65 72 3b  tReader sReader;
25cc0 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74  .      for(sqlit
25cd0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
25ce0 64 65 72 49 6e 69 74 28 2d 31 2c 20 70 50 6f 73  derInit(-1, pPos
25cf0 2c 20 6e 50 6f 73 2c 20 26 73 52 65 61 64 65 72  , nPos, &sReader
25d00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 52 65  );.          sRe
25d10 61 64 65 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20  ader.bEof==0;.  
25d20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
25d30 74 73 35 50 6f 73 6c 69 73 74 52 65 61 64 65 72  ts5PoslistReader
25d40 4e 65 78 74 28 26 73 52 65 61 64 65 72 29 0a 20  Next(&sReader). 
25d50 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
25d60 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
25d70 50 4f 53 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64  POS2COLUMN(sRead
25d80 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20  er.iPos);.      
25d90 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 46 54 53    int iOff = FTS
25da0 35 5f 50 4f 53 32 4f 46 46 53 45 54 28 73 52 65  5_POS2OFFSET(sRe
25db0 61 64 65 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20  ader.iPos);.    
25dc0 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20 66 74 73      cksum ^= fts
25dd0 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
25de0 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 4f  (rowid, iCol, iO
25df0 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20 6e 29 3b  ff, iIdx, z, n);
25e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
25e10 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49  c = sqlite3Fts5I
25e20 74 65 72 4e 65 78 74 28 70 49 64 78 49 74 65 72  terNext(pIdxIter
25e30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
25e40 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
25e50 6f 73 65 28 70 49 64 78 49 74 65 72 29 3b 0a 0a  ose(pIdxIter);..
25e60 20 20 2a 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75    *pCksum = cksu
25e70 6d 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  m;.  return rc;.
25e80 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
25e90 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20  unction is also 
25ea0 70 75 72 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e  purely an intern
25eb0 61 6c 20 74 65 73 74 2e 20 49 74 20 64 6f 65 73  al test. It does
25ec0 20 6e 6f 74 20 63 6f 6e 74 72 69 62 75 74 65 20   not contribute 
25ed0 74 6f 20 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74  to .** FTS funct
25ee0 69 6f 6e 61 6c 69 74 79 2c 20 6f 72 20 65 76 65  ionality, or eve
25ef0 6e 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 2d  n the integrity-
25f00 63 68 65 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61  check, in any wa
25f10 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
25f20 64 20 66 74 73 35 54 65 73 74 54 65 72 6d 28 0a  d fts5TestTerm(.
25f30 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
25f40 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
25f50 50 72 65 76 2c 20 20 20 20 20 20 20 20 20 20 20  Prev,           
25f60 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74     /* Previous t
25f70 65 72 6d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  erm */.  const c
25f80 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20  har *z, int n,  
25f90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
25fa0 69 62 6c 79 20 6e 65 77 20 74 65 72 6d 20 74 6f  ibly new term to
25fb0 20 74 65 73 74 20 2a 2f 0a 20 20 75 36 34 20 65   test */.  u64 e
25fc0 78 70 65 63 74 65 64 2c 0a 20 20 75 36 34 20 2a  xpected,.  u64 *
25fd0 70 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20  pCksum.){.  int 
25fe0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
25ff0 28 20 70 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b  ( pPrev->n==0 ){
26000 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
26010 65 74 28 26 72 63 2c 20 70 50 72 65 76 2c 20 6e  et(&rc, pPrev, n
26020 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b  , (const u8*)z);
26030 0a 20 20 7d 65 6c 73 65 0a 20 20 69 66 28 20 72  .  }else.  if( r
26040 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26050 28 70 50 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20  (pPrev->n!=n || 
26060 6d 65 6d 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c  memcmp(pPrev->p,
26070 20 7a 2c 20 6e 29 29 20 29 7b 0a 20 20 20 20 75   z, n)) ){.    u
26080 36 34 20 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b  64 cksum3 = *pCk
26090 73 75 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  sum;.    const c
260a0 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f  har *zTerm = (co
260b0 6e 73 74 20 63 68 61 72 2a 29 26 70 50 72 65 76  nst char*)&pPrev
260c0 2d 3e 70 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d  ->p[1];  /* term
260d0 20 73 61 6e 73 20 70 72 65 66 69 78 2d 62 79 74   sans prefix-byt
260e0 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65  e */.    int nTe
260f0 72 6d 20 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b  rm = pPrev->n-1;
26100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26110 69 7a 65 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20  ize of zTerm in 
26120 62 79 74 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74  bytes */.    int
26130 20 69 49 64 78 20 3d 20 28 70 50 72 65 76 2d 3e   iIdx = (pPrev->
26140 70 5b 30 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e  p[0] - FTS5_MAIN
26150 5f 50 52 45 46 49 58 29 3b 0a 20 20 20 20 69 6e  _PREFIX);.    in
26160 74 20 66 6c 61 67 73 20 3d 20 28 69 49 64 78 3d  t flags = (iIdx=
26170 3d 30 20 3f 20 30 20 3a 20 46 54 53 35 49 4e 44  =0 ? 0 : FTS5IND
26180 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 29  EX_QUERY_PREFIX)
26190 3b 0a 20 20 20 20 75 36 34 20 63 6b 31 20 3d 20  ;.    u64 ck1 = 
261a0 30 3b 0a 20 20 20 20 75 36 34 20 63 6b 32 20 3d  0;.    u64 ck2 =
261b0 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63   0;..    /* Chec
261c0 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75 6c  k that the resul
261d0 74 73 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  ts returned for 
261e0 41 53 43 20 61 6e 64 20 44 45 53 43 20 71 75 65  ASC and DESC que
261f0 72 69 65 73 20 61 72 65 0a 20 20 20 20 2a 2a 20  ries are.    ** 
26200 74 68 65 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74  the same. If not
26210 2c 20 63 61 6c 6c 20 74 68 69 73 20 63 6f 72 72  , call this corr
26220 75 70 74 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20  uption.  */.    
26230 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
26240 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
26250 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73  rm, nTerm, flags
26260 2c 20 26 63 6b 31 29 3b 0a 20 20 20 20 69 66 28  , &ck1);.    if(
26270 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
26280 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 20 3d 20  {.      int f = 
26290 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45 58 5f  flags|FTS5INDEX_
262a0 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
262b0 20 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79    rc = fts5Query
262c0 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a  Cksum(p, iIdx, z
262d0 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20  Term, nTerm, f, 
262e0 26 63 6b 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &ck2);.    }.   
262f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26300 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
26310 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
26320 50 54 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  PT;..    /* If t
26330 68 69 73 20 69 73 20 61 20 70 72 65 66 69 78 20  his is a prefix 
26340 71 75 65 72 79 2c 20 63 68 65 63 6b 20 74 68 61  query, check tha
26350 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72 65  t the results re
26360 74 75 72 6e 65 64 20 69 66 20 74 68 65 0a 20 20  turned if the.  
26370 20 20 2a 2a 20 74 68 65 20 69 6e 64 65 78 20 69    ** the index i
26380 73 20 64 69 73 61 62 6c 65 64 20 61 72 65 20 74  s disabled are t
26390 68 65 20 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68  he same. In both
263a0 20 41 53 43 20 61 6e 64 20 44 45 53 43 20 6f 72   ASC and DESC or
263b0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  der. */.    if( 
263c0 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
263d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
263e0 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c 46   int f = flags|F
263f0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 54  TS5INDEX_QUERY_T
26400 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20 20 20 20  EST_NOIDX;.     
26410 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20 20   ck2 = 0;.      
26420 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b  rc = fts5QueryCk
26430 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65  sum(p, iIdx, zTe
26440 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63  rm, nTerm, f, &c
26450 6b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  k2);.      if( r
26460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26470 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
26480 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
26490 20 20 7d 0a 20 20 20 20 69 66 28 20 69 49 64 78    }.    if( iIdx
264a0 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  >0 && rc==SQLITE
264b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
264c0 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49   f = flags|FTS5I
264d0 4e 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f  NDEX_QUERY_TEST_
264e0 4e 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f  NOIDX|FTS5INDEX_
264f0 51 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20  QUERY_DESC;.    
26500 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20 20    ck2 = 0;.     
26510 20 72 63 20 3d 20 66 74 73 35 51 75 65 72 79 43   rc = fts5QueryC
26520 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54  ksum(p, iIdx, zT
26530 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26  erm, nTerm, f, &
26540 63 6b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck2);.      if( 
26550 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26560 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d   ck1!=ck2 ) rc =
26570 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
26580 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33     }..    cksum3
26590 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20 66 74 73   ^= ck1;.    fts
265a0 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
265b0 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74  pPrev, n, (const
265c0 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66   u8*)z);..    if
265d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
265e0 26 26 20 63 6b 73 75 6d 33 21 3d 65 78 70 65 63  && cksum3!=expec
265f0 74 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ted ){.      rc 
26600 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
26610 20 20 20 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75      }.    *pCksu
26620 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a  m = cksum3;.  }.
26630 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a    p->rc = rc;.}.
26640 20 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65   .#else.# define
26650 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
26660 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64  verse(x,y,z).# d
26670 65 66 69 6e 65 20 66 74 73 35 54 65 73 74 54 65  efine fts5TestTe
26680 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a  rm(u,v,w,x,y,z).
26690 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68  #endif../*.** Ch
266a0 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  eck that:.**.** 
266b0 20 20 31 29 20 41 6c 6c 20 6c 65 61 76 65 73 20    1) All leaves 
266c0 6f 66 20 70 53 65 67 20 62 65 74 77 65 65 6e 20  of pSeg between 
266d0 69 46 69 72 73 74 20 61 6e 64 20 69 4c 61 73 74  iFirst and iLast
266e0 20 28 69 6e 63 6c 75 73 69 76 65 29 20 65 78 69   (inclusive) exi
266f0 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63  st and.**      c
26700 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d  ontain zero term
26710 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c  s..**   2) All l
26720 65 61 76 65 73 20 6f 66 20 70 53 65 67 20 62 65  eaves of pSeg be
26730 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61  tween iNoRowid a
26740 6e 64 20 69 4c 61 73 74 20 28 69 6e 63 6c 75 73  nd iLast (inclus
26750 69 76 65 29 20 65 78 69 73 74 20 61 6e 64 0a 2a  ive) exist and.*
26760 2a 20 20 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a  *      contain z
26770 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73  ero rowids..*/.s
26780 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
26790 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
267a0 63 6b 45 6d 70 74 79 28 0a 20 20 46 74 73 35 49  ckEmpty(.  Fts5I
267b0 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35 53  ndex *p,.  Fts5S
267c0 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
267d0 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 53 65  *pSeg,     /* Se
267e0 67 6d 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69  gment to check i
267f0 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65  nternal consiste
26800 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ncy */.  int iFi
26810 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f  rst,.  int iNoRo
26820 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74  wid,.  int iLast
26830 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
26840 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68 61  /* Now check tha
26850 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70 74  t the iter.nEmpt
26860 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69  y leaves followi
26870 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  ng the current l
26880 65 61 66 0a 20 20 2a 2a 20 28 61 29 20 65 78 69  eaf.  ** (a) exi
26890 73 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61  st and (b) conta
268a0 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a  in no terms. */.
268b0 20 20 66 6f 72 28 69 3d 69 46 69 72 73 74 3b 20    for(i=iFirst; 
268c0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
268d0 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b   && i<=iLast; i+
268e0 2b 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61  +){.    Fts5Data
268f0 20 2a 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61   *pLeaf = fts5Da
26900 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53  taRead(p, FTS5_S
26910 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 53 65  EGMENT_ROWID(pSe
26920 67 2d 3e 69 53 65 67 69 64 2c 20 30 2c 20 69 29  g->iSegid, 0, i)
26930 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
26940 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 21   ){.      if( 0!
26950 3d 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65  =fts5GetU16(&pLe
26960 61 66 2d 3e 70 5b 32 5d 29 20 29 20 70 2d 3e 72  af->p[2]) ) p->r
26970 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
26980 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69  ;.      if( i>=i
26990 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74  NoRowid && 0!=ft
269a0 73 35 47 65 74 55 31 36 28 26 70 4c 65 61 66 2d  s5GetU16(&pLeaf-
269b0 3e 70 5b 30 5d 29 20 29 20 70 2d 3e 72 63 20 3d  >p[0]) ) p->rc =
269c0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
269d0 20 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74     }.    fts5Dat
269e0 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b  aRelease(pLeaf);
269f0 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29  .    if( p->rc )
26a00 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 73   break;.  }.}..s
26a10 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
26a20 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
26a30 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73  ckSegment(.  Fts
26a40 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26a60 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
26a70 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
26a80 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
26a90 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg      /* Segm
26aa0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
26ab0 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
26ac0 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  y */.){.  Fts5Co
26ad0 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
26ae0 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71  p->pConfig;.  sq
26af0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
26b00 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32  t = 0;.  int rc2
26b10 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65 76  ;.  int iIdxPrev
26b20 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
26b30 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20  oFirst-1;.  int 
26b40 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d  iDlidxPrevLeaf =
26b50 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b   pSeg->pgnoLast;
26b60 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67  ..  if( pSeg->pg
26b70 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74  noFirst==0 ) ret
26b80 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65  urn;..  fts5Inde
26b90 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
26ba0 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f  &pStmt, sqlite3_
26bb0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
26bc0 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65  SELECT segid, te
26bd0 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28  rm, (pgno>>1), (
26be0 70 67 6e 6f 20 26 20 31 29 20 46 52 4f 4d 20 27  pgno & 1) FROM '
26bf0 25 71 27 2e 27 25 71 5f 69 64 78 27 20 57 48 45  %q'.'%q_idx' WHE
26c00 52 45 20 73 65 67 69 64 3d 25 64 22 2c 0a 20 20  RE segid=%d",.  
26c10 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62      pConfig->zDb
26c20 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
26c30 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64 0a 20  , pSeg->iSegid. 
26c40 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 74 65 72 61   ));..  /* Itera
26c50 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 62  te through the b
26c60 2d 74 72 65 65 20 68 69 65 72 61 72 63 68 79 2e  -tree hierarchy.
26c70 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 70 2d    */.  while( p-
26c80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
26c90 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
26ca0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
26cb0 29 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  ) ){.    i64 iRo
26cc0 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w;              
26cd0 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
26ce0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
26cf0 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
26d00 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
26d10 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74     /* Data for t
26d20 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20  his leaf */.    
26d30 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20 20 20  int iOff;       
26d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d50 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
26d60 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f   term on leaf */
26d70 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
26d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d90 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
26da0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6d  erate through em
26db0 70 74 79 20 6c 65 61 76 65 73 20 2a 2f 0a 0a 20  pty leaves */.. 
26dc0 20 20 20 69 6e 74 20 6e 49 64 78 54 65 72 6d 20     int nIdxTerm 
26dd0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
26de0 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 31 29  _bytes(pStmt, 1)
26df0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
26e00 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20 28 63 6f   *zIdxTerm = (co
26e10 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
26e20 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
26e30 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74  tmt, 1);.    int
26e40 20 69 49 64 78 4c 65 61 66 20 3d 20 73 71 6c 69   iIdxLeaf = sqli
26e50 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
26e60 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 69 6e  Stmt, 2);.    in
26e70 74 20 62 49 64 78 44 6c 69 64 78 20 3d 20 73 71  t bIdxDlidx = sq
26e80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
26e90 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20  (pStmt, 3);..   
26ea0 20 2f 2a 20 49 66 20 74 68 65 20 6c 65 61 66 20   /* If the leaf 
26eb0 69 6e 20 71 75 65 73 74 69 6f 6e 20 68 61 73 20  in question has 
26ec0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 74 72 69  already been tri
26ed0 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65 20 73 65  mmed from the se
26ee0 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a 2a 20 69  gment, .    ** i
26ef0 67 6e 6f 72 65 20 74 68 69 73 20 62 2d 74 72 65  gnore this b-tre
26f00 65 20 65 6e 74 72 79 2e 20 4f 74 68 65 72 77 69  e entry. Otherwi
26f10 73 65 2c 20 6c 6f 61 64 20 69 74 20 69 6e 74 6f  se, load it into
26f20 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20 20 20 20   memory. */.    
26f30 69 66 28 20 69 49 64 78 4c 65 61 66 3c 70 53 65  if( iIdxLeaf<pSe
26f40 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 20 63  g->pgnoFirst ) c
26f50 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 52 6f  ontinue;.    iRo
26f60 77 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  w = FTS5_SEGMENT
26f70 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65  _ROWID(pSeg->iSe
26f80 67 69 64 2c 20 30 2c 20 69 49 64 78 4c 65 61 66  gid, 0, iIdxLeaf
26f90 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
26fa0 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
26fb0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
26fc0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
26fd0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
26fe0 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
26ff0 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
27000 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
27010 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
27020 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
27030 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
27040 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e  key in zIdxTerm.
27050 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61    Also check tha
27060 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a  t if there.    *
27070 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69  * is also a rowi
27080 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  d pointer within
27090 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68   the leaf page h
270a0 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73  eader, it points
270b0 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63   to a.    ** loc
270c0 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65  ation before the
270d0 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69   term.  */.    i
270e0 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  Off = fts5GetU16
270f0 28 26 70 4c 65 61 66 2d 3e 70 5b 32 5d 29 3b 0a  (&pLeaf->p[2]);.
27100 20 20 20 20 69 66 28 20 69 4f 66 66 3d 3d 30 20      if( iOff==0 
27110 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  ){.      p->rc =
27120 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
27130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27140 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20  int iRowidOff;. 
27150 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 20       int nTerm; 
27160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27170 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
27180 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79 74 65   on leaf in byte
27190 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 72  s */.      int r
271a0 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  es;             
271b0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
271c0 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61 6e 64  ison of term and
271d0 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a 0a 20   split-key */.. 
271e0 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20 3d       iRowidOff =
271f0 20 66 74 73 35 47 65 74 55 31 36 28 26 70 4c 65   fts5GetU16(&pLe
27200 61 66 2d 3e 70 5b 30 5d 29 3b 0a 20 20 20 20 20  af->p[0]);.     
27210 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
27220 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  iOff ){.        
27230 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
27240 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
27250 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
27260 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
27270 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
27280 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  f], nTerm);.    
27290 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
272a0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
272b0 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28  , zIdxTerm, MIN(
272c0 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29  nTerm, nIdxTerm)
272d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
272e0 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54  es==0 ) res = nT
272f0 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a  erm - nIdxTerm;.
27300 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
27310 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
27320 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
27330 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  }.    }.    fts5
27340 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
27350 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  f);.    if( p->r
27360 63 20 29 20 62 72 65 61 6b 3b 0a 0a 0a 20 20 20  c ) break;...   
27370 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20 74 68   /* Now check th
27380 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45 6d 70  at the iter.nEmp
27390 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c 6f 77  ty leaves follow
273a0 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
273b0 6c 65 61 66 0a 20 20 20 20 2a 2a 20 28 61 29 20  leaf.    ** (a) 
273c0 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f  exist and (b) co
273d0 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20  ntain no terms. 
273e0 2a 2f 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78  */.    fts5Index
273f0 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45 6d  IntegrityCheckEm
27400 70 74 79 28 0a 20 20 20 20 20 20 20 20 70 2c 20  pty(.        p, 
27410 70 53 65 67 2c 20 69 49 64 78 50 72 65 76 4c 65  pSeg, iIdxPrevLe
27420 61 66 2b 31 2c 20 69 44 6c 69 64 78 50 72 65 76  af+1, iDlidxPrev
27430 4c 65 61 66 2b 31 2c 20 69 49 64 78 4c 65 61 66  Leaf+1, iIdxLeaf
27440 2d 31 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  -1.    );.    if
27450 28 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b  ( p->rc ) break;
27460 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ..    /* If ther
27470 65 20 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69  e is a doclist-i
27480 6e 64 65 78 2c 20 63 68 65 63 6b 20 74 68 61 74  ndex, check that
27490 20 69 74 20 6c 6f 6f 6b 73 20 72 69 67 68 74 2e   it looks right.
274a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 49 64 78   */.    if( bIdx
274b0 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20 46  Dlidx ){.      F
274c0 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44  ts5DlidxIter *pD
274d0 6c 69 64 78 20 3d 20 30 3b 20 20 2f 2a 20 46 6f  lidx = 0;  /* Fo
274e0 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
274f0 75 67 68 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  ugh doclist inde
27500 78 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  x */.      int i
27510 50 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c  PrevLeaf = iIdxL
27520 65 61 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  eaf;.      int i
27530 53 65 67 69 64 20 3d 20 70 53 65 67 2d 3e 69 53  Segid = pSeg->iS
27540 65 67 69 64 3b 0a 20 20 20 20 20 20 69 6e 74 20  egid;.      int 
27550 69 50 67 3b 0a 20 20 20 20 20 20 69 36 34 20 69  iPg;.      i64 i
27560 4b 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28  Key;..      for(
27570 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78  pDlidx=fts5Dlidx
27580 49 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69  IterInit(p, 0, i
27590 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29  Segid, iIdxLeaf)
275a0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35  ;.          fts5
275b0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
275c0 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
275d0 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
275e0 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
275f0 78 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20  x).      ){..   
27600 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e       /* Check an
27610 79 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67  y rowid-less pag
27620 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
27630 66 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  fore the current
27640 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20   leaf. */.      
27650 20 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c    for(iPg=iPrevL
27660 65 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44  eaf+1; iPg<fts5D
27670 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
27680 69 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20  idx); iPg++){.  
27690 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46          iKey = F
276a0 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
276b0 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69 50 67  D(iSegid, 0, iPg
276c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65  );.          pLe
276d0 61 66 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  af = fts5DataRea
276e0 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20 20 20  d(p, iKey);.    
276f0 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
27700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
27710 66 28 20 66 74 73 35 47 65 74 55 31 36 28 26 70  f( fts5GetU16(&p
27720 4c 65 61 66 2d 3e 70 5b 30 5d 29 21 3d 30 20 29  Leaf->p[0])!=0 )
27730 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
27740 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
27750 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
27760 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
27770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
27780 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65  .        iPrevLe
27790 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  af = fts5DlidxIt
277a0 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
277b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
277c0 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
277d0 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
277e0 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
277f0 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
27800 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
27810 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
27820 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
27830 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
27840 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
27850 57 49 44 28 69 53 65 67 69 64 2c 20 30 2c 20 69  WID(iSegid, 0, i
27860 50 72 65 76 4c 65 61 66 29 3b 0a 20 20 20 20 20  PrevLeaf);.     
27870 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 44     pLeaf = fts5D
27880 61 74 61 52 65 61 64 28 70 2c 20 69 4b 65 79 29  ataRead(p, iKey)
27890 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
278a0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eaf ){.         
278b0 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 20   i64 iRowid;.   
278c0 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
278d0 64 4f 66 66 20 3d 20 66 74 73 35 47 65 74 55 31  dOff = fts5GetU1
278e0 36 28 26 70 4c 65 61 66 2d 3e 70 5b 30 5d 29 3b  6(&pLeaf->p[0]);
278f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
27900 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65 61 66 2d  RowidOff>=pLeaf-
27910 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >n ){.          
27920 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
27930 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
27940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27950 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
27960 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69 52 6f  nt(&pLeaf->p[iRo
27970 77 69 64 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  widOff], (u64*)&
27980 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
27990 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 21       if( iRowid!
279a0 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  =fts5DlidxIterRo
279b0 77 69 64 28 70 44 6c 69 64 78 29 20 29 20 70 2d  wid(pDlidx) ) p-
279c0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
279d0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  PT;.          }.
279e0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 61            fts5Da
279f0 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29  taRelease(pLeaf)
27a00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
27a10 20 20 7d 0a 0a 20 20 20 20 20 20 69 44 6c 69 64    }..      iDlid
27a20 78 50 72 65 76 4c 65 61 66 20 3d 20 69 50 67 3b  xPrevLeaf = iPg;
27a30 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
27a40 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
27a50 3b 0a 20 20 20 20 20 20 66 74 73 35 54 65 73 74  ;.      fts5Test
27a60 44 6c 69 64 78 52 65 76 65 72 73 65 28 70 2c 20  DlidxReverse(p, 
27a70 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
27a80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
27a90 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
27aa0 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  af = pSeg->pgnoL
27ab0 61 73 74 3b 0a 20 20 20 20 20 20 2f 2a 20 54 4f  ast;.      /* TO
27ac0 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 72 65 20  DO: Check there 
27ad0 69 73 20 6e 6f 20 64 6f 63 6c 69 73 74 20 69 6e  is no doclist in
27ae0 64 65 78 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 20  dex */.    }..  
27af0 20 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d    iIdxPrevLeaf =
27b00 20 69 49 64 78 4c 65 61 66 3b 0a 20 20 7d 0a 0a   iIdxLeaf;.  }..
27b10 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f    rc2 = sqlite3_
27b20 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
27b30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
27b40 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20  LITE_OK ) p->rc 
27b50 3d 20 72 63 32 3b 0a 0a 20 20 2f 2a 20 50 61 67  = rc2;..  /* Pag
27b60 65 20 69 74 65 72 2e 69 4c 65 61 66 20 6d 75 73  e iter.iLeaf mus
27b70 74 20 6e 6f 77 20 62 65 20 74 68 65 20 72 69 67  t now be the rig
27b80 68 74 6d 6f 73 74 20 6c 65 61 66 2d 70 61 67 65  htmost leaf-page
27b90 20 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 20   in the segment 
27ba0 2a 2f 0a 23 69 66 20 30 0a 20 20 69 66 28 20 70  */.#if 0.  if( p
27bb0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27bc0 26 26 20 69 74 65 72 2e 69 4c 65 61 66 21 3d 70  && iter.iLeaf!=p
27bd0 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b  Seg->pgnoLast ){
27be0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
27bf0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 23  5_CORRUPT;.  }.#
27c00 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
27c10 52 75 6e 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  Run internal che
27c20 63 6b 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68  cks to ensure th
27c30 61 74 20 74 68 65 20 46 54 53 20 69 6e 64 65 78  at the FTS index
27c40 20 28 61 29 20 69 73 20 69 6e 74 65 72 6e 61 6c   (a) is internal
27c50 6c 79 20 0a 2a 2a 20 63 6f 6e 73 69 73 74 65 6e  ly .** consisten
27c60 74 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69  t and (b) contai
27c70 6e 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 77  ns entries for w
27c80 68 69 63 68 20 74 68 65 20 58 4f 52 20 6f 66 20  hich the XOR of 
27c90 74 68 65 20 63 68 65 63 6b 73 75 6d 73 0a 2a 2a  the checksums.**
27ca0 20 61 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62   as calculated b
27cb0 79 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  y fts5IndexEntry
27cc0 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d  Cksum() is cksum
27cd0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
27ce0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
27cf0 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65   any of the inte
27d00 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c  rnal checks fail
27d10 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63  , or if the.** c
27d20 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
27d30 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53   match. Return S
27d40 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20  QLITE_OK if all 
27d50 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68  checks pass with
27d60 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72  out.** error, or
27d70 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69   some other SQLi
27d80 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
27d90 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28   another error (
27da0 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63  e.g. OOM).** occ
27db0 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
27dc0 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
27dd0 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
27de0 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73  ndex *p, u64 cks
27df0 75 6d 29 7b 0a 20 20 75 36 34 20 63 6b 73 75 6d  um){.  u64 cksum
27e00 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  2 = 0;          
27e10 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
27e20 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e 74  um based on cont
27e30 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73 20  ents of indexes 
27e40 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
27e50 70 6f 73 6c 69 73 74 20 3d 20 7b 30 2c 30 2c 30  poslist = {0,0,0
27e60 7d 3b 20 20 20 2f 2a 20 42 75 66 66 65 72 20 75  };   /* Buffer u
27e70 73 65 64 20 74 6f 20 68 6f 6c 64 20 61 20 70 6f  sed to hold a po
27e80 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 49  slist */.  Fts5I
27e90 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 3b  ndexIter *pIter;
27ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
27eb0 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
27ec0 72 6f 75 67 68 20 65 6e 74 69 72 65 20 69 6e 64  rough entire ind
27ed0 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ex */.  Fts5Stru
27ee0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 20  cture *pStruct; 
27ef0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
27f00 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 0a 20   structure */.. 
27f10 20 2f 2a 20 55 73 65 64 20 62 79 20 65 78 74 72   /* Used by extr
27f20 61 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 73  a internal tests
27f30 20 6f 6e 6c 79 20 72 75 6e 20 69 66 20 4e 44 45   only run if NDE
27f40 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
27f50 65 64 20 2a 2f 0a 20 20 75 36 34 20 63 6b 73 75  ed */.  u64 cksu
27f60 6d 33 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  m3 = 0;         
27f70 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
27f80 73 75 6d 20 62 61 73 65 64 20 6f 6e 20 63 6f 6e  sum based on con
27f90 74 65 6e 74 73 20 6f 66 20 69 6e 64 65 78 65 73  tents of indexes
27fa0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
27fb0 20 74 65 72 6d 20 3d 20 7b 30 2c 30 2c 30 7d 3b   term = {0,0,0};
27fc0 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
27fd0 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 6d 6f 73  used to hold mos
27fe0 74 20 72 65 63 65 6e 74 20 74 65 72 6d 20 2a 2f  t recent term */
27ff0 0a 20 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68  .  .  /* Load th
28000 65 20 46 54 53 20 69 6e 64 65 78 20 73 74 72 75  e FTS index stru
28010 63 74 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75  cture */.  pStru
28020 63 74 20 3d 20 66 74 73 35 53 74 72 75 63 74 75  ct = fts5Structu
28030 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a  reRead(p);..  /*
28040 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
28050 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f  internal nodes o
28060 66 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d  f each segment m
28070 61 74 63 68 20 74 68 65 20 6c 65 61 76 65 73 20  atch the leaves 
28080 2a 2f 0a 20 20 69 66 28 20 70 53 74 72 75 63 74  */.  if( pStruct
28090 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c   ){.    int iLvl
280a0 2c 20 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28  , iSeg;.    for(
280b0 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
280c0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
280d0 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72  vl++){.      for
280e0 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53  (iSeg=0; iSeg<pS
280f0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
28100 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b  vl].nSeg; iSeg++
28110 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73 35 53  ){.        Fts5S
28120 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20  tructureSegment 
28130 2a 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74  *pSeg = &pStruct
28140 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61  ->aLevel[iLvl].a
28150 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20  Seg[iSeg];.     
28160 20 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65     fts5IndexInte
28170 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e  grityCheckSegmen
28180 74 28 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20  t(p, pSeg);.    
28190 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
281a0 20 2f 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72   /* The cksum ar
281b0 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
281c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
281d0 73 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  s a checksum cal
281e0 63 75 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73  culated.  ** bas
281f0 65 64 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74  ed on all expect
28200 65 64 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ed entries in th
28210 65 20 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63  e FTS index (inc
28220 6c 75 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e  luding prefix in
28230 64 65 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73  dex.  ** entries
28240 29 2e 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68  ). This block ch
28250 65 63 6b 73 20 74 68 61 74 20 61 20 63 68 65 63  ecks that a chec
28260 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20  ksum calculated 
28270 62 61 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a  based on the.  *
28280 2a 20 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74  * actual content
28290 73 20 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69  s of FTS index i
282a0 73 20 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a  s identical..  *
282b0 2a 0a 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69  *.  ** Two versi
282c0 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ons of the same 
282d0 63 68 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c  checksum are cal
282e0 63 75 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72  culated. The fir
282f0 73 74 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76  st (stack.  ** v
28300 61 72 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20  ariable cksum2) 
28310 62 61 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73  based on entries
28320 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
28330 74 68 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e  the full-text in
28340 64 65 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64  dex.  ** while d
28350 6f 69 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63  oing a linear sc
28360 61 6e 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76  an of each indiv
28370 69 64 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74  idual index in t
28380 75 72 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  urn. .  **.  ** 
28390 41 73 20 65 61 63 68 20 74 65 72 6d 20 76 69 73  As each term vis
283a0 69 74 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65  ited by the line
283b0 61 72 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61  ar scans, a sepa
283c0 72 61 74 65 20 71 75 65 72 79 20 66 6f 72 20 74  rate query for t
283d0 68 65 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72  he.  ** same ter
283e0 6d 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  m is performed. 
283f0 63 6b 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c  cksum3 is calcul
28400 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68  ated based on th
28410 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65  e entries.  ** e
28420 78 74 72 61 63 74 65 64 20 62 79 20 74 68 65 73  xtracted by thes
28430 65 20 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a  e queries..  */.
28440 20 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49    for(fts5MultiI
28450 74 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63  terNew(p, pStruc
28460 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 2d  t, 0, 0, 0, 0, -
28470 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a 20  1, 0, &pIter);. 
28480 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
28490 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29 3d  erEof(p, pIter)=
284a0 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75  =0;.      fts5Mu
284b0 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70  ltiIterNext(p, p
284c0 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29 7b  Iter, 0, 0).  ){
284d0 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  .    int n;     
284e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72 6d   /* Size of term
28500 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
28510 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20 20   i64 iPos = 0;  
28520 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28530 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66 72  Position read fr
28540 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20  om poslist */.  
28550 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 20    int iOff = 0; 
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28570 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20 70   Offset within p
28580 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 36  oslist */.    i6
28590 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d  4 iRowid = fts5M
285a0 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49  ultiIterRowid(pI
285b0 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20 2a  ter);.    char *
285c0 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35 4d  z = (char*)fts5M
285d0 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49 74  ultiIterTerm(pIt
285e0 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f 2a  er, &n);..    /*
285f0 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e 65   If this is a ne
28600 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66 6f  w term, query fo
28610 72 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b 73  r it. Update cks
28620 75 6d 33 20 77 69 74 68 20 74 68 65 20 72 65 73  um3 with the res
28630 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74 73  ults. */.    fts
28640 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65  5TestTerm(p, &te
28650 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d 32  rm, z, n, cksum2
28660 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 20  , &cksum3);..   
28670 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a   poslist.n = 0;.
28680 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
28690 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 49 74 65  rPoslist(p, pIte
286a0 72 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b  r, 0, &poslist);
286b0 0a 20 20 20 20 77 68 69 6c 65 28 20 30 3d 3d 73  .    while( 0==s
286c0 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73  qlite3Fts5Poslis
286d0 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73 74 2e  tNext64(poslist.
286e0 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20 26 69  p, poslist.n, &i
286f0 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b 0a 20  Off, &iPos) ){. 
28700 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
28710 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e 28  FTS5_POS2COLUMN(
28720 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 69 6e 74  iPos);.      int
28730 20 69 54 6f 6b 4f 66 66 20 3d 20 46 54 53 35 5f   iTokOff = FTS5_
28740 50 4f 53 32 4f 46 46 53 45 54 28 69 50 6f 73 29  POS2OFFSET(iPos)
28750 3b 0a 20 20 20 20 20 20 63 6b 73 75 6d 32 20 5e  ;.      cksum2 ^
28760 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72 79  = fts5IndexEntry
28770 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43  Cksum(iRowid, iC
28780 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c  ol, iTokOff, -1,
28790 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20   z, n);.    }.  
287a0 7d 0a 20 20 66 74 73 35 54 65 73 74 54 65 72 6d  }.  fts5TestTerm
287b0 28 70 2c 20 26 74 65 72 6d 2c 20 30 2c 20 30 2c  (p, &term, 0, 0,
287c0 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d 33   cksum2, &cksum3
287d0 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
287e0 74 65 72 46 72 65 65 28 70 2c 20 70 49 74 65 72  terFree(p, pIter
287f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  );.  if( p->rc==
28800 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
28810 75 6d 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e  um!=cksum2 ) p->
28820 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
28830 54 3b 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74  T;..  fts5Struct
28840 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
28850 63 74 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ct);.  fts5Buffe
28860 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20 20  rFree(&term);.  
28870 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
28880 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75  poslist);.  retu
28890 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
288a0 72 6e 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn(p);.}.../*.**
288b0 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 72   Calculate and r
288c0 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
288d0 20 74 68 61 74 20 69 73 20 74 68 65 20 58 4f 52   that is the XOR
288e0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
288f0 74 72 79 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  try.** checksum 
28900 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 74  of all entries t
28910 68 61 74 20 77 6f 75 6c 64 20 62 65 20 67 65 6e  hat would be gen
28920 65 72 61 74 65 64 20 62 79 20 74 68 65 20 74 6f  erated by the to
28930 6b 65 6e 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  ken specified.**
28940 20 62 79 20 74 68 65 20 66 69 6e 61 6c 20 35 20   by the final 5 
28950 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 75 36  arguments..*/.u6
28960 34 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  4 sqlite3Fts5Ind
28970 65 78 43 6b 73 75 6d 28 0a 20 20 46 74 73 35 43  exCksum(.  Fts5C
28980 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 2c 20  onfig *pConfig, 
28990 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
289a0 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62 6a 65  nfiguration obje
289b0 63 74 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77  ct */.  i64 iRow
289c0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
289d0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 75 6d          /* Docum
289e0 65 6e 74 20 74 65 72 6d 20 61 70 70 65 61 72 73  ent term appears
289f0 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f   in */.  int iCo
28a00 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
28a10 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
28a20 6d 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73 20  mn term appears 
28a30 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73  in */.  int iPos
28a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28a50 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74          /* Posit
28a60 69 6f 6e 20 74 65 72 6d 20 61 70 70 65 61 72 73  ion term appears
28a70 20 69 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63   in */.  const c
28a80 68 61 72 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20  har *pTerm, int 
28a90 6e 54 65 72 6d 20 20 20 20 2f 2a 20 54 65 72 6d  nTerm    /* Term
28aa0 20 61 74 20 69 50 6f 73 20 2a 2f 0a 29 7b 0a 20   at iPos */.){. 
28ab0 20 75 36 34 20 72 65 74 20 3d 20 30 3b 20 20 20   u64 ret = 0;   
28ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ad0 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
28ae0 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78 3b 20   */.  int iIdx; 
28af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b00 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
28b10 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 69  rating through i
28b20 6e 64 65 78 65 73 20 2a 2f 0a 0a 20 20 72 65 74  ndexes */..  ret
28b30 20 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72   = fts5IndexEntr
28b40 79 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69  yCksum(iRowid, i
28b50 43 6f 6c 2c 20 69 50 6f 73 2c 20 30 2c 20 70 54  Col, iPos, 0, pT
28b60 65 72 6d 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20  erm, nTerm);..  
28b70 66 6f 72 28 69 49 64 78 3d 30 3b 20 69 49 64 78  for(iIdx=0; iIdx
28b80 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  <pConfig->nPrefi
28b90 78 3b 20 69 49 64 78 2b 2b 29 7b 0a 20 20 20 20  x; iIdx++){.    
28ba0 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35  int nByte = fts5
28bb0 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79  IndexCharlenToBy
28bc0 74 65 6c 65 6e 28 70 54 65 72 6d 2c 20 6e 54 65  telen(pTerm, nTe
28bd0 72 6d 2c 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  rm, pConfig->aPr
28be0 65 66 69 78 5b 69 49 64 78 5d 29 3b 0a 20 20 20  efix[iIdx]);.   
28bf0 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20   if( nByte ){.  
28c00 20 20 20 20 72 65 74 20 5e 3d 20 66 74 73 35 49      ret ^= fts5I
28c10 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
28c20 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69 50 6f  Rowid, iCol, iPo
28c30 73 2c 20 69 49 64 78 2b 31 2c 20 70 54 65 72 6d  s, iIdx+1, pTerm
28c40 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a  , nByte);.    }.
28c50 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 65    }..  return re
28c60 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  t;.}../*********
28c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28cb0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
28cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
28d00 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
28d10 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
28d20 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 74 73  ation of the fts
28d30 35 5f 64 65 63 6f 64 65 28 29 20 73 63 61 6c 61  5_decode() scala
28d40 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  r.** function on
28d50 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  ly..*/../*.** De
28d60 63 6f 64 65 20 61 20 73 65 67 6d 65 6e 74 2d 64  code a segment-d
28d70 61 74 61 20 72 6f 77 69 64 20 66 72 6f 6d 20 74  ata rowid from t
28d80 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
28d90 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
28da0 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f 73 69 74  s.** the opposit
28db0 65 20 6f 66 20 6d 61 63 72 6f 20 46 54 53 35 5f  e of macro FTS5_
28dc0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 29 2e  SEGMENT_ROWID().
28dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
28de0 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28  fts5DecodeRowid(
28df0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20  .  i64 iRowid,  
28e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e10 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 72 6f 6d     /* Rowid from
28e20 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
28e30 0a 20 20 69 6e 74 20 2a 70 69 53 65 67 69 64 2c  .  int *piSegid,
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e50 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65 67 6d 65     /* OUT: Segme
28e60 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  nt id */.  int *
28e70 70 62 44 6c 69 64 78 2c 20 20 20 20 20 20 20 20  pbDlidx,        
28e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
28e90 54 3a 20 44 6c 69 64 78 20 66 6c 61 67 20 2a 2f  T: Dlidx flag */
28ea0 0a 20 20 69 6e 74 20 2a 70 69 48 65 69 67 68 74  .  int *piHeight
28eb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
28ec0 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65 69 67 68     /* OUT: Heigh
28ed0 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 50 67  t */.  int *piPg
28ee0 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  no              
28ef0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 50         /* OUT: P
28f00 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
28f10 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20 28 69 6e  .  *piPgno = (in
28f20 74 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69  t)(iRowid & (((i
28f30 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54  64)1 << FTS5_DAT
28f40 41 5f 50 41 47 45 5f 42 29 20 2d 20 31 29 29 3b  A_PAGE_B) - 1));
28f50 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54  .  iRowid >>= FT
28f60 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 3b 0a  S5_DATA_PAGE_B;.
28f70 0a 20 20 2a 70 69 48 65 69 67 68 74 20 3d 20 28  .  *piHeight = (
28f80 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28 28  int)(iRowid & ((
28f90 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f 44  (i64)1 << FTS5_D
28fa0 41 54 41 5f 48 45 49 47 48 54 5f 42 29 20 2d 20  ATA_HEIGHT_B) - 
28fb0 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
28fc0 3d 20 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47  = FTS5_DATA_HEIG
28fd0 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44 6c 69 64  HT_B;..  *pbDlid
28fe0 78 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64  x = (int)(iRowid
28ff0 20 26 20 30 78 30 30 30 31 29 3b 0a 20 20 69 52   & 0x0001);.  iR
29000 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
29010 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20 2a 70 69  TA_DLI_B;..  *pi
29020 53 65 67 69 64 20 3d 20 28 69 6e 74 29 28 69 52  Segid = (int)(iR
29030 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
29040 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f  << FTS5_DATA_ID_
29050 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a 73 74 61  B) - 1));.}..sta
29060 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
29070 75 67 52 6f 77 69 64 28 69 6e 74 20 2a 70 52 63  ugRowid(int *pRc
29080 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42  , Fts5Buffer *pB
29090 75 66 2c 20 69 36 34 20 69 4b 65 79 29 7b 0a 20  uf, i64 iKey){. 
290a0 20 69 6e 74 20 69 53 65 67 69 64 2c 20 69 48 65   int iSegid, iHe
290b0 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20 62 44 6c  ight, iPgno, bDl
290c0 69 64 78 3b 20 20 20 20 20 20 20 2f 2a 20 52 6f  idx;       /* Ro
290d0 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74 73 20 2a  wid compenents *
290e0 2f 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f  /.  fts5DecodeRo
290f0 77 69 64 28 69 4b 65 79 2c 20 26 69 53 65 67 69  wid(iKey, &iSegi
29100 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48 65  d, &bDlidx, &iHe
29110 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a 0a  ight, &iPgno);..
29120 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20    if( iSegid==0 
29130 29 7b 0a 20 20 20 20 69 66 28 20 69 4b 65 79 3d  ){.    if( iKey=
29140 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52  =FTS5_AVERAGES_R
29150 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 73 71  OWID ){.      sq
29160 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
29170 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
29180 20 70 42 75 66 2c 20 22 28 61 76 65 72 61 67 65   pBuf, "(average
29190 73 29 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  s) ");.    }else
291a0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  {.      sqlite3F
291b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
291c0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
291d0 20 22 28 73 74 72 75 63 74 75 72 65 29 22 29 3b   "(structure)");
291e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c 73  .    }.  }.  els
291f0 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  e{.    sqlite3Ft
29200 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
29210 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
29220 22 28 25 73 73 65 67 69 64 3d 25 64 20 68 3d 25  "(%ssegid=%d h=%
29230 64 20 70 67 6e 6f 3d 25 64 29 22 2c 0a 20 20 20  d pgno=%d)",.   
29240 20 20 20 20 20 62 44 6c 69 64 78 20 3f 20 22 64       bDlidx ? "d
29250 6c 69 64 78 20 22 20 3a 20 22 22 2c 20 69 53 65  lidx " : "", iSe
29260 67 69 64 2c 20 69 48 65 69 67 68 74 2c 20 69 50  gid, iHeight, iP
29270 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 7d  gno.    );.  }.}
29280 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
29290 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72 65  s5DebugStructure
292a0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20  (.  int *pRc,   
292b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
292c0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65      /* IN/OUT: e
292d0 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46  rror code */.  F
292e0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
292f0 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
29300 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20 69 4c 76   *p.){.  int iLv
29310 6c 2c 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  l, iSeg;        
29320 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
29330 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76 65  ate through leve
29340 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a  ls, segments */.
29350 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69  .  for(iLvl=0; i
29360 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c 3b 20 69  Lvl<p->nLevel; i
29370 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  Lvl++){.    Fts5
29380 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
29390 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c 65 76 65  pLvl = &p->aLeve
293a0 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 73 71 6c  l[iLvl];.    sql
293b0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
293c0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
293d0 70 42 75 66 2c 20 0a 20 20 20 20 20 20 20 20 22  pBuf, .        "
293e0 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72 67 65 3d   {lvl=%d nMerge=
293f0 25 64 20 6e 53 65 67 3d 25 64 22 2c 20 69 4c 76  %d nSeg=%d", iLv
29400 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 2c  l, pLvl->nMerge,
29410 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20 20 20 20   pLvl->nSeg.    
29420 29 3b 0a 20 20 20 20 66 6f 72 28 69 53 65 67 3d  );.    for(iSeg=
29430 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e 53  0; iSeg<pLvl->nS
29440 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
29450 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
29460 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
29470 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
29480 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
29490 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
294a0 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
294b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 20 7b  , .          " {
294c0 69 64 3d 25 64 20 68 3d 25 64 20 6c 65 61 76 65  id=%d h=%d leave
294d0 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 70 53 65 67  s=%d..%d}", pSeg
294e0 2d 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e  ->iSegid, pSeg->
294f0 6e 48 65 69 67 68 74 2c 20 0a 20 20 20 20 20 20  nHeight, .      
29500 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69      pSeg->pgnoFi
29510 72 73 74 2c 20 70 53 65 67 2d 3e 70 67 6e 6f 4c  rst, pSeg->pgnoL
29520 61 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ast.      );.   
29530 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
29540 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
29550 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20  intf(pRc, pBuf, 
29560 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  "}");.  }.}../*.
29570 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72 74 20  ** This is part 
29580 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63 6f  of the fts5_deco
29590 64 65 28 29 20 64 65 62 75 67 67 69 6e 67 20 61  de() debugging a
295a0 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65  id..**.** Argume
295b0 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20  nts pBlob/nBlob 
295c0 63 6f 6e 74 61 69 6e 20 61 20 73 65 72 69 61 6c  contain a serial
295d0 69 7a 65 64 20 46 74 73 35 53 74 72 75 63 74 75  ized Fts5Structu
295e0 72 65 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 0a  re object. This.
295f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  ** function appe
29600 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  nds a human-read
29610 61 62 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74  able representat
29620 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ion of the same 
29630 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f 20 74 68 65  object.** to the
29640 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 61   buffer passed a
29650 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
29660 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69  ument. .*/.stati
29670 63 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64  c void fts5Decod
29680 65 53 74 72 75 63 74 75 72 65 28 0a 20 20 69 6e  eStructure(.  in
29690 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20  t *pRc,         
296a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
296b0 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63   IN/OUT: error c
296c0 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  ode */.  Fts5Buf
296d0 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e  fer *pBuf,.  con
296e0 73 74 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e  st u8 *pBlob, in
296f0 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74  t nBlob.){.  int
29700 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29720 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
29730 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
29740 70 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  p = 0;          
29750 20 2f 2a 20 44 65 63 6f 64 65 64 20 73 74 72 75   /* Decoded stru
29760 63 74 75 72 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  cture object */.
29770 0a 20 20 72 63 20 3d 20 66 74 73 35 53 74 72 75  .  rc = fts5Stru
29780 63 74 75 72 65 44 65 63 6f 64 65 28 70 42 6c 6f  ctureDecode(pBlo
29790 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c 20 26 70 29  b, nBlob, 0, &p)
297a0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
297b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
297c0 63 20 3d 20 72 63 3b 0a 20 20 20 20 72 65 74 75  c = rc;.    retu
297d0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44  rn;.  }..  fts5D
297e0 65 62 75 67 53 74 72 75 63 74 75 72 65 28 70 52  ebugStructure(pR
297f0 63 2c 20 70 42 75 66 2c 20 70 29 3b 0a 20 20 66  c, pBuf, p);.  f
29800 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
29810 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ase(p);.}../*.**
29820 20 42 75 66 66 65 72 20 28 61 2f 6e 29 20 69 73   Buffer (a/n) is
29830 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
29840 61 69 6e 20 61 20 6c 69 73 74 20 6f 66 20 73 65  ain a list of se
29850 72 69 61 6c 69 7a 65 64 20 76 61 72 69 6e 74 73  rialized varints
29860 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63 68 20 76  . Read.** each v
29870 61 72 69 6e 74 20 61 6e 64 20 61 70 70 65 6e 64  arint and append
29880 20 69 74 73 20 73 74 72 69 6e 67 20 72 65 70 72   its string repr
29890 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f 20 62 75  esentation to bu
298a0 66 66 65 72 20 70 42 75 66 2e 20 52 65 74 75 72  ffer pBuf. Retur
298b0 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69 74 68 65  n.** after eithe
298c0 72 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  r the input buff
298d0 65 72 20 69 73 20 65 78 68 61 75 73 74 65 64 20  er is exhausted 
298e0 6f 72 20 61 20 30 20 76 61 6c 75 65 20 69 73 20  or a 0 value is 
298f0 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  read..**.** The 
29900 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
29910 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
29920 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68  tes read from th
29930 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e 0a  e input buffer..
29940 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
29950 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
29960 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42 75  int *pRc, Fts5Bu
29970 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73  ffer *pBuf, cons
29980 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b  t u8 *a, int n){
29990 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b  .  int iOff = 0;
299a0 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e  .  while( iOff<n
299b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 56 61 6c   ){.    int iVal
299c0 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74  ;.    iOff += ft
299d0 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
299e0 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29 3b 0a 20  [iOff], iVal);. 
299f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29a00 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
29a10 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 25 64  (pRc, pBuf, " %d
29a20 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ", iVal);.  }.  
29a30 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a  return iOff;.}..
29a40 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61 72 74 20  /*.** The start 
29a50 6f 66 20 62 75 66 66 65 72 20 28 61 2f 6e 29 20  of buffer (a/n) 
29a60 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 73 74 61  contains the sta
29a70 72 74 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e  rt of a doclist.
29a80 20 54 68 65 20 64 6f 63 6c 69 73 74 0a 2a 2a 20   The doclist.** 
29a90 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 66  may or may not f
29aa0 69 6e 69 73 68 20 77 69 74 68 69 6e 20 74 68 65  inish within the
29ab0 20 62 75 66 66 65 72 2e 20 54 68 69 73 20 66 75   buffer. This fu
29ac0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
29ad0 20 74 65 78 74 0a 2a 2a 20 72 65 70 72 65 73 65   text.** represe
29ae0 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 70  ntation of the p
29af0 61 72 74 20 6f 66 20 74 68 65 20 64 6f 63 6c 69  art of the docli
29b00 73 74 20 74 68 61 74 20 69 73 20 70 72 65 73 65  st that is prese
29b10 6e 74 20 74 6f 20 62 75 66 66 65 72 0a 2a 2a 20  nt to buffer.** 
29b20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  pBuf. .**.** The
29b30 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
29b40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
29b50 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ytes read from t
29b60 68 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 2e  he input buffer.
29b70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
29b80 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
29b90 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73 35 42  (int *pRc, Fts5B
29ba0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63 6f 6e  uffer *pBuf, con
29bb0 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20 6e 29  st u8 *a, int n)
29bc0 7b 0a 20 20 69 36 34 20 69 44 6f 63 69 64 3b 0a  {.  i64 iDocid;.
29bd0 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
29be0 0a 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65  .  iOff = sqlite
29bf0 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
29c00 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
29c10 69 44 6f 63 69 64 29 3b 0a 20 20 73 71 6c 69 74  iDocid);.  sqlit
29c20 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
29c30 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
29c40 75 66 2c 20 22 20 72 6f 77 69 64 3d 25 6c 6c 64  uf, " rowid=%lld
29c50 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 77 68  ", iDocid);.  wh
29c60 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
29c70 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20     int nPos;.   
29c80 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20 20   int bDummy;.   
29c90 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
29ca0 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b 69  PoslistSize(&a[i
29cb0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
29cc0 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66 66 20  ummy);.    iOff 
29cd0 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73  += fts5DecodePos
29ce0 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66 2c 20  list(pRc, pBuf, 
29cf0 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28 6e 2d  &a[iOff], MIN(n-
29d00 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a 20 20  iOff, nPos));.  
29d10 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29 7b 0a    if( iOff<n ){.
29d20 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
29d30 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
29d40 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
29d50 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
29d60 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
29d70 20 20 20 20 20 69 66 28 20 69 44 65 6c 74 61 3d       if( iDelta=
29d80 3d 30 20 29 20 72 65 74 75 72 6e 20 69 4f 66 66  =0 ) return iOff
29d90 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b  ;.      iDocid +
29da0 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20  = iDelta;.      
29db0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
29dc0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
29dd0 63 2c 20 70 42 75 66 2c 20 22 20 72 6f 77 69 64  c, pBuf, " rowid
29de0 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
29df0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
29e00 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
29e10 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
29e20 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72 2d 64  tation of user-d
29e30 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20 66 75  efined scalar fu
29e40 6e 63 74 69 6f 6e 20 66 74 73 35 5f 64 65 63 6f  nction fts5_deco
29e50 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  de()..*/.static 
29e60 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 46  void fts5DecodeF
29e70 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
29e80 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
29e90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
29ea0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
29eb0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
29ec0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
29ed0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29ee0 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
29ef0 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
29f00 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
29f10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
29f20 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
29f30 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 69 52 6f   */.){.  i64 iRo
29f40 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
29f50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69           /* Rowi
29f60 64 20 66 6f 72 20 72 65 63 6f 72 64 20 62 65 69  d for record bei
29f70 6e 67 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20  ng decoded */.  
29f80 69 6e 74 20 69 53 65 67 69 64 2c 69 48 65 69 67  int iSegid,iHeig
29f90 68 74 2c 69 50 67 6e 6f 2c 62 44 6c 69 64 78 3b  ht,iPgno,bDlidx;
29fa0 2f 2a 20 52 6f 77 69 64 20 63 6f 6d 70 6f 6e 65  /* Rowid compone
29fb0 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  nts */.  const u
29fc0 38 20 2a 61 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b  8 *aBlob; int n;
29fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 63 6f           /* Reco
29fe0 72 64 20 74 6f 20 64 65 63 6f 64 65 20 2a 2f 0a  rd to decode */.
29ff0 20 20 75 38 20 2a 61 20 3d 20 30 3b 0a 20 20 46    u8 *a = 0;.  F
2a000 74 73 35 42 75 66 66 65 72 20 73 3b 20 20 20 20  ts5Buffer s;    
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a020 2a 20 42 75 69 6c 64 20 75 70 20 74 65 78 74 20  * Build up text 
2a030 74 6f 20 72 65 74 75 72 6e 20 68 65 72 65 20 2a  to return here *
2a040 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2a050 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2a060 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2a070 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 70 61  de */.  int nSpa
2a080 63 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  ce = 0;..  asser
2a090 74 28 20 6e 41 72 67 3d 3d 32 20 29 3b 0a 20 20  t( nArg==2 );.  
2a0a0 6d 65 6d 73 65 74 28 26 73 2c 20 30 2c 20 73 69  memset(&s, 0, si
2a0b0 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29  zeof(Fts5Buffer)
2a0c0 29 3b 0a 20 20 69 52 6f 77 69 64 20 3d 20 73 71  );.  iRowid = sq
2a0d0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36  lite3_value_int6
2a0e0 34 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 6e  4(apVal[0]);.  n
2a0f0 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
2a100 5f 62 79 74 65 73 28 61 70 56 61 6c 5b 31 5d 29  _bytes(apVal[1])
2a110 3b 0a 20 20 61 42 6c 6f 62 20 3d 20 73 71 6c 69  ;.  aBlob = sqli
2a120 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
2a130 70 56 61 6c 5b 31 5d 29 3b 0a 0a 20 20 6e 53 70  pVal[1]);..  nSp
2a140 61 63 65 20 3d 20 6e 20 2b 20 46 54 53 35 5f 44  ace = n + FTS5_D
2a150 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47  ATA_ZERO_PADDING
2a160 3b 0a 20 20 61 20 3d 20 28 75 38 2a 29 73 71 6c  ;.  a = (u8*)sql
2a170 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
2a180 72 6f 28 26 72 63 2c 20 6e 53 70 61 63 65 29 3b  ro(&rc, nSpace);
2a190 0a 20 20 69 66 28 20 61 3d 3d 30 20 29 20 67 6f  .  if( a==0 ) go
2a1a0 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20  to decode_out;. 
2a1b0 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c 6f 62   memcpy(a, aBlob
2a1c0 2c 20 6e 29 3b 0a 20 20 66 74 73 35 44 65 63 6f  , n);.  fts5Deco
2a1d0 64 65 52 6f 77 69 64 28 69 52 6f 77 69 64 2c 20  deRowid(iRowid, 
2a1e0 26 69 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78  &iSegid, &bDlidx
2a1f0 2c 20 26 69 48 65 69 67 68 74 2c 20 26 69 50 67  , &iHeight, &iPg
2a200 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44 65 62 75  no);..  fts5Debu
2a210 67 52 6f 77 69 64 28 26 72 63 2c 20 26 73 2c 20  gRowid(&rc, &s, 
2a220 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 62  iRowid);.  if( b
2a230 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 46 74 73  Dlidx ){.    Fts
2a240 35 44 61 74 61 20 64 6c 69 64 78 3b 0a 20 20 20  5Data dlidx;.   
2a250 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 6c 76   Fts5DlidxLvl lv
2a260 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78 2e 70 20  l;..    dlidx.p 
2a270 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64 78 2e 6e  = a;.    dlidx.n
2a280 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d 65 6d 73 65   = n;..    memse
2a290 74 28 26 6c 76 6c 2c 20 30 2c 20 73 69 7a 65 6f  t(&lvl, 0, sizeo
2a2a0 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29 29  f(Fts5DlidxLvl))
2a2b0 3b 0a 20 20 20 20 6c 76 6c 2e 70 44 61 74 61 20  ;.    lvl.pData 
2a2c0 3d 20 26 64 6c 69 64 78 3b 0a 20 20 20 20 6c 76  = &dlidx;.    lv
2a2d0 6c 2e 69 4c 65 61 66 50 67 6e 6f 20 3d 20 69 50  l.iLeafPgno = iP
2a2e0 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f 72 28 66 74  gno;..    for(ft
2a2f0 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 26  s5DlidxLvlNext(&
2a300 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d  lvl); lvl.bEof==
2a310 30 3b 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  0; fts5DlidxLvlN
2a320 65 78 74 28 26 6c 76 6c 29 29 7b 0a 20 20 20 20  ext(&lvl)){.    
2a330 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2a340 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2a350 26 72 63 2c 20 26 73 2c 20 0a 20 20 20 20 20 20  &rc, &s, .      
2a360 20 20 20 20 22 20 25 64 28 25 6c 6c 64 29 22 2c      " %d(%lld)",
2a370 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 2c 20   lvl.iLeafPgno, 
2a380 6c 76 6c 2e 69 52 6f 77 69 64 0a 20 20 20 20 20  lvl.iRowid.     
2a390 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   );.    }.  }els
2a3a0 65 20 69 66 28 20 69 53 65 67 69 64 3d 3d 30 20  e if( iSegid==0 
2a3b0 29 7b 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69  ){.    if( iRowi
2a3c0 64 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45 53  d==FTS5_AVERAGES
2a3d0 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20  _ROWID ){.      
2a3e0 2f 2a 20 74 6f 64 6f 20 2a 2f 0a 20 20 20 20 7d  /* todo */.    }
2a3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35  else{.      fts5
2a400 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
2a410 26 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a  &rc, &s, a, n);.
2a420 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 0a      }.  }else{..
2a430 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 74      Fts5Buffer t
2a440 65 72 6d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  erm;.    memset(
2a450 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
2a460 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
2a470 20 20 20 20 69 66 28 20 69 48 65 69 67 68 74 3d      if( iHeight=
2a480 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
2a490 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
2a4a0 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
2a4b0 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  f = 0;.      int
2a4c0 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 69 6e 74   iOff;.      int
2a4d0 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
2a4e0 20 20 20 69 66 28 20 6e 3e 3d 34 20 29 7b 0a 20     if( n>=4 ){. 
2a4f0 20 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66         iRowidOff
2a500 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
2a510 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 54  [0]);.        iT
2a520 65 72 6d 4f 66 66 20 3d 20 66 74 73 35 47 65 74  ermOff = fts5Get
2a530 55 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20  U16(&a[2]);.    
2a540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2a550 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2a560 65 72 53 65 74 28 26 72 63 2c 20 26 73 2c 20 38  erSet(&rc, &s, 8
2a570 2c 20 28 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f  , (const u8*)"co
2a580 72 72 75 70 74 22 29 3b 0a 20 20 20 20 20 20 20  rrupt");.       
2a590 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
2a5a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
2a5b0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
2a5c0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 3d  {.        iOff =
2a5d0 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
2a5e0 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54 65 72    }else if( iTer
2a5f0 6d 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  mOff ){.        
2a600 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
2a610 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2a620 20 20 20 20 20 20 69 4f 66 66 20 3d 20 6e 3b 0a        iOff = n;.
2a630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
2a640 73 35 44 65 63 6f 64 65 50 6f 73 6c 69 73 74 28  s5DecodePoslist(
2a650 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d 2c 20  &rc, &s, &a[4], 
2a660 69 4f 66 66 2d 34 29 3b 0a 0a 20 20 20 20 20 20  iOff-4);..      
2a670 61 73 73 65 72 74 28 20 69 52 6f 77 69 64 4f 66  assert( iRowidOf
2a680 66 3d 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 52  f==0 || iOff==iR
2a690 6f 77 69 64 4f 66 66 20 29 3b 0a 20 20 20 20 20  owidOff );.     
2a6a0 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20 29   if( iRowidOff )
2a6b0 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
2a6c0 3d 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  = fts5DecodeDocl
2a6d0 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
2a6e0 69 4f 66 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a  iOff], n-iOff);.
2a6f0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61        }..      a
2a700 73 73 65 72 74 28 20 69 54 65 72 6d 4f 66 66 3d  ssert( iTermOff=
2a710 3d 30 20 7c 7c 20 69 4f 66 66 3d 3d 69 54 65 72  =0 || iOff==iTer
2a720 6d 4f 66 66 20 29 3b 0a 20 20 20 20 20 20 77 68  mOff );.      wh
2a730 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2a740 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65         int nByte
2a750 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  ;.        iOff +
2a760 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2a770 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  2(&a[iOff], nByt
2a780 65 29 3b 0a 20 20 20 20 20 20 20 20 74 65 72 6d  e);.        term
2a790 2e 6e 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20  .n= nKeep;.     
2a7a0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
2a7b0 65 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65  endBlob(&rc, &te
2a7c0 72 6d 2c 20 6e 42 79 74 65 2c 20 26 61 5b 69 4f  rm, nByte, &a[iO
2a7d0 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 4f  ff]);.        iO
2a7e0 66 66 20 2b 3d 20 6e 42 79 74 65 3b 0a 0a 20 20  ff += nByte;..  
2a7f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
2a800 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
2a810 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
2a820 20 26 72 63 2c 20 26 73 2c 20 22 20 74 65 72 6d   &rc, &s, " term
2a830 3d 25 2e 2a 73 22 2c 20 74 65 72 6d 2e 6e 2c 20  =%.*s", term.n, 
2a840 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 74 65 72  (const char*)ter
2a850 6d 2e 70 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  m.p.        );. 
2a860 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66         iOff += f
2a870 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73 74  ts5DecodeDoclist
2a880 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66  (&rc, &s, &a[iOf
2a890 66 5d 2c 20 6e 2d 69 4f 66 66 29 3b 0a 20 20 20  f], n-iOff);.   
2a8a0 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20       if( iOff<n 
2a8b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  ){.          iOf
2a8c0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
2a8d0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
2a8e0 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  Keep);.        }
2a8f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
2a900 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
2a910 65 72 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  erm);.    }else{
2a920 0a 20 20 20 20 20 20 46 74 73 35 4e 6f 64 65 49  .      Fts5NodeI
2a930 74 65 72 20 73 73 3b 0a 20 20 20 20 20 20 66 6f  ter ss;.      fo
2a940 72 28 66 74 73 35 4e 6f 64 65 49 74 65 72 49 6e  r(fts5NodeIterIn
2a950 69 74 28 61 2c 20 6e 2c 20 26 73 73 29 3b 20 73  it(a, n, &ss); s
2a960 73 2e 61 44 61 74 61 3b 20 66 74 73 35 4e 6f 64  s.aData; fts5Nod
2a970 65 49 74 65 72 4e 65 78 74 28 26 72 63 2c 20 26  eIterNext(&rc, &
2a980 73 73 29 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ss)){.        if
2a990 28 20 73 73 2e 74 65 72 6d 2e 6e 3d 3d 30 20 29  ( ss.term.n==0 )
2a9a0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2a9b0 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2a9c0 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c 20 26  endPrintf(&rc, &
2a9d0 73 2c 20 22 20 6c 65 66 74 3d 25 64 22 2c 20 73  s, " left=%d", s
2a9e0 73 2e 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  s.iChild);.     
2a9f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2aa00 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2aa10 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2aa20 66 28 26 72 63 2c 26 73 2c 20 22 20 5c 22 25 2e  f(&rc,&s, " \"%.
2aa30 2a 73 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 20  *s\"", .        
2aa40 20 20 20 20 20 20 73 73 2e 74 65 72 6d 2e 6e 2c        ss.term.n,
2aa50 20 73 73 2e 74 65 72 6d 2e 70 0a 20 20 20 20 20   ss.term.p.     
2aa60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
2aa70 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 73  }.        if( ss
2aa80 2e 6e 45 6d 70 74 79 20 29 7b 0a 20 20 20 20 20  .nEmpty ){.     
2aa90 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2aaa0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2aab0 74 66 28 26 72 63 2c 20 26 73 2c 20 22 20 65 6d  tf(&rc, &s, " em
2aac0 70 74 79 3d 25 64 25 73 22 2c 20 73 73 2e 6e 45  pty=%d%s", ss.nE
2aad0 6d 70 74 79 2c 0a 20 20 20 20 20 20 20 20 20 20  mpty,.          
2aae0 20 20 20 20 73 73 2e 62 44 6c 69 64 78 20 3f 20      ss.bDlidx ? 
2aaf0 22 2a 22 20 3a 20 22 22 0a 20 20 20 20 20 20 20  "*" : "".       
2ab00 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a     );.        }.
2ab10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
2ab20 73 35 4e 6f 64 65 49 74 65 72 46 72 65 65 28 26  s5NodeIterFree(&
2ab30 73 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ss);.    }.  }. 
2ab40 20 0a 20 64 65 63 6f 64 65 5f 6f 75 74 3a 0a 20   . decode_out:. 
2ab50 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 29   sqlite3_free(a)
2ab60 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
2ab70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
2ab80 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
2ab90 28 70 43 74 78 2c 20 28 63 6f 6e 73 74 20 63 68  (pCtx, (const ch
2aba0 61 72 2a 29 73 2e 70 2c 20 73 2e 6e 2c 20 53 51  ar*)s.p, s.n, SQ
2abb0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
2abc0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
2abd0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
2abe0 6f 72 5f 63 6f 64 65 28 70 43 74 78 2c 20 72 63  or_code(pCtx, rc
2abf0 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 42 75 66  );.  }.  fts5Buf
2ac00 66 65 72 46 72 65 65 28 26 73 29 3b 0a 7d 0a 0a  ferFree(&s);.}..
2ac10 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d  /*.** The implem
2ac20 65 6e 74 61 74 69 6f 6e 20 6f 66 20 75 73 65 72  entation of user
2ac30 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72 20  -defined scalar 
2ac40 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 5f 72 6f  function fts5_ro
2ac50 77 69 64 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  wid()..*/.static
2ac60 20 76 6f 69 64 20 66 74 73 35 52 6f 77 69 64 46   void fts5RowidF
2ac70 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
2ac80 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
2ac90 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75  ,          /* Fu
2aca0 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74  nction call cont
2acb0 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  ext */.  int nAr
2acc0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
2acd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ace0 65 72 20 6f 66 20 61 72 67 73 20 28 61 6c 77 61  er of args (alwa
2acf0 79 73 20 32 29 20 2a 2f 0a 20 20 73 71 6c 69 74  ys 2) */.  sqlit
2ad00 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c  e3_value **apVal
2ad10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 75             /* Fu
2ad20 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
2ad30 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63   */.){.  const c
2ad40 68 61 72 20 2a 7a 41 72 67 3b 0a 20 20 69 66 28  har *zArg;.  if(
2ad50 20 6e 41 72 67 3d 3d 30 20 29 7b 0a 20 20 20 20   nArg==0 ){.    
2ad60 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
2ad70 72 72 6f 72 28 70 43 74 78 2c 20 22 73 68 6f 75  rror(pCtx, "shou
2ad80 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77 69  ld be: fts5_rowi
2ad90 64 28 73 75 62 6a 65 63 74 2c 20 2e 2e 2e 2e 29  d(subject, ....)
2ada0 22 2c 20 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  ", -1);.  }else{
2adb0 0a 20 20 20 20 7a 41 72 67 20 3d 20 28 63 6f 6e  .    zArg = (con
2adc0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
2add0 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
2ade0 6c 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 30  l[0]);.    if( 0
2adf0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ==sqlite3_stricm
2ae00 70 28 7a 41 72 67 2c 20 22 73 65 67 6d 65 6e 74  p(zArg, "segment
2ae10 22 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  ") ){.      i64 
2ae20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 69 6e  iRowid;.      in
2ae30 74 20 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  t segid, height,
2ae40 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
2ae50 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20 20 20 20   nArg!=4 ){.    
2ae60 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2ae70 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2ae80 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
2ae90 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2aea0 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
2aeb0 67 69 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e  gid, height, pgn
2aec0 6f 29 29 22 2c 20 2d 31 0a 20 20 20 20 20 20 20  o))", -1.       
2aed0 20 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   );.      }else{
2aee0 0a 20 20 20 20 20 20 20 20 73 65 67 69 64 20 3d  .        segid =
2aef0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
2af00 6e 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20  nt(apVal[1]);.  
2af10 20 20 20 20 20 20 68 65 69 67 68 74 20 3d 20 73        height = s
2af20 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
2af30 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 20 20  (apVal[2]);.    
2af40 20 20 20 20 70 67 6e 6f 20 3d 20 73 71 6c 69 74      pgno = sqlit
2af50 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56  e3_value_int(apV
2af60 61 6c 5b 33 5d 29 3b 0a 20 20 20 20 20 20 20 20  al[3]);.        
2af70 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
2af80 47 4d 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69  GMENT_ROWID(segi
2af90 64 2c 20 68 65 69 67 68 74 2c 20 70 67 6e 6f 29  d, height, pgno)
2afa0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2afb0 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34 28 70  3_result_int64(p
2afc0 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20  Ctx, iRowid);.  
2afd0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
2afe0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2aff0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2b000 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69 72  x, .        "fir
2b010 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f 72  st arg to fts5_r
2b020 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20 27  owid() must be '
2b030 73 65 67 6d 65 6e 74 27 20 22 0a 20 20 20 20 20  segment' ".     
2b040 20 20 20 22 6f 72 20 27 73 74 61 72 74 2d 6f 66     "or 'start-of
2b050 2d 69 6e 64 65 78 27 22 0a 20 20 20 20 20 20 20  -index'".       
2b060 20 2c 20 2d 31 0a 20 20 20 20 20 20 29 3b 0a 20   , -1.      );. 
2b070 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
2b080 2a 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64  * This is called
2b090 20 61 73 20 70 61 72 74 20 6f 66 20 72 65 67 69   as part of regi
2b0a0 73 74 65 72 69 6e 67 20 74 68 65 20 46 54 53 35  stering the FTS5
2b0b0 20 6d 6f 64 75 6c 65 20 77 69 74 68 20 64 61 74   module with dat
2b0c0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
2b0d0 69 6f 6e 20 64 62 2e 20 49 74 20 72 65 67 69 73  ion db. It regis
2b0e0 74 65 72 73 20 73 65 76 65 72 61 6c 20 75 73 65  ters several use
2b0f0 72 2d 64 65 66 69 6e 65 64 20 73 63 61 6c 61 72  r-defined scalar
2b100 20 66 75 6e 63 74 69 6f 6e 73 20 75 73 65 66 75   functions usefu
2b110 6c 0a 2a 2a 20 77 69 74 68 20 46 54 53 35 2e 0a  l.** with FTS5..
2b120 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
2b130 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
2b140 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61  s returned. If a
2b150 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
2b160 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 53 51  some other.** SQ
2b170 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
2b180 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
2b190 65 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ead..*/.int sqli
2b1a0 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 69 74  te3Fts5IndexInit
2b1b0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
2b1c0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
2b1d0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
2b1e0 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 66 74  n(.      db, "ft
2b1f0 73 35 5f 64 65 63 6f 64 65 22 2c 20 32 2c 20 53  s5_decode", 2, S
2b200 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66  QLITE_UTF8, 0, f
2b210 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
2b220 6e 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69  n, 0, 0.  );.  i
2b230 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2b240 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
2b250 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
2b260 74 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 64 62  tion(.        db
2b270 2c 20 22 66 74 73 35 5f 72 6f 77 69 64 22 2c 20  , "fts5_rowid", 
2b280 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  -1, SQLITE_UTF8,
2b290 20 30 2c 20 66 74 73 35 52 6f 77 69 64 46 75 6e   0, fts5RowidFun
2b2a0 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20  ction, 0, 0.    
2b2b0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2b2c0 72 63 3b 0a 7d 0a 0a                             rc;.}..