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

Artifact 11687c48902238e1fedb0bb8e1e8b5b8f6d82e1c:


0000: 2f 2a 0a 2a 2a 20 32 30 31 34 20 4d 61 79 20 33  /*.** 2014 May 3
0010: 31 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  1.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4c 6f 77 20  *****.**.** Low 
0180: 6c 65 76 65 6c 20 61 63 63 65 73 73 20 74 6f 20  level access to 
0190: 74 68 65 20 46 54 53 20 69 6e 64 65 78 20 73 74  the FTS index st
01a0: 6f 72 65 64 20 69 6e 20 74 68 65 20 64 61 74 61  ored in the data
01b0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 0a  base file. The .
01c0: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74  ** routines in t
01d0: 68 69 73 20 66 69 6c 65 20 66 69 6c 65 20 69 6d  his file file im
01e0: 70 6c 65 6d 65 6e 74 20 61 6c 6c 20 72 65 61 64  plement all read
01f0: 20 61 6e 64 20 77 72 69 74 65 20 61 63 63 65 73   and write acces
0200: 73 20 74 6f 20 74 68 65 0a 2a 2a 20 25 5f 64 61  s to the.** %_da
0210: 74 61 20 74 61 62 6c 65 2e 20 4f 74 68 65 72 20  ta table. Other 
0220: 70 61 72 74 73 20 6f 66 20 74 68 65 20 73 79 73  parts of the sys
0230: 74 65 6d 20 61 63 63 65 73 73 20 74 68 69 73 20  tem access this 
0240: 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 20 76 69  functionality vi
0250: 61 0a 2a 2a 20 74 68 65 20 69 6e 74 65 72 66 61  a.** the interfa
0260: 63 65 20 64 65 66 69 6e 65 64 20 69 6e 20 66 74  ce defined in ft
0270: 73 35 49 6e 74 2e 68 2e 0a 2a 2f 0a 0a 0a 23 69  s5Int.h..*/...#i
0280: 6e 63 6c 75 64 65 20 22 66 74 73 35 49 6e 74 2e  nclude "fts5Int.
0290: 68 22 0a 0a 2f 2a 0a 2a 2a 20 4f 76 65 72 76 69  h"../*.** Overvi
02a0: 65 77 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 25 5f  ew:.**.** The %_
02b0: 64 61 74 61 20 74 61 62 6c 65 20 63 6f 6e 74 61  data table conta
02c0: 69 6e 73 20 61 6c 6c 20 74 68 65 20 46 54 53 20  ins all the FTS 
02d0: 69 6e 64 65 78 65 73 20 66 6f 72 20 61 6e 20 46  indexes for an F
02e0: 54 53 35 20 76 69 72 74 75 61 6c 20 74 61 62 6c  TS5 virtual tabl
02f0: 65 2e 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73  e..** As well as
0300: 20 74 68 65 20 6d 61 69 6e 20 74 65 72 6d 20 69   the main term i
0310: 6e 64 65 78 2c 20 74 68 65 72 65 20 6d 61 79 20  ndex, there may 
0320: 62 65 20 75 70 20 74 6f 20 33 31 20 70 72 65 66  be up to 31 pref
0330: 69 78 20 69 6e 64 65 78 65 73 2e 0a 2a 2a 20 54  ix indexes..** T
0340: 68 65 20 66 6f 72 6d 61 74 20 69 73 20 73 69 6d  he format is sim
0350: 69 6c 61 72 20 74 6f 20 46 54 53 33 2f 34 2c 20  ilar to FTS3/4, 
0360: 65 78 63 65 70 74 20 74 68 61 74 3a 0a 2a 2a 0a  except that:.**.
0370: 2a 2a 20 20 20 2a 20 61 6c 6c 20 73 65 67 6d 65  **   * all segme
0380: 6e 74 20 62 2d 74 72 65 65 20 6c 65 61 66 20 64  nt b-tree leaf d
0390: 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ata is stored in
03a0: 20 66 69 78 65 64 20 73 69 7a 65 20 70 61 67 65   fixed size page
03b0: 20 72 65 63 6f 72 64 73 20 0a 2a 2a 20 20 20 20   records .**    
03c0: 20 28 65 2e 67 2e 20 31 30 30 30 20 62 79 74 65   (e.g. 1000 byte
03d0: 73 29 2e 20 41 20 73 69 6e 67 6c 65 20 64 6f 63  s). A single doc
03e0: 6c 69 73 74 20 6d 61 79 20 73 70 61 6e 20 6d 75  list may span mu
03f0: 6c 74 69 70 6c 65 20 70 61 67 65 73 2e 20 43 61  ltiple pages. Ca
0400: 72 65 20 69 73 20 0a 2a 2a 20 20 20 20 20 74 61  re is .**     ta
0410: 6b 65 6e 20 74 6f 20 65 6e 73 75 72 65 20 69 74  ken to ensure it
0420: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
0430: 69 74 65 72 61 74 65 20 69 6e 20 65 69 74 68 65  iterate in eithe
0440: 72 20 64 69 72 65 63 74 69 6f 6e 20 74 68 72 6f  r direction thro
0450: 75 67 68 20 0a 2a 2a 20 20 20 20 20 74 68 65 20  ugh .**     the 
0460: 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 6f 63  entries in a doc
0470: 6c 69 73 74 2c 20 6f 72 20 74 6f 20 73 65 65 6b  list, or to seek
0480: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 65   to a specific e
0490: 6e 74 72 79 20 77 69 74 68 69 6e 20 61 20 0a 2a  ntry within a .*
04a0: 2a 20 20 20 20 20 64 6f 63 6c 69 73 74 2c 20 77  *     doclist, w
04b0: 69 74 68 6f 75 74 20 6c 6f 61 64 69 6e 67 20 69  ithout loading i
04c0: 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  t into memory..*
04d0: 2a 0a 2a 2a 20 20 20 2a 20 6c 61 72 67 65 20 64  *.**   * large d
04e0: 6f 63 6c 69 73 74 73 20 74 68 61 74 20 73 70 61  oclists that spa
04f0: 6e 20 6d 61 6e 79 20 70 61 67 65 73 20 68 61 76  n many pages hav
0500: 65 20 61 73 73 6f 63 69 61 74 65 64 20 22 64 6f  e associated "do
0510: 63 6c 69 73 74 20 69 6e 64 65 78 22 0a 2a 2a 20  clist index".** 
0520: 20 20 20 20 72 65 63 6f 72 64 73 20 74 68 61 74      records that
0530: 20 63 6f 6e 74 61 69 6e 20 61 20 63 6f 70 79 20   contain a copy 
0540: 6f 66 20 74 68 65 20 66 69 72 73 74 20 72 6f 77  of the first row
0550: 69 64 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  id on each page 
0560: 73 70 61 6e 6e 65 64 20 62 79 0a 2a 2a 20 20 20  spanned by.**   
0570: 20 20 74 68 65 20 64 6f 63 6c 69 73 74 2e 20 54    the doclist. T
0580: 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 73  his is used to s
0590: 70 65 65 64 20 75 70 20 73 65 65 6b 20 6f 70 65  peed up seek ope
05a0: 72 61 74 69 6f 6e 73 2c 20 61 6e 64 20 6d 65 72  rations, and mer
05b0: 67 65 73 20 6f 66 0a 2a 2a 20 20 20 20 20 6c 61  ges of.**     la
05c0: 72 67 65 20 64 6f 63 6c 69 73 74 73 20 77 69 74  rge doclists wit
05d0: 68 20 76 65 72 79 20 73 6d 61 6c 6c 20 64 6f 63  h very small doc
05e0: 6c 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  lists..**.**   *
05f0: 20 65 78 74 72 61 20 66 69 65 6c 64 73 20 69 6e   extra fields in
0600: 20 74 68 65 20 22 73 74 72 75 63 74 75 72 65 20   the "structure 
0610: 72 65 63 6f 72 64 22 20 72 65 63 6f 72 64 20 74  record" record t
0620: 68 65 20 73 74 61 74 65 20 6f 66 20 6f 6e 67 6f  he state of ongo
0630: 69 6e 67 0a 2a 2a 20 20 20 20 20 69 6e 63 72 65  ing.**     incre
0640: 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70 65  mental merge ope
0650: 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2f 0a 0a  rations..**.*/..
0660: 0a 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4f 50  .#define FTS5_OP
0670: 54 5f 57 4f 52 4b 5f 55 4e 49 54 20 20 31 30 30  T_WORK_UNIT  100
0680: 30 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  0  /* Number of 
0690: 6c 65 61 66 20 70 61 67 65 73 20 70 65 72 20 6f  leaf pages per o
06a0: 70 74 69 6d 69 7a 65 20 73 74 65 70 20 2a 2f 0a  ptimize step */.
06b0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 57 4f 52  #define FTS5_WOR
06c0: 4b 5f 55 4e 49 54 20 20 20 20 20 20 36 34 20 20  K_UNIT      64  
06d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c    /* Number of l
06e0: 65 61 66 20 70 61 67 65 73 20 69 6e 20 75 6e 69  eaf pages in uni
06f0: 74 20 6f 66 20 77 6f 72 6b 20 2a 2f 0a 0a 23 64  t of work */..#d
0700: 65 66 69 6e 65 20 46 54 53 35 5f 4d 49 4e 5f 44  efine FTS5_MIN_D
0710: 4c 49 44 58 5f 53 49 5a 45 20 34 20 20 20 20 20  LIDX_SIZE 4     
0720: 2f 2a 20 41 64 64 20 64 6c 69 64 78 20 69 66 20  /* Add dlidx if 
0730: 74 68 69 73 20 6d 61 6e 79 20 65 6d 70 74 79 20  this many empty 
0740: 70 61 67 65 73 20 2a 2f 0a 0a 23 64 65 66 69 6e  pages */..#defin
0750: 65 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  e FTS5_MAIN_PREF
0760: 49 58 20 27 30 27 0a 0a 23 69 66 20 46 54 53 35  IX '0'..#if FTS5
0770: 5f 4d 41 58 5f 50 52 45 46 49 58 5f 49 4e 44 45  _MAX_PREFIX_INDE
0780: 58 45 53 20 3e 20 33 31 0a 23 20 65 72 72 6f 72  XES > 31.# error
0790: 20 22 46 54 53 35 5f 4d 41 58 5f 50 52 45 46 49   "FTS5_MAX_PREFI
07a0: 58 5f 49 4e 44 45 58 45 53 20 69 73 20 74 6f 6f  X_INDEXES is too
07b0: 20 6c 61 72 67 65 22 0a 23 65 6e 64 69 66 0a 0a   large".#endif..
07c0: 2f 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 3a 0a 2a  /*.** Details:.*
07d0: 2a 0a 2a 2a 20 54 68 65 20 25 5f 64 61 74 61 20  *.** The %_data 
07e0: 74 61 62 6c 65 20 6d 61 6e 61 67 65 64 20 62 79  table managed by
07f0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2c 0a 2a 2a   this module,.**
0800: 0a 2a 2a 20 20 20 20 20 43 52 45 41 54 45 20 54  .**     CREATE T
0810: 41 42 4c 45 20 25 5f 64 61 74 61 28 69 64 20 49  ABLE %_data(id I
0820: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0830: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 3b  EY, block BLOB);
0840: 0a 2a 2a 0a 2a 2a 20 2c 20 63 6f 6e 74 61 69 6e  .**.** , contain
0850: 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  s the following 
0860: 35 20 74 79 70 65 73 20 6f 66 20 72 65 63 6f 72  5 types of recor
0870: 64 73 2e 20 53 65 65 20 74 68 65 20 63 6f 6d 6d  ds. See the comm
0880: 65 6e 74 73 20 73 75 72 72 6f 75 6e 64 69 6e 67  ents surrounding
0890: 0a 2a 2a 20 74 68 65 20 46 54 53 35 5f 2a 5f 52  .** the FTS5_*_R
08a0: 4f 57 49 44 20 6d 61 63 72 6f 73 20 62 65 6c 6f  OWID macros belo
08b0: 77 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  w for a descript
08c0: 69 6f 6e 20 6f 66 20 68 6f 77 20 25 5f 64 61 74  ion of how %_dat
08d0: 61 20 72 6f 77 69 64 73 20 61 72 65 20 0a 2a 2a  a rowids are .**
08e0: 20 61 73 73 69 67 6e 65 64 20 74 6f 20 65 61 63   assigned to eac
08f0: 68 20 66 6f 20 74 68 65 6d 2e 0a 2a 2a 0a 2a 2a  h fo them..**.**
0900: 20 31 2e 20 53 74 72 75 63 74 75 72 65 20 52 65   1. Structure Re
0910: 63 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 54  cords:.**.**   T
0920: 68 65 20 73 65 74 20 6f 66 20 73 65 67 6d 65 6e  he set of segmen
0930: 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
0940: 61 6e 20 69 6e 64 65 78 20 2d 20 74 68 65 20 69  an index - the i
0950: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2d  ndex structure -
0960: 20 61 72 65 0a 2a 2a 20 20 20 72 65 63 6f 72 64   are.**   record
0970: 65 64 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 72  ed in a single r
0980: 65 63 6f 72 64 20 77 69 74 68 69 6e 20 74 68 65  ecord within the
0990: 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e 20 54   %_data table. T
09a0: 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  he record consis
09b0: 74 73 0a 2a 2a 20 20 20 6f 66 20 61 20 73 69 6e  ts.**   of a sin
09c0: 67 6c 65 20 33 32 2d 62 69 74 20 63 6f 6e 66 69  gle 32-bit confi
09d0: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
09e0: 76 61 6c 75 65 20 66 6f 6c 6c 6f 77 65 64 20 62  value followed b
09f0: 79 20 61 20 6c 69 73 74 20 6f 66 20 0a 2a 2a 20  y a list of .** 
0a00: 20 20 53 51 4c 69 74 65 20 76 61 72 69 6e 74 73    SQLite varints
0a10: 2e 20 49 66 20 74 68 65 20 46 54 53 20 74 61 62  . If the FTS tab
0a20: 6c 65 20 66 65 61 74 75 72 65 73 20 6d 6f 72 65  le features more
0a30: 20 74 68 61 6e 20 6f 6e 65 20 69 6e 64 65 78 20   than one index 
0a40: 28 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 74 68  (because.**   th
0a50: 65 72 65 20 61 72 65 20 6f 6e 65 20 6f 72 20 6d  ere are one or m
0a60: 6f 72 65 20 70 72 65 66 69 78 20 69 6e 64 65 78  ore prefix index
0a70: 65 73 29 2c 20 69 74 20 69 73 20 67 75 61 72 61  es), it is guara
0a80: 6e 74 65 65 64 20 74 68 61 74 20 61 6c 6c 20 73  nteed that all s
0a90: 68 61 72 65 0a 2a 2a 20 20 20 74 68 65 20 73 61  hare.**   the sa
0aa0: 6d 65 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 2e  me cookie value.
0ab0: 0a 2a 2a 0a 2a 2a 20 20 20 49 6d 6d 65 64 69 61  .**.**   Immedia
0ac0: 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  tely following t
0ad0: 68 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  he configuration
0ae0: 20 63 6f 6f 6b 69 65 2c 20 74 68 65 20 72 65 63   cookie, the rec
0af0: 6f 72 64 20 62 65 67 69 6e 73 20 77 69 74 68 0a  ord begins with.
0b00: 2a 2a 20 20 20 74 68 72 65 65 20 76 61 72 69 6e  **   three varin
0b10: 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20  ts:.**.**     + 
0b20: 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65 6c 73  number of levels
0b30: 2c 0a 2a 2a 20 20 20 20 20 2b 20 74 6f 74 61 6c  ,.**     + total
0b40: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
0b50: 6e 74 73 20 6f 6e 20 61 6c 6c 20 6c 65 76 65 6c  nts on all level
0b60: 73 2c 0a 2a 2a 20 20 20 20 20 2b 20 76 61 6c 75  s,.**     + valu
0b70: 65 20 6f 66 20 77 72 69 74 65 20 63 6f 75 6e 74  e of write count
0b80: 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 6e  er..**.**   Then
0b90: 2c 20 66 6f 72 20 65 61 63 68 20 6c 65 76 65 6c  , for each level
0ba0: 20 66 72 6f 6d 20 30 20 74 6f 20 6e 4d 61 78 3a   from 0 to nMax:
0bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2b 20 6e 75 6d  .**.**     + num
0bc0: 62 65 72 20 6f 66 20 69 6e 70 75 74 20 73 65 67  ber of input seg
0bd0: 6d 65 6e 74 73 20 69 6e 20 6f 6e 67 6f 69 6e 67  ments in ongoing
0be0: 20 6d 65 72 67 65 2e 0a 2a 2a 20 20 20 20 20 2b   merge..**     +
0bf0: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   total number of
0c00: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 6c 65 76   segments in lev
0c10: 65 6c 2e 0a 2a 2a 20 20 20 20 20 2b 20 66 6f 72  el..**     + for
0c20: 20 65 61 63 68 20 73 65 67 6d 65 6e 74 20 66 72   each segment fr
0c30: 6f 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77  om oldest to new
0c40: 65 73 74 3a 0a 2a 2a 20 20 20 20 20 20 20 20 20  est:.**         
0c50: 2b 20 73 65 67 6d 65 6e 74 20 69 64 20 28 61 6c  + segment id (al
0c60: 77 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20  ways > 0).**    
0c70: 20 20 20 20 20 2b 20 66 69 72 73 74 20 6c 65 61       + first lea
0c80: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f  f page number (o
0c90: 66 74 65 6e 20 31 2c 20 61 6c 77 61 79 73 20 67  ften 1, always g
0ca0: 72 65 61 74 65 72 20 74 68 61 6e 20 30 29 0a 2a  reater than 0).*
0cb0: 2a 20 20 20 20 20 20 20 20 20 2b 20 66 69 6e 61  *         + fina
0cc0: 6c 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  l leaf page numb
0cd0: 65 72 0a 2a 2a 0a 2a 2a 20 32 2e 20 54 68 65 20  er.**.** 2. The 
0ce0: 41 76 65 72 61 67 65 73 20 52 65 63 6f 72 64 3a  Averages Record:
0cf0: 0a 2a 2a 0a 2a 2a 20 20 20 41 20 73 69 6e 67 6c  .**.**   A singl
0d00: 65 20 72 65 63 6f 72 64 20 77 69 74 68 69 6e 20  e record within 
0d10: 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65  the %_data table
0d20: 2e 20 54 68 65 20 64 61 74 61 20 69 73 20 61 20  . The data is a 
0d30: 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2e  list of varints.
0d40: 0a 2a 2a 20 20 20 54 68 65 20 66 69 72 73 74 20  .**   The first 
0d50: 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d  value is the num
0d60: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
0d70: 68 65 20 69 6e 64 65 78 2e 20 54 68 65 6e 2c 20  he index. Then, 
0d80: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 0a  for each column.
0d90: 2a 2a 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74  **   from left t
0da0: 6f 20 72 69 67 68 74 2c 20 74 68 65 20 74 6f 74  o right, the tot
0db0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 74 6f 6b  al number of tok
0dc0: 65 6e 73 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d  ens in the colum
0dd0: 6e 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 20 20 72  n for all.**   r
0de0: 6f 77 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ows of the table
0df0: 2e 0a 2a 2a 0a 2a 2a 20 33 2e 20 53 65 67 6d 65  ..**.** 3. Segme
0e00: 6e 74 20 6c 65 61 76 65 73 3a 0a 2a 2a 0a 2a 2a  nt leaves:.**.**
0e10: 20 20 20 54 45 52 4d 2f 44 4f 43 4c 49 53 54 20     TERM/DOCLIST 
0e20: 46 4f 52 4d 41 54 3a 0a 2a 2a 0a 2a 2a 20 20 20  FORMAT:.**.**   
0e30: 20 20 4d 6f 73 74 20 6f 66 20 65 61 63 68 20 73    Most of each s
0e40: 65 67 6d 65 6e 74 20 6c 65 61 66 20 69 73 20 74  egment leaf is t
0e50: 61 6b 65 6e 20 75 70 20 62 79 20 74 65 72 6d 2f  aken up by term/
0e60: 64 6f 63 6c 69 73 74 20 64 61 74 61 2e 20 54 68  doclist data. Th
0e70: 65 20 0a 2a 2a 20 20 20 20 20 67 65 6e 65 72 61  e .**     genera
0e80: 6c 20 66 6f 72 6d 61 74 20 6f 66 20 74 65 72 6d  l format of term
0e90: 2f 64 6f 63 6c 69 73 74 2c 20 73 74 61 72 74 69  /doclist, starti
0ea0: 6e 67 20 77 69 74 68 20 74 68 65 20 66 69 72 73  ng with the firs
0eb0: 74 20 74 65 72 6d 0a 2a 2a 20 20 20 20 20 6f 6e  t term.**     on
0ec0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 2c 20   the leaf page, 
0ed0: 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  is:.**.**       
0ee0: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
0ef0: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
0f00: 20 20 20 20 20 20 20 20 20 62 6c 6f 62 3a 20 20           blob:  
0f10: 20 20 66 69 72 73 74 20 74 65 72 6d 20 64 61 74    first term dat
0f20: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 6f 63  a.**         doc
0f30: 6c 69 73 74 3a 20 66 69 72 73 74 20 64 6f 63 6c  list: first docl
0f40: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7a  ist.**         z
0f50: 65 72 6f 2d 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a  ero-or-more {.**
0f60: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 6e             varin
0f70: 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  t:  number of by
0f80: 74 65 73 20 69 6e 20 63 6f 6d 6d 6f 6e 20 77 69  tes in common wi
0f90: 74 68 20 70 72 65 76 69 6f 75 73 20 74 65 72 6d  th previous term
0fa0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 76 61  .**           va
0fb0: 72 69 6e 74 3a 20 20 6e 75 6d 62 65 72 20 6f 66  rint:  number of
0fc0: 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20 74 65   bytes of new te
0fd0: 72 6d 20 64 61 74 61 20 28 6e 4e 65 77 29 0a 2a  rm data (nNew).*
0fe0: 2a 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62  *           blob
0ff0: 3a 20 20 20 20 6e 4e 65 77 20 62 79 74 65 73 20  :    nNew bytes 
1000: 6f 66 20 6e 65 77 20 74 65 72 6d 20 64 61 74 61  of new term data
1010: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 64 6f  .**           do
1020: 63 6c 69 73 74 3a 20 6e 65 78 74 20 64 6f 63 6c  clist: next docl
1030: 69 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 7d  ist.**         }
1040: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 64 6f 63 6c 69  .**.**     docli
1050: 73 74 20 66 6f 72 6d 61 74 3a 0a 2a 2a 0a 2a 2a  st format:.**.**
1060: 20 20 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a           varint:
1070: 20 20 66 69 72 73 74 20 72 6f 77 69 64 0a 2a 2a    first rowid.**
1080: 20 20 20 20 20 20 20 20 20 70 6f 73 6c 69 73 74           poslist
1090: 3a 20 66 69 72 73 74 20 70 6f 73 6c 69 73 74 0a  : first poslist.
10a0: 2a 2a 20 20 20 20 20 20 20 20 20 7a 65 72 6f 2d  **         zero-
10b0: 6f 72 2d 6d 6f 72 65 20 7b 0a 2a 2a 20 20 20 20  or-more {.**    
10c0: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20         varint:  
10d0: 72 6f 77 69 64 20 64 65 6c 74 61 20 28 61 6c 77  rowid delta (alw
10e0: 61 79 73 20 3e 20 30 29 0a 2a 2a 20 20 20 20 20  ays > 0).**     
10f0: 20 20 20 20 20 20 70 6f 73 6c 69 73 74 3a 20 6e        poslist: n
1100: 65 78 74 20 70 6f 73 6c 69 73 74 0a 2a 2a 20 20  ext poslist.**  
1110: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1120: 20 20 20 70 6f 73 6c 69 73 74 20 66 6f 72 6d 61     poslist forma
1130: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
1140: 20 76 61 72 69 6e 74 3a 20 73 69 7a 65 20 6f 66   varint: size of
1150: 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
1160: 73 20 6d 75 6c 74 69 70 6c 69 65 64 20 62 79 20  s multiplied by 
1170: 32 2c 20 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67  2, not including
1180: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1190: 20 20 20 20 74 68 69 73 20 66 69 65 6c 64 2e 20      this field. 
11a0: 50 6c 75 73 20 31 20 69 66 20 74 68 69 73 20 65  Plus 1 if this e
11b0: 6e 74 72 79 20 63 61 72 72 69 65 73 20 74 68 65  ntry carries the
11c0: 20 22 64 65 6c 65 74 65 22 20 66 6c 61 67 2e 0a   "delete" flag..
11d0: 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6c 6c 69  **         colli
11e0: 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66 6f 72 20  st: collist for 
11f0: 63 6f 6c 75 6d 6e 20 30 0a 2a 2a 20 20 20 20 20  column 0.**     
1200: 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72 65      zero-or-more
1210: 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   {.**           
1220: 30 78 30 31 20 62 79 74 65 0a 2a 2a 20 20 20 20  0x01 byte.**    
1230: 20 20 20 20 20 20 20 76 61 72 69 6e 74 3a 20 63         varint: c
1240: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 28 49 29  olumn number (I)
1250: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 63 6f  .**           co
1260: 6c 6c 69 73 74 3a 20 63 6f 6c 6c 69 73 74 20 66  llist: collist f
1270: 6f 72 20 63 6f 6c 75 6d 6e 20 49 0a 2a 2a 20 20  or column I.**  
1280: 20 20 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20         }.**.**  
1290: 20 20 20 63 6f 6c 6c 69 73 74 20 66 6f 72 6d 61     collist forma
12a0: 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  t:.**.**        
12b0: 20 76 61 72 69 6e 74 3a 20 66 69 72 73 74 20 6f   varint: first o
12c0: 66 66 73 65 74 20 2b 20 32 0a 2a 2a 20 20 20 20  ffset + 2.**    
12d0: 20 20 20 20 20 7a 65 72 6f 2d 6f 72 2d 6d 6f 72       zero-or-mor
12e0: 65 20 7b 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  e {.**          
12f0: 20 76 61 72 69 6e 74 3a 20 6f 66 66 73 65 74 20   varint: offset 
1300: 64 65 6c 74 61 20 2b 20 32 0a 2a 2a 20 20 20 20  delta + 2.**    
1310: 20 20 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 20 20 50       }.**.**   P
1320: 41 47 45 20 46 4f 52 4d 41 54 0a 2a 2a 0a 2a 2a  AGE FORMAT.**.**
1330: 20 20 20 20 20 45 61 63 68 20 6c 65 61 66 20 70       Each leaf p
1340: 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20  age begins with 
1350: 61 20 34 2d 62 79 74 65 20 68 65 61 64 65 72 20  a 4-byte header 
1360: 63 6f 6e 74 61 69 6e 69 6e 67 20 32 20 31 36 2d  containing 2 16-
1370: 62 69 74 20 0a 2a 2a 20 20 20 20 20 75 6e 73 69  bit .**     unsi
1380: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 66 69 65  gned integer fie
1390: 6c 64 73 20 69 6e 20 62 69 67 2d 65 6e 64 69 61  lds in big-endia
13a0: 6e 20 66 6f 72 6d 61 74 2e 20 54 68 65 79 20 61  n format. They a
13b0: 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  re:.**.**       
13c0: 2a 20 54 68 65 20 62 79 74 65 20 6f 66 66 73 65  * The byte offse
13d0: 74 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 72  t of the first r
13e0: 6f 77 69 64 20 6f 6e 20 74 68 65 20 70 61 67 65  owid on the page
13f0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 2a  , if it exists.*
1400: 2a 20 20 20 20 20 20 20 20 20 61 6e 64 20 6f 63  *         and oc
1410: 63 75 72 73 20 62 65 66 6f 72 65 20 74 68 65 20  curs before the 
1420: 66 69 72 73 74 20 74 65 72 6d 20 28 6f 74 68 65  first term (othe
1430: 72 77 69 73 65 20 30 29 2e 0a 2a 2a 0a 2a 2a 20  rwise 0)..**.** 
1440: 20 20 20 20 20 20 2a 20 54 68 65 20 62 79 74 65        * The byte
1450: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 73   offset of the s
1460: 74 61 72 74 20 6f 66 20 74 68 65 20 70 61 67 65  tart of the page
1470: 20 66 6f 6f 74 65 72 2e 20 49 66 20 74 68 65 20   footer. If the 
1480: 70 61 67 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  page.**         
1490: 66 6f 6f 74 65 72 20 69 73 20 30 20 62 79 74 65  footer is 0 byte
14a0: 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65 6e 20  s in size, then 
14b0: 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 74 68  this field is th
14c0: 65 20 73 61 6d 65 20 61 73 20 74 68 65 0a 2a 2a  e same as the.**
14d0: 20 20 20 20 20 20 20 20 20 73 69 7a 65 20 6f 66           size of
14e0: 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 69   the leaf page i
14f0: 6e 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  n bytes..**.**  
1500: 20 20 20 54 68 65 20 70 61 67 65 20 66 6f 6f 74     The page foot
1510: 65 72 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  er consists of a
1520: 20 73 69 6e 67 6c 65 20 76 61 72 69 6e 74 20 66   single varint f
1530: 6f 72 20 65 61 63 68 20 74 65 72 6d 20 6c 6f 63  or each term loc
1540: 61 74 65 64 0a 2a 2a 20 20 20 20 20 6f 6e 20 74  ated.**     on t
1550: 68 65 20 70 61 67 65 2e 20 45 61 63 68 20 76 61  he page. Each va
1560: 72 69 6e 74 20 69 73 20 74 68 65 20 62 79 74 65  rint is the byte
1570: 20 6f 66 66 73 65 74 20 6f 66 20 74 68 65 20 63   offset of the c
1580: 75 72 72 65 6e 74 20 74 65 72 6d 0a 2a 2a 20 20  urrent term.**  
1590: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 61     within the pa
15a0: 67 65 2c 20 64 65 6c 74 61 2d 63 6f 6d 70 72 65  ge, delta-compre
15b0: 73 73 65 64 20 61 67 61 69 6e 73 74 20 74 68 65  ssed against the
15c0: 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 2e   previous value.
15d0: 20 49 6e 0a 2a 2a 20 20 20 20 20 6f 74 68 65 72   In.**     other
15e0: 20 77 6f 72 64 73 2c 20 74 68 65 20 66 69 72 73   words, the firs
15f0: 74 20 76 61 72 69 6e 74 20 69 6e 20 74 68 65 20  t varint in the 
1600: 66 6f 6f 74 65 72 20 69 73 20 74 68 65 20 62 79  footer is the by
1610: 74 65 20 6f 66 66 73 65 74 20 6f 66 0a 2a 2a 20  te offset of.** 
1620: 20 20 20 20 74 68 65 20 66 69 72 73 74 20 74 65      the first te
1630: 72 6d 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69  rm, the second i
1640: 73 20 74 68 65 20 62 79 74 65 20 6f 66 66 73 65  s the byte offse
1650: 74 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  t of the second 
1660: 6c 65 73 73 20 74 68 61 74 0a 2a 2a 20 20 20 20  less that.**    
1670: 20 6f 66 20 74 68 65 20 66 69 72 73 74 2c 20 61   of the first, a
1680: 6e 64 20 73 6f 20 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nd so on..**.** 
1690: 20 20 20 20 54 68 65 20 74 65 72 6d 2f 64 6f 63      The term/doc
16a0: 6c 69 73 74 20 66 6f 72 6d 61 74 20 64 65 73 63  list format desc
16b0: 72 69 62 65 64 20 61 62 6f 76 65 20 69 73 20 61  ribed above is a
16c0: 63 63 75 72 61 74 65 20 69 66 20 74 68 65 20 65  ccurate if the e
16d0: 6e 74 69 72 65 0a 2a 2a 20 20 20 20 20 74 65 72  ntire.**     ter
16e0: 6d 2f 64 6f 63 6c 69 73 74 20 64 61 74 61 20 66  m/doclist data f
16f0: 69 74 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  its on a single 
1700: 6c 65 61 66 20 70 61 67 65 2e 20 49 66 20 74 68  leaf page. If th
1710: 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20 63 61  is is not the ca
1720: 73 65 2c 0a 2a 2a 20 20 20 20 20 74 68 65 20 66  se,.**     the f
1730: 6f 72 6d 61 74 20 69 73 20 63 68 61 6e 67 65 64  ormat is changed
1740: 20 69 6e 20 74 77 6f 20 77 61 79 73 3a 0a 2a 2a   in two ways:.**
1750: 0a 2a 2a 20 20 20 20 20 20 20 2b 20 69 66 20 74  .**       + if t
1760: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  he first rowid o
1770: 6e 20 61 20 70 61 67 65 20 6f 63 63 75 72 73 20  n a page occurs 
1780: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
1790: 20 74 65 72 6d 2c 20 69 74 0a 2a 2a 20 20 20 20   term, it.**    
17a0: 20 20 20 20 20 69 73 20 73 74 6f 72 65 64 20 61       is stored a
17b0: 73 20 61 20 6c 69 74 65 72 61 6c 20 76 61 6c 75  s a literal valu
17c0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  e:.**.**        
17d0: 20 20 20 20 20 76 61 72 69 6e 74 3a 20 20 66 69       varint:  fi
17e0: 72 73 74 20 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  rst rowid.**.** 
17f0: 20 20 20 20 20 20 2b 20 74 68 65 20 66 69 72 73        + the firs
1800: 74 20 74 65 72 6d 20 6f 6e 20 65 61 63 68 20 70  t term on each p
1810: 61 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  age is stored in
1820: 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
1830: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
1840: 76 65 72 79 20 66 69 72 73 74 20 74 65 72 6d 20  very first term 
1850: 6f 66 20 74 68 65 20 73 65 67 6d 65 6e 74 3a 0a  of the segment:.
1860: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
1870: 20 20 76 61 72 69 6e 74 20 3a 20 73 69 7a 65 20    varint : size 
1880: 6f 66 20 66 69 72 73 74 20 74 65 72 6d 0a 2a 2a  of first term.**
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 6c 6f               blo
18a0: 62 3a 20 20 20 20 66 69 72 73 74 20 74 65 72 6d  b:    first term
18b0: 20 64 61 74 61 0a 2a 2a 0a 2a 2a 20 35 2e 20 53   data.**.** 5. S
18c0: 65 67 6d 65 6e 74 20 64 6f 63 6c 69 73 74 20 69  egment doclist i
18d0: 6e 64 65 78 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ndexes:.**.**   
18e0: 44 6f 63 6c 69 73 74 20 69 6e 64 65 78 65 73 20  Doclist indexes 
18f0: 61 72 65 20 74 68 65 6d 73 65 6c 76 65 73 20 62  are themselves b
1900: 2d 74 72 65 65 73 2c 20 68 6f 77 65 76 65 72 20  -trees, however 
1910: 74 68 65 79 20 75 73 75 61 6c 6c 79 20 63 6f 6e  they usually con
1920: 73 69 73 74 20 6f 66 0a 2a 2a 20 20 20 61 20 73  sist of.**   a s
1930: 69 6e 67 6c 65 20 6c 65 61 66 20 72 65 63 6f 72  ingle leaf recor
1940: 64 20 6f 6e 6c 79 2e 20 54 68 65 20 66 6f 72 6d  d only. The form
1950: 61 74 20 6f 66 20 65 61 63 68 20 64 6f 63 6c 69  at of each docli
1960: 73 74 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  st index leaf pa
1970: 67 65 20 0a 2a 2a 20 20 20 69 73 3a 0a 2a 2a 0a  ge .**   is:.**.
1980: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1990: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
19a0: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
19b0: 43 6c 65 61 72 20 69 66 20 6c 65 61 66 20 69 73  Clear if leaf is
19c0: 20 61 6c 73 6f 20 74 68 65 20 72 6f 6f 74 20 70   also the root p
19d0: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
19e0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
19f0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1a00: 74 73 20 69 6e 64 65 78 20 6c 65 61 66 20 70 61  ts index leaf pa
1a10: 67 65 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e  ge. As a varint.
1a20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 69 72  .**.**     * Fir
1a30: 73 74 20 72 6f 77 69 64 20 6f 6e 20 70 61 67 65  st rowid on page
1a40: 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 70 72   indicated by pr
1a50: 65 76 69 6f 75 73 20 66 69 65 6c 64 2e 20 41 73  evious field. As
1a60: 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a   a varint..**.**
1a70: 20 20 20 20 20 2a 20 41 20 6c 69 73 74 20 6f 66       * A list of
1a80: 20 76 61 72 69 6e 74 73 2c 20 6f 6e 65 20 66 6f   varints, one fo
1a90: 72 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e  r each subsequen
1aa0: 74 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65 2e  t termless page.
1ab0: 20 41 20 0a 2a 2a 20 20 20 20 20 20 20 70 6f 73   A .**       pos
1ac0: 69 74 69 76 65 20 64 65 6c 74 61 20 69 66 20 74  itive delta if t
1ad0: 68 65 20 74 65 72 6d 6c 65 73 73 20 70 61 67 65  he termless page
1ae0: 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61   contains at lea
1af0: 73 74 20 6f 6e 65 20 72 6f 77 69 64 2c 20 0a 2a  st one rowid, .*
1b00: 2a 20 20 20 20 20 20 20 6f 72 20 61 6e 20 30 78  *       or an 0x
1b10: 30 30 20 62 79 74 65 20 6f 74 68 65 72 77 69 73  00 byte otherwis
1b20: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 74 65 72  e..**.**   Inter
1b30: 6e 61 6c 20 64 6f 63 6c 69 73 74 20 69 6e 64 65  nal doclist inde
1b40: 78 20 6e 6f 64 65 73 20 61 72 65 3a 0a 2a 2a 0a  x nodes are:.**.
1b50: 2a 2a 20 20 20 20 20 2a 20 46 6c 61 67 73 20 62  **     * Flags b
1b60: 79 74 65 2e 20 42 69 74 73 20 61 72 65 3a 0a 2a  yte. Bits are:.*
1b70: 2a 20 20 20 20 20 20 20 20 20 30 78 30 31 3a 20  *         0x01: 
1b80: 43 6c 65 61 72 20 66 6f 72 20 72 6f 6f 74 20 70  Clear for root p
1b90: 61 67 65 2c 20 6f 74 68 65 72 77 69 73 65 20 73  age, otherwise s
1ba0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20  et..**.**     * 
1bb0: 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  Page number of f
1bc0: 69 72 73 74 20 63 68 69 6c 64 20 70 61 67 65 2e  irst child page.
1bd0: 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   As a varint..**
1be0: 0a 2a 2a 20 20 20 20 20 2a 20 43 6f 70 79 20 6f  .**     * Copy o
1bf0: 66 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  f first rowid on
1c00: 20 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20   page indicated 
1c10: 62 79 20 70 72 65 76 69 6f 75 73 20 66 69 65 6c  by previous fiel
1c20: 64 2e 20 41 73 20 61 20 76 61 72 69 6e 74 2e 0a  d. As a varint..
1c30: 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 41 20 6c 69  **.**     * A li
1c40: 73 74 20 6f 66 20 64 65 6c 74 61 2d 65 6e 63 6f  st of delta-enco
1c50: 64 65 64 20 76 61 72 69 6e 74 73 20 2d 20 74 68  ded varints - th
1c60: 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e  e first rowid on
1c70: 20 65 61 63 68 20 73 75 62 73 65 71 75 65 6e 74   each subsequent
1c80: 0a 2a 2a 20 20 20 20 20 20 20 63 68 69 6c 64 20  .**       child 
1c90: 70 61 67 65 2e 20 0a 2a 2a 0a 2a 2f 0a 0a 2f 2a  page. .**.*/../*
1ca0: 0a 2a 2a 20 52 6f 77 69 64 73 20 66 6f 72 20 74  .** Rowids for t
1cb0: 68 65 20 61 76 65 72 61 67 65 73 20 61 6e 64 20  he averages and 
1cc0: 73 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64  structure record
1cd0: 73 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61 20  s in the %_data 
1ce0: 74 61 62 6c 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  table..*/.#defin
1cf0: 65 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  e FTS5_AVERAGES_
1d00: 52 4f 57 49 44 20 20 20 20 20 31 20 20 20 20 2f  ROWID     1    /
1d10: 2a 20 52 6f 77 69 64 20 75 73 65 64 20 66 6f 72  * Rowid used for
1d20: 20 74 68 65 20 61 76 65 72 61 67 65 73 20 72 65   the averages re
1d30: 63 6f 72 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  cord */.#define 
1d40: 46 54 53 35 5f 53 54 52 55 43 54 55 52 45 5f 52  FTS5_STRUCTURE_R
1d50: 4f 57 49 44 20 20 20 31 30 20 20 20 20 2f 2a 20  OWID   10    /* 
1d60: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 72 65  The structure re
1d70: 63 6f 72 64 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d  cord */../*.** M
1d80: 61 63 72 6f 73 20 64 65 74 65 72 6d 69 6e 69 6e  acros determinin
1d90: 67 20 74 68 65 20 72 6f 77 69 64 73 20 75 73 65  g the rowids use
1da0: 64 20 62 79 20 73 65 67 6d 65 6e 74 20 6c 65 61  d by segment lea
1db0: 76 65 73 20 61 6e 64 20 64 6c 69 64 78 20 6c 65  ves and dlidx le
1dc0: 61 76 65 73 0a 2a 2a 20 61 6e 64 20 6e 6f 64 65  aves.** and node
1dd0: 73 2e 20 41 6c 6c 20 6e 6f 64 65 73 20 61 6e 64  s. All nodes and
1de0: 20 6c 65 61 76 65 73 20 61 72 65 20 73 74 6f 72   leaves are stor
1df0: 65 64 20 69 6e 20 74 68 65 20 25 5f 64 61 74 61  ed in the %_data
1e00: 20 74 61 62 6c 65 20 77 69 74 68 20 6c 61 72 67   table with larg
1e10: 65 0a 2a 2a 20 70 6f 73 69 74 69 76 65 20 72 6f  e.** positive ro
1e20: 77 69 64 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68  wids..**.** Each
1e30: 20 73 65 67 6d 65 6e 74 20 68 61 73 20 61 20 75   segment has a u
1e40: 6e 69 71 75 65 20 6e 6f 6e 2d 7a 65 72 6f 20 31  nique non-zero 1
1e50: 36 2d 62 69 74 20 69 64 2e 0a 2a 2a 0a 2a 2a 20  6-bit id..**.** 
1e60: 54 68 65 20 72 6f 77 69 64 20 66 6f 72 20 65 61  The rowid for ea
1e70: 63 68 20 73 65 67 6d 65 6e 74 20 6c 65 61 66 20  ch segment leaf 
1e80: 69 73 20 66 6f 75 6e 64 20 62 79 20 70 61 73 73  is found by pass
1e90: 69 6e 67 20 74 68 65 20 73 65 67 6d 65 6e 74 20  ing the segment 
1ea0: 69 64 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6c  id and .** the l
1eb0: 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20  eaf page number 
1ec0: 74 6f 20 74 68 65 20 46 54 53 35 5f 53 45 47 4d  to the FTS5_SEGM
1ed0: 45 4e 54 5f 52 4f 57 49 44 20 6d 61 63 72 6f 2e  ENT_ROWID macro.
1ee0: 20 4c 65 61 76 65 73 20 61 72 65 20 6e 75 6d 62   Leaves are numb
1ef0: 65 72 65 64 0a 2a 2a 20 73 65 71 75 65 6e 74 69  ered.** sequenti
1f00: 61 6c 6c 79 20 73 74 61 72 74 69 6e 67 20 66 72  ally starting fr
1f10: 6f 6d 20 31 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  om 1..*/.#define
1f20: 20 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 20   FTS5_DATA_ID_B 
1f30: 20 20 20 20 31 36 20 20 20 20 20 2f 2a 20 4d 61      16     /* Ma
1f40: 78 20 73 65 67 20 69 64 20 6e 75 6d 62 65 72 20  x seg id number 
1f50: 36 35 35 33 35 20 2a 2f 0a 23 64 65 66 69 6e 65  65535 */.#define
1f60: 20 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42   FTS5_DATA_DLI_B
1f70: 20 20 20 20 20 31 20 20 20 20 20 2f 2a 20 44 6f       1     /* Do
1f80: 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6c 61 67  clist-index flag
1f90: 20 28 31 20 62 69 74 29 20 2a 2f 0a 23 64 65 66   (1 bit) */.#def
1fa0: 69 6e 65 20 46 54 53 35 5f 44 41 54 41 5f 48 45  ine FTS5_DATA_HE
1fb0: 49 47 48 54 5f 42 20 20 35 20 20 20 20 20 2f 2a  IGHT_B  5     /*
1fc0: 20 4d 61 78 20 64 6c 69 64 78 20 74 72 65 65 20   Max dlidx tree 
1fd0: 68 65 69 67 68 74 20 6f 66 20 33 32 20 2a 2f 0a  height of 32 */.
1fe0: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 44 41 54  #define FTS5_DAT
1ff0: 41 5f 50 41 47 45 5f 42 20 20 20 33 31 20 20 20  A_PAGE_B   31   
2000: 20 20 2f 2a 20 4d 61 78 20 70 61 67 65 20 6e 75    /* Max page nu
2010: 6d 62 65 72 20 6f 66 20 32 31 34 37 34 38 33 36  mber of 21474836
2020: 34 38 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 66  48 */..#define f
2030: 74 73 35 5f 64 72 69 28 73 65 67 69 64 2c 20 64  ts5_dri(segid, d
2040: 6c 69 64 78 2c 20 68 65 69 67 68 74 2c 20 70 67  lidx, height, pg
2050: 6e 6f 29 20 28 20 20 20 20 20 20 20 20 20 20 20  no) (           
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34 29 28        \. ((i64)(
2080: 73 65 67 69 64 29 20 20 3c 3c 20 28 46 54 53 35  segid)  << (FTS5
2090: 5f 44 41 54 41 5f 50 41 47 45 5f 42 2b 46 54 53  _DATA_PAGE_B+FTS
20a0: 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 2b  5_DATA_HEIGHT_B+
20b0: 46 54 53 35 5f 44 41 54 41 5f 44 4c 49 5f 42 29  FTS5_DATA_DLI_B)
20c0: 29 20 2b 20 20 20 20 5c 0a 20 28 28 69 36 34 29  ) +    \. ((i64)
20d0: 28 64 6c 69 64 78 29 20 20 3c 3c 20 28 46 54 53  (dlidx)  << (FTS
20e0: 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 20 2b 20  5_DATA_PAGE_B + 
20f0: 46 54 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54  FTS5_DATA_HEIGHT
2100: 5f 42 29 29 20 2b 20 20 20 20 20 20 20 20 20 20  _B)) +          
2110: 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36 34          \. ((i64
2120: 29 28 68 65 69 67 68 74 29 20 3c 3c 20 28 46 54  )(height) << (FT
2130: 53 35 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 29  S5_DATA_PAGE_B))
2140: 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   +              
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 5c 0a 20 28 28 69 36           \. ((i6
2170: 34 29 28 70 67 6e 6f 29 29 20 20 20 20 20 20 20  4)(pgno))       
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21b0: 20 20 20 20 20 20 20 20 20 20 5c 0a 29 0a 0a 23            \.)..#
21c0: 64 65 66 69 6e 65 20 46 54 53 35 5f 53 45 47 4d  define FTS5_SEGM
21d0: 45 4e 54 5f 52 4f 57 49 44 28 73 65 67 69 64 2c  ENT_ROWID(segid,
21e0: 20 70 67 6e 6f 29 20 20 20 20 20 20 20 66 74 73   pgno)       fts
21f0: 35 5f 64 72 69 28 73 65 67 69 64 2c 20 30 2c 20  5_dri(segid, 0, 
2200: 30 2c 20 70 67 6e 6f 29 0a 23 64 65 66 69 6e 65  0, pgno).#define
2210: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
2220: 44 28 73 65 67 69 64 2c 20 68 65 69 67 68 74 2c  D(segid, height,
2230: 20 70 67 6e 6f 29 20 66 74 73 35 5f 64 72 69 28   pgno) fts5_dri(
2240: 73 65 67 69 64 2c 20 31 2c 20 68 65 69 67 68 74  segid, 1, height
2250: 2c 20 70 67 6e 6f 29 0a 0a 2f 2a 0a 2a 2a 20 4d  , pgno)../*.** M
2260: 61 78 69 6d 75 6d 20 73 65 67 6d 65 6e 74 73 20  aximum segments 
2270: 70 65 72 6d 69 74 74 65 64 20 69 6e 20 61 20 73  permitted in a s
2280: 69 6e 67 6c 65 20 69 6e 64 65 78 20 0a 2a 2f 0a  ingle index .*/.
2290: 23 64 65 66 69 6e 65 20 46 54 53 35 5f 4d 41 58  #define FTS5_MAX
22a0: 5f 53 45 47 4d 45 4e 54 20 32 30 30 30 0a 0a 23  _SEGMENT 2000..#
22b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
22c0: 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  UG.int sqlite3Ft
22d0: 73 35 43 6f 72 72 75 70 74 28 29 20 7b 20 72 65  s5Corrupt() { re
22e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
22f0: 55 50 54 5f 56 54 41 42 3b 20 7d 0a 23 65 6e 64  UPT_VTAB; }.#end
2300: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  if.../*.** Each 
2310: 74 69 6d 65 20 61 20 62 6c 6f 62 20 69 73 20 72  time a blob is r
2320: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2330: 61 74 61 20 74 61 62 6c 65 2c 20 69 74 20 69 73  ata table, it is
2340: 20 70 61 64 64 65 64 20 77 69 74 68 20 74 68 69   padded with thi
2350: 73 0a 2a 2a 20 6d 61 6e 79 20 7a 65 72 6f 20 62  s.** many zero b
2360: 79 74 65 73 2e 20 54 68 69 73 20 6d 61 6b 65 73  ytes. This makes
2370: 20 69 74 20 65 61 73 69 65 72 20 74 6f 20 64 65   it easier to de
2380: 63 6f 64 65 20 74 68 65 20 76 61 72 69 6f 75 73  code the various
2390: 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 73 0a   record formats.
23a0: 2a 2a 20 77 69 74 68 6f 75 74 20 6f 76 65 72 72  ** without overr
23b0: 65 61 64 69 6e 67 20 69 66 20 74 68 65 20 72 65  eading if the re
23c0: 63 6f 72 64 73 20 61 72 65 20 63 6f 72 72 75 70  cords are corrup
23d0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 54  t..*/.#define FT
23e0: 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44  S5_DATA_ZERO_PAD
23f0: 44 49 4e 47 20 38 0a 23 64 65 66 69 6e 65 20 46  DING 8.#define F
2400: 54 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47  TS5_DATA_PADDING
2410: 20 32 30 0a 0a 74 79 70 65 64 65 66 20 73 74 72   20..typedef str
2420: 75 63 74 20 46 74 73 35 44 61 74 61 20 46 74 73  uct Fts5Data Fts
2430: 35 44 61 74 61 3b 0a 74 79 70 65 64 65 66 20 73  5Data;.typedef s
2440: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
2450: 74 65 72 20 46 74 73 35 44 6c 69 64 78 49 74 65  ter Fts5DlidxIte
2460: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2470: 74 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 46  t Fts5DlidxLvl F
2480: 74 73 35 44 6c 69 64 78 4c 76 6c 3b 0a 74 79 70  ts5DlidxLvl;.typ
2490: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24a0: 44 6c 69 64 78 57 72 69 74 65 72 20 46 74 73 35  DlidxWriter Fts5
24b0: 44 6c 69 64 78 57 72 69 74 65 72 3b 0a 74 79 70  DlidxWriter;.typ
24c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
24d0: 50 61 67 65 57 72 69 74 65 72 20 46 74 73 35 50  PageWriter Fts5P
24e0: 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70 65 64  ageWriter;.typed
24f0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 65  ef struct Fts5Se
2500: 67 49 74 65 72 20 46 74 73 35 53 65 67 49 74 65  gIter Fts5SegIte
2510: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2520: 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t Fts5DoclistIte
2530: 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  r Fts5DoclistIte
2540: 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  r;.typedef struc
2550: 74 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  t Fts5SegWriter 
2560: 46 74 73 35 53 65 67 57 72 69 74 65 72 3b 0a 74  Fts5SegWriter;.t
2570: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
2580: 73 35 53 74 72 75 63 74 75 72 65 20 46 74 73 35  s5Structure Fts5
2590: 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70 65 64  Structure;.typed
25a0: 65 66 20 73 74 72 75 63 74 20 46 74 73 35 53 74  ef struct Fts5St
25b0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46 74 73  ructureLevel Fts
25c0: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 3b  5StructureLevel;
25d0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25e0: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
25f0: 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63 74 75  ment Fts5Structu
2600: 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74 72 75  reSegment;..stru
2610: 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a 20 20  ct Fts5Data {.  
2620: 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  u8 *p;          
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
2650: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2660: 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20  record */.  int 
2670: 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nn;             
2680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2690: 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 69 6e  ize of record in
26a0: 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
26b0: 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  szLeaf;         
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26d0: 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69 74 68  ize of leaf with
26e0: 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  out page-index *
26f0: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 65 20  /.};../*.** One 
2700: 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64 61 74  object per %_dat
2710: 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 72 75  a table..*/.stru
2720: 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b 0a 20  ct Fts5Index {. 
2730: 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
2740: 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20 20 20  nfig;           
2750: 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61 62 6c   /* Virtual tabl
2760: 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  e configuration 
2770: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61 74 61  */.  char *zData
2780: 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Tbl;            
2790: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
27a0: 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f 0a  %_data table */.
27b0: 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69 74 3b    int nWorkUnit;
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 73 20    /* Leaf pages 
27e0: 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66 20 77  in a "unit" of w
27f0: 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a  ork */..  /*.  *
2800: 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65 6c 61  * Variables rela
2810: 74 65 64 20 74 6f 20 74 68 65 20 61 63 63 75 6d  ted to the accum
2820: 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  ulation of token
2830: 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73 20 77  s and doclists w
2840: 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a 20 69  ithin the.  ** i
2850: 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
2860: 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68 65 79  bles before they
2870: 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f 20   are flushed to 
2880: 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46 74 73  disk..  */.  Fts
2890: 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20 20 20  5Hash *pHash;   
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28b0: 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72 20 69  Hash table for i
28c0: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20 2a 2f  n-memory data */
28d0: 0a 20 20 69 6e 74 20 6e 4d 61 78 50 65 6e 64 69  .  int nMaxPendi
28e0: 6e 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  ngData;         
28f0: 20 20 20 2f 2a 20 4d 61 78 20 70 65 6e 64 69 6e     /* Max pendin
2900: 67 20 64 61 74 61 20 62 65 66 6f 72 65 20 66 6c  g data before fl
2910: 75 73 68 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ush to disk */. 
2920: 20 69 6e 74 20 6e 50 65 6e 64 69 6e 67 44 61 74   int nPendingDat
2930: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2940: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
2950: 73 20 6f 66 20 70 65 6e 64 69 6e 67 20 64 61 74  s of pending dat
2960: 61 20 2a 2f 0a 20 20 69 36 34 20 69 57 72 69 74  a */.  i64 iWrit
2970: 65 52 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20  eRowid;         
2980: 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2990: 66 6f 72 20 63 75 72 72 65 6e 74 20 64 6f 63 20  for current doc 
29a0: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 2a 2f  being written */
29b0: 0a 20 20 69 6e 74 20 62 44 65 6c 65 74 65 3b 20  .  int bDelete; 
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 77 72     /* Current wr
29e0: 69 74 65 20 69 73 20 61 20 64 65 6c 65 74 65 20  ite is a delete 
29f0: 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72 6f 72 20 73  */..  /* Error s
2a00: 74 61 74 65 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  tate. */.  int r
2a10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2a20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
2a30: 72 72 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  rrent error code
2a40: 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74 61 74 65 20   */..  /* State 
2a50: 75 73 65 64 20 62 79 20 74 68 65 20 66 74 73 35  used by the fts5
2a60: 44 61 74 61 58 58 58 28 29 20 66 75 6e 63 74 69  DataXXX() functi
2a70: 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ons. */.  sqlite
2a80: 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72 3b  3_blob *pReader;
2a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 4f 20            /* RO 
2aa0: 69 6e 63 72 2d 62 6c 6f 62 20 6f 70 65 6e 20 6f  incr-blob open o
2ab0: 6e 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  n %_data table *
2ac0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
2ad0: 20 2a 70 57 72 69 74 65 72 3b 20 20 20 20 20 20   *pWriter;      
2ae0: 20 20 20 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e      /* "INSERT .
2af0: 2e 2e 20 25 5f 64 61 74 61 20 56 41 4c 55 45 53  .. %_data VALUES
2b00: 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  (?,?)" */.  sqli
2b10: 74 65 33 5f 73 74 6d 74 20 2a 70 44 65 6c 65 74  te3_stmt *pDelet
2b20: 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 22  er;         /* "
2b30: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 64 61  DELETE FROM %_da
2b40: 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f 20 41 4e 44  ta ... id>=? AND
2b50: 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20 20 73 71 6c   id<=?" */.  sql
2b60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 57  ite3_stmt *pIdxW
2b70: 72 69 74 65 72 3b 20 20 20 20 20 20 20 2f 2a 20  riter;       /* 
2b80: 22 49 4e 53 45 52 54 20 2e 2e 2e 20 25 5f 69 64  "INSERT ... %_id
2b90: 78 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  x VALUES(?,?,?,?
2ba0: 29 22 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  )" */.  sqlite3_
2bb0: 73 74 6d 74 20 2a 70 49 64 78 44 65 6c 65 74 65  stmt *pIdxDelete
2bc0: 72 3b 20 20 20 20 20 20 2f 2a 20 22 44 45 4c 45  r;      /* "DELE
2bd0: 54 45 20 46 52 4f 4d 20 25 5f 69 64 78 20 57 48  TE FROM %_idx WH
2be0: 45 52 45 20 73 65 67 69 64 3d 3f 20 2a 2f 0a 20  ERE segid=? */. 
2bf0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2c00: 49 64 78 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74  IdxSelect;.  int
2c10: 20 6e 52 65 61 64 3b 20 20 20 20 20 20 20 20 20   nRead;         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c30: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2c40: 62 6c 6f 63 6b 73 20 72 65 61 64 20 2a 2f 0a 7d  blocks read */.}
2c50: 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44 6f  ;..struct Fts5Do
2c60: 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75 38  clistIter {.  u8
2c70: 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20 20   *aEof;         
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c90: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79   Pointer to 1 by
2ca0: 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 64  te past end of d
2cb0: 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a 20  oclist */..  /* 
2cc0: 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  Output variables
2cd0: 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61 74  . aPoslist==0 at
2ce0: 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69 52   EOF */.  i64 iR
2cf0: 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f 73  owid;.  u8 *aPos
2d00: 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f 73  list;.  int nPos
2d10: 6c 69 73 74 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  list;.};../*.** 
2d20: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2d30: 74 68 65 20 22 73 74 72 75 63 74 75 72 65 22 20  the "structure" 
2d40: 72 65 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20  record for each 
2d50: 69 6e 64 65 78 20 61 72 65 20 72 65 70 72 65 73  index are repres
2d60: 65 6e 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61  ented.** using a
2d70: 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20  n Fts5Structure 
2d80: 72 65 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79  record in memory
2d90: 2e 20 57 68 69 63 68 20 75 73 65 73 20 69 6e 73  . Which uses ins
2da0: 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a  tances of the .*
2db0: 2a 20 6f 74 68 65 72 20 46 74 73 35 53 74 72 75  * other Fts5Stru
2dc0: 63 74 75 72 65 58 58 58 20 74 79 70 65 73 20 61  ctureXXX types a
2dd0: 73 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f  s components..*/
2de0: 0a 73 74 72 75 63 74 20 46 74 73 35 53 74 72 75  .struct Fts5Stru
2df0: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20  ctureSegment {. 
2e00: 20 69 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20   int iSegid;    
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a   /* Segment id *
2e30: 2f 0a 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73  /.  int pgnoFirs
2e40: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2e50: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61      /* First lea
2e60: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
2e70: 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e   segment */.  in
2e80: 74 20 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20  t pgnoLast;     
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ea0: 20 4c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20   Last leaf page 
2eb0: 6e 75 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e  number in segmen
2ec0: 74 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  t */.};.struct F
2ed0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
2ee0: 6c 20 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65  l {.  int nMerge
2ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f00: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2f10: 6f 66 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69  of segments in i
2f20: 6e 63 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69  ncr-merge */.  i
2f30: 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20  nt nSeg;        
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f50: 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * Total number o
2f60: 66 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65  f segments on le
2f70: 76 65 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  vel */.  Fts5Str
2f80: 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61  uctureSegment *a
2f90: 53 65 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61  Seg;     /* Arra
2fa0: 79 20 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61  y of segments. a
2fb0: 53 65 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74  Seg[0] is oldest
2fc0: 2e 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46  . */.};.struct F
2fd0: 74 73 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20  ts5Structure {. 
2fe0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 2f 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72   /* Object refer
3010: 65 6e 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20  ence count */.  
3020: 75 36 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65  u64 nWriteCounte
3030: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3040: 2f 2a 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20  /* Total leaves 
3050: 77 72 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c  written to level
3060: 20 30 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67   0 */.  int nSeg
3070: 6d 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  ment;           
3080: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
3090: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69   segments in thi
30a0: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
30b0: 20 69 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20   int nLevel;    
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
30e0: 76 65 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64  vels in this ind
30f0: 65 78 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ex */.  Fts5Stru
3100: 63 74 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65  ctureLevel aLeve
3110: 6c 5b 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79  l[1];   /* Array
3120: 20 6f 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c   of nLevel level
3130: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a   objects */.};..
3140: 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
3150: 6f 66 20 74 79 70 65 20 46 74 73 35 53 65 67 57  of type Fts5SegW
3160: 72 69 74 65 72 20 69 73 20 75 73 65 64 20 74 6f  riter is used to
3170: 20 77 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e   write to segmen
3180: 74 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74  ts..*/.struct Ft
3190: 73 35 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20  s5PageWriter {. 
31a0: 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20   int pgno;      
31b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c0: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
31d0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
31e0: 0a 20 20 69 6e 74 20 69 50 72 65 76 50 67 69 64  .  int iPrevPgid
31f0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
3200: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76     /* Previous v
3210: 61 6c 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74  alue written int
3220: 6f 20 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73  o pgidx */.  Fts
3230: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3250: 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  Buffer containin
3260: 67 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  g leaf data */. 
3270: 20 46 74 73 35 42 75 66 66 65 72 20 70 67 69 64   Fts5Buffer pgid
3280: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
3290: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
32a0: 69 6e 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78  ining page-index
32b0: 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
32c0: 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20   term;          
32d0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
32e0: 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69  containing previ
32f0: 6f 75 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65  ous term on page
3300: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
3310: 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a  s5DlidxWriter {.
3320: 20 20 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20    int pgno;     
3330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3340: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
3350: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
3360: 2f 0a 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c  /.  int bPrevVal
3370: 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
3380: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
3390: 50 72 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f  Prev is valid */
33a0: 0a 20 20 69 36 34 20 69 50 72 65 76 3b 20 20 20  .  i64 iPrev;   
33b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c0: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72     /* Previous r
33d0: 6f 77 69 64 20 76 61 6c 75 65 20 77 72 69 74 74  owid value writt
33e0: 65 6e 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20  en to page */.  
33f0: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 20  Fts5Buffer buf; 
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3410: 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
3420: 6e 69 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a  ning page data *
3430: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
3440: 53 65 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e  SegWriter {.  in
3450: 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20 20  t iSegid;       
3460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3470: 20 53 65 67 69 64 20 74 6f 20 77 72 69 74 65 20   Segid to write 
3480: 74 6f 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65  to */.  Fts5Page
3490: 57 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20  Writer writer;  
34a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57          /* PageW
34b0: 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
34c0: 20 20 69 36 34 20 69 50 72 65 76 52 6f 77 69 64    i64 iPrevRowid
34d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
34e0: 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f    /* Previous ro
34f0: 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63  wid written to c
3500: 75 72 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20  urrent leaf */. 
3510: 20 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49   u8 bFirstRowidI
3520: 6e 44 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20  nDoclist;       
3530: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
3540: 20 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20   rowid is first 
3550: 69 6e 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20  in doclist */.  
3560: 75 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e  u8 bFirstRowidIn
3570: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
3580: 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20  /* True if next 
3590: 72 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69  rowid is first i
35a0: 6e 20 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54  n page */.  /* T
35b0: 4f 44 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77  ODO1: Can use (w
35c0: 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30  riter.pgidx.n==0
35d0: 29 20 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69  ) instead of bFi
35e0: 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f  rstTermInPage */
35f0: 0a 20 20 75 38 20 62 46 69 72 73 74 54 65 72 6d  .  u8 bFirstTerm
3600: 49 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  InPage;         
3610: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65     /* True if ne
3620: 78 74 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20  xt term will be 
3630: 66 69 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f  first in leaf */
3640: 0a 20 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74  .  int nLeafWrit
3650: 74 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ten;            
3660: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
3670: 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74  leaf pages writt
3680: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70  en */.  int nEmp
3690: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
36a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
36b0: 72 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20  r of contiguous 
36c0: 74 65 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20  term-less nodes 
36d0: 2a 2f 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78  */..  int nDlidx
36e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
36f0: 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
3700: 65 64 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64  ed size of aDlid
3710: 78 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46  x[] array */.  F
3720: 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a  ts5DlidxWriter *
3730: 61 44 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f  aDlidx;        /
3740: 2a 20 41 72 72 61 79 20 6f 66 20 46 74 73 35 44  * Array of Fts5D
3750: 6c 69 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63  lidxWriter objec
3760: 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75  ts */..  /* Valu
3770: 65 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74  es to insert int
3780: 6f 20 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c  o the %_idx tabl
3790: 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
37a0: 72 20 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20  r btterm;       
37b0: 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74         /* Next t
37c0: 65 72 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  erm to insert in
37d0: 74 6f 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a  to %_idx table *
37e0: 2f 0a 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b  /.  int iBtPage;
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3800: 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
3810: 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  er corresponding
3820: 20 74 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b   to btterm */.};
3830: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66  ../*.** Object f
3840: 6f 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72  or iterating thr
3850: 6f 75 67 68 20 74 68 65 20 6d 65 72 67 65 64 20  ough the merged 
3860: 72 65 73 75 6c 74 73 20 6f 66 20 6f 6e 65 20 6f  results of one o
3870: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 2c  r more segments,
3880: 0a 2a 2a 20 76 69 73 69 74 69 6e 67 20 65 61 63  .** visiting eac
3890: 68 20 74 65 72 6d 2f 72 6f 77 69 64 20 70 61 69  h term/rowid pai
38a0: 72 20 69 6e 20 74 68 65 20 6d 65 72 67 65 64 20  r in the merged 
38b0: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 6e 53 65 67  data..**.** nSeg
38c0: 20 69 73 20 61 6c 77 61 79 73 20 61 20 70 6f 77   is always a pow
38d0: 65 72 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65  er of two greate
38e0: 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
38f0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
3900: 0a 2a 2a 20 73 65 67 6d 65 6e 74 73 20 74 68 61  .** segments tha
3910: 74 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73  t this object is
3920: 20 6d 65 72 67 69 6e 67 20 64 61 74 61 20 66 72   merging data fr
3930: 6f 6d 2e 20 42 6f 74 68 20 74 68 65 20 61 53 65  om. Both the aSe
3940: 67 5b 5d 20 61 6e 64 0a 2a 2a 20 61 46 69 72 73  g[] and.** aFirs
3950: 74 5b 5d 20 61 72 72 61 79 73 20 61 72 65 20 73  t[] arrays are s
3960: 69 7a 65 64 20 61 74 20 6e 53 65 67 20 65 6e 74  ized at nSeg ent
3970: 72 69 65 73 2e 20 54 68 65 20 61 53 65 67 5b 5d  ries. The aSeg[]
3980: 20 61 72 72 61 79 20 69 73 20 70 61 64 64 65 64   array is padded
3990: 0a 2a 2a 20 77 69 74 68 20 7a 65 72 6f 65 64 20  .** with zeroed 
39a0: 6f 62 6a 65 63 74 73 20 2d 20 74 68 65 73 65 20  objects - these 
39b0: 61 72 65 20 68 61 6e 64 6c 65 64 20 61 73 20 69  are handled as i
39c0: 66 20 74 68 65 79 20 77 65 72 65 20 69 74 65 72  f they were iter
39d0: 61 74 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  ators opened.** 
39e0: 6f 6e 20 65 6d 70 74 79 20 73 65 67 6d 65 6e 74  on empty segment
39f0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  s..**.** The res
3a00: 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e  ults of comparin
3a10: 67 20 73 65 67 6d 65 6e 74 73 20 61 53 65 67 5b  g segments aSeg[
3a20: 4e 5d 20 61 6e 64 20 61 53 65 67 5b 4e 2b 31 5d  N] and aSeg[N+1]
3a30: 2c 20 77 68 65 72 65 20 4e 20 69 73 20 61 6e 0a  , where N is an.
3a40: 2a 2a 20 65 76 65 6e 20 6e 75 6d 62 65 72 2c 20  ** even number, 
3a50: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 46 69  is stored in aFi
3a60: 72 73 74 5b 28 6e 53 65 67 2b 4e 29 2f 32 5d 2e  rst[(nSeg+N)/2].
3a70: 20 54 68 65 20 22 72 65 73 75 6c 74 22 20 6f 66   The "result" of
3a80: 20 74 68 65 20 0a 2a 2a 20 63 6f 6d 70 61 72 69   the .** compari
3a90: 73 6f 6e 20 69 6e 20 74 68 69 73 20 63 6f 6e 74  son in this cont
3aa0: 65 78 74 20 69 73 20 74 68 65 20 69 6e 64 65 78  ext is the index
3ab0: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
3ac0: 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 0a   that currently.
3ad0: 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ** points to the
3ae0: 20 73 6d 61 6c 6c 65 72 20 74 65 72 6d 2f 72 6f   smaller term/ro
3af0: 77 69 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 2e  wid combination.
3b00: 20 49 74 65 72 61 74 6f 72 73 20 61 74 20 45 4f   Iterators at EO
3b10: 46 20 61 72 65 0a 2a 2a 20 63 6f 6e 73 69 64 65  F are.** conside
3b20: 72 65 64 20 74 6f 20 62 65 20 67 72 65 61 74 65  red to be greate
3b30: 72 20 74 68 61 6e 20 61 6c 6c 20 6f 74 68 65 72  r than all other
3b40: 20 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a   iterators..**.*
3b50: 2a 20 61 46 69 72 73 74 5b 31 5d 20 63 6f 6e 74  * aFirst[1] cont
3b60: 61 69 6e 73 20 74 68 65 20 69 6e 64 65 78 20 69  ains the index i
3b70: 6e 20 61 53 65 67 5b 5d 20 6f 66 20 74 68 65 20  n aSeg[] of the 
3b80: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 70 6f  iterator that po
3b90: 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 73  ints to.** the s
3ba0: 6d 61 6c 6c 65 73 74 20 6b 65 79 20 6f 76 65 72  mallest key over
3bb0: 61 6c 6c 2e 20 61 46 69 72 73 74 5b 30 5d 20 69  all. aFirst[0] i
3bc0: 73 20 75 6e 75 73 65 64 2e 20 0a 2a 2f 0a 0a 74  s unused. .*/..t
3bd0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
3be0: 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43 52  s5CResult Fts5CR
3bf0: 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46 74  esult;.struct Ft
3c00: 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75 31  s5CResult {.  u1
3c10: 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20 20  6 iFirst;       
3c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c30: 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f 66   aSeg[] index of
3c40: 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61 74   firstest iterat
3c50: 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72 6d  or */.  u8 bTerm
3c60: 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Eq;             
3c70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3c80: 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72 65  if the terms are
3c90: 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a   equal */.};../*
3ca0: 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20 69  .** Object for i
3cb0: 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68  terating through
3cc0: 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65 6e   a single segmen
3cd0: 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63 68  t, visiting each
3ce0: 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20 70   term/rowid.** p
3cf0: 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d 65  air in the segme
3d00: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a 0a  nt..**.** pSeg:.
3d10: 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e 74  **   The segment
3d20: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
3d30: 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ugh..**.** iLeaf
3d40: 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72 65  Pgno:.**   Curre
3d50: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d  nt leaf page num
3d60: 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d 65  ber within segme
3d70: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66 4f  nt..**.** iLeafO
3d80: 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74 65  ffset:.**   Byte
3d90: 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20 74   offset within t
3da0: 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
3db0: 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72 73  that is the firs
3dc0: 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a 2a  t byte of the .*
3dd0: 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  *   position lis
3de0: 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74 65  t data (one byte
3df0: 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73 69   passed the posi
3e00: 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
3e10: 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77 69  ield)..**   rowi
3e20: 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63  d field of the c
3e30: 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55 73  urrent entry. Us
3e40: 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74 68  ually this is th
3e50: 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66 20  e size field of 
3e60: 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69 6f  the.**   positio
3e70: 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68 65  n list data. The
3e80: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69 66   exception is if
3e90: 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20 74   the rowid for t
3ea0: 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72 79  he current entry
3eb0: 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c 61   .**   is the la
3ec0: 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65 20  st thing on the 
3ed0: 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  leaf page..**.**
3ee0: 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75 66   pLeaf:.**   Buf
3ef0: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  fer containing c
3f00: 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65  urrent leaf page
3f10: 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e 55   data. Set to NU
3f20: 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  LL at EOF..**.**
3f30: 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c 20   iTermLeafPgno, 
3f40: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3a  iTermLeafOffset:
3f50: 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65 20  .**   Leaf page 
3f60: 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69 6e  number containin
3f70: 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d 20  g the last term 
3f80: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73 65  read from the se
3f90: 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20 20  gment. And.**   
3fa0: 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65 64  the offset immed
3fb0: 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67  iately following
3fc0: 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e 0a   the term data..
3fd0: 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a 20  **.** flags:.** 
3fe0: 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f 53    Mask of FTS5_S
3ff0: 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75 65  EGITER_XXX value
4000: 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20 61  s. Interpreted a
4010: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
4020: 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f     FTS5_SEGITER_
4030: 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20 20  ONETERM:.**     
4040: 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65 20  If set, set the 
4050: 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69 6e  iterator to poin
4060: 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20 74  t to EOF after t
4070: 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
4080: 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20 62  st .**     has b
4090: 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20 44  een exhausted. D
40a0: 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74 6f  o not proceed to
40b0: 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20 69   the next term i
40c0: 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a 2a  n the segment..*
40d0: 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47 49  *.**   FTS5_SEGI
40e0: 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a 20  TER_REVERSE:.** 
40f0: 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73      This flag is
4100: 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20 69   only ever set i
4110: 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  f FTS5_SEGITER_O
4120: 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20 73  NETERM is also s
4130: 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69 74  et. If.**     it
4140: 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74 65   is set, iterate
4150: 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20 69   through rowid i
4160: 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72 64  n descending ord
4170: 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  er instead of th
4180: 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c 74  e.**     default
4190: 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   ascending order
41a0: 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f 66  ..**.** iRowidOf
41b0: 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73 65  fset/nRowidOffse
41c0: 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a 0a  t/aRowidOffset:.
41d0: 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72 65  **     These are
41e0: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
41f0: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4200: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a 2a  E flag is set..*
4210: 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61 63  *.**     For eac
4220: 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 70  h rowid on the p
4230: 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  age correspondin
4240: 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  g to the current
4250: 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20 20   term, the.**   
4260: 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20    corresponding 
4270: 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 65  aRowidOffset[] e
4280: 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20 74  ntry is set to t
4290: 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20 6f  he byte offset o
42a0: 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74 61  f the.**     sta
42b0: 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69 74  rt of the "posit
42c0: 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20 66  ion-list-size" f
42d0: 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65 20  ield within the 
42e0: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65 72  page..**.** iTer
42f0: 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e 64  mIdx:.**     Ind
4300: 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74 65  ex of current te
4310: 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66 50  rm on iTermLeafP
4320: 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46  gno..*/.struct F
4330: 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20 46  ts5SegIter {.  F
4340: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
4350: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f  ent *pSeg;     /
4360: 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74 65  * Segment to ite
4370: 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f 0a  rate through */.
4380: 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20    int flags;    
4390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43a0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f 6e    /* Mask of con
43b0: 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67 73  figuration flags
43c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66 50   */.  int iLeafP
43d0: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
43e0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
43f0: 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
4400: 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61 20  r */.  Fts5Data 
4410: 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20  *pLeaf;         
4420: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
4430: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20  t leaf data */. 
4440: 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78 74   Fts5Data *pNext
4450: 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20 20  Leaf;           
4460: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28 69   /* Leaf page (i
4470: 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a 20  LeafPgno+1) */. 
4480: 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65 74   int iLeafOffset
4490: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
44a0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
44b0: 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20 6c  within current l
44c0: 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  eaf */..  /* The
44d0: 20 70 61 67 65 20 61 6e 64 20 6f 66 66 73 65 74   page and offset
44e0: 20 66 72 6f 6d 20 77 68 69 63 68 20 74 68 65 20   from which the 
44f0: 63 75 72 72 65 6e 74 20 74 65 72 6d 20 77 61 73  current term was
4500: 20 72 65 61 64 2e 20 54 68 65 20 6f 66 66 73 65   read. The offse
4510: 74 20 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 6f  t .  ** is the o
4520: 66 66 73 65 74 20 6f 66 20 74 68 65 20 66 69 72  ffset of the fir
4530: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
4540: 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2e  current doclist.
4550: 20 20 2a 2f 0a 20 20 69 6e 74 20 69 54 65 72 6d    */.  int iTerm
4560: 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e 74 20  LeafPgno;.  int 
4570: 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b  iTermLeafOffset;
4580: 0a 0a 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66  ..  int iPgidxOf
4590: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
45a0: 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73      /* Next offs
45b0: 65 74 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20  et in pgidx */. 
45c0: 20 69 6e 74 20 69 45 6e 64 6f 66 44 6f 63 6c 69   int iEndofDocli
45d0: 73 74 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  st;..  /* The fo
45e0: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
45f0: 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54 53   used if the FTS
4600: 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53  5_SEGITER_REVERS
4610: 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 2a  E flag is set. *
4620: 2f 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  /.  int iRowidOf
4630: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
4640: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 65      /* Current e
4650: 6e 74 72 79 20 69 6e 20 61 52 6f 77 69 64 4f 66  ntry in aRowidOf
4660: 66 73 65 74 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  fset[] */.  int 
4670: 6e 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  nRowidOffset;   
4680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4690: 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66  llocated size of
46a0: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
46b0: 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  array */.  int *
46c0: 61 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20  aRowidOffset;   
46d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
46e0: 72 61 79 20 6f 66 20 6f 66 66 73 65 74 20 74 6f  ray of offset to
46f0: 20 72 6f 77 69 64 20 66 69 65 6c 64 73 20 2a 2f   rowid fields */
4700: 0a 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ..  Fts5DlidxIte
4710: 72 20 2a 70 44 6c 69 64 78 3b 20 20 20 20 20 20  r *pDlidx;      
4720: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
4730: 69 73 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64  is a doclist-ind
4740: 65 78 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 72 69  ex */..  /* Vari
4750: 61 62 6c 65 73 20 70 6f 70 75 6c 61 74 65 64 20  ables populated 
4760: 62 61 73 65 64 20 6f 6e 20 63 75 72 72 65 6e 74  based on current
4770: 20 65 6e 74 72 79 2e 20 2a 2f 0a 20 20 46 74 73   entry. */.  Fts
4780: 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20 20 20  5Buffer term;   
4790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
47a0: 43 75 72 72 65 6e 74 20 74 65 72 6d 20 2a 2f 0a  Current term */.
47b0: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
47c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 72 6f 77    /* Current row
47e0: 69 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 6f 73  id */.  int nPos
47f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4800: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4810: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 75  r of bytes in cu
4820: 72 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 20 6c  rrent position l
4830: 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  ist */.  int bDe
4840: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
4850: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
4860: 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20 66   if the delete f
4870: 6c 61 67 20 69 73 20 73 65 74 20 2a 2f 0a 7d 3b  lag is set */.};
4880: 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
4890: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
48a0: 20 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72   an Fts5Data str
48b0: 75 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74  ucture that cont
48c0: 61 69 6e 73 20 61 20 0a 2a 2a 20 6c 65 61 66 20  ains a .** leaf 
48d0: 70 61 67 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  page..*/.#define
48e0: 20 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f   ASSERT_SZLEAF_O
48f0: 4b 28 78 29 20 61 73 73 65 72 74 28 20 5c 0a 20  K(x) assert( \. 
4900: 20 20 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d     (x)->szLeaf==
4910: 28 78 29 2d 3e 6e 6e 20 7c 7c 20 28 78 29 2d 3e  (x)->nn || (x)->
4920: 73 7a 4c 65 61 66 3d 3d 66 74 73 35 47 65 74 55  szLeaf==fts5GetU
4930: 31 36 28 26 28 78 29 2d 3e 70 5b 32 5d 29 20 5c  16(&(x)->p[2]) \
4940: 0a 29 0a 0a 23 64 65 66 69 6e 65 20 46 54 53 35  .)..#define FTS5
4950: 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d  _SEGITER_ONETERM
4960: 20 30 78 30 31 0a 23 64 65 66 69 6e 65 20 46 54   0x01.#define FT
4970: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
4980: 53 45 20 30 78 30 32 0a 0a 0a 2f 2a 20 0a 2a 2a  SE 0x02.../* .**
4990: 20 41 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   Argument is a p
49a0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73  ointer to an Fts
49b0: 35 44 61 74 61 20 73 74 72 75 63 74 75 72 65 20  5Data structure 
49c0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
49d0: 6c 65 61 66 0a 2a 2a 20 70 61 67 65 2e 20 54 68  leaf.** page. Th
49e0: 69 73 20 6d 61 63 72 6f 20 65 76 61 6c 75 61 74  is macro evaluat
49f0: 65 73 20 74 6f 20 74 72 75 65 20 69 66 20 74 68  es to true if th
4a00: 65 20 6c 65 61 66 20 63 6f 6e 74 61 69 6e 73 20  e leaf contains 
4a10: 6e 6f 20 74 65 72 6d 73 2c 20 6f 72 0a 2a 2a 20  no terms, or.** 
4a20: 66 61 6c 73 65 20 69 66 20 69 74 20 63 6f 6e 74  false if it cont
4a30: 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
4a40: 65 20 74 65 72 6d 2e 0a 2a 2f 0a 23 64 65 66 69  e term..*/.#defi
4a50: 6e 65 20 66 74 73 35 4c 65 61 66 49 73 54 65 72  ne fts5LeafIsTer
4a60: 6d 6c 65 73 73 28 78 29 20 28 28 78 29 2d 3e 73  mless(x) ((x)->s
4a70: 7a 4c 65 61 66 20 3e 3d 20 28 78 29 2d 3e 6e 6e  zLeaf >= (x)->nn
4a80: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4a90: 65 61 66 54 65 72 6d 4f 66 66 28 78 2c 20 69 29  eafTermOff(x, i)
4aa0: 20 28 66 74 73 35 47 65 74 55 31 36 28 26 28 78   (fts5GetU16(&(x
4ab0: 29 2d 3e 70 5b 28 78 29 2d 3e 73 7a 4c 65 61 66  )->p[(x)->szLeaf
4ac0: 20 2b 20 28 69 29 2a 32 5d 29 29 0a 0a 23 64 65   + (i)*2]))..#de
4ad0: 66 69 6e 65 20 66 74 73 35 4c 65 61 66 46 69 72  fine fts5LeafFir
4ae0: 73 74 52 6f 77 69 64 4f 66 66 28 78 29 20 28 66  stRowidOff(x) (f
4af0: 74 73 35 47 65 74 55 31 36 28 28 78 29 2d 3e 70  ts5GetU16((x)->p
4b00: 29 29 0a 0a 2f 2a 0a 2a 2a 20 70 6f 73 6c 69 73  ))../*.** poslis
4b10: 74 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20  t:.**   Used by 
4b20: 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50  sqlite3Fts5IterP
4b30: 6f 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68  oslist() when th
4b40: 65 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20  e poslist needs 
4b50: 74 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a  to be buffered..
4b60: 2a 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  **   There is no
4b70: 20 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20   way to tell if 
4b80: 74 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65  this is populate
4b90: 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72  d or not..*/.str
4ba0: 75 63 74 20 46 74 73 35 49 6e 64 65 78 49 74 65  uct Fts5IndexIte
4bb0: 72 20 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20  r {.  Fts5Index 
4bc0: 2a 70 49 6e 64 65 78 3b 20 20 20 20 20 20 20 20  *pIndex;        
4bd0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
4be0: 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 69 74  hat owns this it
4bf0: 65 72 61 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35  erator */.  Fts5
4c00: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
4c10: 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ct;         /* D
4c20: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
4c30: 65 20 66 6f 72 20 74 68 69 73 20 69 74 65 72 61  e for this itera
4c40: 74 6f 72 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  tor */.  Fts5Buf
4c50: 66 65 72 20 70 6f 73 6c 69 73 74 3b 20 20 20 20  fer poslist;    
4c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
4c70: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 75  er containing cu
4c80: 72 72 65 6e 74 20 70 6f 73 6c 69 73 74 20 2a 2f  rrent poslist */
4c90: 0a 0a 20 20 69 6e 74 20 6e 53 65 67 3b 20 20 20  ..  int nSeg;   
4ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cb0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
4cc0: 53 65 67 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  Seg[] array */. 
4cd0: 20 69 6e 74 20 62 52 65 76 3b 20 20 20 20 20 20   int bRev;      
4ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4cf0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 74 65 72   /* True to iter
4d00: 61 74 65 20 69 6e 20 72 65 76 65 72 73 65 20 6f  ate in reverse o
4d10: 72 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 53  rder */.  int bS
4d20: 6b 69 70 45 6d 70 74 79 3b 20 20 20 20 20 20 20  kipEmpty;       
4d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
4d40: 65 20 74 6f 20 73 6b 69 70 20 64 65 6c 65 74 65  e to skip delete
4d50: 64 20 65 6e 74 72 69 65 73 20 2a 2f 0a 20 20 69  d entries */.  i
4d60: 6e 74 20 62 45 6f 66 3b 20 20 20 20 20 20 20 20  nt bEof;        
4d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4d80: 2a 20 54 72 75 65 20 61 74 20 45 4f 46 20 2a 2f  * True at EOF */
4d90: 0a 0a 20 20 69 36 34 20 69 53 77 69 74 63 68 52  ..  i64 iSwitchR
4da0: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
4db0: 20 20 20 20 2f 2a 20 46 69 72 73 74 65 73 74 20      /* Firstest 
4dc0: 72 6f 77 69 64 20 6f 66 20 6f 74 68 65 72 20 74  rowid of other t
4dd0: 68 61 6e 20 61 46 69 72 73 74 5b 31 5d 20 2a 2f  han aFirst[1] */
4de0: 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a  .  Fts5CResult *
4df0: 61 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  aFirst;         
4e00: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6d 65     /* Current me
4e10: 72 67 65 20 73 74 61 74 65 20 28 73 65 65 20 61  rge state (see a
4e20: 62 6f 76 65 29 20 2a 2f 0a 20 20 46 74 73 35 53  bove) */.  Fts5S
4e30: 65 67 49 74 65 72 20 61 53 65 67 5b 31 5d 3b 20  egIter aSeg[1]; 
4e40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
4e50: 72 61 79 20 6f 66 20 73 65 67 6d 65 6e 74 20 69  ray of segment i
4e60: 74 65 72 61 74 6f 72 73 20 2a 2f 0a 7d 3b 0a 0a  terators */.};..
4e70: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
4e80: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
4e90: 69 6e 67 20 74 79 70 65 20 69 73 20 75 73 65 64  ing type is used
4ea0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
4eb0: 75 67 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ugh the contents
4ec0: 0a 2a 2a 20 6f 66 20 61 20 64 6f 63 6c 69 73 74  .** of a doclist
4ed0: 2d 69 6e 64 65 78 20 72 65 63 6f 72 64 2e 0a 2a  -index record..*
4ee0: 2a 0a 2a 2a 20 70 44 61 74 61 3a 0a 2a 2a 20 20  *.** pData:.**  
4ef0: 20 52 65 63 6f 72 64 20 63 6f 6e 74 61 69 6e 69   Record containi
4f00: 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  ng the doclist-i
4f10: 6e 64 65 78 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  ndex data..**.**
4f20: 20 62 45 6f 66 3a 0a 2a 2a 20 20 20 53 65 74 20   bEof:.**   Set 
4f30: 74 6f 20 74 72 75 65 20 6f 6e 63 65 20 69 74 65  to true once ite
4f40: 72 61 74 6f 72 20 68 61 73 20 72 65 61 63 68 65  rator has reache
4f50: 64 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a 20 69 4f 66  d EOF..**.** iOf
4f60: 66 3a 0a 2a 2a 20 20 20 53 65 74 20 74 6f 20 74  f:.**   Set to t
4f70: 68 65 20 63 75 72 72 65 6e 74 20 6f 66 66 73 65  he current offse
4f80: 74 20 77 69 74 68 69 6e 20 72 65 63 6f 72 64 20  t within record 
4f90: 70 44 61 74 61 2e 0a 2a 2f 0a 73 74 72 75 63 74  pData..*/.struct
4fa0: 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 7b 0a   Fts5DlidxLvl {.
4fb0: 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61 74    Fts5Data *pDat
4fc0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
4fd0: 2f 2a 20 44 61 74 61 20 66 6f 72 20 63 75 72 72  /* Data for curr
4fe0: 65 6e 74 20 70 61 67 65 20 6f 66 20 74 68 69 73  ent page of this
4ff0: 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20   level */.  int 
5000: 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
5010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
5020: 72 65 6e 74 20 6f 66 66 73 65 74 20 69 6e 74 6f  rent offset into
5030: 20 70 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20   pData */.  int 
5040: 62 45 6f 66 3b 20 20 20 20 20 20 20 20 20 20 20  bEof;           
5050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20            /* At 
5060: 45 4f 46 20 61 6c 72 65 61 64 79 20 2a 2f 0a 20  EOF already */. 
5070: 20 69 6e 74 20 69 46 69 72 73 74 4f 66 66 3b 20   int iFirstOff; 
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5090: 2a 20 55 73 65 64 20 62 79 20 72 65 76 65 72 73  * Used by revers
50a0: 65 20 69 74 65 72 61 74 6f 72 73 20 2a 2f 0a 0a  e iterators */..
50b0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 76 61 72 69    /* Output vari
50c0: 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 69  ables */.  int i
50d0: 4c 65 61 66 50 67 6e 6f 3b 20 20 20 20 20 20 20  LeafPgno;       
50e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
50f0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 75 72 72 65   number of curre
5100: 6e 74 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a  nt leaf page */.
5110: 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 2f 2a 20 46 69 72 73 74 20 72 6f 77 69 64 20 6f  /* First rowid o
5140: 6e 20 6c 65 61 66 20 69 4c 65 61 66 50 67 6e 6f  n leaf iLeafPgno
5150: 20 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74   */.};.struct Ft
5160: 73 35 44 6c 69 64 78 49 74 65 72 20 7b 0a 20 20  s5DlidxIter {.  
5170: 69 6e 74 20 6e 4c 76 6c 3b 0a 20 20 69 6e 74 20  int nLvl;.  int 
5180: 69 53 65 67 69 64 3b 0a 20 20 46 74 73 35 44 6c  iSegid;.  Fts5Dl
5190: 69 64 78 4c 76 6c 20 61 4c 76 6c 5b 31 5d 3b 0a  idxLvl aLvl[1];.
51a0: 7d 3b 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  };..static void 
51b0: 66 74 73 35 50 75 74 55 31 36 28 75 38 20 2a 61  fts5PutU16(u8 *a
51c0: 4f 75 74 2c 20 75 31 36 20 69 56 61 6c 29 7b 0a  Out, u16 iVal){.
51d0: 20 20 61 4f 75 74 5b 30 5d 20 3d 20 28 69 56 61    aOut[0] = (iVa
51e0: 6c 3e 3e 38 29 3b 0a 20 20 61 4f 75 74 5b 31 5d  l>>8);.  aOut[1]
51f0: 20 3d 20 28 69 56 61 6c 26 30 78 46 46 29 3b 0a   = (iVal&0xFF);.
5200: 7d 0a 0a 73 74 61 74 69 63 20 75 31 36 20 66 74  }..static u16 ft
5210: 73 35 47 65 74 55 31 36 28 63 6f 6e 73 74 20 75  s5GetU16(const u
5220: 38 20 2a 61 49 6e 29 7b 0a 20 20 72 65 74 75 72  8 *aIn){.  retur
5230: 6e 20 28 28 75 31 36 29 61 49 6e 5b 30 5d 20 3c  n ((u16)aIn[0] <
5240: 3c 20 38 29 20 2b 20 61 49 6e 5b 31 5d 3b 0a 7d  < 8) + aIn[1];.}
5250: 20 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74   ../*.** Allocat
5260: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 62  e and return a b
5270: 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20 6e  uffer at least n
5280: 42 79 74 65 20 62 79 74 65 73 20 69 6e 20 73 69  Byte bytes in si
5290: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
52a0: 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
52b0: 6f 75 6e 74 65 72 65 64 2c 20 72 65 74 75 72 6e  ountered, return
52c0: 20 4e 55 4c 4c 20 61 6e 64 20 73 65 74 20 74 68   NULL and set th
52d0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e 0a  e error code in.
52e0: 2a 2a 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  ** the Fts5Index
52f0: 20 68 61 6e 64 6c 65 20 70 61 73 73 65 64 20 61   handle passed a
5300: 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
5310: 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
5320: 76 6f 69 64 20 2a 66 74 73 35 49 64 78 4d 61 6c  void *fts5IdxMal
5330: 6c 6f 63 28 46 74 73 35 49 6e 64 65 78 20 2a 70  loc(Fts5Index *p
5340: 2c 20 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20  , int nByte){.  
5350: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 46 74  return sqlite3Ft
5360: 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
5370: 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d 0a 0a  >rc, nByte);.}..
5380: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5390: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
53a0: 65 20 70 4c 65 66 74 20 62 75 66 66 65 72 20 77  e pLeft buffer w
53b0: 69 74 68 20 74 68 65 20 70 52 69 67 68 74 2f 6e  ith the pRight/n
53c0: 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a 0a 2a  Right blob..**.*
53d0: 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69 66 20  * Return -ve if 
53e0: 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c 65 72  pLeft is smaller
53f0: 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20 30 20   than pRight, 0 
5400: 69 66 20 74 68 65 79 20 61 72 65 20 65 71 75 61  if they are equa
5410: 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66 20 70  l or.** +ve if p
5420: 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c 65 72  Right is smaller
5430: 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49 6e 20   than pLeft. In 
5440: 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a 2a 0a  other words:.**.
5450: 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a 70 4c  **     res = *pL
5460: 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a 2a 2f  eft - *pRight.*/
5470: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
5480: 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20  EBUG.static int 
5490: 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61 72  fts5BufferCompar
54a0: 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42 75 66  eBlob(.  Fts5Buf
54b0: 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20  fer *pLeft,     
54c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74           /* Left
54d0: 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20 63 6f   hand side of co
54e0: 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20 63 6f  mparison */.  co
54f0: 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74 2c 20  nst u8 *pRight, 
5500: 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20 2f 2a  int nRight    /*
5510: 20 52 69 67 68 74 20 68 61 6e 64 20 73 69 64 65   Right hand side
5520: 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 2a   of comparison *
5530: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20  /.){.  int nCmp 
5540: 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e 2c 20  = MIN(pLeft->n, 
5550: 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74 20 72  nRight);.  int r
5560: 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c 65 66  es = memcmp(pLef
5570: 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20 6e 43  t->p, pRight, nC
5580: 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72  mp);.  return (r
5590: 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e  es==0 ? (pLeft->
55a0: 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20 72 65  n - nRight) : re
55b0: 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  s);.}.#endif../*
55c0: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
55d0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
55e0: 74 77 6f 20 62 75 66 66 65 72 73 20 75 73 69 6e  two buffers usin
55f0: 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66 20 6f  g memcmp(). If o
5600: 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69 73 20  ne buffer.** is 
5610: 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20  a prefix of the 
5620: 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63 6f 6e  other, it is con
5630: 73 69 64 65 72 65 64 20 74 68 65 20 6c 65 73 73  sidered the less
5640: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
5650: 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20 69 73   -ve if pLeft is
5660: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 52   smaller than pR
5670: 69 67 68 74 2c 20 30 20 69 66 20 74 68 65 79 20  ight, 0 if they 
5680: 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a 2a 20  are equal or.** 
5690: 2b 76 65 20 69 66 20 70 52 69 67 68 74 20 69 73  +ve if pRight is
56a0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4c   smaller than pL
56b0: 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  eft. In other wo
56c0: 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 72  rds:.**.**     r
56d0: 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20 2a 70  es = *pLeft - *p
56e0: 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69 63 20  Right.*/.static 
56f0: 69 6e 74 20 66 74 73 35 42 75 66 66 65 72 43 6f  int fts5BufferCo
5700: 6d 70 61 72 65 28 46 74 73 35 42 75 66 66 65 72  mpare(Fts5Buffer
5710: 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42 75 66   *pLeft, Fts5Buf
5720: 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20  fer *pRight){.  
5730: 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 70  int nCmp = MIN(p
5740: 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68 74 2d  Left->n, pRight-
5750: 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  >n);.  int res =
5760: 20 6d 65 6d 63 6d 70 28 70 4c 65 66 74 2d 3e 70   memcmp(pLeft->p
5770: 2c 20 70 52 69 67 68 74 2d 3e 70 2c 20 6e 43 6d  , pRight->p, nCm
5780: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
5790: 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74 2d 3e 6e  s==0 ? (pLeft->n
57a0: 20 2d 20 70 52 69 67 68 74 2d 3e 6e 29 20 3a 20   - pRight->n) : 
57b0: 72 65 73 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  res);.}..#ifdef 
57c0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61  SQLITE_DEBUG.sta
57d0: 74 69 63 20 69 6e 74 20 66 74 73 35 42 6c 6f 62  tic int fts5Blob
57e0: 43 6f 6d 70 61 72 65 28 0a 20 20 63 6f 6e 73 74  Compare(.  const
57f0: 20 75 38 20 2a 70 4c 65 66 74 2c 20 69 6e 74 20   u8 *pLeft, int 
5800: 6e 4c 65 66 74 2c 20 0a 20 20 63 6f 6e 73 74 20  nLeft, .  const 
5810: 75 38 20 2a 70 52 69 67 68 74 2c 20 69 6e 74 20  u8 *pRight, int 
5820: 6e 52 69 67 68 74 0a 29 7b 0a 20 20 69 6e 74 20  nRight.){.  int 
5830: 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 4c 65 66 74  nCmp = MIN(nLeft
5840: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
5850: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
5860: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 6e 43 6d  eft, pRight, nCm
5870: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 72 65  p);.  return (re
5880: 73 3d 3d 30 20 3f 20 28 6e 4c 65 66 74 20 2d 20  s==0 ? (nLeft - 
5890: 6e 52 69 67 68 74 29 20 3a 20 72 65 73 29 3b 0a  nRight) : res);.
58a0: 7d 0a 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63  }.#endif..static
58b0: 20 69 6e 74 20 66 74 73 35 4c 65 61 66 46 69 72   int fts5LeafFir
58c0: 73 74 54 65 72 6d 4f 66 66 28 46 74 73 35 44 61  stTermOff(Fts5Da
58d0: 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e  ta *pLeaf){.  in
58e0: 74 20 72 65 74 3b 0a 20 20 66 74 73 35 47 65 74  t ret;.  fts5Get
58f0: 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66 2d  Varint32(&pLeaf-
5900: 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  >p[pLeaf->szLeaf
5910: 5d 2c 20 72 65 74 29 3b 0a 20 20 72 65 74 75 72  ], ret);.  retur
5920: 6e 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n ret;.}../*.** 
5930: 43 6c 6f 73 65 20 74 68 65 20 72 65 61 64 2d 6f  Close the read-o
5940: 6e 6c 79 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2c  nly blob handle,
5950: 20 69 66 20 69 74 20 69 73 20 6f 70 65 6e 2e 0a   if it is open..
5960: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5970: 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 46  ts5CloseReader(F
5980: 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
5990: 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72 20 29  if( p->pReader )
59a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 6c  {.    sqlite3_bl
59b0: 6f 62 20 2a 70 52 65 61 64 65 72 20 3d 20 70 2d  ob *pReader = p-
59c0: 3e 70 52 65 61 64 65 72 3b 0a 20 20 20 20 70 2d  >pReader;.    p-
59d0: 3e 70 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  >pReader = 0;.  
59e0: 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63    sqlite3_blob_c
59f0: 6c 6f 73 65 28 70 52 65 61 64 65 72 29 3b 0a 20  lose(pReader);. 
5a00: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   }.}.../*.** Ret
5a10: 72 69 65 76 65 20 61 20 72 65 63 6f 72 64 20 66  rieve a record f
5a20: 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
5a30: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  able..**.** If a
5a40: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
5a50: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
5a60: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 6c 65   and an error le
5a70: 66 74 20 69 6e 20 74 68 65 20 0a 2a 2a 20 46 74  ft in the .** Ft
5a80: 73 35 49 6e 64 65 78 20 6f 62 6a 65 63 74 2e 0a  s5Index object..
5a90: 2a 2f 0a 73 74 61 74 69 63 20 46 74 73 35 44 61  */.static Fts5Da
5aa0: 74 61 20 2a 66 74 73 35 44 61 74 61 52 65 61 64  ta *fts5DataRead
5ab0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
5ac0: 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46 74  64 iRowid){.  Ft
5ad0: 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20 30  s5Data *pRet = 0
5ae0: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ;.  if( p->rc==S
5af0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5b00: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
5b10: 4f 4b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  OK;..    if( p->
5b20: 70 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  pReader ){.     
5b30: 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 61   /* This call ma
5b40: 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
5b50: 41 42 4f 52 54 20 69 66 20 74 68 65 72 65 20 68  ABORT if there h
5b60: 61 73 20 62 65 65 6e 20 61 20 73 61 76 65 70 6f  as been a savepo
5b70: 69 6e 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 6c  int.      ** rol
5b80: 6c 62 61 63 6b 20 73 69 6e 63 65 20 69 74 20 77  lback since it w
5b90: 61 73 20 6c 61 73 74 20 75 73 65 64 2e 20 49 6e  as last used. In
5ba0: 20 74 68 69 73 20 63 61 73 65 20 61 20 6e 65 77   this case a new
5bb0: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 0a 20 20 20   blob handle.   
5bc0: 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
5bd0: 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  d.  */.      sql
5be0: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
5bf0: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
5c00: 20 20 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20       p->pReader 
5c10: 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
5c20: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f  sqlite3_blob_reo
5c30: 70 65 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69  pen(pBlob, iRowi
5c40: 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  d);.      assert
5c50: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
5c60: 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  );.      p->pRea
5c70: 64 65 72 20 3d 20 70 42 6c 6f 62 3b 0a 20 20 20  der = pBlob;.   
5c80: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
5c90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
5ca0: 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
5cb0: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
5cc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5cd0: 5f 41 42 4f 52 54 20 29 20 72 63 20 3d 20 53 51  _ABORT ) rc = SQ
5ce0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
5cf0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 62 6c      /* If the bl
5d00: 6f 62 20 68 61 6e 64 6c 65 20 69 73 20 6e 6f 74  ob handle is not
5d10: 20 6f 70 65 6e 20 61 74 20 74 68 69 73 20 70 6f   open at this po
5d20: 69 6e 74 2c 20 6f 70 65 6e 20 69 74 20 61 6e 64  int, open it and
5d30: 20 73 65 65 6b 20 0a 20 20 20 20 2a 2a 20 74 6f   seek .    ** to
5d40: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 65   the requested e
5d50: 6e 74 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ntry.  */.    if
5d60: 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
5d70: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
5d80: 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 43 6f   ){.      Fts5Co
5d90: 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
5da0: 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20  p->pConfig;.    
5db0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
5dc0: 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69 67  lob_open(pConfig
5dd0: 2d 3e 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20  ->db, .         
5de0: 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70   pConfig->zDb, p
5df0: 2d 3e 7a 44 61 74 61 54 62 6c 2c 20 22 62 6c 6f  ->zDataTbl, "blo
5e00: 63 6b 22 2c 20 69 52 6f 77 69 64 2c 20 30 2c 20  ck", iRowid, 0, 
5e10: 26 70 2d 3e 70 52 65 61 64 65 72 0a 20 20 20 20  &p->pReader.    
5e20: 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
5e30: 2f 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  /* If either of 
5e40: 74 68 65 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  the sqlite3_blob
5e50: 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
5e60: 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 29  e3_blob_reopen()
5e70: 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 61 62   calls.    ** ab
5e80: 6f 76 65 20 72 65 74 75 72 6e 65 64 20 53 51 4c  ove returned SQL
5e90: 49 54 45 5f 45 52 52 4f 52 2c 20 72 65 74 75 72  ITE_ERROR, retur
5ea0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
5eb0: 5f 56 54 41 42 20 69 6e 73 74 65 61 64 2e 0a 20  _VTAB instead.. 
5ec0: 20 20 20 2a 2a 20 41 6c 6c 20 74 68 65 20 72 65     ** All the re
5ed0: 61 73 6f 6e 73 20 74 68 6f 73 65 20 66 75 6e 63  asons those func
5ee0: 74 69 6f 6e 73 20 6d 69 67 68 74 20 72 65 74 75  tions might retu
5ef0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  rn SQLITE_ERROR 
5f00: 2d 20 6d 69 73 73 69 6e 67 0a 20 20 20 20 2a 2a  - missing.    **
5f10: 20 74 61 62 6c 65 2c 20 6d 69 73 73 69 6e 67 20   table, missing 
5f20: 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f 62 2f 74 65  row, non-blob/te
5f30: 78 74 20 69 6e 20 62 6c 6f 63 6b 20 63 6f 6c 75  xt in block colu
5f40: 6d 6e 20 2d 20 69 6e 64 69 63 61 74 65 20 0a 20  mn - indicate . 
5f50: 20 20 20 2a 2a 20 62 61 63 6b 69 6e 67 20 73 74     ** backing st
5f60: 6f 72 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20  ore corruption. 
5f70: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
5f80: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 20 72  SQLITE_ERROR ) r
5f90: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
5fa0: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
5fb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5fc0: 20 20 75 38 20 2a 61 4f 75 74 20 3d 20 30 3b 20    u8 *aOut = 0; 
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5fe0: 20 52 65 61 64 20 62 6c 6f 62 20 64 61 74 61 20   Read blob data 
5ff0: 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  into this buffer
6000: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42   */.      int nB
6010: 79 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c  yte = sqlite3_bl
6020: 6f 62 5f 62 79 74 65 73 28 70 2d 3e 70 52 65 61  ob_bytes(p->pRea
6030: 64 65 72 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  der);.      int 
6040: 6e 41 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28  nAlloc = sizeof(
6050: 46 74 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74  Fts5Data) + nByt
6060: 65 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  e + FTS5_DATA_PA
6070: 44 44 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65  DDING;.      pRe
6080: 74 20 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73  t = (Fts5Data*)s
6090: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 41  qlite3_malloc(nA
60a0: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
60b0: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
60c0: 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74   pRet->nn = nByt
60d0: 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  e;.        aOut 
60e0: 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a  = pRet->p = (u8*
60f0: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6110: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6120: 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  M;.      }..    
6130: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6140: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
6150: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
6160: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
6170: 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30  , aOut, nByte, 0
6180: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
6190: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
61a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
61b0: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
61c0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
61d0: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
61e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  .        /* TODO
61f0: 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20  1: Fix this */. 
6200: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c         pRet->szL
6210: 65 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36  eaf = fts5GetU16
6220: 28 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20  (&pRet->p[2]);. 
6230: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
6240: 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
6250: 20 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d   p->nRead++;.  }
6260: 0a 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65  ..  assert( (pRe
6270: 74 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53  t==0)==(p->rc!=S
6280: 51 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72  QLITE_OK) );.  r
6290: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
62a0: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72  *.** Release a r
62b0: 65 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61  eference to data
62c0: 20 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64   record returned
62d0: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
62e0: 61 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61  all to.** fts5Da
62f0: 74 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61  taRead()..*/.sta
6300: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6310: 61 52 65 6c 65 61 73 65 28 46 74 73 35 44 61 74  aRelease(Fts5Dat
6320: 61 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c  a *pData){.  sql
6330: 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29  ite3_free(pData)
6340: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
6350: 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72 65  fts5IndexPrepare
6360: 53 74 6d 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Stmt(.  Fts5Inde
6370: 78 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 5f  x *p,.  sqlite3_
6380: 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
6390: 20 63 68 61 72 20 2a 7a 53 71 6c 0a 29 7b 0a 20   char *zSql.){. 
63a0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
63b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
63c0: 20 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 70   zSql ){.      p
63d0: 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70  ->rc = sqlite3_p
63e0: 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 70 43 6f  repare_v2(p->pCo
63f0: 6e 66 69 67 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  nfig->db, zSql, 
6400: 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, ppStmt, 0);.
6410: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6420: 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
6430: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
6440: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
6450: 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zSql);.  return 
6460: 70 2d 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  p->rc;.}.../*.**
6470: 20 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41   INSERT OR REPLA
6480: 43 45 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f  CE a record into
6490: 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c   the %_data tabl
64a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
64b0: 64 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28  d fts5DataWrite(
64c0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36  Fts5Index *p, i6
64d0: 34 20 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20  4 iRowid, const 
64e0: 75 38 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e  u8 *pData, int n
64f0: 44 61 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Data){.  if( p->
6500: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6510: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
6520: 2d 3e 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a  ->pWriter==0 ){.
6530: 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a      Fts5Config *
6540: 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f  pConfig = p->pCo
6550: 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e  nfig;.    fts5In
6560: 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70  dexPrepareStmt(p
6570: 2c 20 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73  , &p->pWriter, s
6580: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
6590: 20 20 20 20 20 20 20 20 20 20 22 52 45 50 4c 41            "REPLA
65a0: 43 45 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71  CE INTO '%q'.'%q
65b0: 5f 64 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b  _data'(id, block
65c0: 29 20 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20  ) VALUES(?,?)", 
65d0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
65e0: 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
65f0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
6600: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
6610: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73  return;.  }..  s
6620: 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
6630: 34 28 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c  4(p->pWriter, 1,
6640: 20 69 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69   iRowid);.  sqli
6650: 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d  te3_bind_blob(p-
6660: 3e 70 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61  >pWriter, 2, pDa
6670: 74 61 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54  ta, nData, SQLIT
6680: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
6690: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72  ite3_step(p->pWr
66a0: 69 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d  iter);.  p->rc =
66b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
66c0: 2d 3e 70 57 72 69 74 65 72 29 3b 0a 7d 0a 0a 2f  ->pWriter);.}../
66d0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74 68 65  *.** Execute the
66e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c 3a 0a   following SQL:.
66f0: 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45 54 45  **.**     DELETE
6700: 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57 48 45   FROM %_data WHE
6710: 52 45 20 69 64 20 42 45 54 57 45 45 4e 20 24 69  RE id BETWEEN $i
6720: 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61 73 74  First AND $iLast
6730: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6740: 66 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 46  fts5DataDelete(F
6750: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
6760: 20 69 46 69 72 73 74 2c 20 69 36 34 20 69 4c 61   iFirst, i64 iLa
6770: 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  st){.  if( p->rc
6780: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6790: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
67a0: 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  pDeleter==0 ){. 
67b0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 46     int rc;.    F
67c0: 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
67d0: 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
67e0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  .    char *zSql 
67f0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6800: 66 28 0a 20 20 20 20 20 20 20 20 22 44 45 4c 45  f(.        "DELE
6810: 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71  TE FROM '%q'.'%q
6820: 5f 64 61 74 61 27 20 57 48 45 52 45 20 69 64 3e  _data' WHERE id>
6830: 3d 3f 20 41 4e 44 20 69 64 3c 3d 3f 22 2c 20 0a  =? AND id<=?", .
6840: 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69            pConfi
6850: 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d  g->zDb, pConfig-
6860: 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 3b 0a 20 20  >zName.    );.  
6870: 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b    if( zSql==0 ){
6880: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
6890: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
68a0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
68b0: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
68c0: 76 32 28 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20  v2(pConfig->db, 
68d0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 2d 3e 70 44  zSql, -1, &p->pD
68e0: 65 6c 65 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  eleter, 0);.    
68f0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
6900: 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
6910: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6920: 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  K ){.      p->rc
6930: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 72 65 74   = rc;.      ret
6940: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  urn;.    }.  }..
6950: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
6960: 6e 74 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72  nt64(p->pDeleter
6970: 2c 20 31 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  , 1, iFirst);.  
6980: 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
6990: 36 34 28 70 2d 3e 70 44 65 6c 65 74 65 72 2c 20  64(p->pDeleter, 
69a0: 32 2c 20 69 4c 61 73 74 29 3b 0a 20 20 73 71 6c  2, iLast);.  sql
69b0: 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 44 65  ite3_step(p->pDe
69c0: 6c 65 74 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20  leter);.  p->rc 
69d0: 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
69e0: 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 7d 0a  p->pDeleter);.}.
69f0: 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6c  ./*.** Remove al
6a00: 6c 20 72 65 63 6f 72 64 73 20 61 73 73 6f 63 69  l records associ
6a10: 61 74 65 64 20 77 69 74 68 20 73 65 67 6d 65 6e  ated with segmen
6a20: 74 20 69 53 65 67 69 64 2e 0a 2a 2f 0a 73 74 61  t iSegid..*/.sta
6a30: 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74  tic void fts5Dat
6a40: 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74 28 46  aRemoveSegment(F
6a50: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74  ts5Index *p, int
6a60: 20 69 53 65 67 69 64 29 7b 0a 20 20 69 36 34 20   iSegid){.  i64 
6a70: 69 46 69 72 73 74 20 3d 20 46 54 53 35 5f 53 45  iFirst = FTS5_SE
6a80: 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 53 65 67  GMENT_ROWID(iSeg
6a90: 69 64 2c 20 30 29 3b 0a 20 20 69 36 34 20 69 4c  id, 0);.  i64 iL
6aa0: 61 73 74 20 3d 20 46 54 53 35 5f 53 45 47 4d 45  ast = FTS5_SEGME
6ab0: 4e 54 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2b  NT_ROWID(iSegid+
6ac0: 31 2c 20 30 29 2d 31 3b 0a 20 20 66 74 73 35 44  1, 0)-1;.  fts5D
6ad0: 61 74 61 44 65 6c 65 74 65 28 70 2c 20 69 46 69  ataDelete(p, iFi
6ae0: 72 73 74 2c 20 69 4c 61 73 74 29 3b 0a 20 20 69  rst, iLast);.  i
6af0: 66 28 20 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  f( p->pIdxDelete
6b00: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35  r==0 ){.    Fts5
6b10: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
6b20: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
6b30: 20 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61    fts5IndexPrepa
6b40: 72 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49  reStmt(p, &p->pI
6b50: 64 78 44 65 6c 65 74 65 72 2c 20 73 71 6c 69 74  dxDeleter, sqlit
6b60: 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
6b70: 20 20 20 20 20 20 22 44 45 4c 45 54 45 20 46 52        "DELETE FR
6b80: 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27  OM '%q'.'%q_idx'
6b90: 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 22 2c   WHERE segid=?",
6ba0: 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
6bb0: 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
6bc0: 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
6bd0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d    }.  if( p->rc=
6be0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6bf0: 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
6c00: 6e 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65  nt(p->pIdxDelete
6c10: 72 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20  r, 1, iSegid);. 
6c20: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28     sqlite3_step(
6c30: 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29 3b  p->pIdxDeleter);
6c40: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
6c50: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 49  ite3_reset(p->pI
6c60: 64 78 44 65 6c 65 74 65 72 29 3b 0a 20 20 7d 0a  dxDeleter);.  }.
6c70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
6c80: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
6c90: 61 6e 20 46 74 73 35 53 74 72 75 63 74 75 72 65  an Fts5Structure
6ca0: 20 6f 62 6a 65 63 74 20 72 65 74 75 72 6e 65 64   object returned
6cb0: 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 0a   by an earlier .
6cc0: 2a 2a 20 63 61 6c 6c 20 74 6f 20 66 74 73 35 53  ** call to fts5S
6cd0: 74 72 75 63 74 75 72 65 52 65 61 64 28 29 20 6f  tructureRead() o
6ce0: 72 20 66 74 73 35 53 74 72 75 63 74 75 72 65 44  r fts5StructureD
6cf0: 65 63 6f 64 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  ecode()..*/.stat
6d00: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6d10: 63 74 75 72 65 52 65 6c 65 61 73 65 28 46 74 73  ctureRelease(Fts
6d20: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
6d30: 75 63 74 29 7b 0a 20 20 69 66 28 20 70 53 74 72  uct){.  if( pStr
6d40: 75 63 74 20 26 26 20 30 3e 3d 28 2d 2d 70 53 74  uct && 0>=(--pSt
6d50: 72 75 63 74 2d 3e 6e 52 65 66 29 20 29 7b 0a 20  ruct->nRef) ){. 
6d60: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
6d70: 73 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e  sert( pStruct->n
6d80: 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 66 6f  Ref==0 );.    fo
6d90: 72 28 69 3d 30 3b 20 69 3c 70 53 74 72 75 63 74  r(i=0; i<pStruct
6da0: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b 2b 29 7b 0a  ->nLevel; i++){.
6db0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6dc0: 65 65 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  ee(pStruct->aLev
6dd0: 65 6c 5b 69 5d 2e 61 53 65 67 29 3b 0a 20 20 20  el[i].aSeg);.   
6de0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
6df0: 72 65 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ree(pStruct);.  
6e00: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
6e10: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
6e20: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20  f(Fts5Structure 
6e30: 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 70 53 74  *pStruct){.  pSt
6e40: 72 75 63 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a  ruct->nRef++;.}.
6e50: 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
6e60: 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  ze and return th
6e70: 65 20 73 74 72 75 63 74 75 72 65 20 72 65 63 6f  e structure reco
6e80: 72 64 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  rd currently sto
6e90: 72 65 64 20 69 6e 20 73 65 72 69 61 6c 69 7a 65  red in serialize
6ea0: 64 0a 2a 2a 20 66 6f 72 6d 20 77 69 74 68 69 6e  d.** form within
6eb0: 20 62 75 66 66 65 72 20 70 44 61 74 61 2f 6e 44   buffer pData/nD
6ec0: 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46  ata..**.** The F
6ed0: 74 73 35 53 74 72 75 63 74 75 72 65 2e 61 4c 65  ts5Structure.aLe
6ee0: 76 65 6c 5b 5d 20 61 6e 64 20 65 61 63 68 20 46  vel[] and each F
6ef0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
6f00: 6c 2e 61 53 65 67 5b 5d 20 61 72 72 61 79 0a 2a  l.aSeg[] array.*
6f10: 2a 20 61 72 65 20 6f 76 65 72 2d 61 6c 6c 6f 63  * are over-alloc
6f20: 61 74 65 64 20 62 79 20 6f 6e 65 20 73 6c 6f 74  ated by one slot
6f30: 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68  . This allows th
6f40: 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
6f50: 65 6e 74 73 0a 2a 2a 20 74 6f 20 62 65 20 6d 6f  ents.** to be mo
6f60: 72 65 20 65 61 73 69 6c 79 20 65 64 69 74 65 64  re easily edited
6f70: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
6f80: 72 6f 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4f  ror occurs, *ppO
6f90: 75 74 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ut is set to NUL
6fa0: 4c 20 61 6e 64 20 61 6e 20 53 51 4c 69 74 65 20  L and an SQLite 
6fb0: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 72 65  error code.** re
6fc0: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
6fd0: 65 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  e, *ppOut is set
6fe0: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
6ff0: 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 0a   new object and.
7000: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
7010: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
7020: 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74 75   int fts5Structu
7030: 72 65 44 65 63 6f 64 65 28 0a 20 20 63 6f 6e 73  reDecode(.  cons
7040: 74 20 75 38 20 2a 70 44 61 74 61 2c 20 20 20 20  t u8 *pData,    
7050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
7060: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
7070: 20 73 65 72 69 61 6c 69 7a 65 64 20 73 74 72 75   serialized stru
7080: 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  cture */.  int n
7090: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 20  Data,           
70a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
70b0: 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 44 61  ze of buffer pDa
70c0: 74 61 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  ta in bytes */. 
70d0: 20 69 6e 74 20 2a 70 69 43 6f 6f 6b 69 65 2c 20   int *piCookie, 
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70f0: 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
7100: 6e 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a  n cookie value *
7110: 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
7120: 65 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20  e **ppOut       
7130: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 65 73 65      /* OUT: Dese
7140: 72 69 61 6c 69 7a 65 64 20 6f 62 6a 65 63 74 20  rialized object 
7150: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
7160: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
7170: 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  t i = 0;.  int i
7180: 4c 76 6c 3b 0a 20 20 69 6e 74 20 6e 4c 65 76 65  Lvl;.  int nLeve
7190: 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 65  l = 0;.  int nSe
71a0: 67 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74  gment = 0;.  int
71b0: 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
71d0: 42 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74  Bytes of space t
71e0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 74 20 70 52  o allocate at pR
71f0: 65 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  et */.  Fts5Stru
7200: 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30 3b  cture *pRet = 0;
7210: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 75 63          /* Struc
7220: 74 75 72 65 20 6f 62 6a 65 63 74 20 74 6f 20 72  ture object to r
7230: 65 74 75 72 6e 20 2a 2f 0a 0a 20 20 2f 2a 20 47  eturn */..  /* G
7240: 72 61 62 20 74 68 65 20 63 6f 6f 6b 69 65 20 76  rab the cookie v
7250: 61 6c 75 65 20 2a 2f 0a 20 20 69 66 28 20 70 69  alue */.  if( pi
7260: 43 6f 6f 6b 69 65 20 29 20 2a 70 69 43 6f 6f 6b  Cookie ) *piCook
7270: 69 65 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  ie = sqlite3Fts5
7280: 47 65 74 33 32 28 70 44 61 74 61 29 3b 0a 20 20  Get32(pData);.  
7290: 69 20 3d 20 34 3b 0a 0a 20 20 2f 2a 20 52 65 61  i = 4;..  /* Rea
72a0: 64 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  d the total numb
72b0: 65 72 20 6f 66 20 6c 65 76 65 6c 73 20 61 6e 64  er of levels and
72c0: 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
72d0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 0a  he start of the.
72e0: 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 72    ** structure r
72f0: 65 63 6f 72 64 2e 20 20 2a 2f 0a 20 20 69 20 2b  ecord.  */.  i +
7300: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
7310: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 4c 65  2(&pData[i], nLe
7320: 76 65 6c 29 3b 0a 20 20 69 20 2b 3d 20 66 74 73  vel);.  i += fts
7330: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44  5GetVarint32(&pD
7340: 61 74 61 5b 69 5d 2c 20 6e 53 65 67 6d 65 6e 74  ata[i], nSegment
7350: 29 3b 0a 20 20 6e 42 79 74 65 20 3d 20 28 0a 20  );.  nByte = (. 
7360: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
7370: 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20  Structure) +    
7380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7390: 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72  /* Main structur
73a0: 65 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  e */.      sizeo
73b0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
73c0: 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2d  evel) * (nLevel-
73d0: 31 29 20 20 20 20 2f 2a 20 61 4c 65 76 65 6c 5b  1)    /* aLevel[
73e0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 29 3b 0a  ] array */.  );.
73f0: 20 20 70 52 65 74 20 3d 20 28 46 74 73 35 53 74    pRet = (Fts5St
7400: 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33  ructure*)sqlite3
7410: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
7420: 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20 69  rc, nByte);..  i
7430: 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 70  f( pRet ){.    p
7440: 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  Ret->nRef = 1;. 
7450: 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76 65 6c 20     pRet->nLevel 
7460: 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 70 52  = nLevel;.    pR
7470: 65 74 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 6e  et->nSegment = n
7480: 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 69 20 2b  Segment;.    i +
7490: 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
74a0: 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b 69 5d  Varint(&pData[i]
74b0: 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69 74 65 43  , &pRet->nWriteC
74c0: 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 66 6f  ounter);..    fo
74d0: 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d 3d 53 51  r(iLvl=0; rc==SQ
74e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 76 6c 3c  LITE_OK && iLvl<
74f0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
7500: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
7510: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
7520: 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76 65 6c 5b  = &pRet->aLevel[
7530: 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 6e 74  iLvl];.      int
7540: 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20 20 20 69   nTotal;.      i
7550: 6e 74 20 69 53 65 67 3b 0a 0a 20 20 20 20 20 20  nt iSeg;..      
7560: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
7570: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
7580: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
7590: 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65       i += fts5Ge
75a0: 74 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61  tVarint32(&pData
75b0: 5b 69 5d 2c 20 6e 54 6f 74 61 6c 29 3b 0a 20 20  [i], nTotal);.  
75c0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 6f 74      assert( nTot
75d0: 61 6c 3e 3d 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  al>=pLvl->nMerge
75e0: 20 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e   );.      pLvl->
75f0: 61 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75  aSeg = (Fts5Stru
7600: 63 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71  ctureSegment*)sq
7610: 6c 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a  lite3Fts5MallocZ
7620: 65 72 6f 28 26 72 63 2c 20 0a 20 20 20 20 20 20  ero(&rc, .      
7630: 20 20 20 20 6e 54 6f 74 61 6c 20 2a 20 73 69 7a      nTotal * siz
7640: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
7650: 65 53 65 67 6d 65 6e 74 29 0a 20 20 20 20 20 20  eSegment).      
7660: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63  );..      if( rc
7670: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7680: 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65         pLvl->nSe
7690: 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20 20  g = nTotal;.    
76a0: 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
76b0: 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69 53 65  iSeg<nTotal; iSe
76c0: 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g++){.          
76d0: 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  i += fts5GetVari
76e0: 6e 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20  nt32(&pData[i], 
76f0: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7700: 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20  .iSegid);.      
7710: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
7720: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7730: 69 5d 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  i], pLvl->aSeg[i
7740: 53 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b  Seg].pgnoFirst);
7750: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20  .          i += 
7760: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
7770: 26 70 44 61 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d  &pData[i], pLvl-
7780: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e 6f  >aSeg[iSeg].pgno
7790: 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  Last);.        }
77a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
77b0: 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
77c0: 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74 29  ureRelease(pRet)
77d0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
77e0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
77f0: 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75 74 20  }.  }..  *ppOut 
7800: 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75 72 6e  = pRet;.  return
7810: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f   rc;.}../*.**.*/
7820: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
7830: 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65 76  5StructureAddLev
7840: 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  el(int *pRc, Fts
7850: 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
7860: 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20 2a 70  truct){.  if( *p
7870: 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
7880: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7890: 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
78a0: 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69 6e 74  pStruct;.    int
78b0: 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63   nLevel = pStruc
78c0: 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20 20 69  t->nLevel;.    i
78d0: 6e 74 20 6e 42 79 74 65 20 3d 20 28 0a 20 20 20  nt nByte = (.   
78e0: 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
78f0: 53 74 72 75 63 74 75 72 65 29 20 2b 20 20 20 20  Structure) +    
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7910: 20 4d 61 69 6e 20 73 74 72 75 63 74 75 72 65 20   Main structure 
7920: 2a 2f 0a 20 20 20 20 20 20 20 20 73 69 7a 65 6f  */.        sizeo
7930: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7940: 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76 65 6c 2b  evel) * (nLevel+
7950: 31 29 20 20 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20  1)  /* aLevel[] 
7960: 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 29 3b 0a  array */.    );.
7970: 0a 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 73  .    pStruct = s
7980: 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70  qlite3_realloc(p
7990: 53 74 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a  Struct, nByte);.
79a0: 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20      if( pStruct 
79b0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
79c0: 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
79d0: 5b 6e 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a  [nLevel], 0, siz
79e0: 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
79f0: 65 4c 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20  eLevel));.      
7a00: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
7a10: 2b 3b 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75  +;.      *ppStru
7a20: 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20  ct = pStruct;.  
7a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
7a40: 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
7a50: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  EM;.    }.  }.}.
7a60: 0a 2f 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65  ./*.** Extend le
7a70: 76 65 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74  vel iLvl so that
7a80: 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66   there is room f
7a90: 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74  or at least nExt
7aa0: 72 61 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65  ra more.** segme
7ab0: 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
7ac0: 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75 72  oid fts5Structur
7ad0: 65 45 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20  eExtendLevel(.  
7ae0: 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73  int *pRc, .  Fts
7af0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
7b00: 75 63 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c  uct, .  int iLvl
7b10: 2c 20 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  , .  int nExtra,
7b20: 20 0a 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a   .  int bInsert.
7b30: 29 7b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  ){.  if( *pRc==S
7b40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7b50: 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
7b60: 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72  el *pLvl = &pStr
7b70: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
7b80: 5d 3b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ];.    Fts5Struc
7b90: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65  tureSegment *aNe
7ba0: 77 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  w;.    int nByte
7bb0: 3b 0a 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ;..    nByte = (
7bc0: 70 4c 76 6c 2d 3e 6e 53 65 67 20 2b 20 6e 45 78  pLvl->nSeg + nEx
7bd0: 74 72 61 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  tra) * sizeof(Ft
7be0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7bf0: 6e 74 29 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20  nt);.    aNew = 
7c00: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
7c10: 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 6e 42 79 74  pLvl->aSeg, nByt
7c20: 65 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77  e);.    if( aNew
7c30: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 62 49   ){.      if( bI
7c40: 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nsert==0 ){.    
7c50: 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e 65 77      memset(&aNew
7c60: 5b 70 4c 76 6c 2d 3e 6e 53 65 67 5d 2c 20 30 2c  [pLvl->nSeg], 0,
7c70: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7c80: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 20 2a 20  ctureSegment) * 
7c90: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
7ca0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
7cb0: 74 20 6e 4d 6f 76 65 20 3d 20 70 4c 76 6c 2d 3e  t nMove = pLvl->
7cc0: 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28 46 74  nSeg * sizeof(Ft
7cd0: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
7ce0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  nt);.        mem
7cf0: 6d 6f 76 65 28 26 61 4e 65 77 5b 6e 45 78 74 72  move(&aNew[nExtr
7d00: 61 5d 2c 20 61 4e 65 77 2c 20 6e 4d 6f 76 65 29  a], aNew, nMove)
7d10: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
7d20: 28 61 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66  (aNew, 0, sizeof
7d30: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65  (Fts5StructureSe
7d40: 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61 29  gment) * nExtra)
7d50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7d60: 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 61 4e 65  pLvl->aSeg = aNe
7d70: 77 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  w;.    }else{.  
7d80: 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
7d90: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
7da0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
7db0: 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20 61 6e  , deserialize an
7dc0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  d return the str
7dd0: 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a  ucture record..*
7de0: 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53 74 72  *.** The Fts5Str
7df0: 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20  ucture.aLevel[] 
7e00: 61 6e 64 20 65 61 63 68 20 46 74 73 35 53 74 72  and each Fts5Str
7e10: 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53 65 67  uctureLevel.aSeg
7e20: 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
7e30: 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64 20 61  over-allocated a
7e40: 73 20 64 65 73 63 72 69 62 65 64 20 66 6f 72 20  s described for 
7e50: 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53 74 72  function fts5Str
7e60: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 20 0a  uctureDecode() .
7e70: 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20  ** above..**.** 
7e80: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
7e90: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
7ea0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
7eb0: 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e 20 74  r code left in t
7ec0: 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 20  he.** Fts5Index 
7ed0: 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20 65 72  handle. If an er
7ee0: 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ror has already 
7ef0: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
7f00: 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69  is function.** i
7f10: 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
7f20: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
7f30: 69 63 20 46 74 73 35 53 74 72 75 63 74 75 72 65  ic Fts5Structure
7f40: 20 2a 66 74 73 35 53 74 72 75 63 74 75 72 65 52   *fts5StructureR
7f50: 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ead(Fts5Index *p
7f60: 29 7b 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20  ){.  Fts5Config 
7f70: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
7f80: 6f 6e 66 69 67 3b 0a 20 20 46 74 73 35 53 74 72  onfig;.  Fts5Str
7f90: 75 63 74 75 72 65 20 2a 70 52 65 74 20 3d 20 30  ucture *pRet = 0
7fa0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 6a 65  ;        /* Obje
7fb0: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7fc0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
7fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fe0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
7ff0: 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46  on cookie */.  F
8000: 74 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a  ts5Data *pData;.
8010: 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
8020: 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
8030: 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29  STRUCTURE_ROWID)
8040: 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20  ;.  if( p->rc ) 
8050: 72 65 74 75 72 6e 20 30 3b 0a 20 20 2f 2a 20 54  return 0;.  /* T
8060: 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65 64 20  ODO: Do we need 
8070: 74 68 69 73 20 69 66 20 74 68 65 20 6c 65 61 66  this if the leaf
8080: 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65 6e 64  -index is append
8090: 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e 2e 20  ed? Probably... 
80a0: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 70 44 61  */.  memset(&pDa
80b0: 74 61 2d 3e 70 5b 70 44 61 74 61 2d 3e 6e 6e 5d  ta->p[pData->nn]
80c0: 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f 50  , 0, FTS5_DATA_P
80d0: 41 44 44 49 4e 47 29 3b 0a 20 20 70 2d 3e 72 63  ADDING);.  p->rc
80e0: 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
80f0: 44 65 63 6f 64 65 28 70 44 61 74 61 2d 3e 70 2c  Decode(pData->p,
8100: 20 70 44 61 74 61 2d 3e 6e 6e 2c 20 26 69 43 6f   pData->nn, &iCo
8110: 6f 6b 69 65 2c 20 26 70 52 65 74 29 3b 0a 20 20  okie, &pRet);.  
8120: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
8130: 45 5f 4f 4b 20 26 26 20 70 43 6f 6e 66 69 67 2d  E_OK && pConfig-
8140: 3e 69 43 6f 6f 6b 69 65 21 3d 69 43 6f 6f 6b 69  >iCookie!=iCooki
8150: 65 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  e ){.    p->rc =
8160: 20 73 71 6c 69 74 65 33 46 74 73 35 43 6f 6e 66   sqlite3Fts5Conf
8170: 69 67 4c 6f 61 64 28 70 43 6f 6e 66 69 67 2c 20  igLoad(pConfig, 
8180: 69 43 6f 6f 6b 69 65 29 3b 0a 20 20 7d 0a 0a 20  iCookie);.  }.. 
8190: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
81a0: 28 70 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70  (pData);.  if( p
81b0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
81c0: 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  ){.    fts5Struc
81d0: 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65 74  tureRelease(pRet
81e0: 29 3b 0a 20 20 20 20 70 52 65 74 20 3d 20 30 3b  );.    pRet = 0;
81f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 52  .  }.  return pR
8200: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  et;.}../*.** Ret
8210: 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
8220: 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73  mber of segments
8230: 20 69 6e 20 69 6e 64 65 78 20 73 74 72 75 63 74   in index struct
8240: 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68 69  ure pStruct. Thi
8250: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
8260: 20 6f 6e 6c 79 20 65 76 65 72 20 75 73 65 64 20   only ever used 
8270: 61 73 20 70 61 72 74 20 6f 66 20 61 73 73 65 72  as part of asser
8280: 74 28 29 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  t() conditions..
8290: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
82a0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
82b0: 74 20 66 74 73 35 53 74 72 75 63 74 75 72 65 43  t fts5StructureC
82c0: 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 46 74 73  ountSegments(Fts
82d0: 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
82e0: 75 63 74 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67  uct){.  int nSeg
82f0: 6d 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20  ment = 0;       
8300: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
8310: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65   number of segme
8320: 6e 74 73 20 2a 2f 0a 20 20 69 66 28 20 70 53 74  nts */.  if( pSt
8330: 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
8340: 69 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20  iLvl;           
8350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
8360: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
8370: 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20  ough levels */. 
8380: 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69     for(iLvl=0; i
8390: 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  Lvl<pStruct->nLe
83a0: 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20  vel; iLvl++){.  
83b0: 20 20 20 20 6e 53 65 67 6d 65 6e 74 20 2b 3d 20      nSegment += 
83c0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
83d0: 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a 20 20 20 20  iLvl].nSeg;.    
83e0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
83f0: 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a 23 65 6e 64  nSegment;.}.#end
8400: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 72 69 61 6c  if../*.** Serial
8410: 69 7a 65 20 61 6e 64 20 73 74 6f 72 65 20 74 68  ize and store th
8420: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
8430: 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  cord..**.** If a
8440: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
8450: 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 63  leave an error c
8460: 6f 64 65 20 69 6e 20 74 68 65 20 46 74 73 35 49  ode in the Fts5I
8470: 6e 64 65 78 20 6f 62 6a 65 63 74 2e 20 49 66 20  ndex object. If 
8480: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 68 61 73 20  an.** error has 
8490: 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
84a0: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
84b0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
84c0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
84d0: 74 72 75 63 74 75 72 65 57 72 69 74 65 28 46 74  tructureWrite(Ft
84e0: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
84f0: 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
8500: 63 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ct){.  if( p->rc
8510: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8520: 20 20 20 46 74 73 35 42 75 66 66 65 72 20 62 75     Fts5Buffer bu
8530: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
8540: 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 73 65   /* Buffer to se
8550: 72 69 61 6c 69 7a 65 20 72 65 63 6f 72 64 20 69  rialize record i
8560: 6e 74 6f 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nto */.    int i
8570: 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
8580: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
8590: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
85a0: 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a 20 20  ugh levels */.  
85b0: 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20    int iCookie;  
85c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85d0: 2f 2a 20 43 6f 6f 6b 69 65 20 76 61 6c 75 65 20  /* Cookie value 
85e0: 74 6f 20 73 74 6f 72 65 20 2a 2f 0a 0a 20 20 20  to store */..   
85f0: 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
8600: 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
8610: 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
8620: 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
8630: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 62  );.    memset(&b
8640: 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
8650: 73 35 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20  s5Buffer));..   
8660: 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 63   /* Append the c
8670: 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 75 72 61  urrent configura
8680: 74 69 6f 6e 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20  tion cookie */. 
8690: 20 20 20 69 43 6f 6f 6b 69 65 20 3d 20 70 2d 3e     iCookie = p->
86a0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
86b0: 3b 0a 20 20 20 20 69 66 28 20 69 43 6f 6f 6b 69  ;.    if( iCooki
86c0: 65 3c 30 20 29 20 69 43 6f 6f 6b 69 65 20 3d 20  e<0 ) iCookie = 
86d0: 30 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  0;.    fts5Buffe
86e0: 72 41 70 70 65 6e 64 33 32 28 26 70 2d 3e 72 63  rAppend32(&p->rc
86f0: 2c 20 26 62 75 66 2c 20 69 43 6f 6f 6b 69 65 29  , &buf, iCookie)
8700: 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ;..    fts5Buffe
8710: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8720: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 74 72  ->rc, &buf, pStr
8730: 75 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20  uct->nLevel);.  
8740: 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
8750: 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
8760: 20 26 62 75 66 2c 20 70 53 74 72 75 63 74 2d 3e   &buf, pStruct->
8770: 6e 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 66  nSegment);.    f
8780: 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
8790: 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62  arint(&p->rc, &b
87a0: 75 66 2c 20 28 69 36 34 29 70 53 74 72 75 63 74  uf, (i64)pStruct
87b0: 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 29  ->nWriteCounter)
87c0: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  ;..    for(iLvl=
87d0: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
87e0: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
87f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67  {.      int iSeg
8800: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8810: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
8820: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
8830: 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
8840: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
8850: 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
8860: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
8870: 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  Lvl];.      fts5
8880: 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
8890: 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
88a0: 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a   pLvl->nMerge);.
88b0: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
88c0: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
88d0: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
88e0: 3e 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73  >nSeg);.      as
88f0: 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72  sert( pLvl->nMer
8900: 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29  ge<=pLvl->nSeg )
8910: 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65  ;..      for(iSe
8920: 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e  g=0; iSeg<pLvl->
8930: 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20  nSeg; iSeg++){. 
8940: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
8950: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
8960: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
8970: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65  ->aSeg[iSeg].iSe
8980: 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  gid);.        ft
8990: 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
89a0: 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rint(&p->rc, &bu
89b0: 66 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  f, pLvl->aSeg[iS
89c0: 65 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a  eg].pgnoFirst);.
89d0: 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
89e0: 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
89f0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76  p->rc, &buf, pLv
8a00: 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67  l->aSeg[iSeg].pg
8a10: 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d  noLast);.      }
8a20: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
8a30: 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
8a40: 35 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49  5_STRUCTURE_ROWI
8a50: 44 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29  D, buf.p, buf.n)
8a60: 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ;.    fts5Buffer
8a70: 46 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a  Free(&buf);.  }.
8a80: 7d 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20  }..#if 0.static 
8a90: 76 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74  void fts5DebugSt
8aa0: 72 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73  ructure(int*,Fts
8ab0: 35 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72  5Buffer*,Fts5Str
8ac0: 75 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63  ucture*);.static
8ad0: 20 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53   void fts5PrintS
8ae0: 74 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63  tructure(const c
8af0: 68 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46  har *zCaption, F
8b00: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
8b10: 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63  truct){.  int rc
8b20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8b30: 46 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a  Fts5Buffer buf;.
8b40: 20 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30    memset(&buf, 0
8b50: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a  , sizeof(buf));.
8b60: 20 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63    fts5DebugStruc
8b70: 74 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20  ture(&rc, &buf, 
8b80: 70 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69  pStruct);.  fpri
8b90: 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a  ntf(stdout, "%s:
8ba0: 20 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e   %s\n", zCaption
8bb0: 2c 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75  , buf.p);.  fflu
8bc0: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74  sh(stdout);.  ft
8bd0: 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
8be0: 66 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  f);.}.#else.# de
8bf0: 66 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74  fine fts5PrintSt
8c00: 72 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e  ructure(x,y).#en
8c10: 64 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  dif..static int 
8c20: 66 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28  fts5SegmentSize(
8c30: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
8c40: 6d 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72  ment *pSeg){.  r
8c50: 65 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e  eturn 1 + pSeg->
8c60: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
8c70: 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f  >pgnoFirst;.}../
8c80: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f  *.** Return a co
8c90: 70 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75  py of index stru
8ca0: 63 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45  cture pStruct. E
8cb0: 78 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61  xcept, promote a
8cc0: 73 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65  s many .** segme
8cd0: 6e 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20  nts as possible 
8ce0: 74 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74  to level iPromot
8cf0: 65 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63  e. If an OOM occ
8d00: 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a  urs, NULL is .**
8d10: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
8d20: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74  atic void fts5St
8d30: 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f  ructurePromoteTo
8d40: 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
8d50: 2c 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65  ,.  int iPromote
8d60: 2c 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74  ,.  int szPromot
8d70: 65 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  e,.  Fts5Structu
8d80: 72 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20  re *pStruct.){. 
8d90: 20 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46   int il, is;.  F
8da0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
8db0: 6c 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75  l *pOut = &pStru
8dc0: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d  ct->aLevel[iProm
8dd0: 6f 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75  ote];..  if( pOu
8de0: 74 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  t->nMerge==0 ){.
8df0: 20 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d      for(il=iProm
8e00: 6f 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63  ote+1; il<pStruc
8e10: 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29  t->nLevel; il++)
8e20: 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  {.      Fts5Stru
8e30: 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
8e40: 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65   = &pStruct->aLe
8e50: 76 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69  vel[il];.      i
8e60: 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20  f( pLvl->nMerge 
8e70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ) return;.      
8e80: 66 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65  for(is=pLvl->nSe
8e90: 67 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d  g-1; is>=0; is--
8ea0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73  ){.        int s
8eb0: 7a 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53  z = fts5SegmentS
8ec0: 69 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  ize(&pLvl->aSeg[
8ed0: 69 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  is]);.        if
8ee0: 28 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29  ( sz>szPromote )
8ef0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
8f00: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
8f10: 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
8f20: 2c 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d  , pStruct, iProm
8f30: 6f 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20  ote, 1, 1);.    
8f40: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
8f50: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
8f60: 6d 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65  memcpy(pOut->aSe
8f70: 67 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  g, &pLvl->aSeg[i
8f80: 73 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53  s], sizeof(Fts5S
8f90: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8fa0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d  );.        pOut-
8fb0: 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20  >nSeg++;.       
8fc0: 20 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20   pLvl->nSeg--;. 
8fd0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
8fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20  .}../*.** A new 
8ff0: 73 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74  segment has just
9000: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
9010: 20 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69   level iLvl of i
9020: 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a  ndex structure.*
9030: 2a 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20  * pStruct. This 
9040: 66 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69  function determi
9050: 6e 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65  nes if any segme
9060: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72  nts should be pr
9070: 6f 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72  omoted.** as a r
9080: 65 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20  esult. Segments 
9090: 61 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20  are promoted in 
90a0: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a  two scenarios:.*
90b0: 2a 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65  *.**   a) If the
90c0: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
90d0: 69 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72  itten is smaller
90e0: 20 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72   than one or mor
90f0: 65 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20  e segments.**   
9100: 20 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72     within the pr
9110: 65 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64  evious populated
9120: 20 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72   level, it is pr
9130: 6f 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72  omoted to the pr
9140: 65 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70  evious.**      p
9150: 6f 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a  opulated level..
9160: 2a 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68  **.**   b) If th
9170: 65 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77  e segment just w
9180: 72 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72  ritten is larger
9190: 20 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74   than the newest
91a0: 20 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20   segment on.**  
91b0: 20 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70      the next pop
91c0: 75 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68  ulated level, th
91d0: 65 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c  en that segment,
91e0: 20 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61   and any other a
91f0: 64 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20  djacent.**      
9200: 73 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72  segments that ar
9210: 65 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74  e also smaller t
9220: 68 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74  han the one just
9230: 20 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a   written, are .*
9240: 2a 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e  *      promoted.
9250: 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f   .**.** If one o
9260: 72 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20  r more segments 
9270: 61 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68  are promoted, th
9280: 65 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65  e structure obje
9290: 63 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a  ct is updated.**
92a0: 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73   to reflect this
92b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
92c0: 20 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72   fts5StructurePr
92d0: 6f 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64  omote(.  Fts5Ind
92e0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
92f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
9300: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
9310: 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
9320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9330: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65       /* Index le
9340: 76 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64  vel just updated
9350: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
9360: 75 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20  ure *pStruct    
9370: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73        /* Index s
9380: 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20  tructure */.){. 
9390: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
93a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
93b0: 20 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69   iTst;.    int i
93c0: 50 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20  Promote = -1;.  
93d0: 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20    int szPromote 
93e0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
93f0: 2f 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68  /* Promote anyth
9400: 69 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72  ing this size or
9410: 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20   smaller */.    
9420: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
9430: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a  ment *pSeg;   /*
9440: 20 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   Segment just wr
9450: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74  itten */.    int
9460: 20 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20   szSeg;         
9470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9480: 7a 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75  ze of segment ju
9490: 73 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20  st written */.  
94a0: 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74    int nSeg = pSt
94b0: 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
94c0: 6c 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66  l].nSeg;..    if
94d0: 28 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75  ( nSeg==0 ) retu
94e0: 72 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26  rn;.    pSeg = &
94f0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9500: 69 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75  iLvl].aSeg[pStru
9510: 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
9520: 2e 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a  .nSeg-1];.    sz
9530: 53 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d  Seg = (1 + pSeg-
9540: 3e 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67  >pgnoLast - pSeg
9550: 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20  ->pgnoFirst);.. 
9560: 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
9570: 63 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f  condition (a) */
9580: 0a 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c  .    for(iTst=iL
9590: 76 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26  vl-1; iTst>=0 &&
95a0: 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
95b0: 5b 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20  [iTst].nSeg==0; 
95c0: 69 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28  iTst--);.    if(
95d0: 20 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20   iTst>=0 ){.    
95e0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
95f0: 6e 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20  nt szMax = 0;.  
9600: 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
9610: 65 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26  eLevel *pTst = &
9620: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
9630: 69 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73  iTst];.      ass
9640: 65 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67  ert( pTst->nMerg
9650: 65 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f  e==0 );.      fo
9660: 72 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e  r(i=0; i<pTst->n
9670: 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Seg; i++){.     
9680: 20 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74     int sz = pTst
9690: 2d 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61  ->aSeg[i].pgnoLa
96a0: 73 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b  st - pTst->aSeg[
96b0: 69 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31  i].pgnoFirst + 1
96c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  ;.        if( sz
96d0: 3e 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d  >szMax ) szMax =
96e0: 20 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   sz;.      }.   
96f0: 20 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a     if( szMax>=sz
9700: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Seg ){.        /
9710: 2a 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20  * Condition (a) 
9720: 69 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65  is true. Promote
9730: 20 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d   the newest segm
9740: 65 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20  ent on level .  
9750: 20 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f        ** iLvl to
9760: 20 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f   level iTst.  */
9770: 0a 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74  .        iPromot
9780: 65 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20  e = iTst;.      
9790: 20 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a    szPromote = sz
97a0: 4d 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Max;.      }.   
97b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f   }..    /* If co
97c0: 6e 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e  ndition (a) is n
97d0: 6f 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28  ot met, assume (
97e0: 62 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75  b) is true. Stru
97f0: 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29  cturePromoteTo()
9800: 0a 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d  .    ** is a no-
9810: 6f 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e  op if it is not.
9820: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72    */.    if( iPr
9830: 6f 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20  omote<0 ){.     
9840: 20 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c   iPromote = iLvl
9850: 3b 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74  ;.      szPromot
9860: 65 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d  e = szSeg;.    }
9870: 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75  .    fts5Structu
9880: 72 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69  rePromoteTo(p, i
9890: 50 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f  Promote, szPromo
98a0: 74 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  te, pStruct);.  
98b0: 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  }.}.../*.** Adva
98c0: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
98d0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
98e0: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66  nly argument. If
98f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
9900: 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  .** doclist-inde
9910: 78 20 70 61 67 65 20 69 73 20 72 65 61 63 68 65  x page is reache
9920: 64 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  d, return non-ze
9930: 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ro..*/.static in
9940: 74 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  t fts5DlidxLvlNe
9950: 78 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20  xt(Fts5DlidxLvl 
9960: 2a 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61  *pLvl){.  Fts5Da
9970: 74 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c  ta *pData = pLvl
9980: 2d 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20  ->pData;..  if( 
9990: 70 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b  pLvl->iOff==0 ){
99a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76  .    assert( pLv
99b0: 6c 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20  l->bEof==0 );.  
99c0: 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31    pLvl->iOff = 1
99d0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66  ;.    pLvl->iOff
99e0: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
99f0: 74 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d  t32(&pData->p[1]
9a00: 2c 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e  , pLvl->iLeafPgn
9a10: 6f 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f  o);.    pLvl->iO
9a20: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
9a30: 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c  int(&pData->p[pL
9a40: 76 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a  vl->iOff], (u64*
9a50: 29 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b  )&pLvl->iRowid);
9a60: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73  .    pLvl->iFirs
9a70: 74 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66  tOff = pLvl->iOf
9a80: 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  f;.  }else{.    
9a90: 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f  int iOff;.    fo
9aa0: 72 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66  r(iOff=pLvl->iOf
9ab0: 66 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e  f; iOff<pData->n
9ac0: 6e 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20  n; iOff++){.    
9ad0: 20 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69    if( pData->p[i
9ae0: 4f 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20  Off] ) break; . 
9af0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f     }..    if( iO
9b00: 66 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a  ff<pData->nn ){.
9b10: 20 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a        i64 iVal;.
9b20: 20 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61        pLvl->iLea
9b30: 66 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d  fPgno += (iOff -
9b40: 20 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31   pLvl->iOff) + 1
9b50: 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
9b60: 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
9b70: 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Data->p[iOff], (
9b80: 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20  u64*)&iVal);.   
9b90: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
9ba0: 2b 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70  += iVal;.      p
9bb0: 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66  Lvl->iOff = iOff
9bc0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9bd0: 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20     pLvl->bEof = 
9be0: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
9bf0: 72 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f  return pLvl->bEo
9c00: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61  f;.}../*.** Adva
9c10: 6e 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  nce the iterator
9c20: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f   passed as the o
9c30: 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
9c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
9c50: 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46  DlidxIterNextR(F
9c60: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
9c70: 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65  5DlidxIter *pIte
9c80: 72 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20  r, int iLvl){.  
9c90: 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c  Fts5DlidxLvl *pL
9ca0: 76 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76  vl = &pIter->aLv
9cb0: 6c 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65  l[iLvl];..  asse
9cc0: 72 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e  rt( iLvl<pIter->
9cd0: 6e 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74  nLvl );.  if( ft
9ce0: 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70  s5DlidxLvlNext(p
9cf0: 4c 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Lvl) ){.    if( 
9d00: 28 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72  (iLvl+1) < pIter
9d10: 2d 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20  ->nLvl ){.      
9d20: 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
9d30: 74 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76  tR(p, pIter, iLv
9d40: 6c 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l+1);.      if( 
9d50: 70 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20  pLvl[1].bEof==0 
9d60: 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  ){.        fts5D
9d70: 61 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d  ataRelease(pLvl-
9d80: 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20  >pData);.       
9d90: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
9da0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
9db0: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  xLvl));.        
9dc0: 70 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74  pLvl->pData = ft
9dd0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20  s5DataRead(p, . 
9de0: 20 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f             FTS5_
9df0: 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65  DLIDX_ROWID(pIte
9e00: 72 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c  r->iSegid, iLvl,
9e10: 20 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67   pLvl[1].iLeafPg
9e20: 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  no).        );. 
9e30: 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
9e40: 3e 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69  >pData ) fts5Dli
9e50: 64 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b  dxLvlNext(pLvl);
9e60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9e70: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74   }..  return pIt
9e80: 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66  er->aLvl[0].bEof
9e90: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
9ea0: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
9eb0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
9ec0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
9ed0: 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66  ter){.  return f
9ee0: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
9ef0: 52 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  R(p, pIter, 0);.
9f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65  }../*.** The ite
9f10: 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
9f20: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
9f30: 6e 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f  nt has the follo
9f40: 77 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a  wing fields set.
9f50: 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54  ** as follows. T
9f60: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74  his function set
9f70: 73 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66  s up the rest of
9f80: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f   the iterator so
9f90: 20 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e   that it.** poin
9fa0: 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ts to the first 
9fb0: 72 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63  rowid in the doc
9fc0: 6c 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a  list-index..**.*
9fd0: 2a 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20  *   pData:.**   
9fe0: 20 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63    pointer to doc
9ff0: 6c 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72  list-index recor
a000: 64 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  d, .**.** When t
a010: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
a020: 63 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c  called pIter->iL
a030: 65 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70  eafPgno is the p
a040: 61 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a  age number the.*
a050: 2a 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73  * doclist is ass
a060: 6f 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68  ociated with (th
a070: 65 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20  e one featuring 
a080: 74 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74  the term)..*/.st
a090: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
a0a0: 64 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35  dxIterFirst(Fts5
a0b0: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a0c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
a0d0: 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
a0e0: 6e 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nLvl; i++){.    
a0f0: 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74  fts5DlidxLvlNext
a100: 28 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d  (&pIter->aLvl[i]
a110: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
a120: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62  pIter->aLvl[0].b
a130: 45 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20  Eof;.}...static 
a140: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
a150: 72 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a  rEof(Fts5Index *
a160: 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  p, Fts5DlidxIter
a170: 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75   *pIter){.  retu
a180: 72 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45  rn p->rc!=SQLITE
a190: 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c  _OK || pIter->aL
a1a0: 76 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73  vl[0].bEof;.}..s
a1b0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
a1c0: 6c 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73  lidxIterLast(Fts
a1d0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44  5Index *p, Fts5D
a1e0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
a1f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  {.  int i;..  /*
a200: 20 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65   Advance each le
a210: 76 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20  vel to the last 
a220: 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73  entry on the las
a230: 74 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28  t page */.  for(
a240: 69 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b  i=pIter->nLvl-1;
a250: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
a260: 4b 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b  K && i>=0; i--){
a270: 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76  .    Fts5DlidxLv
a280: 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72  l *pLvl = &pIter
a290: 2d 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77  ->aLvl[i];.    w
a2a0: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
a2b0: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
a2c0: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  );.    pLvl->bEo
a2d0: 66 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  f = 0;..    if( 
a2e0: 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  i>0 ){.      Fts
a2f0: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c  5DlidxLvl *pChil
a300: 64 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20  d = &pLvl[-1];. 
a310: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
a320: 65 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61  ease(pChild->pDa
a330: 74 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65  ta);.      memse
a340: 74 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a  t(pChild, 0, siz
a350: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
a360: 29 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64  ));.      pChild
a370: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
a380: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
a390: 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f       FTS5_DLIDX_
a3a0: 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65  ROWID(pIter->iSe
a3b0: 67 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e  gid, i-1, pLvl->
a3c0: 69 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20  iLeafPgno).     
a3d0: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a   );.    }.  }.}.
a3e0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
a3f0: 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
a400: 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
a410: 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76  ment to the prev
a420: 69 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ious entry..*/.s
a430: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c  tatic int fts5Dl
a440: 69 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44  idxLvlPrev(Fts5D
a450: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a  lidxLvl *pLvl){.
a460: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76    int iOff = pLv
a470: 6c 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  l->iOff;..  asse
a480: 72 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d  rt( pLvl->bEof==
a490: 30 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c  0 );.  if( iOff<
a4a0: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
a4b0: 20 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45   ){.    pLvl->bE
a4c0: 6f 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  of = 1;.  }else{
a4d0: 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76  .    u8 *a = pLv
a4e0: 6c 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20  l->pData->p;.   
a4f0: 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   i64 iVal;.    i
a500: 6e 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69  nt iLimit;.    i
a510: 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e  nt ii;.    int n
a520: 5a 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  Zero = 0;..    /
a530: 2a 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66  * Currently iOff
a540: 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
a550: 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76  irst byte of a v
a560: 61 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63  arint. This bloc
a570: 6b 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d  k .    ** decrem
a580: 65 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20  ents iOff until 
a590: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
a5a0: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
a5b0: 68 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20  he previous .   
a5c0: 20 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69   ** varint. Taki
a5d0: 6e 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72  ng care not to r
a5e0: 65 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c  ead any memory l
a5f0: 6f 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63  ocations that oc
a600: 63 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  cur.    ** befor
a610: 65 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20  e the buffer in 
a620: 6d 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20  memory.  */.    
a630: 69 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39  iLimit = (iOff>9
a640: 20 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a   ? iOff-9 : 0);.
a650: 20 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20      for(iOff--; 
a660: 69 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66  iOff>iLimit; iOf
a670: 66 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20  f--){.      if( 
a680: 28 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38  (a[iOff-1] & 0x8
a690: 30 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  0)==0 ) break;. 
a6a0: 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65     }..    fts5Ge
a6b0: 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d  tVarint(&a[iOff]
a6c0: 2c 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a  , (u64*)&iVal);.
a6d0: 20 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64      pLvl->iRowid
a6e0: 20 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c   -= iVal;.    pL
a6f0: 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b  vl->iLeafPgno--;
a700: 0a 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61  ..    /* Skip ba
a710: 63 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79  ckwards past any
a720: 20 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a   0x00 varints. *
a730: 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66  /.    for(ii=iOf
a740: 66 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69  f-1; ii>=pLvl->i
a750: 46 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69  FirstOff && a[ii
a760: 5d 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a  ]==0x00; ii--){.
a770: 20 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20        nZero++;. 
a780: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e     }.    if( ii>
a790: 3d 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66  =pLvl->iFirstOff
a7a0: 20 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38   && (a[ii] & 0x8
a7b0: 30 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  0) ){.      /* T
a7c0: 68 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74  he byte immediat
a7d0: 65 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c  ely before the l
a7e0: 61 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61  ast 0x00 byte ha
a7f0: 73 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20  s the 0x80 bit. 
a800: 20 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20       ** set. So 
a810: 74 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73  the last 0x00 is
a820: 20 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30   only a varint 0
a830: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20   if there are 8 
a840: 6d 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20  more 0x80.      
a850: 2a 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20  ** bytes before 
a860: 61 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20  a[ii]. */.      
a870: 69 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20  int bZero = 0;  
a880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
a890: 72 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30  rue if last 0x00
a8a0: 20 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20   counts */.     
a8b0: 20 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76   if( (ii-8)>=pLv
a8c0: 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a  l->iFirstOff ){.
a8d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
a8e0: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20         for(j=1; 
a8f0: 6a 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d  j<=8 && (a[ii-j]
a900: 20 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a   & 0x80); j++);.
a910: 20 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20          bZero = 
a920: 28 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (j>8);.      }. 
a930: 20 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d       if( bZero==
a940: 30 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20  0 ) nZero--;.   
a950: 20 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65   }.    pLvl->iLe
a960: 61 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b  afPgno -= nZero;
a970: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a980: 3d 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a  = iOff - nZero;.
a990: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c    }..  return pL
a9a0: 76 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61  vl->bEof;.}..sta
a9b0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
a9c0: 78 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49  xIterPrevR(Fts5I
a9d0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69  ndex *p, Fts5Dli
a9e0: 64 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  dxIter *pIter, i
a9f0: 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35  nt iLvl){.  Fts5
aa00: 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d  DlidxLvl *pLvl =
aa10: 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c   &pIter->aLvl[iL
aa20: 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  vl];..  assert( 
aa30: 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c  iLvl<pIter->nLvl
aa40: 20 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c   );.  if( fts5Dl
aa50: 69 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29  idxLvlPrev(pLvl)
aa60: 20 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76   ){.    if( (iLv
aa70: 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c  l+1) < pIter->nL
aa80: 76 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  vl ){.      fts5
aa90: 44 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70  DlidxIterPrevR(p
aaa0: 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29  , pIter, iLvl+1)
aab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c  ;.      if( pLvl
aac0: 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20  [1].bEof==0 ){. 
aad0: 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52         fts5DataR
aae0: 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61  elease(pLvl->pDa
aaf0: 74 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ta);.        mem
ab00: 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a  set(pLvl, 0, siz
ab10: 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c  eof(Fts5DlidxLvl
ab20: 29 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c  ));.        pLvl
ab30: 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61  ->pData = fts5Da
ab40: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
ab50: 20 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44         FTS5_DLID
ab60: 58 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69  X_ROWID(pIter->i
ab70: 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76  Segid, iLvl, pLv
ab80: 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a  l[1].iLeafPgno).
ab90: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
aba0: 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61     if( pLvl->pDa
abb0: 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ta ){.          
abc0: 77 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78  while( fts5Dlidx
abd0: 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30  LvlNext(pLvl)==0
abe0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c   );.          pL
abf0: 76 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20  vl->bEof = 0;.  
ac00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ac10: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
ac20: 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b  urn pIter->aLvl[
ac30: 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69  0].bEof;.}.stati
ac40: 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49  c int fts5DlidxI
ac50: 74 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65  terPrev(Fts5Inde
ac60: 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49  x *p, Fts5DlidxI
ac70: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
ac80: 65 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49  eturn fts5DlidxI
ac90: 74 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65  terPrevR(p, pIte
aca0: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r, 0);.}../*.** 
acb0: 46 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  Free a doclist-i
acc0: 6e 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62  ndex iterator ob
acd0: 6a 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62  ject allocated b
ace0: 79 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  y fts5DlidxIterI
acf0: 6e 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nit()..*/.static
ad00: 20 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49   void fts5DlidxI
ad10: 74 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64  terFree(Fts5Dlid
ad20: 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  xIter *pIter){. 
ad30: 20 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20   if( pIter ){.  
ad40: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ad50: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
ad60: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Lvl; i++){.     
ad70: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
ad80: 28 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e  (pIter->aLvl[i].
ad90: 70 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  pData);.    }.  
ada0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
adb0: 49 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74  Iter);.  }.}..st
adc0: 61 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74  atic Fts5DlidxIt
add0: 65 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65  er *fts5DlidxIte
ade0: 72 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64  rInit(.  Fts5Ind
adf0: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
ae00: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35           /* Fts5
ae10: 20 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   Backend to iter
ae20: 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
ae30: 69 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20  int bRev,       
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 2f 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45  /* True for ORDE
ae60: 52 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e  R BY ASC */.  in
ae70: 74 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20  t iSegid,       
ae80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ae90: 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20   Segment id */. 
aea0: 20 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20   int iLeafPg    
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75   /* Leaf page nu
aed0: 6d 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69  mber to load dli
aee0: 64 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46  dx for */.){.  F
aef0: 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49  ts5DlidxIter *pI
af00: 74 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ter = 0;.  int i
af10: 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20  ;.  int bDone = 
af20: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70  0;..  for(i=0; p
af30: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
af40: 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b  && bDone==0; i++
af50: 29 7b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65  ){.    int nByte
af60: 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c   = sizeof(Fts5Dl
af70: 69 64 78 49 74 65 72 29 20 2b 20 69 20 2a 20 73  idxIter) + i * s
af80: 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
af90: 76 6c 29 3b 0a 20 20 20 20 46 74 73 35 44 6c 69  vl);.    Fts5Dli
afa0: 64 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a 20  dxIter *pNew;.. 
afb0: 20 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 44     pNew = (Fts5D
afc0: 6c 69 64 78 49 74 65 72 2a 29 73 71 6c 69 74 65  lidxIter*)sqlite
afd0: 33 5f 72 65 61 6c 6c 6f 63 28 70 49 74 65 72 2c  3_realloc(pIter,
afe0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28   nByte);.    if(
aff0: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
b000: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
b010: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
b020: 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 52 6f  e{.      i64 iRo
b030: 77 69 64 20 3d 20 46 54 53 35 5f 44 4c 49 44 58  wid = FTS5_DLIDX
b040: 5f 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 69  _ROWID(iSegid, i
b050: 2c 20 69 4c 65 61 66 50 67 29 3b 0a 20 20 20 20  , iLeafPg);.    
b060: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a    Fts5DlidxLvl *
b070: 70 4c 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c  pLvl = &pNew->aL
b080: 76 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 70 49 74  vl[i];.      pIt
b090: 65 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20  er = pNew;.     
b0a0: 20 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c   memset(pLvl, 0,
b0b0: 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
b0c0: 78 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 70 4c  xLvl));.      pL
b0d0: 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73 35  vl->pData = fts5
b0e0: 44 61 74 61 52 65 61 64 28 70 2c 20 69 52 6f 77  DataRead(p, iRow
b0f0: 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  id);.      if( p
b100: 4c 76 6c 2d 3e 70 44 61 74 61 20 26 26 20 28 70  Lvl->pData && (p
b110: 4c 76 6c 2d 3e 70 44 61 74 61 2d 3e 70 5b 30 5d  Lvl->pData->p[0]
b120: 20 26 20 30 78 30 30 30 31 29 3d 3d 30 20 29 7b   & 0x0001)==0 ){
b130: 0a 20 20 20 20 20 20 20 20 62 44 6f 6e 65 20 3d  .        bDone =
b140: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
b150: 20 20 70 49 74 65 72 2d 3e 6e 4c 76 6c 20 3d 20    pIter->nLvl = 
b160: 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  i+1;.    }.  }..
b170: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
b180: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 49  ITE_OK ){.    pI
b190: 74 65 72 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  ter->iSegid = iS
b1a0: 65 67 69 64 3b 0a 20 20 20 20 69 66 28 20 62 52  egid;.    if( bR
b1b0: 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66  ev==0 ){.      f
b1c0: 74 73 35 44 6c 69 64 78 49 74 65 72 46 69 72 73  ts5DlidxIterFirs
b1d0: 74 28 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 65  t(pIter);.    }e
b1e0: 6c 73 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44  lse{.      fts5D
b1f0: 6c 69 64 78 49 74 65 72 4c 61 73 74 28 70 2c 20  lidxIterLast(p, 
b200: 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pIter);.    }.  
b210: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 21 3d  }..  if( p->rc!=
b220: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b230: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72   fts5DlidxIterFr
b240: 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20 70  ee(pIter);.    p
b250: 49 74 65 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  Iter = 0;.  }.. 
b260: 20 72 65 74 75 72 6e 20 70 49 74 65 72 3b 0a 7d   return pIter;.}
b270: 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73  ..static i64 fts
b280: 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28  5DlidxIterRowid(
b290: 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70  Fts5DlidxIter *p
b2a0: 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  Iter){.  return 
b2b0: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 69  pIter->aLvl[0].i
b2c0: 52 6f 77 69 64 3b 0a 7d 0a 73 74 61 74 69 63 20  Rowid;.}.static 
b2d0: 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65  int fts5DlidxIte
b2e0: 72 50 67 6e 6f 28 46 74 73 35 44 6c 69 64 78 49  rPgno(Fts5DlidxI
b2f0: 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72  ter *pIter){.  r
b300: 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76  eturn pIter->aLv
b310: 6c 5b 30 5d 2e 69 4c 65 61 66 50 67 6e 6f 3b 0a  l[0].iLeafPgno;.
b320: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 61 64 20 74 68  }../*.** Load th
b330: 65 20 6e 65 78 74 20 6c 65 61 66 20 70 61 67 65  e next leaf page
b340: 20 69 6e 74 6f 20 74 68 65 20 73 65 67 6d 65 6e   into the segmen
b350: 74 20 69 74 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73  t iterator..*/.s
b360: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
b370: 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 0a  egIterNextPage(.
b380: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3a0: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
b3b0: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
b3c0: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b3e0: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
b3f0: 61 6e 63 65 20 74 6f 20 6e 65 78 74 20 70 61 67  ance to next pag
b400: 65 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 44 61  e */.){.  Fts5Da
b410: 74 61 20 2a 70 4c 65 61 66 3b 0a 20 20 46 74 73  ta *pLeaf;.  Fts
b420: 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
b430: 74 20 2a 70 53 65 67 20 3d 20 70 49 74 65 72 2d  t *pSeg = pIter-
b440: 3e 70 53 65 67 3b 0a 20 20 66 74 73 35 44 61 74  >pSeg;.  fts5Dat
b450: 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
b460: 70 4c 65 61 66 29 3b 0a 20 20 70 49 74 65 72 2d  pLeaf);.  pIter-
b470: 3e 69 4c 65 61 66 50 67 6e 6f 2b 2b 3b 0a 20 20  >iLeafPgno++;.  
b480: 69 66 28 20 70 49 74 65 72 2d 3e 70 4e 65 78 74  if( pIter->pNext
b490: 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65  Leaf ){.    pIte
b4a0: 72 2d 3e 70 4c 65 61 66 20 3d 20 70 49 74 65 72  r->pLeaf = pIter
b4b0: 2d 3e 70 4e 65 78 74 4c 65 61 66 3b 0a 20 20 20  ->pNextLeaf;.   
b4c0: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
b4d0: 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  f = 0;.  }else i
b4e0: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
b4f0: 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  gno<=pSeg->pgnoL
b500: 61 73 74 20 29 7b 0a 20 20 20 20 70 49 74 65 72  ast ){.    pIter
b510: 2d 3e 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61  ->pLeaf = fts5Da
b520: 74 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20  taRead(p, .     
b530: 20 20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f     FTS5_SEGMENT_
b540: 52 4f 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67  ROWID(pSeg->iSeg
b550: 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  id, pIter->iLeaf
b560: 50 67 6e 6f 29 0a 20 20 20 20 29 3b 0a 20 20 7d  Pgno).    );.  }
b570: 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
b580: 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 7d 0a  >pLeaf = 0;.  }.
b590: 20 20 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d    pLeaf = pIter-
b5a0: 3e 70 4c 65 61 66 3b 0a 0a 20 20 69 66 28 20 70  >pLeaf;..  if( p
b5b0: 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74 65  Leaf ){.    pIte
b5c0: 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70  r->iPgidxOff = p
b5d0: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20  Leaf->szLeaf;.  
b5e0: 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73    if( fts5LeafIs
b5f0: 54 65 72 6d 6c 65 73 73 28 70 4c 65 61 66 29 20  Termless(pLeaf) 
b600: 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
b610: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
b620: 70 4c 65 61 66 2d 3e 6e 6e 2b 31 3b 0a 20 20 20  pLeaf->nn+1;.   
b630: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
b640: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 2b  ter->iPgidxOff +
b650: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
b660: 32 28 26 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65  2(&pLeaf->p[pIte
b670: 72 2d 3e 69 50 67 69 64 78 4f 66 66 5d 2c 0a 20  r->iPgidxOff],. 
b680: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
b690: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20  iEndofDoclist.  
b6a0: 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
b6b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65  .}../*.** Argume
b6c0: 6e 74 20 70 20 70 6f 69 6e 74 73 20 74 6f 20 61  nt p points to a
b6d0: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
b6e0: 6e 67 20 61 20 76 61 72 69 6e 74 20 74 6f 20 62  ng a varint to b
b6f0: 65 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  e interpreted as
b700: 20 61 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c   a.** position l
b710: 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 2e 20  ist size field. 
b720: 52 65 61 64 20 74 68 65 20 76 61 72 69 6e 74 20  Read the varint 
b730: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 6e  and return the n
b740: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
b750: 2a 20 72 65 61 64 2e 20 42 65 66 6f 72 65 20 72  * read. Before r
b760: 65 74 75 72 6e 69 6e 67 2c 20 73 65 74 20 2a 70  eturning, set *p
b770: 6e 53 7a 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  nSz to the numbe
b780: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
b790: 65 20 70 6f 73 69 74 69 6f 6e 0a 2a 2a 20 6c 69  e position.** li
b7a0: 73 74 2c 20 61 6e 64 20 2a 70 62 44 65 6c 20 74  st, and *pbDel t
b7b0: 6f 20 74 72 75 65 20 69 66 20 74 68 65 20 64 65  o true if the de
b7c0: 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65 74  lete flag is set
b7d0: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
b7e0: 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
b7f0: 69 6e 74 20 66 74 73 35 47 65 74 50 6f 73 6c 69  int fts5GetPosli
b800: 73 74 53 69 7a 65 28 63 6f 6e 73 74 20 75 38 20  stSize(const u8 
b810: 2a 70 2c 20 69 6e 74 20 2a 70 6e 53 7a 2c 20 69  *p, int *pnSz, i
b820: 6e 74 20 2a 70 62 44 65 6c 29 7b 0a 20 20 69 6e  nt *pbDel){.  in
b830: 74 20 6e 53 7a 3b 0a 20 20 69 6e 74 20 6e 20 3d  t nSz;.  int n =
b840: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
b850: 28 70 2c 20 6e 53 7a 29 3b 0a 20 20 61 73 73 65  (p, nSz);.  asse
b860: 72 74 5f 6e 63 28 20 6e 53 7a 3e 3d 30 20 29 3b  rt_nc( nSz>=0 );
b870: 0a 20 20 2a 70 6e 53 7a 20 3d 20 6e 53 7a 2f 32  .  *pnSz = nSz/2
b880: 3b 0a 20 20 2a 70 62 44 65 6c 20 3d 20 6e 53 7a  ;.  *pbDel = nSz
b890: 20 26 20 30 78 30 30 30 31 3b 0a 20 20 72 65 74   & 0x0001;.  ret
b8a0: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
b8b0: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
b8c0: 66 4f 66 66 73 65 74 20 63 75 72 72 65 6e 74 6c  fOffset currentl
b8d0: 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  y points to the 
b8e0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 61 0a  first byte of a.
b8f0: 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
b900: 20 73 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61   size field. Rea
b910: 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  d the value of t
b920: 68 65 20 66 69 65 6c 64 20 61 6e 64 20 73 74 6f  he field and sto
b930: 72 65 20 69 74 0a 2a 2a 20 69 6e 20 74 68 65 20  re it.** in the 
b940: 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
b950: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 46 74 73  les:.**.**   Fts
b960: 35 53 65 67 49 74 65 72 2e 6e 50 6f 73 0a 2a 2a  5SegIter.nPos.**
b970: 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 62     Fts5SegIter.b
b980: 44 65 6c 0a 2a 2a 0a 2a 2a 20 4c 65 61 76 65 20  Del.**.** Leave 
b990: 46 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61  Fts5SegIter.iLea
b9a0: 66 4f 66 66 73 65 74 20 70 6f 69 6e 74 69 6e 67  fOffset pointing
b9b0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79   to the first by
b9c0: 74 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 6f  te of the .** po
b9d0: 73 69 74 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74  sition list cont
b9e0: 65 6e 74 20 28 69 66 20 61 6e 79 29 2e 0a 2a 2f  ent (if any)..*/
b9f0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
ba00: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
ba10: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ba20: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ba30: 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  r){.  if( p->rc=
ba40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ba50: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 49 74    int iOff = pIt
ba60: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ba70: 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 72    /* Offset to r
ba80: 65 61 64 20 61 74 20 2a 2f 0a 20 20 20 20 41 53  ead at */.    AS
ba90: 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70  SERT_SZLEAF_OK(p
baa0: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20  Iter->pLeaf);.  
bab0: 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65    if( iOff>=pIte
bac0: 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  r->pLeaf->szLeaf
bad0: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
bae0: 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
baf0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bb00: 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 26   const u8 *a = &
bb10: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b  pIter->pLeaf->p[
bb20: 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 49 74  iOff];.      pIt
bb30: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
bb40: 2b 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73  += fts5GetPoslis
bb50: 74 53 69 7a 65 28 61 2c 20 26 70 49 74 65 72 2d  tSize(a, &pIter-
bb60: 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d 3e 62  >nPos, &pIter->b
bb70: 44 65 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Del);.    }.  }.
bb80: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
bb90: 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 52 6f  ts5SegIterLoadRo
bba0: 77 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70  wid(Fts5Index *p
bbb0: 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
bbc0: 49 74 65 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d  Iter){.  u8 *a =
bbd0: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
bbe0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66  ;        /* Buff
bbf0: 65 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20  er to read data 
bc00: 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  from */.  int iO
bc10: 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61  ff = pIter->iLea
bc20: 66 4f 66 66 73 65 74 3b 0a 0a 20 20 41 53 53 45  fOffset;..  ASSE
bc30: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
bc40: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66  er->pLeaf);.  if
bc50: 28 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  ( iOff>=pIter->p
bc60: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
bc70: 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e      fts5SegIterN
bc80: 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72  extPage(p, pIter
bc90: 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
bca0: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20  ->pLeaf==0 ){.  
bcb0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
bcc0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63  QLITE_OK ) p->rc
bcd0: 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
bce0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
bcf0: 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20     }.    iOff = 
bd00: 34 3b 0a 20 20 20 20 61 20 3d 20 70 49 74 65 72  4;.    a = pIter
bd10: 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a  ->pLeaf->p;.  }.
bd20: 20 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65    iOff += sqlite
bd30: 33 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26  3Fts5GetVarint(&
bd40: 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
bd50: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
bd60: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
bd70: 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a  fset = iOff;.}..
bd80: 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  /*.** Fts5SegIte
bd90: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63 75  r.iLeafOffset cu
bda0: 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
bdb0: 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  o the first byte
bdc0: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75   of the .** "nSu
bdd0: 66 66 69 78 22 20 66 69 65 6c 64 20 6f 66 20 61  ffix" field of a
bde0: 20 74 65 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20   term. Function 
bdf0: 70 61 72 61 6d 65 74 65 72 20 6e 4b 65 65 70 20  parameter nKeep 
be00: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
be10: 75 65 0a 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50  ue.** of the "nP
be20: 72 65 66 69 78 22 20 66 69 65 6c 64 20 28 69 66  refix" field (if
be30: 20 74 68 65 72 65 20 77 61 73 20 6f 6e 65 20 2d   there was one -
be40: 20 69 74 20 69 73 20 70 61 73 73 65 64 20 30 20   it is passed 0 
be50: 69 66 20 74 68 69 73 20 69 73 0a 2a 2a 20 74 68  if this is.** th
be60: 65 20 66 69 72 73 74 20 74 65 72 6d 20 69 6e 20  e first term in 
be70: 74 68 65 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a  the segment)..**
be80: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
be90: 6e 20 70 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a  n populates:.**.
bea0: 2a 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72  **   Fts5SegIter
beb0: 2e 74 65 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53  .term.**   Fts5S
bec0: 65 67 49 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a  egIter.rowid.**.
bed0: 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79 20 61  ** accordingly a
bee0: 6e 64 20 6c 65 61 76 65 73 20 28 46 74 73 35 53  nd leaves (Fts5S
bef0: 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73  egIter.iLeafOffs
bf00: 65 74 29 20 73 65 74 20 74 6f 20 74 68 65 20 63  et) set to the c
bf10: 6f 6e 74 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65  ontent of.** the
bf20: 20 66 69 72 73 74 20 70 6f 73 69 74 69 6f 6e 20   first position 
bf30: 6c 69 73 74 2e 20 54 68 65 20 70 6f 73 69 74 69  list. The positi
bf40: 6f 6e 20 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e  on list belongin
bf50: 67 20 74 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a  g to document .*
bf60: 2a 20 28 46 74 73 35 53 65 67 49 74 65 72 2e 69  * (Fts5SegIter.i
bf70: 52 6f 77 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  Rowid)..*/.stati
bf80: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
bf90: 65 72 4c 6f 61 64 54 65 72 6d 28 46 74 73 35 49  erLoadTerm(Fts5I
bfa0: 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67  ndex *p, Fts5Seg
bfb0: 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
bfc0: 20 6e 4b 65 65 70 29 7b 0a 20 20 75 38 20 2a 61   nKeep){.  u8 *a
bfd0: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
bfe0: 3e 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 42 75  >p;        /* Bu
bff0: 66 66 65 72 20 74 6f 20 72 65 61 64 20 64 61 74  ffer to read dat
c000: 61 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  a from */.  int 
c010: 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c  iOff = pIter->iL
c020: 65 61 66 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f  eafOffset;  /* O
c030: 66 66 73 65 74 20 74 6f 20 72 65 61 64 20 61 74  ffset to read at
c040: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20   */.  int nNew; 
c050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c060: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
c070: 66 20 6e 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20  f new data */.. 
c080: 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
c090: 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
c0a0: 5d 2c 20 6e 4e 65 77 29 3b 0a 20 20 70 49 74 65  ], nNew);.  pIte
c0b0: 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65 65  r->term.n = nKee
c0c0: 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 41  p;.  fts5BufferA
c0d0: 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
c0e0: 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c 20  , &pIter->term, 
c0f0: 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  nNew, &a[iOff]);
c100: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
c110: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
c120: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
c130: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
c140: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
c150: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
c160: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
c170: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
c180: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
c190: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
c1a0: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
c1b0: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
c1c0: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
c1d0: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
c1e0: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
c1f0: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
c200: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
c210: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
c220: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
c230: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
c240: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
c250: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
c260: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
c270: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
c280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  .}../*.** Initia
c290: 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61 74 6f  lize the iterato
c2a0: 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  r object pIter t
c2b0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
c2c0: 68 20 74 68 65 20 65 6e 74 72 69 65 73 20 69 6e  h the entries in
c2d0: 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53 65 67  .** segment pSeg
c2e0: 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72 20 69  . The iterator i
c2f0: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
c300: 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
c310: 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68 69 73  ry when .** this
c320: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
c330: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  s..**.** If an e
c340: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
c350: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
c360: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
c370: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
c380: 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68  f .** an error h
c390: 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  as already occur
c3a0: 72 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75  red when this fu
c3b0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
c3c0: 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
c3d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
c3e0: 66 74 73 35 53 65 67 49 74 65 72 49 6e 69 74 28  fts5SegIterInit(
c3f0: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
c400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c410: 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65 78 20     /* FTS index 
c420: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
c430: 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74  StructureSegment
c440: 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a 20 44   *pSeg,     /* D
c450: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 73 65  escription of se
c460: 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 53  gment */.  Fts5S
c470: 65 67 49 74 65 72 20 2a 70 49 74 65 72 20 20 20  egIter *pIter   
c480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 62             /* Ob
c490: 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61 74 65  ject to populate
c4a0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 53 65   */.){.  if( pSe
c4b0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d 30 20  g->pgnoFirst==0 
c4c0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
c4d0: 61 70 70 65 6e 73 20 69 66 20 74 68 65 20 73 65  appens if the se
c4e0: 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67 20 75  gment is being u
c4f0: 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75 74 20  sed as an input 
c500: 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  to an incrementa
c510: 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65 20 61  l.    ** merge a
c520: 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  nd all data has 
c530: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22 74 72  already been "tr
c540: 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75 6e 63  immed". See func
c550: 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74 73 35  tion.    ** fts5
c560: 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29 20 66  TrimSegments() f
c570: 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e 20 74  or details. In t
c580: 68 69 73 20 63 61 73 65 20 6c 65 61 76 65 20 74  his case leave t
c590: 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d 70 74  he iterator empt
c5a0: 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 63 61  y..    ** The ca
c5b0: 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20 74 68  ller will see th
c5c0: 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d  e (pIter->pLeaf=
c5d0: 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65 20 74  =0) and assume t
c5e0: 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 0a 20  he iterator is. 
c5f0: 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61 6c 72     ** at EOF alr
c600: 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73  eady. */.    ass
c610: 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c 65 61  ert( pIter->pLea
c620: 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75  f==0 );.    retu
c630: 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  rn;.  }..  if( p
c640: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
c650: 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ){.    memset(pI
c660: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  ter, 0, sizeof(*
c670: 70 49 74 65 72 29 29 3b 0a 20 20 20 20 70 49 74  pIter));.    pIt
c680: 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67 3b  er->pSeg = pSeg;
c690: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
c6a0: 66 50 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67  fPgno = pSeg->pg
c6b0: 6e 6f 46 69 72 73 74 2d 31 3b 0a 20 20 20 20 66  noFirst-1;.    f
c6c0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50 61  ts5SegIterNextPa
c6d0: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
c6e0: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  }..  if( p->rc==
c6f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c700: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
c710: 73 65 74 20 3d 20 34 3b 0a 20 20 20 20 61 73 73  set = 4;.    ass
c720: 65 72 74 5f 6e 63 28 20 70 49 74 65 72 2d 3e 70  ert_nc( pIter->p
c730: 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29 3b 0a 20 20  Leaf->nn>4 );.  
c740: 20 20 61 73 73 65 72 74 28 20 66 74 73 35 4c 65    assert( fts5Le
c750: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 70  afFirstTermOff(p
c760: 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 34 20  Iter->pLeaf)==4 
c770: 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  );.    pIter->iP
c780: 67 69 64 78 4f 66 66 20 3d 20 70 49 74 65 72 2d  gidxOff = pIter-
c790: 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 2b 31  >pLeaf->szLeaf+1
c7a0: 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
c7b0: 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70 49 74  rLoadTerm(p, pIt
c7c0: 65 72 2c 20 30 29 3b 0a 20 20 20 20 66 74 73 35  er, 0);.    fts5
c7d0: 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
c7e0: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
c7f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
c800: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 65 76  ction is only ev
c810: 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 69 74 65  er called on ite
c820: 72 61 74 6f 72 73 20 63 72 65 61 74 65 64 20 62  rators created b
c830: 79 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 46 74  y calls to.** Ft
c840: 73 35 49 6e 64 65 78 51 75 65 72 79 28 29 20 77  s5IndexQuery() w
c850: 69 74 68 20 74 68 65 20 46 54 53 35 49 4e 44 45  ith the FTS5INDE
c860: 58 5f 51 55 45 52 59 5f 44 45 53 43 20 66 6c 61  X_QUERY_DESC fla
c870: 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  g set..**.** The
c880: 20 69 74 65 72 61 74 6f 72 20 69 73 20 69 6e 20   iterator is in 
c890: 61 6e 20 75 6e 75 73 75 61 6c 20 73 74 61 74 65  an unusual state
c8a0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
c8b0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 3a 20 74  ion is called: t
c8c0: 68 65 0a 2a 2a 20 46 74 73 35 53 65 67 49 74 65  he.** Fts5SegIte
c8d0: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 76 61  r.iLeafOffset va
c8e0: 72 69 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f  riable is set to
c8f0: 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74   the offset of t
c900: 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 74  he start of.** t
c910: 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  he position-list
c920: 20 73 69 7a 65 20 66 69 65 6c 64 20 66 6f 72 20   size field for 
c930: 74 68 65 20 66 69 72 73 74 20 72 65 6c 65 76 61  the first releva
c940: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
c950: 70 61 67 65 2e 0a 2a 2a 20 46 74 73 35 53 65 67  page..** Fts5Seg
c960: 49 74 65 72 2e 72 6f 77 69 64 20 69 73 20 73 65  Iter.rowid is se
c970: 74 2c 20 62 75 74 20 6e 50 6f 73 20 61 6e 64 20  t, but nPos and 
c980: 62 44 65 6c 20 61 72 65 20 6e 6f 74 2e 0a 2a 2a  bDel are not..**
c990: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
c9a0: 6e 20 61 64 76 61 6e 63 65 73 20 74 68 65 20 69  n advances the i
c9b0: 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74 20  terator so that 
c9c0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  it points to the
c9d0: 20 6c 61 73 74 20 0a 2a 2a 20 72 65 6c 65 76 61   last .** releva
c9e0: 6e 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  nt rowid on the 
c9f0: 70 61 67 65 20 61 6e 64 2c 20 69 66 20 6e 65 63  page and, if nec
ca00: 65 73 73 61 72 79 2c 20 69 6e 69 74 69 61 6c 69  essary, initiali
ca10: 7a 65 73 20 74 68 65 20 0a 2a 2a 20 61 52 6f 77  zes the .** aRow
ca20: 69 64 4f 66 66 73 65 74 5b 5d 20 61 6e 64 20 69  idOffset[] and i
ca30: 52 6f 77 69 64 4f 66 66 73 65 74 20 76 61 72 69  RowidOffset vari
ca40: 61 62 6c 65 73 2e 20 41 74 20 74 68 69 73 20 70  ables. At this p
ca50: 6f 69 6e 74 20 74 68 65 20 69 74 65 72 61 74 6f  oint the iterato
ca60: 72 0a 2a 2a 20 69 73 20 69 6e 20 69 74 73 20 72  r.** is in its r
ca70: 65 67 75 6c 61 72 20 73 74 61 74 65 20 2d 20 46  egular state - F
ca80: 74 73 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66  ts5SegIter.iLeaf
ca90: 4f 66 66 73 65 74 20 70 6f 69 6e 74 73 20 74 6f  Offset points to
caa0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 62 79   the first.** by
cab0: 74 65 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  te of the positi
cac0: 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 65 6e 74 20  on list content 
cad0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
cae0: 73 61 69 64 20 72 6f 77 69 64 2e 0a 2a 2f 0a 73  said rowid..*/.s
caf0: 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53  tatic void fts5S
cb00: 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69  egIterReverseIni
cb10: 74 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  tPage(Fts5Index 
cb20: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
cb30: 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 6e  *pIter){.  int n
cb40: 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
cb50: 3e 73 7a 4c 65 61 66 3b 0a 20 20 69 6e 74 20 69  >szLeaf;.  int i
cb60: 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f   = pIter->iLeafO
cb70: 66 66 73 65 74 3b 0a 20 20 75 38 20 2a 61 20 3d  ffset;.  u8 *a =
cb80: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70   pIter->pLeaf->p
cb90: 3b 0a 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66  ;.  int iRowidOf
cba0: 66 73 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  fset = 0;..  if(
cbb0: 20 6e 3e 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66   n>pIter->iEndof
cbc0: 44 6f 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 6e  Doclist ){.    n
cbd0: 20 3d 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66   = pIter->iEndof
cbe0: 44 6f 63 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20  Doclist;.  }..  
cbf0: 41 53 53 45 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b  ASSERT_SZLEAF_OK
cc00: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
cc10: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
cc20: 20 20 69 36 34 20 69 44 65 6c 74 61 20 3d 20 30    i64 iDelta = 0
cc30: 3b 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a  ;.    int nPos;.
cc40: 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a      int bDummy;.
cc50: 0a 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65  .    i += fts5Ge
cc60: 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61 5b  tPoslistSize(&a[
cc70: 69 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d  i], &nPos, &bDum
cc80: 6d 79 29 3b 0a 20 20 20 20 69 20 2b 3d 20 6e 50  my);.    i += nP
cc90: 6f 73 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e  os;.    if( i>=n
cca0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20   ) break;.    i 
ccb0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
ccc0: 28 26 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69  (&a[i], (u64*)&i
ccd0: 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65  Delta);.    pIte
cce0: 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65  r->iRowid += iDe
ccf0: 6c 74 61 3b 0a 0a 20 20 20 20 69 66 28 20 69 52  lta;..    if( iR
cd00: 6f 77 69 64 4f 66 66 73 65 74 3e 3d 70 49 74 65  owidOffset>=pIte
cd10: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
cd20: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4e 65  ){.      int nNe
cd30: 77 20 3d 20 70 49 74 65 72 2d 3e 6e 52 6f 77 69  w = pIter->nRowi
cd40: 64 4f 66 66 73 65 74 20 2b 20 38 3b 0a 20 20 20  dOffset + 8;.   
cd50: 20 20 20 69 6e 74 20 2a 61 4e 65 77 20 3d 20 28     int *aNew = (
cd60: 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
cd70: 6c 6c 6f 63 28 70 49 74 65 72 2d 3e 61 52 6f 77  lloc(pIter->aRow
cd80: 69 64 4f 66 66 73 65 74 2c 20 6e 4e 65 77 2a 73  idOffset, nNew*s
cd90: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20  izeof(int));.   
cda0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29     if( aNew==0 )
cdb0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
cdc0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
cdd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
cde0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
cdf0: 65 72 2d 3e 61 52 6f 77 69 64 4f 66 66 73 65 74  er->aRowidOffset
ce00: 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 20 20 70   = aNew;.      p
ce10: 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73  Iter->nRowidOffs
ce20: 65 74 20 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d  et = nNew;.    }
ce30: 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e 61 52 6f  ..    pIter->aRo
ce40: 77 69 64 4f 66 66 73 65 74 5b 69 52 6f 77 69 64  widOffset[iRowid
ce50: 4f 66 66 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65  Offset++] = pIte
ce60: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a  r->iLeafOffset;.
ce70: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
ce80: 4f 66 66 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a  Offset = i;.  }.
ce90: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
cea0: 66 66 73 65 74 20 3d 20 69 52 6f 77 69 64 4f 66  ffset = iRowidOf
ceb0: 66 73 65 74 3b 0a 20 20 66 74 73 35 53 65 67 49  fset;.  fts5SegI
cec0: 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70  terLoadNPos(p, p
ced0: 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  Iter);.}../*.**.
cee0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
cef0: 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73  ts5SegIterRevers
cf00: 65 4e 65 77 50 61 67 65 28 46 74 73 35 49 6e 64  eNewPage(Fts5Ind
cf10: 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74  ex *p, Fts5SegIt
cf20: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 61 73  er *pIter){.  as
cf30: 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61  sert( pIter->fla
cf40: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
cf50: 52 5f 52 45 56 45 52 53 45 20 29 3b 0a 20 20 61  R_REVERSE );.  a
cf60: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 66 6c  ssert( pIter->fl
cf70: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
cf80: 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20  ER_ONETERM );.. 
cf90: 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
cfa0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a  (pIter->pLeaf);.
cfb0: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d    pIter->pLeaf =
cfc0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e   0;.  while( p->
cfd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
cfe0: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
cff0: 6f 3e 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  o>pIter->iTermLe
d000: 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74  afPgno ){.    Ft
d010: 73 35 44 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20  s5Data *pNew;.  
d020: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
d030: 6e 6f 2d 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d  no--;.    pNew =
d040: 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
d050: 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
d060: 57 49 44 28 0a 20 20 20 20 20 20 20 20 20 20 70  WID(.          p
d070: 49 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67  Iter->pSeg->iSeg
d080: 69 64 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  id, pIter->iLeaf
d090: 50 67 6e 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20  Pgno.    ));.   
d0a0: 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
d0b0: 20 20 20 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f     /* iTermLeafO
d0c0: 66 66 73 65 74 20 6d 61 79 20 62 65 20 65 71 75  ffset may be equ
d0d0: 61 6c 20 74 6f 20 73 7a 4c 65 61 66 20 69 66 20  al to szLeaf if 
d0e0: 74 68 65 20 74 65 72 6d 20 69 73 20 74 68 65 20  the term is the 
d0f0: 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 74 68  last.      ** th
d100: 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ing on the page 
d110: 2d 20 69 2e 65 2e 20 74 68 65 20 66 69 72 73 74  - i.e. the first
d120: 20 72 6f 77 69 64 20 69 73 20 6f 6e 20 74 68 65   rowid is on the
d130: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e   following page.
d140: 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74 68 69  .      ** In thi
d150: 73 20 63 61 73 65 20 6c 65 61 66 20 70 49 74 65  s case leaf pIte
d160: 72 2d 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69  r->pLeaf==0, thi
d170: 73 20 69 74 65 72 61 74 6f 72 20 69 73 20 61 74  s iterator is at
d180: 20 45 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69   EOF. */.      i
d190: 66 28 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50  f( pIter->iLeafP
d1a0: 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72  gno==pIter->iTer
d1b0: 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20 20 20 20  mLeafPgno .     
d1c0: 20 20 26 26 20 70 49 74 65 72 2d 3e 69 54 65 72    && pIter->iTer
d1d0: 6d 4c 65 61 66 4f 66 66 73 65 74 3c 70 4e 65 77  mLeafOffset<pNew
d1e0: 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20  ->szLeaf .      
d1f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
d200: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
d210: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
d220: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70 49 74  LeafOffset = pIt
d230: 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66  er->iTermLeafOff
d240: 73 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  set;.      }else
d250: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 52  {.        int iR
d260: 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20  owidOff;.       
d270: 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
d280: 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
d290: 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20  ff(pNew);.      
d2a0: 20 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 20    if( iRowidOff 
d2b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
d2c0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77  er->pLeaf = pNew
d2d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  ;.          pIte
d2e0: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
d2f0: 20 69 52 6f 77 69 64 4f 66 66 3b 0a 20 20 20 20   iRowidOff;.    
d300: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
d310: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
d320: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  pLeaf ){.       
d330: 20 75 38 20 2a 61 20 3d 20 26 70 49 74 65 72 2d   u8 *a = &pIter-
d340: 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d  >pLeaf->p[pIter-
d350: 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20  >iLeafOffset];. 
d360: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
d370: 65 61 66 4f 66 66 73 65 74 20 2b 3d 20 66 74 73  eafOffset += fts
d380: 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20 28 75  5GetVarint(a, (u
d390: 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77  64*)&pIter->iRow
d3a0: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  id);.        bre
d3b0: 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
d3c0: 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
d3d0: 61 52 65 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a  aRelease(pNew);.
d3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d3f0: 7d 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  }..  if( pIter->
d400: 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 70 49 74  pLeaf ){.    pIt
d410: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
d420: 74 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  t = pIter->pLeaf
d430: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 66 74 73 35  ->nn+1;.    fts5
d440: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 49 6e  SegIterReverseIn
d450: 69 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  itPage(p, pIter)
d460: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
d470: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
d480: 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65  e iterator passe
d490: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
d4a0: 61 72 67 75 6d 65 6e 74 20 63 75 72 72 65 6e 74  argument current
d4b0: 6c 79 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  ly.** points to 
d4c0: 61 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72 2e  a delete marker.
d4d0: 20 41 20 64 65 6c 65 74 65 20 6d 61 72 6b 65 72   A delete marker
d4e0: 20 69 73 20 61 6e 20 65 6e 74 72 79 20 77 69 74   is an entry wit
d4f0: 68 20 61 20 30 20 62 79 74 65 0a 2a 2a 20 70 6f  h a 0 byte.** po
d500: 73 69 74 69 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a  sition-list..*/.
d510: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
d520: 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28  ultiIterIsEmpty(
d530: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
d540: 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
d550: 65 72 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  er){.  Fts5SegIt
d560: 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
d570: 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e 61  r->aSeg[pIter->a
d580: 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d  First[1].iFirst]
d590: 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
d5a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
d5b0: 70 53 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70  pSeg->pLeaf && p
d5c0: 53 65 67 2d 3e 6e 50 6f 73 3d 3d 30 29 3b 0a 7d  Seg->nPos==0);.}
d5d0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
d5e0: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
d5f0: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
d600: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  . .**.** If an e
d610: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73  rror occurs, Fts
d620: 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74  5Index.rc is set
d630: 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61   to an appropria
d640: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49  te error code. I
d650: 74 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 63 6f 6e  t .** is not con
d660: 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72  sidered an error
d670: 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   if the iterator
d680: 20 72 65 61 63 68 65 73 20 45 4f 46 2e 20 49 66   reaches EOF. If
d690: 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a   an error has .*
d6a0: 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  * already occurr
d6b0: 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
d6c0: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
d6d0: 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
d6e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
d6f0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 0a  ts5SegIterNext(.
d700: 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
d710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d720: 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
d730: 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
d740: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
d750: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
d760: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76   Iterator to adv
d770: 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ance */.  int *p
d780: 62 4e 65 77 54 65 72 6d 20 20 20 20 20 20 20 20  bNewTerm        
d790: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
d7a0: 3a 20 53 65 74 20 66 6f 72 20 6e 65 77 20 74 65  : Set for new te
d7b0: 72 6d 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  rm */.){.  asser
d7c0: 74 28 20 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20  t( pbNewTerm==0 
d7d0: 7c 7c 20 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30  || *pbNewTerm==0
d7e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d   );.  if( p->rc=
d7f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
d800: 20 20 69 66 28 20 70 49 74 65 72 2d 3e 66 6c 61    if( pIter->fla
d810: 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45  gs & FTS5_SEGITE
d820: 52 5f 52 45 56 45 52 53 45 20 29 7b 0a 20 20 20  R_REVERSE ){.   
d830: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
d840: 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29  ->pNextLeaf==0 )
d850: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
d860: 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 3e  r->iRowidOffset>
d870: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  0 ){.        u8 
d880: 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
d890: 66 2d 3e 70 3b 0a 20 20 20 20 20 20 20 20 69 6e  f->p;.        in
d8a0: 74 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  t iOff;.        
d8b0: 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
d8c0: 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
d8d0: 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
d8e0: 3b 0a 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ;..        pIter
d8f0: 2d 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 2d 2d  ->iRowidOffset--
d900: 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72 2d  ;.        pIter-
d910: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69  >iLeafOffset = i
d920: 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 61 52 6f  Off = pIter->aRo
d930: 77 69 64 4f 66 66 73 65 74 5b 70 49 74 65 72 2d  widOffset[pIter-
d940: 3e 69 52 6f 77 69 64 4f 66 66 73 65 74 5d 3b 0a  >iRowidOffset];.
d950: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
d960: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
d970: 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e 50  ze(&a[iOff], &nP
d980: 6f 73 2c 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20  os, &bDummy);.  
d990: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 50        iOff += nP
d9a0: 6f 73 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  os;.        fts5
d9b0: 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
d9c0: 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
d9d0: 61 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  a);.        pIte
d9e0: 72 2d 3e 69 52 6f 77 69 64 20 2d 3d 20 69 44 65  r->iRowid -= iDe
d9f0: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 66 74 73  lta;.        fts
da00: 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73  5SegIterLoadNPos
da10: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
da20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
da30: 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
da40: 72 73 65 4e 65 77 50 61 67 65 28 70 2c 20 70 49  rseNewPage(p, pI
da50: 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
da60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 46    }else{.      F
da70: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
da80: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20   pIter->pLeaf;. 
da90: 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20       int iOff;. 
daa0: 20 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72       int bNewTer
dab0: 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  m = 0;.      int
dac0: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 0a 20 20 20   nKeep = 0;..   
dad0: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
dae0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
daf0: 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 77 69  position list wi
db00: 74 68 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  thin the current
db10: 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20   page. */.      
db20: 75 38 20 2a 61 20 3d 20 70 4c 65 61 66 2d 3e 70  u8 *a = pLeaf->p
db30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
db40: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 0a  pLeaf->szLeaf;..
db50: 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
db60: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
db70: 20 20 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65       iOff = pIte
db80: 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2b  r->iLeafOffset +
db90: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20   pIter->nPos;.. 
dba0: 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20       if( iOff<n 
dbb0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
dbc0: 65 20 6e 65 78 74 20 65 6e 74 72 79 20 69 73 20  e next entry is 
dbd0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  on the current p
dbe0: 61 67 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  age. */.        
dbf0: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
dc00: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
dc10: 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 20  clist );.       
dc20: 20 69 66 28 20 69 4f 66 66 3e 3d 70 49 74 65 72   if( iOff>=pIter
dc30: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
dc40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 4e 65  ){.          bNe
dc50: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
dc60: 20 20 20 20 20 69 66 28 20 69 4f 66 66 21 3d 66       if( iOff!=f
dc70: 74 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d  ts5LeafFirstTerm
dc80: 4f 66 66 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  Off(pLeaf) ){.  
dc90: 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
dca0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
dcb0: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
dcc0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
dcd0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
dce0: 20 20 20 20 20 20 20 20 20 75 36 34 20 69 44 65           u64 iDe
dcf0: 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20 69  lta;.          i
dd00: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
dd10: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
dd20: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
dd30: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
dd40: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
dd50: 61 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  a;.          ass
dd60: 65 72 74 5f 6e 63 28 20 69 44 65 6c 74 61 3e 30  ert_nc( iDelta>0
dd70: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
dd80: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65        pIter->iLe
dd90: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
dda0: 0a 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ..      }else if
ddb0: 28 20 70 49 74 65 72 2d 3e 70 53 65 67 3d 3d 30  ( pIter->pSeg==0
ddc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
ddd0: 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20 30 3b  t u8 *pList = 0;
dde0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
ddf0: 68 61 72 20 2a 7a 54 65 72 6d 20 3d 20 30 3b 0a  har *zTerm = 0;.
de00: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 73          int nLis
de10: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  t = 0;.        i
de20: 66 28 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c  f( 0==(pIter->fl
de30: 61 67 73 20 26 20 46 54 53 35 5f 53 45 47 49 54  ags & FTS5_SEGIT
de40: 45 52 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20  ER_ONETERM) ){. 
de50: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
de60: 46 74 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74  Fts5HashScanNext
de70: 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
de80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
de90: 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
dea0: 2d 3e 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c  ->pHash, &zTerm,
deb0: 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
dec0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ded0: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
dee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74   ){.          ft
def0: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
df00: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
df10: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c         pIter->pL
df20: 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  eaf = 0;.       
df30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
df40: 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e    pIter->pLeaf->
df50: 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
df60: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
df70: 3e 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69  >pLeaf->nn = nLi
df80: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  st;.          pI
df90: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
dfa0: 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20  af = nList;.    
dfb0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e        pIter->iEn
dfc0: 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e 4c 69  dofDoclist = nLi
dfd0: 73 74 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  st+1;.          
dfe0: 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
dff0: 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49  rSet(&p->rc, &pI
e000: 74 65 72 2d 3e 74 65 72 6d 2c 20 73 74 72 6c 65  ter->term, strle
e010: 6e 28 7a 54 65 72 6d 29 2c 20 28 75 38 2a 29 7a  n(zTerm), (u8*)z
e020: 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  Term);.         
e030: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e040: 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61 72  set = fts5GetVar
e050: 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34 2a  int(pList, (u64*
e060: 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29  )&pIter->iRowid)
e070: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
e080: 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e  pbNewTerm ) *pbN
e090: 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20  ewTerm = 1;.    
e0a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
e0b0: 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
e0c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 0;.        /* 
e0d0: 4e 65 78 74 20 65 6e 74 72 79 20 69 73 20 6e 6f  Next entry is no
e0e0: 74 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  t on the current
e0f0: 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
e100: 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30 20   while( iOff==0 
e110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
e120: 35 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65  5SegIterNextPage
e130: 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
e140: 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20 70 49        pLeaf = pI
e150: 74 65 72 2d 3e 70 4c 65 61 66 3b 0a 20 20 20 20  ter->pLeaf;.    
e160: 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d        if( pLeaf=
e170: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e180: 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c        ASSERT_SZL
e190: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
e1a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 69 4f           if( (iO
e1b0: 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
e1c0: 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66  stRowidOff(pLeaf
e1d0: 29 29 20 26 26 20 69 4f 66 66 3c 70 4c 65 61 66  )) && iOff<pLeaf
e1e0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
e1f0: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
e200: 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
e210: 72 69 6e 74 28 26 70 4c 65 61 66 2d 3e 70 5b 69  rint(&pLeaf->p[i
e220: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
e230: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20  er->iRowid);.   
e240: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e250: 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f  iLeafOffset = iO
e260: 66 66 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ff;..           
e270: 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70   if( pLeaf->nn>p
e280: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
e2a0: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
e2b0: 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b   pLeaf->szLeaf +
e2c0: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
e2d0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
e2e0: 20 20 20 20 26 70 4c 65 61 66 2d 3e 70 5b 70 4c      &pLeaf->p[pL
e2f0: 65 61 66 2d 3e 73 7a 4c 65 61 66 5d 2c 20 70 49  eaf->szLeaf], pI
e300: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
e310: 73 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  st.             
e320: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
e330: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  }..          }. 
e340: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66           else if
e350: 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e 70 4c 65 61  ( pLeaf->nn>pLea
e360: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
e370: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e380: 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61  iPgidxOff = pLea
e390: 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74 73 35  f->szLeaf + fts5
e3a0: 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20 20 20  GetVarint32(.   
e3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
e3c0: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
e3d0: 4c 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20  Leaf], iOff.    
e3e0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
e3f0: 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c         pIter->iL
e400: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
e410: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49  ;.            pI
e420: 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
e430: 73 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  st = iOff;.     
e440: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
e450: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
e460: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
e470: 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
e480: 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
e490: 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
e4a0: 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
e4b0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
e4c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e4d0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e4e0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
e4f0: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 77   iterator is now
e500: 20 61 74 20 45 4f 46 2e 20 49 66 20 73 6f 2c 20   at EOF. If so, 
e510: 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 2a 2f  return early. */
e520: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
e530: 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  ->pLeaf ){.     
e540: 20 20 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20     if( bNewTerm 
e550: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e560: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
e570: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
e580: 54 45 52 4d 20 29 7b 0a 20 20 20 20 20 20 20 20  TERM ){.        
e590: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
e5a0: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
e5b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
e5c0: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e5d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
e5e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
e5f0: 73 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72  s5SegIterLoadTer
e600: 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e 4b 65 65  m(p, pIter, nKee
e610: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
e620: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e630: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
e640: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
e650: 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62 4e 65  bNewTerm ) *pbNe
e660: 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20 20 20  wTerm = 1;.     
e670: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
e680: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
e690: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
e6a0: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
e6b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e6c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64  .    }.  }.}..#d
e6d0: 65 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c  efine SWAPVAL(T,
e6e0: 20 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20   a, b) { T tmp; 
e6f0: 74 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d  tmp=a; a=b; b=tm
e700: 70 3b 20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72  p; }../*.** Iter
e710: 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
e720: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
e730: 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 69  he first rowid i
e740: 6e 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69  n a doclist. Thi
e750: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65  s.** function se
e760: 74 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ts the iterator 
e770: 75 70 20 73 6f 20 74 68 61 74 20 69 74 65 72 61  up so that itera
e780: 74 65 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f  tes in reverse o
e790: 72 64 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20  rder through.** 
e7a0: 74 68 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a  the doclist..*/.
e7b0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e7c0: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 28 46  SegIterReverse(F
e7d0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
e7e0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29  5SegIter *pIter)
e7f0: 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
e800: 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
e810: 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73  r->pDlidx;.  Fts
e820: 35 44 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30  5Data *pLast = 0
e830: 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74  ;.  int pgnoLast
e840: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c   = 0;..  if( pDl
e850: 69 64 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  idx ){.    int i
e860: 53 65 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70  Segid = pIter->p
e870: 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
e880: 20 70 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35   pgnoLast = fts5
e890: 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44  DlidxIterPgno(pD
e8a0: 6c 69 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74  lidx);.    pLast
e8b0: 20 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28   = fts5DataRead(
e8c0: 70 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f  p, FTS5_SEGMENT_
e8d0: 52 4f 57 49 44 28 69 53 65 67 69 64 2c 20 70 67  ROWID(iSegid, pg
e8e0: 6e 6f 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73  noLast));.  }els
e8f0: 65 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  e{.    Fts5Data 
e900: 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  *pLeaf = pIter->
e910: 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f  pLeaf;         /
e920: 2a 20 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64  * Current leaf d
e930: 61 74 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  ata */..    /* C
e940: 75 72 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65  urrently, Fts5Se
e950: 67 49 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65  gIter.iLeafOffse
e960: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
e970: 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a 20 20  first byte of.  
e980: 20 20 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69    ** position-li
e990: 73 74 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74  st content for t
e9a0: 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64  he current rowid
e9b0: 2e 20 42 61 63 6b 20 69 74 20 75 70 20 73 6f 20  . Back it up so 
e9c0: 74 68 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 70  that it.    ** p
e9d0: 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61  oints to the sta
e9e0: 72 74 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69  rt of the positi
e9f0: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
ea00: 6c 64 2e 20 2a 2f 0a 20 20 20 20 70 49 74 65 72  ld. */.    pIter
ea10: 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 2d 3d  ->iLeafOffset -=
ea20: 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56   sqlite3Fts5GetV
ea30: 61 72 69 6e 74 4c 65 6e 28 70 49 74 65 72 2d 3e  arintLen(pIter->
ea40: 6e 50 6f 73 2a 32 2b 70 49 74 65 72 2d 3e 62 44  nPos*2+pIter->bD
ea50: 65 6c 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  el);..    /* If 
ea60: 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  this condition i
ea70: 73 20 74 72 75 65 20 74 68 65 6e 20 74 68 65 20  s true then the 
ea80: 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20 66 6f  largest rowid fo
ea90: 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  r the current.  
eaa0: 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20 6e 6f    ** term may no
eab0: 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e 20 74  t be stored on t
eac0: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e  he current page.
ead0: 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72 77 61   So search forwa
eae0: 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73 65 65  rd to.    ** see
eaf0: 20 77 68 65 72 65 20 73 61 69 64 20 72 6f 77 69   where said rowi
eb00: 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20 2a 2f  d really is.  */
eb10: 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
eb20: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e 3d 70  iEndofDoclist>=p
eb30: 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
eb40: 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f 3b 0a        int pgno;.
eb50: 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
eb60: 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
eb70: 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67 3b 0a   = pIter->pSeg;.
eb80: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 61  .      /* The la
eb90: 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68 65 20  st rowid in the 
eba0: 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f 74 20  doclist may not 
ebb0: 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e  be on the curren
ebc0: 74 20 70 61 67 65 2e 20 53 65 61 72 63 68 0a 20  t page. Search. 
ebd0: 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72 64 20       ** forward 
ebe0: 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61 67 65  to find the page
ebf0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
ec00: 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a 2f 0a  last rowid.  */.
ec10: 20 20 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 70        for(pgno=p
ec20: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2b  Iter->iLeafPgno+
ec30: 31 3b 20 21 70 2d 3e 72 63 20 26 26 20 70 67 6e  1; !p->rc && pgn
ec40: 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  o<=pSeg->pgnoLas
ec50: 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20  t; pgno++){.    
ec60: 20 20 20 20 69 36 34 20 69 41 62 73 20 3d 20 46      i64 iAbs = F
ec70: 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
ec80: 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20  D(pSeg->iSegid, 
ec90: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 46  pgno);.        F
eca0: 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20 3d 20  ts5Data *pNew = 
ecb0: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
ecc0: 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iAbs);.        i
ecd0: 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20  f( pNew ){.     
ece0: 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 2c       int iRowid,
ecf0: 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20 20 20   bTermless;.    
ed00: 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66        iRowid = f
ed10: 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
ed20: 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20 20 20  dOff(pNew);.    
ed30: 20 20 20 20 20 20 62 54 65 72 6d 6c 65 73 73 20        bTermless 
ed40: 3d 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d  = fts5LeafIsTerm
ed50: 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20 20 20 20  less(pNew);.    
ed60: 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69 64        if( iRowid
ed70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ed80: 53 57 41 50 56 41 4c 28 46 74 73 35 44 61 74 61  SWAPVAL(Fts5Data
ed90: 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74 29 3b  *, pNew, pLast);
eda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 67 6e  .            pgn
edb0: 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a 20 20  oLast = pgno;.  
edc0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
edd0: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
ede0: 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ase(pNew);.     
edf0: 20 20 20 20 20 69 66 28 20 62 54 65 72 6d 6c 65       if( bTermle
ee00: 73 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ss==0 ) break;. 
ee10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
ee20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ee30: 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e 55 4c   If pLast is NUL
ee40: 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  L at this point,
ee50: 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
ee60: 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 64 6f  owid for this do
ee70: 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65 73 20  clist.  ** lies 
ee80: 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75 72 72  on the page curr
ee90: 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65 64 20  ently indicated 
eea0: 62 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 2e  by the iterator.
eeb0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 0a 20   In this case . 
eec0: 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65 61 66   ** pIter->iLeaf
eed0: 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65 61 64  Offset is alread
eee0: 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  y set to point t
eef0: 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  o the position-l
ef00: 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20 66 69  ist size.  ** fi
ef10: 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64 20 77  eld associated w
ef20: 69 74 68 20 74 68 65 20 66 69 72 73 74 20 72 65  ith the first re
ef30: 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f 6e 20  levant rowid on 
ef40: 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a 0a 20  the page..  **. 
ef50: 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61 73 74   ** Or, if pLast
ef60: 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
ef70: 65 6e 20 69 74 20 69 73 20 74 68 65 20 70 61 67  en it is the pag
ef80: 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
ef90: 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20 72 6f  the last.  ** ro
efa0: 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73  wid. In this cas
efb0: 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20  e configure the 
efc0: 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68 61 74  iterator so that
efd0: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
efe0: 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72 6f 77  e.  ** first row
eff0: 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67 65 2e  id on this page.
f000: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c 61 73  .  */.  if( pLas
f010: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  t ){.    int iOf
f020: 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  f;.    fts5DataR
f030: 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4c  elease(pIter->pL
f040: 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  eaf);.    pIter-
f050: 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74 3b 0a  >pLeaf = pLast;.
f060: 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66      pIter->iLeaf
f070: 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73 74 3b  Pgno = pgnoLast;
f080: 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74 73 35  .    iOff = fts5
f090: 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66  LeafFirstRowidOf
f0a0: 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20 69 4f  f(pLast);.    iO
f0b0: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
f0c0: 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b 69 4f  int(&pLast->p[iO
f0d0: 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74 65  ff], (u64*)&pIte
f0e0: 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  r->iRowid);.    
f0f0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f100: 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20  et = iOff;..    
f110: 69 66 28 20 66 74 73 35 4c 65 61 66 49 73 54 65  if( fts5LeafIsTe
f120: 72 6d 6c 65 73 73 28 70 4c 61 73 74 29 20 29 7b  rmless(pLast) ){
f130: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45  .      pIter->iE
f140: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c  ndofDoclist = pL
f150: 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d  ast->nn+1;.    }
f160: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 74 65  else{.      pIte
f170: 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
f180: 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
f190: 54 65 72 6d 4f 66 66 28 70 4c 61 73 74 29 3b 0a  TermOff(pLast);.
f1a0: 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20 66 74      }..  }..  ft
f1b0: 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
f1c0: 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
f1d0: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65  r);.}../*.** Ite
f1e0: 72 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72  rator pIter curr
f1f0: 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
f200: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
f210: 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a 2a 2a  of a doclist..**
f220: 20 54 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   There is a docl
f230: 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f 63 69  ist-index associ
f240: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 66 69  ated with the fi
f250: 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  nal term on the 
f260: 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61 67 65  current .** page
f270: 2e 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  . If the current
f280: 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73   term is the las
f290: 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20 70 61  t term on the pa
f2a0: 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a 2a 2a  ge, load the .**
f2b0: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66   doclist-index f
f2c0: 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69 6e 69  rom disk and ini
f2d0: 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65 72 61  tialize an itera
f2e0: 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d 3e 70  tor at (pIter->p
f2f0: 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61 74 69  Dlidx)..*/.stati
f300: 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
f310: 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74 73 35  erLoadDlidx(Fts5
f320: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65  Index *p, Fts5Se
f330: 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  gIter *pIter){. 
f340: 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49 74 65   int iSeg = pIte
f350: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 3b  r->pSeg->iSegid;
f360: 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28 70  .  int bRev = (p
f370: 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
f380: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
f390: 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74 61 20  SE);.  Fts5Data 
f3a0: 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e  *pLeaf = pIter->
f3b0: 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72 65 6e  pLeaf; /* Curren
f3c0: 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 0a  t leaf data */..
f3d0: 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
f3e0: 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53 45  >flags & FTS5_SE
f3f0: 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29 3b  GITER_ONETERM );
f400: 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
f410: 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b 0a 0a  ->pDlidx==0 );..
f420: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
f430: 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69 73  e current doclis
f440: 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73 20 70  t ends on this p
f450: 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  age. If it does,
f460: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65 61 72   return.  ** ear
f470: 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61 64 69  ly without loadi
f480: 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  ng the doclist-i
f490: 6e 64 65 78 20 28 61 73 20 69 74 20 62 65 6c 6f  ndex (as it belo
f4a0: 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65 72 65  ngs to a differe
f4b0: 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20 2a 2f  nt.  ** term. */
f4c0: 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54  .  if( pIter->iT
f4d0: 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70 49 74  ermLeafPgno==pIt
f4e0: 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 0a 20  er->iLeafPgno . 
f4f0: 20 20 26 26 20 70 49 74 65 72 2d 3e 69 45 6e 64    && pIter->iEnd
f500: 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61 66 2d  ofDoclist<pLeaf-
f510: 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a 20 20  >szLeaf .  ){.  
f520: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
f530: 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 3d   pIter->pDlidx =
f540: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
f550: 69 74 28 70 2c 20 62 52 65 76 2c 20 69 53 65 67  it(p, bRev, iSeg
f560: 2c 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65  , pIter->iTermLe
f570: 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 23 64 65 66  afPgno);.}..#def
f580: 69 6e 65 20 66 74 73 35 49 6e 64 65 78 47 65 74  ine fts5IndexGet
f590: 56 61 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66  Varint32(a, iOff
f5a0: 2c 20 6e 56 61 6c 29 20 7b 20 20 20 20 20 5c 0a  , nVal) {     \.
f5b0: 20 20 6e 56 61 6c 20 3d 20 28 61 29 5b 69 4f 66    nVal = (a)[iOf
f5c0: 66 2b 2b 5d 3b 20 20 20 20 20 20 20 20 20 20 20  f++];           
f5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5e0: 20 20 5c 0a 20 20 69 66 28 20 6e 56 61 6c 20 26    \.  if( nVal &
f5f0: 20 30 78 38 30 20 29 7b 20 20 20 20 20 20 20 20   0x80 ){        
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 20 20 20 5c 0a 20 20 20 20 69 4f 66 66        \.    iOff
f620: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
f630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f640: 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
f650: 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
f660: 61 72 69 6e 74 33 32 28 26 28 61 29 5b 69 4f 66  arint32(&(a)[iOf
f670: 66 5d 2c 20 6e 56 61 6c 29 3b 20 20 20 20 5c 0a  f], nVal);    \.
f680: 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20    }             
f690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f6b0: 20 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66    \.}..#define f
f6c0: 74 73 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69  ts5IndexSkipVari
f6d0: 6e 74 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20  nt(a, iOff) {   
f6e0: 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74           \.  int
f6f0: 20 69 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20   iEnd = iOff+9; 
f700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
f720: 20 77 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b   while( (a[iOff+
f730: 2b 5d 20 26 20 30 78 38 30 29 20 26 26 20 69 4f  +] & 0x80) && iO
f740: 66 66 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20  ff<iEnd );      
f750: 20 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20   \.}../*.** The 
f760: 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63 74 20  iterator object 
f770: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
f780: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 75  cond argument cu
f790: 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
f7a0: 0a 2a 2a 20 6e 6f 20 76 61 6c 69 64 20 76 61 6c  .** no valid val
f7b0: 75 65 73 20 65 78 63 65 70 74 20 66 6f 72 20 74  ues except for t
f7c0: 68 65 20 46 74 73 35 53 65 67 49 74 65 72 2e 70  he Fts5SegIter.p
f7d0: 4c 65 61 66 20 6d 65 6d 62 65 72 20 76 61 72 69  Leaf member vari
f7e0: 61 62 6c 65 2e 20 54 68 69 73 0a 2a 2a 20 66 75  able. This.** fu
f7f0: 6e 63 74 69 6f 6e 20 73 65 61 72 63 68 65 73 20  nction searches 
f800: 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 66 6f  the leaf page fo
f810: 72 20 61 20 74 65 72 6d 20 6d 61 74 63 68 69 6e  r a term matchin
f820: 67 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e  g (pTerm/nTerm).
f830: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 70  .**.** If the sp
f840: 65 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20  ecified term is 
f850: 66 6f 75 6e 64 20 6f 6e 20 74 68 65 20 70 61 67  found on the pag
f860: 65 2c 20 74 68 65 6e 20 74 68 65 20 69 74 65 72  e, then the iter
f870: 61 74 6f 72 20 69 73 20 6c 65 66 74 0a 2a 2a 20  ator is left.** 
f880: 70 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 20  pointing to it. 
f890: 49 66 20 61 72 67 75 6d 65 6e 74 20 62 47 65 20  If argument bGe 
f8a0: 69 73 20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  is zero and the 
f8b0: 74 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e  term is not foun
f8c0: 64 2c 0a 2a 2a 20 74 68 65 20 69 74 65 72 61 74  d,.** the iterat
f8d0: 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
f8e0: 69 6e 67 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ing at EOF..**.*
f8f0: 2a 20 49 66 20 62 47 65 20 69 73 20 6e 6f 6e 2d  * If bGe is non-
f900: 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 73 70 65  zero and the spe
f910: 63 69 66 69 65 64 20 74 65 72 6d 20 69 73 20 6e  cified term is n
f920: 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74  ot found, then t
f930: 68 65 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69  he.** iterator i
f940: 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
f950: 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  to the smallest 
f960: 74 65 72 6d 20 69 6e 20 74 68 65 20 73 65 67 6d  term in the segm
f970: 65 6e 74 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c  ent that.** is l
f980: 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 73  arger than the s
f990: 70 65 63 69 66 69 65 64 20 74 65 72 6d 2c 20 65  pecified term, e
f9a0: 76 65 6e 20 69 66 20 74 68 69 73 20 74 65 72 6d  ven if this term
f9b0: 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 0a 2a   is not on the.*
f9c0: 2a 20 63 75 72 72 65 6e 74 20 70 61 67 65 2e 0a  * current page..
f9d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
f9e0: 74 73 35 4c 65 61 66 53 65 65 6b 28 0a 20 20 46  ts5LeafSeek(.  F
f9f0: 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
fa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fa10: 2a 20 4c 65 61 76 65 20 61 6e 79 20 65 72 72 6f  * Leave any erro
fa20: 72 20 63 6f 64 65 20 68 65 72 65 20 2a 2f 0a 20  r code here */. 
fa30: 20 69 6e 74 20 62 47 65 2c 20 20 20 20 20 20 20   int bGe,       
fa40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa50: 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 3e   /* True for a >
fa60: 3d 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 46 74  = search */.  Ft
fa70: 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
fa80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
fa90: 20 49 74 65 72 61 74 6f 72 20 74 6f 20 73 65 65   Iterator to see
faa0: 6b 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20  k */.  const u8 
fab0: 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72  *pTerm, int nTer
fac0: 6d 20 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74  m      /* Term t
fad0: 6f 20 73 65 61 72 63 68 20 66 6f 72 20 2a 2f 0a  o search for */.
fae0: 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20  ){.  int iOff;. 
faf0: 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20 70   const u8 *a = p
fb00: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
fb10: 20 20 69 6e 74 20 73 7a 4c 65 61 66 20 3d 20 70    int szLeaf = p
fb20: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
fb30: 65 61 66 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  eaf;.  int n = p
fb40: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b  Iter->pLeaf->nn;
fb50: 0a 0a 20 20 69 6e 74 20 6e 4d 61 74 63 68 20 3d  ..  int nMatch =
fb60: 20 30 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20   0;.  int nKeep 
fb70: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20  = 0;.  int nNew 
fb80: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 54 65 72 6d  = 0;.  int iTerm
fb90: 4f 66 66 3b 0a 20 20 69 6e 74 20 69 50 67 69 64  Off;.  int iPgid
fba0: 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
fbb0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
fbc0: 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69 64  t offset in pgid
fbd0: 78 20 2a 2f 0a 20 20 69 6e 74 20 62 45 6e 64 4f  x */.  int bEndO
fbe0: 66 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 61 73  fPage = 0;..  as
fbf0: 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
fc00: 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 50 67  ITE_OK );..  iPg
fc10: 69 64 78 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20  idx = szLeaf;.  
fc20: 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47 65  iPgidx += fts5Ge
fc30: 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67  tVarint32(&a[iPg
fc40: 69 64 78 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b  idx], iTermOff);
fc50: 0a 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f  .  iOff = iTermO
fc60: 66 66 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20  ff;..  while( 1 
fc70: 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72  ){..    /* Figur
fc80: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 6e  e out how many n
fc90: 65 77 20 62 79 74 65 73 20 61 72 65 20 69 6e 20  ew bytes are in 
fca0: 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
fcb0: 20 66 74 73 35 49 6e 64 65 78 47 65 74 56 61 72   fts5IndexGetVar
fcc0: 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20 6e  int32(a, iOff, n
fcd0: 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e 4b  New);.    if( nK
fce0: 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20 20  eep<nMatch ){.  
fcf0: 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68 5f      goto search_
fd00: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
fd10: 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65 70     assert( nKeep
fd20: 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20 20  >=nMatch );.    
fd30: 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74 63  if( nKeep==nMatc
fd40: 68 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  h ){.      int n
fd50: 43 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Cmp;.      int i
fd60: 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20 4d  ;.      nCmp = M
fd70: 49 4e 28 6e 4e 65 77 2c 20 6e 54 65 72 6d 2d 6e  IN(nNew, nTerm-n
fd80: 4d 61 74 63 68 29 3b 0a 20 20 20 20 20 20 66 6f  Match);.      fo
fd90: 72 28 69 3d 30 3b 20 69 3c 6e 43 6d 70 3b 20 69  r(i=0; i<nCmp; i
fda0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
fdb0: 20 61 5b 69 4f 66 66 2b 69 5d 21 3d 70 54 65 72   a[iOff+i]!=pTer
fdc0: 6d 5b 6e 4d 61 74 63 68 2b 69 5d 20 29 20 62 72  m[nMatch+i] ) br
fdd0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
fde0: 20 20 20 6e 4d 61 74 63 68 20 2b 3d 20 69 3b 0a     nMatch += i;.
fdf0: 0a 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d  .      if( nTerm
fe00: 3d 3d 6e 4d 61 74 63 68 20 29 7b 0a 20 20 20 20  ==nMatch ){.    
fe10: 20 20 20 20 69 66 28 20 69 3d 3d 6e 4e 65 77 20      if( i==nNew 
fe20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
fe30: 6f 20 73 65 61 72 63 68 5f 73 75 63 63 65 73 73  o search_success
fe40: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
fe50: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
fe60: 73 65 61 72 63 68 5f 66 61 69 6c 65 64 3b 0a 20  search_failed;. 
fe70: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
fe80: 65 6c 73 65 20 69 66 28 20 69 3c 6e 4e 65 77 20  else if( i<nNew 
fe90: 26 26 20 61 5b 69 4f 66 66 2b 69 5d 3e 70 54 65  && a[iOff+i]>pTe
fea0: 72 6d 5b 6e 4d 61 74 63 68 5d 20 29 7b 0a 20 20  rm[nMatch] ){.  
feb0: 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
fec0: 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
fed0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
fee0: 20 69 50 67 69 64 78 3e 3d 6e 20 29 7b 0a 20 20   iPgidx>=n ){.  
fef0: 20 20 20 20 62 45 6e 64 4f 66 50 61 67 65 20 3d      bEndOfPage =
ff00: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
ff10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 50 67 69  .    }..    iPgi
ff20: 64 78 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  dx += fts5GetVar
ff30: 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 5d  int32(&a[iPgidx]
ff40: 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 69 54  , nKeep);.    iT
ff50: 65 72 6d 4f 66 66 20 2b 3d 20 6e 4b 65 65 70 3b  ermOff += nKeep;
ff60: 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
ff70: 6d 4f 66 66 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  mOff;..    /* Re
ff80: 61 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65  ad the nKeep fie
ff90: 6c 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74  ld of the next t
ffa0: 65 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35  erm. */.    fts5
ffb0: 49 6e 64 65 78 47 65 74 56 61 72 69 6e 74 33 32  IndexGetVarint32
ffc0: 28 61 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29  (a, iOff, nKeep)
ffd0: 3b 0a 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66  ;.  }.. search_f
ffe0: 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65  ailed:.  if( bGe
fff0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44  ==0 ){.    fts5D
10000 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
10010 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  ->pLeaf);.    pI
10020 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a  ter->pLeaf = 0;.
10030 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65      return;.  }e
10040 6c 73 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61  lse if( bEndOfPa
10050 67 65 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  ge ){.    do {. 
10060 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
10070 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74 65  NextPage(p, pIte
10080 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  r);.      if( pI
10090 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20  ter->pLeaf==0 ) 
100a0 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20  return;.      a 
100b0 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
100c0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  p;.      if( fts
100d0 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28  5LeafIsTermless(
100e0 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30  pIter->pLeaf)==0
100f0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
10100 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74  GetVarint32(&pIt
10110 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 49 74  er->pLeaf->p[pIt
10120 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  er->pLeaf->szLea
10130 66 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20  f], iOff);.     
10140 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
10150 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c   iOff>=pIter->pL
10160 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
10170 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
10180 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
10190 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
101a0 20 20 20 20 20 20 20 20 6e 4b 65 65 70 20 3d 20          nKeep = 
101b0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66  0;.          iOf
101c0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
101d0 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e  nt32(&a[iOff], n
101e0 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20  New);.          
101f0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
10200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68  .      }.    }wh
10210 69 6c 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20  ile( 1 );.  }.. 
10220 73 65 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a  search_success:.
10230 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  .  pIter->iLeafO
10240 66 66 73 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e  ffset = iOff + n
10250 4e 65 77 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54  New;.  pIter->iT
10260 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ermLeafOffset = 
10270 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10280 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65  et;.  pIter->iTe
10290 72 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74  rmLeafPgno = pIt
102a0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a  er->iLeafPgno;..
102b0 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
102c0 26 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e  &p->rc, &pIter->
102d0 74 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65  term, nKeep, pTe
102e0 72 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  rm);.  fts5Buffe
102f0 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
10300 72 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d  rc, &pIter->term
10310 2c 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d  , nNew, &a[iOff]
10320 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78  );..  if( iPgidx
10330 3e 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >=n ){.    pIter
10340 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
10350 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
10360 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
10370 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
10380 20 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73     iPgidx += fts
10390 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
103a0 69 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29  iPgidx], nExtra)
103b0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e  ;.    pIter->iEn
103c0 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65  dofDoclist = iTe
103d0 72 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a  rmOff + nExtra;.
103e0 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67    }.  pIter->iPg
103f0 69 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b  idxOff = iPgidx;
10400 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c  ..  fts5SegIterL
10410 6f 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65  oadRowid(p, pIte
10420 72 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65  r);.  fts5SegIte
10430 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
10440 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  er);.}../*.** In
10450 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a  itialize the obj
10460 65 63 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69  ect pIter to poi
10470 6e 74 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d  nt to term pTerm
10480 2f 6e 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65  /nTerm within se
10490 67 6d 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49  gment.** pSeg. I
104a0 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
104b0 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69  ch term in the i
104c0 6e 64 65 78 2c 20 74 68 65 20 69 74 65 72 61 74  ndex, the iterat
104d0 6f 72 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46  or is set to EOF
104e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
104f0 72 6f 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35  ror occurs, Fts5
10500 49 6e 64 65 78 2e 72 63 20 69 73 20 73 65 74 20  Index.rc is set 
10510 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  to an appropriat
10520 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66  e error code. If
10530 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61   .** an error ha
10540 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
10550 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
10560 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
10570 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
10580 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
10590 74 73 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e  ts5SegIterSeekIn
105a0 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  it(.  Fts5Index 
105b0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
105c0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
105d0 63 6b 65 6e 64 20 2a 2f 0a 20 20 46 74 73 35 42  ckend */.  Fts5B
105e0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20  uffer *pBuf,    
105f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
10600 66 66 65 72 20 74 6f 20 75 73 65 20 66 6f 72 20  ffer to use for 
10610 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
10620 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65  .  const u8 *pTe
10630 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20  rm, int nTerm,  
10640 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65     /* Term to se
10650 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 66  ek to */.  int f
10660 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
10670 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
10680 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58 5f  sk of FTS5INDEX_
10690 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 46  XXX flags */.  F
106a0 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
106b0 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
106c0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
106d0 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74   segment */.  Ft
106e0 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72  s5SegIter *pIter
106f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10700 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c   Object to popul
10710 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ate */.){.  int 
10720 69 50 67 20 3d 20 31 3b 0a 20 20 69 6e 74 20 62  iPg = 1;.  int b
10730 47 65 20 3d 20 28 66 6c 61 67 73 20 26 20 46 54  Ge = (flags & FT
10740 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
10750 41 4e 29 3b 0a 20 20 69 6e 74 20 62 44 6c 69 64  AN);.  int bDlid
10760 78 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  x = 0;          
10770 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
10780 66 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63  f there is a doc
10790 6c 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20  list-index */.. 
107a0 20 73 74 61 74 69 63 20 69 6e 74 20 6e 43 61 6c   static int nCal
107b0 6c 20 3d 20 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b  l = 0;.  nCall++
107c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62 47 65  ;..  assert( bGe
107d0 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20 26 20  ==0 || (flags & 
107e0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
107f0 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20 61 73  DESC)==0 );.  as
10800 73 65 72 74 28 20 70 54 65 72 6d 20 26 26 20 6e  sert( pTerm && n
10810 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73 65 74  Term );.  memset
10820 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  (pIter, 0, sizeo
10830 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 70 49  f(*pIter));.  pI
10840 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53 65 67  ter->pSeg = pSeg
10850 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f  ;..  /* This blo
10860 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20 76 61  ck sets stack va
10870 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20 74 68  riable iPg to th
10880 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  e leaf page numb
10890 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20 2a 2a  er that may.  **
108a0 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20 28 70   contain term (p
108b0 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69 66 20  Term/nTerm), if 
108c0 69 74 20 69 73 20 70 72 65 73 65 6e 74 20 69 6e  it is present in
108d0 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20 2a 2f   the segment. */
108e0 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 53 65  .  if( p->pIdxSe
108f0 6c 65 63 74 3d 3d 30 20 29 7b 0a 20 20 20 20 46  lect==0 ){.    F
10900 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
10910 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
10920 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
10930 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
10940 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 73 71 6c  >pIdxSelect, sql
10950 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
10960 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
10970 70 67 6e 6f 20 46 52 4f 4d 20 27 25 71 27 2e 27  pgno FROM '%q'.'
10980 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 22 0a  %q_idx' WHERE ".
10990 20 20 20 20 20 20 20 20 20 20 22 73 65 67 69 64            "segid
109a0 3d 3f 20 41 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f  =? AND term<=? O
109b0 52 44 45 52 20 42 59 20 74 65 72 6d 20 44 45 53  RDER BY term DES
109c0 43 20 4c 49 4d 49 54 20 31 22 2c 0a 20 20 20 20  C LIMIT 1",.    
109d0 20 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a        pConfig->z
109e0 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61  Db, pConfig->zNa
109f0 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 20  me.    ));.  }. 
10a00 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74   if( p->rc ) ret
10a10 75 72 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  urn;.  sqlite3_b
10a20 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 53  ind_int(p->pIdxS
10a30 65 6c 65 63 74 2c 20 31 2c 20 70 53 65 67 2d 3e  elect, 1, pSeg->
10a40 69 53 65 67 69 64 29 3b 0a 20 20 73 71 6c 69 74  iSegid);.  sqlit
10a50 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e  e3_bind_blob(p->
10a60 70 49 64 78 53 65 6c 65 63 74 2c 20 32 2c 20 70  pIdxSelect, 2, p
10a70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 53 51 4c  Term, nTerm, SQL
10a80 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69  ITE_STATIC);.  i
10a90 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
10aa0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
10ab0 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  IdxSelect) ){.  
10ac0 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69    i64 val = sqli
10ad0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
10ae0 2d 3e 70 49 64 78 53 65 6c 65 63 74 2c 20 30 29  ->pIdxSelect, 0)
10af0 3b 0a 20 20 20 20 69 50 67 20 3d 20 28 69 6e 74  ;.    iPg = (int
10b00 29 28 76 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62  )(val>>1);.    b
10b10 44 6c 69 64 78 20 3d 20 28 76 61 6c 20 26 20 30  Dlidx = (val & 0
10b20 78 30 30 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d  x0001);.  }.  p-
10b30 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  >rc = sqlite3_re
10b40 73 65 74 28 70 2d 3e 70 49 64 78 53 65 6c 65 63  set(p->pIdxSelec
10b50 74 29 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70  t);..  if( iPg<p
10b60 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29  Seg->pgnoFirst )
10b70 7b 0a 20 20 20 20 69 50 67 20 3d 20 70 53 65 67  {.    iPg = pSeg
10b80 2d 3e 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20  ->pgnoFirst;.   
10b90 20 62 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d   bDlidx = 0;.  }
10ba0 0a 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  ..  pIter->iLeaf
10bb0 50 67 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a  Pgno = iPg - 1;.
10bc0 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78    fts5SegIterNex
10bd0 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b  tPage(p, pIter);
10be0 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70  ..  if( pIter->p
10bf0 4c 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35  Leaf ){.    fts5
10c00 4c 65 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c  LeafSeek(p, bGe,
10c10 20 70 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e   pIter, pTerm, n
10c20 54 65 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Term);.  }..  if
10c30 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
10c40 4f 4b 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a  OK && bGe==0 ){.
10c50 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
10c60 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
10c70 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66  _ONETERM;.    if
10c80 28 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29  ( pIter->pLeaf )
10c90 7b 0a 20 20 20 20 20 20 69 66 28 20 66 6c 61 67  {.      if( flag
10ca0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
10cb0 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
10cc0 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
10cd0 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
10ce0 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
10cf0 7d 0a 20 20 20 20 20 20 69 66 28 20 62 44 6c 69  }.      if( bDli
10d00 64 78 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74  dx ){.        ft
10d10 73 35 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69  s5SegIterLoadDli
10d20 64 78 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  dx(p, pIter);.  
10d30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10d40 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
10d50 58 5f 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a  X_QUERY_DESC ){.
10d60 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
10d70 74 65 72 52 65 76 65 72 73 65 28 70 2c 20 70 49  terReverse(p, pI
10d80 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
10d90 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69    }.  }..  /* Ei
10da0 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ther:.  **.  ** 
10db0 20 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61    1) an error ha
10dc0 73 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20  s occurred, or. 
10dd0 20 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65   **   2) the ite
10de0 72 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20  rator points to 
10df0 45 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33  EOF, or.  **   3
10e00 29 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  ) the iterator p
10e10 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
10e20 79 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65  y with term (pTe
10e30 72 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20  rm/nTerm), or.  
10e40 2a 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35  **   4) the FTS5
10e50 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e  INDEX_QUERY_SCAN
10e60 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e   flag was set an
10e70 64 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70  d the iterator p
10e80 6f 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20  oints.  **      
10e90 74 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68  to an entry with
10ea0 20 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20   a term greater 
10eb0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
10ec0 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a   (pTerm/nTerm)..
10ed0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
10ee0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
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 20 2f 2a 20 31 20 2a 2f           /* 1 */
10f20 0a 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c  .   || pIter->pL
10f30 65 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20  eaf==0          
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f60 20 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20       /* 2 */.   
10f70 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d  || fts5BufferCom
10f80 70 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d  pareBlob(&pIter-
10f90 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54  >term, pTerm, nT
10fa0 65 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20  erm)==0         
10fb0 20 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28   /* 3 */.   || (
10fc0 62 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65  bGe && fts5Buffe
10fd0 72 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49  rCompareBlob(&pI
10fe0 74 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d  ter->term, pTerm
10ff0 2c 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20  , nTerm)>0)  /* 
11000 34 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a  4 */.  );.}../*.
11010 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
11020 65 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74  e object pIter t
11030 6f 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20  o point to term 
11040 70 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68  pTerm/nTerm with
11050 69 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d  in the.** in-mem
11060 6f 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20  ory hash table. 
11070 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73  If there is no s
11080 75 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20  uch term in the 
11090 68 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20  hash-table, the 
110a0 0a 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20  .** iterator is 
110b0 73 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a  set to EOF..**.*
110c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
110d0 63 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e  curs, Fts5Index.
110e0 72 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20  rc is set to an 
110f0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
11100 72 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61  r code. If .** a
11110 6e 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65  n error has alre
11120 61 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65  ady occurred whe
11130 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
11140 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  is called, it is
11150 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
11160 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
11170 49 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20  IterHashInit(.  
11180 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111a0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
111b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70  */.  const u8 *p
111c0 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c  Term, int nTerm,
111d0 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20       /* Term to 
111e0 73 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  seek to */.  int
111f0 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
11200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11210 4d 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45  Mask of FTS5INDE
11220 58 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  X_XXX flags */. 
11230 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
11240 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20  ter             
11250 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f   /* Object to po
11260 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63  pulate */.){.  c
11270 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d  onst u8 *pList =
11280 20 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20   0;.  int nList 
11290 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  = 0;.  const u8 
112a0 2a 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20  *z = 0;.  int n 
112b0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
112c0 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73  p->pHash );.  as
112d0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
112e0 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28  ITE_OK );..  if(
112f0 20 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c   pTerm==0 || (fl
11300 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
11310 51 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20  QUERY_SCAN) ){. 
11320 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
11330 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e  e3Fts5HashScanIn
11340 69 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f  it(p->pHash, (co
11350 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c  nst char*)pTerm,
11360 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c   nTerm);.    sql
11370 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
11380 45 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20  Entry(p->pHash, 
11390 28 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a  (const char**)&z
113a0 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
113b0 29 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20  );.    n = (z ? 
113c0 73 74 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68  strlen((const ch
113d0 61 72 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 7d  ar*)z) : 0);.  }
113e0 65 6c 73 65 7b 0a 20 20 20 20 70 49 74 65 72 2d  else{.    pIter-
113f0 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35 5f 53  >flags |= FTS5_S
11400 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a  EGITER_ONETERM;.
11410 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48      sqlite3Fts5H
11420 61 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73  ashQuery(p->pHas
11430 68 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  h, (const char*)
11440 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 26 70  pTerm, nTerm, &p
11450 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20  List, &nList);. 
11460 20 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20     z = pTerm;.  
11470 20 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 7d    n = nTerm;.  }
11480 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ..  if( pList ){
11490 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
114a0 4c 65 61 66 3b 0a 20 20 20 20 73 71 6c 69 74 65  Leaf;.    sqlite
114b0 33 46 74 73 35 42 75 66 66 65 72 53 65 74 28 26  3Fts5BufferSet(&
114c0 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
114d0 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a 20 20 20 20  erm, n, z);.    
114e0 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64 78 4d  pLeaf = fts5IdxM
114f0 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28  alloc(p, sizeof(
11500 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20 20 20  Fts5Data));.    
11510 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 72  if( pLeaf==0 ) r
11520 65 74 75 72 6e 3b 0a 20 20 20 20 70 4c 65 61 66  eturn;.    pLeaf
11530 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74  ->p = (u8*)pList
11540 3b 0a 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20  ;.    pLeaf->nn 
11550 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20  = pLeaf->szLeaf 
11560 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74  = nList;.    pIt
11570 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61  er->pLeaf = pLea
11580 66 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  f;.    pIter->iL
11590 65 61 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35  eafOffset = fts5
115a0 47 65 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d  GetVarint(pLeaf-
115b0 3e 70 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  >p, (u64*)&pIter
115c0 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70  ->iRowid);.    p
115d0 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
115e0 69 73 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 2b  ist = pLeaf->nn+
115f0 31 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c 61 67  1;..    if( flag
11600 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
11610 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20  ERY_DESC ){.    
11620 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
11630 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
11640 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 66 74  EVERSE;.      ft
11650 73 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65  s5SegIterReverse
11660 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49 74 65  InitPage(p, pIte
11670 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
11680 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
11690 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
116a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
116b0 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20  ./*.** Zero the 
116c0 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20  iterator passed 
116d0 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75  as the only argu
116e0 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ment..*/.static 
116f0 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
11700 43 6c 65 61 72 28 46 74 73 35 53 65 67 49 74 65  Clear(Fts5SegIte
11710 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 66 74 73  r *pIter){.  fts
11720 35 42 75 66 66 65 72 46 72 65 65 28 26 70 49 74  5BufferFree(&pIt
11730 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73  er->term);.  fts
11740 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49 74  5DataRelease(pIt
11750 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74  er->pLeaf);.  ft
11760 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
11770 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b  ter->pNextLeaf);
11780 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
11790 46 72 65 65 28 70 49 74 65 72 2d 3e 70 44 6c 69  Free(pIter->pDli
117a0 64 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  dx);.  sqlite3_f
117b0 72 65 65 28 70 49 74 65 72 2d 3e 61 52 6f 77 69  ree(pIter->aRowi
117c0 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73  dOffset);.  mems
117d0 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
117e0 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72 29  eof(Fts5SegIter)
117f0 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
11800 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a  ITE_DEBUG../*.**
11810 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11820 73 20 75 73 65 64 20 61 73 20 70 61 72 74 20 6f  s used as part o
11830 66 20 74 68 65 20 62 69 67 20 61 73 73 65 72 74  f the big assert
11840 28 29 20 70 72 6f 63 65 64 75 72 65 20 69 6d 70  () procedure imp
11850 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66  lemented by.** f
11860 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74  ts5AssertMultiIt
11870 65 72 53 65 74 75 70 28 29 2e 20 49 74 20 65 6e  erSetup(). It en
11880 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 72  sures that the r
11890 65 73 75 6c 74 20 63 75 72 72 65 6e 74 6c 79 20  esult currently 
118a0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52  stored.** in *pR
118b0 65 73 20 69 73 20 74 68 65 20 63 6f 72 72 65 63  es is the correc
118c0 74 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  t result of comp
118d0 61 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  aring the curren
118e0 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74  t positions of t
118f0 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65 72 61 74  he.** two iterat
11900 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ors..*/.static v
11910 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 43 6f  oid fts5AssertCo
11920 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a  mparisonResult(.
11930 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
11940 2a 70 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53  *pIter, .  Fts5S
11950 65 67 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74  egIter *p1,.  Ft
11960 73 35 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20  s5SegIter *p2,. 
11970 20 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52   Fts5CResult *pR
11980 65 73 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d  es.){.  int i1 =
11990 20 70 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65   p1 - pIter->aSe
119a0 67 3b 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32  g;.  int i2 = p2
119b0 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a   - pIter->aSeg;.
119c0 0a 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66  .  if( p1->pLeaf
119d0 20 7c 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b   || p2->pLeaf ){
119e0 0a 20 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65  .    if( p1->pLe
119f0 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  af==0 ){.      a
11a00 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
11a10 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d  rst==i2 );.    }
11a20 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65  else if( p2->pLe
11a30 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  af==0 ){.      a
11a40 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69  ssert( pRes->iFi
11a50 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d  rst==i1 );.    }
11a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
11a70 6e 4d 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74  nMin = MIN(p1->t
11a80 65 72 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e  erm.n, p2->term.
11a90 6e 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65  n);.      int re
11aa0 73 20 3d 20 6d 65 6d 63 6d 70 28 70 31 2d 3e 74  s = memcmp(p1->t
11ab0 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72 6d 2e  erm.p, p2->term.
11ac0 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20 20 20  p, nMin);.      
11ad0 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
11ae0 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20   = p1->term.n - 
11af0 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20  p2->term.n;..   
11b00 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
11b10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11b20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d   pRes->bTermEq==
11b30 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  1 );.        ass
11b40 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69 64 21  ert( p1->iRowid!
11b50 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b 0a 20  =p2->iRowid );. 
11b60 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 28 70         res = ((p
11b70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e  1->iRowid > p2->
11b80 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e  iRowid)==pIter->
11b90 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31 3b 0a  bRev) ? -1 : 1;.
11ba0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
11bb0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
11bc0 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20 29 3b  s->bTermEq==0 );
11bd0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
11be0 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
11bf0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
11c00 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20 29 3b  s->iFirst==i1 );
11c10 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
11c20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
11c30 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20 29  es->iFirst==i2 )
11c40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11c50 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
11c60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
11c70 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53 51 4c  no-op unless SQL
11c80 49 54 45 5f 44 45 42 55 47 20 69 73 20 64 65 66  ITE_DEBUG is def
11c90 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73 20 6d  ined when this m
11ca0 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f 6d 70  odule.** is comp
11cb0 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20 63 61  iled. In that ca
11cc0 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  se, this functio
11cd0 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c 6c 79  n is essentially
11ce0 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a 2a 2a   an assert() .**
11cf0 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65 64 20   statement used 
11d00 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
11d10 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
11d20 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  he pIter->aFirst
11d30 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72 65 20  [] array.** are 
11d40 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74  correct..*/.stat
11d50 69 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65  ic void fts5Asse
11d60 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
11d70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
11d80 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
11d90 74 65 72 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  ter){.  if( p->r
11da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11db0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
11dc0 2a 70 46 69 72 73 74 20 3d 20 26 70 49 74 65 72  *pFirst = &pIter
11dd0 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
11de0 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
11df0 5d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  ];.    int i;.. 
11e00 20 20 20 61 73 73 65 72 74 28 20 28 70 46 69 72     assert( (pFir
11e10 73 74 2d 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70  st->pLeaf==0)==p
11e20 49 74 65 72 2d 3e 62 45 6f 66 20 29 3b 0a 0a 20  Iter->bEof );.. 
11e30 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74     /* Check that
11e40 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52   pIter->iSwitchR
11e50 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f 72 72  owid is set corr
11e60 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 66 6f  ectly. */.    fo
11e70 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
11e80 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSeg; i++){.    
11e90 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
11ea0 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  1 = &pIter->aSeg
11eb0 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  [i];.      asser
11ec0 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20 0a 20  t( p1==pFirst . 
11ed0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 31 2d            || p1-
11ee0 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20 20 20  >pLeaf==0 .     
11ef0 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42 75 66        || fts5Buf
11f00 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46 69 72  ferCompare(&pFir
11f10 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d 3e 74  st->term, &p1->t
11f20 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20 20 20  erm) .          
11f30 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d   || p1->iRowid==
11f40 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
11f50 77 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 7c  wid.           |
11f60 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c 70 49  | (p1->iRowid<pI
11f70 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
11f80 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a  d)==pIter->bRev.
11f90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
11fa0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11fb0 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32  Iter->nSeg; i+=2
11fc0 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67  ){.      Fts5Seg
11fd0 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65  Iter *p1 = &pIte
11fe0 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20  r->aSeg[i];.    
11ff0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
12000 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67  2 = &pIter->aSeg
12010 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46 74 73  [i+1];.      Fts
12020 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
12030 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
12040 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69  (pIter->nSeg + i
12050 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20 66 74  ) / 2];.      ft
12060 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73  s5AssertComparis
12070 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20  onResult(pIter, 
12080 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20  p1, p2, pRes);. 
12090 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 3d     }..    for(i=
120a0 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e 53 65  1; i<(pIter->nSe
120b0 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b 0a 20  g / 2); i+=2){. 
120c0 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
120d0 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
120e0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
120f0 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74 20 5d  st[i*2].iFirst ]
12100 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  ;.      Fts5SegI
12110 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74 65 72  ter *p2 = &pIter
12120 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
12130 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69 46 69  First[i*2+1].iFi
12140 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46 74 73  rst ];.      Fts
12150 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
12160 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
12170 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73  i];.      fts5As
12180 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
12190 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
121a0 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
121b0 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  .  }.}.#else.# d
121c0 65 66 69 6e 65 20 66 74 73 35 41 73 73 65 72 74  efine fts5Assert
121d0 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 78  MultiIterSetup(x
121e0 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,y).#endif../*.*
121f0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
12200 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20 74 6f  son necessary to
12210 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65 72 2d   populate pIter-
12220 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a  >aFirst[iOut]..*
12230 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75  *.** If the retu
12240 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 6e 6f  rned value is no
12250 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69 74 20  n-zero, then it 
12260 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  is the index of 
12270 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e 20 74  an entry.** in t
12280 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 5d  he pIter->aSeg[]
12290 20 61 72 72 61 79 20 74 68 61 74 20 69 73 20 28   array that is (
122a0 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c 20 61  a) not at EOF, a
122b0 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e 67 0a  nd (b) pointing.
122c0 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74  ** to a key that
122d0 20 69 73 20 61 20 64 75 70 6c 69 63 61 74 65 20   is a duplicate 
122e0 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69 67 68  of another, high
122f0 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a 2a 2a  er priority, .**
12300 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61 74 6f   segment-iterato
12310 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d 3e 61  r in the pSeg->a
12320 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a  Seg[] array..*/.
12330 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d  static int fts5M
12340 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72  ultiIterDoCompar
12350 65 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  e(Fts5IndexIter 
12360 2a 70 49 74 65 72 2c 20 69 6e 74 20 69 4f 75 74  *pIter, int iOut
12370 29 7b 0a 20 20 69 6e 74 20 69 31 3b 20 20 20 20  ){.  int i1;    
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
123a0 20 6c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53   left-hand Fts5S
123b0 65 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  egIter */.  int 
123c0 69 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i2;             
123d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
123e0 6e 64 65 78 20 6f 66 20 72 69 67 68 74 2d 68 61  ndex of right-ha
123f0 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
12400 2f 0a 20 20 69 6e 74 20 69 52 65 73 3b 0a 20 20  /.  int iRes;.  
12410 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31 3b  Fts5SegIter *p1;
12420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12430 2f 2a 20 4c 65 66 74 2d 68 61 6e 64 20 46 74 73  /* Left-hand Fts
12440 35 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74  5SegIter */.  Ft
12450 73 35 53 65 67 49 74 65 72 20 2a 70 32 3b 20 20  s5SegIter *p2;  
12460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12470 20 52 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35   Right-hand Fts5
12480 53 65 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73  SegIter */.  Fts
12490 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73 20 3d  5CResult *pRes =
124a0 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b   &pIter->aFirst[
124b0 69 4f 75 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74  iOut];..  assert
124c0 28 20 69 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53  ( iOut<pIter->nS
124d0 65 67 20 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a  eg && iOut>0 );.
124e0 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
124f0 3e 62 52 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65  >bRev==0 || pIte
12500 72 2d 3e 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20  r->bRev==1 );.. 
12510 20 69 66 28 20 69 4f 75 74 3e 3d 28 70 49 74 65   if( iOut>=(pIte
12520 72 2d 3e 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20  r->nSeg/2) ){.  
12530 20 20 69 31 20 3d 20 28 69 4f 75 74 20 2d 20 70    i1 = (iOut - p
12540 49 74 65 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20  Iter->nSeg/2) * 
12550 32 3b 0a 20 20 20 20 69 32 20 3d 20 69 31 20 2b  2;.    i2 = i1 +
12560 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
12570 20 69 31 20 3d 20 70 49 74 65 72 2d 3e 61 46 69   i1 = pIter->aFi
12580 72 73 74 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72  rst[iOut*2].iFir
12590 73 74 3b 0a 20 20 20 20 69 32 20 3d 20 70 49 74  st;.    i2 = pIt
125a0 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
125b0 32 2b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d  2+1].iFirst;.  }
125c0 0a 20 20 70 31 20 3d 20 26 70 49 74 65 72 2d 3e  .  p1 = &pIter->
125d0 61 53 65 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d  aSeg[i1];.  p2 =
125e0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 32   &pIter->aSeg[i2
125f0 5d 3b 0a 0a 20 20 70 52 65 73 2d 3e 62 54 65 72  ];..  pRes->bTer
12600 6d 45 71 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  mEq = 0;.  if( p
12610 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20  1->pLeaf==0 ){  
12620 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 70           /* If p
12630 31 20 69 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20  1 is at EOF */. 
12640 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20 20     iRes = i2;.  
12650 7d 65 6c 73 65 20 69 66 28 20 70 32 2d 3e 70 4c  }else if( p2->pL
12660 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a  eaf==0 ){     /*
12670 20 49 66 20 70 32 20 69 73 20 61 74 20 45 4f 46   If p2 is at EOF
12680 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d 20 69   */.    iRes = i
12690 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
126a0 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35 42 75  int res = fts5Bu
126b0 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 31 2d  fferCompare(&p1-
126c0 3e 74 65 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d  >term, &p2->term
126d0 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  );.    if( res==
126e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
126f0 74 28 20 69 32 3e 69 31 20 29 3b 0a 20 20 20 20  t( i2>i1 );.    
12700 20 20 61 73 73 65 72 74 28 20 69 32 21 3d 30 20    assert( i2!=0 
12710 29 3b 0a 20 20 20 20 20 20 70 52 65 73 2d 3e 62  );.      pRes->b
12720 54 65 72 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20  TermEq = 1;.    
12730 20 20 69 66 28 20 70 31 2d 3e 69 52 6f 77 69 64    if( p1->iRowid
12740 3d 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ==p2->iRowid ){.
12750 20 20 20 20 20 20 20 20 70 31 2d 3e 62 44 65 6c          p1->bDel
12760 20 3d 20 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20   = p2->bDel;.   
12770 20 20 20 20 20 72 65 74 75 72 6e 20 69 32 3b 0a       return i2;.
12780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
12790 73 20 3d 20 28 28 70 31 2d 3e 69 52 6f 77 69 64  s = ((p1->iRowid
127a0 20 3e 20 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d   > p2->iRowid)==
127b0 70 49 74 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d  pIter->bRev) ? -
127c0 31 20 3a 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  1 : +1;.    }.  
127d0 20 20 61 73 73 65 72 74 28 20 72 65 73 21 3d 30    assert( res!=0
127e0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 65 73 3c   );.    if( res<
127f0 30 20 29 7b 0a 20 20 20 20 20 20 69 52 65 73 20  0 ){.      iRes 
12800 3d 20 69 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = i1;.    }else{
12810 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69 32  .      iRes = i2
12820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
12830 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20 69 52  Res->iFirst = iR
12840 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  es;.  return 0;.
12850 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
12860 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20 74 68  e seg-iter so th
12870 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
12880 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
12890 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50 67 6e  on page iLeafPgn
128a0 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65  o..** It is an e
128b0 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69 4c 65  rror if leaf iLe
128c0 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f 74 20  afPgno does not 
128d0 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e  exist or contain
128e0 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a  s no rowids..*/.
128f0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
12900 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67 65 28  SegIterGotoPage(
12910 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
12940 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
12950 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
12960 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r,             /
12970 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 61 64  * Iterator to ad
12980 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74 20 69  vance */.  int i
12990 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20 61 73  LeafPgno.){.  as
129a0 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e 6f 3e  sert( iLeafPgno>
129b0 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
129c0 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65 61 66   );..  if( iLeaf
129d0 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53 65 67  Pgno>pIter->pSeg
129e0 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a 20 20  ->pgnoLast ){.  
129f0 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
12a00 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73 65 7b  ORRUPT;.  }else{
12a10 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c  .    fts5DataRel
12a20 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e 65 78  ease(pIter->pNex
12a30 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  tLeaf);.    pIte
12a40 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
12a50 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
12a60 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67  afPgno = iLeafPg
12a70 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 53 65  no-1;.    fts5Se
12a80 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
12a90 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61 73 73   pIter);.    ass
12aa0 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49  ert( p->rc!=SQLI
12ab0 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e  TE_OK || pIter->
12ac0 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65 61 66  iLeafPgno==iLeaf
12ad0 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
12ae0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
12af0 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
12b00 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20 2a 61  Off;.      u8 *a
12b10 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
12b20 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  >p;.      int n 
12b30 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
12b40 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20 20 69  szLeaf;..      i
12b50 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69  Off = fts5LeafFi
12b60 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49 74 65  rstRowidOff(pIte
12b70 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  r->pLeaf);.     
12b80 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c 20 69   if( iOff<4 || i
12b90 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20  Off>=n ){.      
12ba0 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43    p->rc = FTS5_C
12bb0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65  ORRUPT;.      }e
12bc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66  lse{.        iOf
12bd0 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
12be0 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36  nt(&a[iOff], (u6
12bf0 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69  4*)&pIter->iRowi
12c00 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65  d);.        pIte
12c10 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d  r->iLeafOffset =
12c20 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66   iOff;.        f
12c30 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
12c40 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
12c50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
12c60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  }../*.** Advance
12c70 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
12c80 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
12c90 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e 74 69  nd argument unti
12ca0 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20 0a 2a  l it is at or .*
12cb0 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69 46 72  * past rowid iFr
12cc0 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73 20 6f  om. Regardless o
12cd0 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 69  f the value of i
12ce0 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72 61 74  From, the iterat
12cf0 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79 73 20  or is.** always 
12d00 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65 61 73  advanced at leas
12d10 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  t once..*/.stati
12d20 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74  c void fts5SegIt
12d30 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
12d40 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
12d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
12d60 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
12d70 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
12d80 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
12d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
12da0 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
12db0 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74 63 68   */.  i64 iMatch
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65        /* Advance
12de0 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c 65 61   iterator at lea
12df0 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f 0a 29  st this far */.)
12e00 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20 28  {.  int bRev = (
12e10 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
12e20 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
12e30 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c 69 64  RSE);.  Fts5Dlid
12e40 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20  xIter *pDlidx = 
12e50 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b 0a 20  pIter->pDlidx;. 
12e60 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f 20 3d   int iLeafPgno =
12e70 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
12e80 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65 20 3d  o;.  int bMove =
12e90 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   1;..  assert( p
12ea0 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46 54  Iter->flags & FT
12eb0 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
12ec0 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  RM );.  assert( 
12ed0 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20 29 3b  pIter->pDlidx );
12ee0 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
12ef0 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20 69 66  ->pLeaf );..  if
12f00 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20 20 20  ( bRev==0 ){.   
12f10 20 77 68 69 6c 65 28 20 21 66 74 73 35 44 6c 69   while( !fts5Dli
12f20 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c  dxIterEof(p, pDl
12f30 69 64 78 29 20 26 26 20 69 4d 61 74 63 68 3e 66  idx) && iMatch>f
12f40 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77 69  ts5DlidxIterRowi
12f50 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20 20 20  d(pDlidx) ){.   
12f60 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66     iLeafPgno = f
12f70 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
12f80 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  (pDlidx);.      
12f90 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78  fts5DlidxIterNex
12fa0 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20  t(p, pDlidx);.  
12fb0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 5f 6e    }.    assert_n
12fc0 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d 70 49  c( iLeafPgno>=pI
12fd0 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 7c  ter->iLeafPgno |
12fe0 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20 20 69  | p->rc );.    i
12ff0 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74  f( iLeafPgno>pIt
13000 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b  er->iLeafPgno ){
13010 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
13020 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20 70 49  erGotoPage(p, pI
13030 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f 29 3b  ter, iLeafPgno);
13040 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30  .      bMove = 0
13050 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
13060 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
13070 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30  er->pNextLeaf==0
13080 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13090 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e 69 52  iMatch<pIter->iR
130a0 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68 69 6c  owid );.    whil
130b0 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74 65  e( !fts5DlidxIte
130c0 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29 20  rEof(p, pDlidx) 
130d0 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35 44 6c  && iMatch<fts5Dl
130e0 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
130f0 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 66 74  idx) ){.      ft
13100 73 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28  s5DlidxIterPrev(
13110 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  p, pDlidx);.    
13120 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20  }.    iLeafPgno 
13130 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  = fts5DlidxIterP
13140 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a 20 20  gno(pDlidx);..  
13150 20 20 61 73 73 65 72 74 28 20 66 74 73 35 44 6c    assert( fts5Dl
13160 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
13170 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66 50 67  lidx) || iLeafPg
13180 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66  no<=pIter->iLeaf
13190 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69 66 28  Pgno );..    if(
131a0 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74 65 72   iLeafPgno<pIter
131b0 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20  ->iLeafPgno ){. 
131c0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
131d0 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e  fPgno = iLeafPgn
131e0 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73 35 53  o+1;.      fts5S
131f0 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65 77  egIterReverseNew
13200 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
13210 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b        bMove = 0;
13220 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
13230 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76 65 20  {.    if( bMove 
13240 29 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  ) fts5SegIterNex
13250 74 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a  t(p, pIter, 0);.
13260 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
13270 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
13280 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
13290 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69   && pIter->iRowi
132a0 64 3e 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d>=iMatch ) brea
132b0 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76 21  k;.    if( bRev!
132c0 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52 6f  =0 && pIter->iRo
132d0 77 69 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72  wid<=iMatch ) br
132e0 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d  eak;.    bMove =
132f0 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d   1;.  }while( p-
13300 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13310 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  ;.}.../*.** Free
13320 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 6f 62   the iterator ob
13330 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
13340 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
13350 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
13360 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
13370 46 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a  Free(Fts5Index *
13380 70 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  p, Fts5IndexIter
13390 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
133a0 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
133b0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
133c0 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
133d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
133e0 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
133f0 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
13400 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72     }.    fts5Str
13410 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 49  uctureRelease(pI
13420 74 65 72 2d 3e 70 53 74 72 75 63 74 29 3b 0a 20  ter->pStruct);. 
13430 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
13440 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  e(&pIter->poslis
13450 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
13460 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
13470 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
13480 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
13490 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64  anced(.  Fts5Ind
134a0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
134b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
134c0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
134d0 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
134e0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
134f0 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
13500 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
13510 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
13520 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
13530 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20  t iChanged,     
13540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13550 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
13560 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
13570 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  nced */.  int iM
13580 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20  inset           
13590 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
135a0 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46  imum entry in aF
135b0 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f  irst[] to set */
135c0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
135d0 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
135e0 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69  g+iChanged)/2; i
135f0 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e  >=iMinset && p->
13600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
13610 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69  =i/2){.    int i
13620 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71  Eq;.    if( (iEq
13630 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
13640 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c  DoCompare(pIter,
13650 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 66 74   i)) ){.      ft
13660 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 70 2c  s5SegIterNext(p,
13670 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 45   &pIter->aSeg[iE
13680 71 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20  q], 0);.      i 
13690 3d 20 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20  = pIter->nSeg + 
136a0 69 45 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  iEq;.    }.  }.}
136b0 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72  ../*.** Sub-iter
136c0 61 74 6f 72 20 69 43 68 61 6e 67 65 64 20 6f 66  ator iChanged of
136d0 20 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20   iterator pIter 
136e0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 64  has just been ad
136f0 76 61 6e 63 65 64 2e 20 49 74 20 73 74 69 6c 6c  vanced. It still
13700 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  .** points to th
13710 65 20 73 61 6d 65 20 74 65 72 6d 20 74 68 6f 75  e same term thou
13720 67 68 20 2d 20 6a 75 73 74 20 61 20 64 69 66 66  gh - just a diff
13730 65 72 65 6e 74 20 72 6f 77 69 64 2e 20 54 68 69  erent rowid. Thi
13740 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74  s function.** at
13750 74 65 6d 70 74 73 20 74 6f 20 75 70 64 61 74 65  tempts to update
13760 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
13770 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
13780 73 74 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79  st[] accordingly
13790 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
137a0 73 6f 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  so successfully,
137b0 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
137c0 4f 74 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a  Otherwise 1..**.
137d0 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ** If non-zero i
137e0 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20  s returned, the 
137f0 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 61  caller should ca
13800 6c 6c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  ll fts5MultiIter
13810 41 64 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e  Advanced().** on
13820 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e   the iterator in
13830 73 74 65 61 64 2e 20 54 68 61 74 20 66 75 6e 63  stead. That func
13840 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61  tion does the sa
13850 6d 65 20 61 73 20 74 68 69 73 20 6f 6e 65 2c 20  me as this one, 
13860 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
13870 74 20 64 65 61 6c 73 20 77 69 74 68 20 6d 6f 72  t deals with mor
13880 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 20 63 61  e complicated ca
13890 73 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20  ses as well..*/ 
138a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
138b0 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65  MultiIterAdvance
138c0 52 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64  Rowid(.  Fts5Ind
138d0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
138e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
138f0 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
13900 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
13910 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
13920 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
13930 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
13940 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
13950 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
13960 74 20 69 43 68 61 6e 67 65 64 20 20 20 20 20 20  t iChanged      
13970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13980 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
13990 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
139a0 6e 63 65 64 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  nced */.){.  Fts
139b0 35 53 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d  5SegIter *pNew =
139c0 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43   &pIter->aSeg[iC
139d0 68 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20  hanged];..  if( 
139e0 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49  pNew->iRowid==pI
139f0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13a00 64 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69  d.   || (pNew->i
13a10 52 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77  Rowid<pIter->iSw
13a20 69 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65  itchRowid)==pIte
13a30 72 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20  r->bRev.  ){.   
13a40 20 69 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35   int i;.    Fts5
13a50 53 65 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20  SegIter *pOther 
13a60 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
13a70 43 68 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31  Changed ^ 0x0001
13a80 5d 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53  ];.    pIter->iS
13a90 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74  witchRowid = pIt
13aa0 65 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c  er->bRev ? SMALL
13ab0 45 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47  EST_INT64 : LARG
13ac0 45 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66  EST_INT64;.    f
13ad0 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
13ae0 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31  g+iChanged)/2; 1
13af0 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20  ; i=i/2){.      
13b00 46 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65  Fts5CResult *pRe
13b10 73 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72  s = &pIter->aFir
13b20 73 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73  st[i];..      as
13b30 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61  sert( pNew->pLea
13b40 66 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  f );.      asser
13b50 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
13b60 3d 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70  ==0 || pOther->p
13b70 4c 65 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69  Leaf );..      i
13b80 66 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  f( pRes->bTermEq
13b90 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
13ba0 70 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f  pNew->iRowid==pO
13bb0 74 68 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a  ther->iRowid ){.
13bc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13bd0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
13be0 65 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69  e if( (pOther->i
13bf0 52 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77  Rowid>pNew->iRow
13c00 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
13c20 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13c30 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
13c40 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  id;.          pN
13c50 65 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20  ew = pOther;.   
13c60 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
13c70 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70  pOther->iRowid>p
13c80 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77  Iter->iSwitchRow
13c90 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
13cb0 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
13cc0 64 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77  d = pOther->iRow
13cd0 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  id;.        }.  
13ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73      }.      pRes
13cf0 2d 3e 69 46 69 72 73 74 20 3d 20 28 70 4e 65 77  ->iFirst = (pNew
13d00 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 29 3b   - pIter->aSeg);
13d10 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20  .      if( i==1 
13d20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
13d30 70 4f 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d  pOther = &pIter-
13d40 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
13d50 69 72 73 74 5b 69 20 5e 20 30 78 30 30 30 31 5d  irst[i ^ 0x0001]
13d60 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 7d  .iFirst ];.    }
13d70 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 30  .  }..  return 0
13d80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
13d90 68 65 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 76  he pIter->bEof v
13da0 61 72 69 61 62 6c 65 20 62 61 73 65 64 20 6f 6e  ariable based on
13db0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
13dc0 65 20 73 75 62 2d 69 74 65 72 61 74 6f 72 73 2e  e sub-iterators.
13dd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13de0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74  fts5MultiIterSet
13df0 45 6f 66 28 46 74 73 35 49 6e 64 65 78 49 74 65  Eof(Fts5IndexIte
13e00 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73  r *pIter){.  Fts
13e10 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
13e20 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
13e30 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
13e40 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49 74 65  iFirst ];.  pIte
13e50 72 2d 3e 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e  r->bEof = pSeg->
13e60 70 4c 65 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65  pLeaf==0;.  pIte
13e70 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
13e80 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
13e90 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
13ea0 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74 68  e iterator to th
13eb0 65 20 6e 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a  e next entry. .*
13ec0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
13ed0 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f   occurs, an erro
13ee0 72 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69  r code is left i
13ef0 6e 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20  n Fts5Index.rc. 
13f00 49 74 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f  It is not .** co
13f10 6e 73 69 64 65 72 65 64 20 61 6e 20 65 72 72 6f  nsidered an erro
13f20 72 20 69 66 20 74 68 65 20 69 74 65 72 61 74 6f  r if the iterato
13f30 72 20 72 65 61 63 68 65 73 20 45 4f 46 2c 20 6f  r reaches EOF, o
13f40 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
13f50 64 79 20 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68  dy at .** EOF wh
13f60 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
13f70 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
13f80 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
13f90 75 6c 74 69 49 74 65 72 4e 65 78 74 28 0a 20 20  ultiIterNext(.  
13fa0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20  Fts5Index *p, . 
13fb0 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a   Fts5IndexIter *
13fc0 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 72  pIter,.  int bFr
13fd0 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  om,             
13fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
13ff0 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69 46 72   if argument iFr
14000 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  om is valid */. 
14010 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20 20 20   i64 iFrom      
14020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14030 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74 20 6c   /* Advance at l
14040 65 61 73 74 20 61 73 20 66 61 72 20 61 73 20 74  east as far as t
14050 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  his */.){.  if( 
14060 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
14070 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 55 73 65   ){.    int bUse
14080 46 72 6f 6d 20 3d 20 62 46 72 6f 6d 3b 0a 20 20  From = bFrom;.  
14090 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 69 6e 74    do {.      int
140a0 20 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d   iFirst = pIter-
140b0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
140c0 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65  t;.      int bNe
140d0 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20  wTerm = 0;.     
140e0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
140f0 65 67 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  eg = &pIter->aSe
14100 67 5b 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20  g[iFirst];.     
14110 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
14120 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
14130 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d 20     if( bUseFrom 
14140 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78 20  && pSeg->pDlidx 
14150 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  ){.        fts5S
14160 65 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70  egIterNextFrom(p
14170 2c 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a  , pSeg, iFrom);.
14180 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14190 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
141a0 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
141b0 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
141c0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  }..      if( pSe
141d0 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20 62  g->pLeaf==0 || b
141e0 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20 20  NewTerm .       
141f0 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  || fts5MultiIter
14200 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 2c 20  AdvanceRowid(p, 
14210 70 49 74 65 72 2c 20 69 46 69 72 73 74 29 0a 20  pIter, iFirst). 
14220 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
14230 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
14240 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c 20  anced(p, pIter, 
14250 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20 20  iFirst, 1);.    
14260 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
14270 72 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a  rSetEof(pIter);.
14280 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
14290 73 35 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65  s5AssertMultiIte
142a0 72 53 65 74 75 70 28 70 2c 20 70 49 74 65 72 29  rSetup(p, pIter)
142b0 3b 0a 0a 20 20 20 20 20 20 62 55 73 65 46 72 6f  ;..      bUseFro
142c0 6d 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c  m = 0;.    }whil
142d0 65 28 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45  e( pIter->bSkipE
142e0 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75 6c 74  mpty && fts5Mult
142f0 69 49 74 65 72 49 73 45 6d 70 74 79 28 70 2c 20  iIterIsEmpty(p, 
14300 70 49 74 65 72 29 20 29 3b 0a 20 20 7d 0a 7d 0a  pIter) );.  }.}.
14310 0a 73 74 61 74 69 63 20 46 74 73 35 49 6e 64 65  .static Fts5Inde
14320 78 49 74 65 72 20 2a 66 74 73 35 4d 75 6c 74 69  xIter *fts5Multi
14330 49 74 65 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73  IterAlloc(.  Fts
14340 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
14350 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14360 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
14370 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
14380 2f 0a 20 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a  /.  int nSeg.){.
14390 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20    Fts5IndexIter 
143a0 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 53 6c  *pNew;.  int nSl
143b0 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ot;             
143c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 77 65           /* Powe
143d0 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53 65 67  r of two >= nSeg
143e0 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c 6f 74   */..  for(nSlot
143f0 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67 3b 20  =2; nSlot<nSeg; 
14400 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29 3b 0a  nSlot=nSlot*2);.
14410 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49 64 78    pNew = fts5Idx
14420 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20 20 20  Malloc(p, .     
14430 20 73 69 7a 65 6f 66 28 46 74 73 35 49 6e 64 65   sizeof(Fts5Inde
14440 78 49 74 65 72 29 20 2b 20 20 20 20 20 20 20 20  xIter) +        
14450 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a 2f 0a       /* pNew */.
14460 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73        sizeof(Fts
14470 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e 53 6c  5SegIter) * (nSl
14480 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70 4e 65  ot-1) +   /* pNe
14490 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20 20 20  w->aSeg[] */.   
144a0 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 43 52     sizeof(Fts5CR
144b0 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74 20 20  esult) * nSlot  
144c0 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 2d 3e         /* pNew->
144d0 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20 29 3b  aFirst[] */.  );
144e0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
144f0 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20 3d 20     pNew->nSeg = 
14500 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65 77 2d  nSlot;.    pNew-
14510 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73 35 43  >aFirst = (Fts5C
14520 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d 3e 61  Result*)&pNew->a
14530 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20 20 20  Seg[nSlot];.    
14540 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d 20 70  pNew->pIndex = p
14550 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
14560 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c  New;.}../*.** Al
14570 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73  locate a new Fts
14580 35 49 6e 64 65 78 49 74 65 72 20 6f 62 6a 65 63  5IndexIter objec
14590 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 77  t..**.** The new
145a0 20 6f 62 6a 65 63 74 20 77 69 6c 6c 20 62 65 20   object will be 
145b0 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
145c0 74 68 72 6f 75 67 68 20 64 61 74 61 20 69 6e 20  through data in 
145d0 73 74 72 75 63 74 75 72 65 20 70 53 74 72 75 63  structure pStruc
145e0 74 2e 0a 2a 2a 20 49 66 20 69 4c 65 76 65 6c 20  t..** If iLevel 
145f0 69 73 20 2d 76 65 2c 20 74 68 65 6e 20 61 6c 6c  is -ve, then all
14600 20 64 61 74 61 20 69 6e 20 61 6c 6c 20 73 65 67   data in all seg
14610 6d 65 6e 74 73 20 69 73 20 6d 65 72 67 65 64 2e  ments is merged.
14620 20 4f 72 2c 20 69 66 20 69 4c 65 76 65 6c 0a 2a   Or, if iLevel.*
14630 2a 20 69 73 20 7a 65 72 6f 20 6f 72 20 67 72 65  * is zero or gre
14640 61 74 65 72 2c 20 64 61 74 61 20 66 72 6f 6d 20  ater, data from 
14650 74 68 65 20 66 69 72 73 74 20 6e 53 65 67 6d 65  the first nSegme
14660 6e 74 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c  nt segments on l
14670 65 76 65 6c 20 69 4c 65 76 65 6c 0a 2a 2a 20 69  evel iLevel.** i
14680 73 20 6d 65 72 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  s merged..**.** 
14690 54 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 69  The iterator ini
146a0 74 69 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tially points to
146b0 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 2f   the first term/
146c0 72 6f 77 69 64 20 65 6e 74 72 79 20 69 6e 20 74  rowid entry in t
146d0 68 65 20 0a 2a 2a 20 69 74 65 72 61 74 65 64 20  he .** iterated 
146e0 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
146f0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
14700 65 72 4e 65 77 28 0a 20 20 46 74 73 35 49 6e 64  erNew(.  Fts5Ind
14710 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
14720 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
14730 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
14740 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
14750 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
14760 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 20 20  Struct,         
14770 2f 2a 20 53 74 72 75 63 74 75 72 65 20 6f 66 20  /* Structure of 
14780 73 70 65 63 69 66 69 63 20 69 6e 64 65 78 20 2a  specific index *
14790 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 45 6d 70  /.  int bSkipEmp
147a0 74 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ty,             
147b0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69      /* True to i
147c0 67 6e 6f 72 65 20 64 65 6c 65 74 65 2d 6b 65 79  gnore delete-key
147d0 73 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  s */.  int flags
147e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
147f0 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49 4e         /* FTS5IN
14800 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66 6c  DEX_QUERY_XXX fl
14810 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  ags */.  const u
14820 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
14830 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
14840 20 74 6f 20 73 65 65 6b 20 74 6f 20 28 6f 72 20   to seek to (or 
14850 4e 55 4c 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74  NULL/0) */.  int
14860 20 69 4c 65 76 65 6c 2c 20 20 20 20 20 20 20 20   iLevel,        
14870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14880 4c 65 76 65 6c 20 74 6f 20 69 74 65 72 61 74 65  Level to iterate
14890 20 28 2d 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f   (-1 for all) */
148a0 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c  .  int nSegment,
148b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
148d0 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
148e0 65 20 28 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f  e (iLevel>=0) */
148f0 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
14900 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20 20 20   **ppOut        
14910 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
14920 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65   */.){.  int nSe
14930 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
14940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
14950 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74  er of segment-it
14960 65 72 73 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20  ers in use */.  
14970 69 6e 74 20 69 49 74 65 72 20 3d 20 30 3b 20 20  int iIter = 0;  
14980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14990 2f 2a 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67  /* */.  int iSeg
149a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
149b0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
149c0 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
149d0 67 68 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20  gh segments */. 
149e0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 20   Fts5Buffer buf 
149f0 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20  = {0,0,0};      
14a00 20 2f 2a 20 42 75 66 66 65 72 20 75 73 65 64 20   /* Buffer used 
14a10 62 79 20 66 74 73 35 53 65 67 49 74 65 72 53 65  by fts5SegIterSe
14a20 65 6b 49 6e 69 74 28 29 20 2a 2f 0a 20 20 46 74  ekInit() */.  Ft
14a30 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
14a40 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 6e   *pLvl;.  Fts5In
14a50 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b 0a 0a  dexIter *pNew;..
14a60 20 20 61 73 73 65 72 74 28 20 28 70 54 65 72 6d    assert( (pTerm
14a70 3d 3d 30 20 26 26 20 6e 54 65 72 6d 3d 3d 30 29  ==0 && nTerm==0)
14a80 20 7c 7c 20 69 4c 65 76 65 6c 3c 30 20 29 3b 0a   || iLevel<0 );.
14a90 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  /* Allocate s
14aa0 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65 77  pace for the new
14ab0 20 6d 75 6c 74 69 2d 73 65 67 2d 69 74 65 72 61   multi-seg-itera
14ac0 74 6f 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d  tor. */.  if( p-
14ad0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
14ae0 7b 0a 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c  {.    if( iLevel
14af0 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
14b00 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65  rt( pStruct->nSe
14b10 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63  gment==fts5Struc
14b20 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74  tureCountSegment
14b30 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20  s(pStruct) );.  
14b40 20 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75      nSeg = pStru
14b50 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20  ct->nSegment;.  
14b60 20 20 20 20 6e 53 65 67 20 2b 3d 20 28 70 2d 3e      nSeg += (p->
14b70 70 48 61 73 68 20 3f 20 31 20 3a 20 30 29 3b 0a  pHash ? 1 : 0);.
14b80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14b90 20 6e 53 65 67 20 3d 20 4d 49 4e 28 70 53 74 72   nSeg = MIN(pStr
14ba0 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65 76  uct->aLevel[iLev
14bb0 65 6c 5d 2e 6e 53 65 67 2c 20 6e 53 65 67 6d 65  el].nSeg, nSegme
14bc0 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nt);.    }.  }. 
14bd0 20 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 20 3d   *ppOut = pNew =
14be0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 6c   fts5MultiIterAl
14bf0 6c 6f 63 28 70 2c 20 6e 53 65 67 29 3b 0a 20 20  loc(p, nSeg);.  
14c00 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
14c10 74 75 72 6e 3b 0a 20 20 70 4e 65 77 2d 3e 62 52  turn;.  pNew->bR
14c20 65 76 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20  ev = (0!=(flags 
14c30 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
14c40 59 5f 44 45 53 43 29 29 3b 0a 20 20 70 4e 65 77  Y_DESC));.  pNew
14c50 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 3d 20 62  ->bSkipEmpty = b
14c60 53 6b 69 70 45 6d 70 74 79 3b 0a 20 20 70 4e 65  SkipEmpty;.  pNe
14c70 77 2d 3e 70 53 74 72 75 63 74 20 3d 20 70 53 74  w->pStruct = pSt
14c80 72 75 63 74 3b 0a 20 20 66 74 73 35 53 74 72 75  ruct;.  fts5Stru
14c90 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74  ctureRef(pStruct
14ca0 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
14cb0 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  ize each of the 
14cc0 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e  component segmen
14cd0 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a  t iterators. */.
14ce0 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29    if( iLevel<0 )
14cf0 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74  {.    Fts5Struct
14d00 75 72 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d  ureLevel *pEnd =
14d10 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65   &pStruct->aLeve
14d20 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l[pStruct->nLeve
14d30 6c 5d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70  l];.    if( p->p
14d40 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Hash ){.      /*
14d50 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74 20 69   Add a segment i
14d60 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68 65 20  terator for the 
14d70 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74 73  current contents
14d80 20 6f 66 20 74 68 65 20 68 61 73 68 20 74 61 62   of the hash tab
14d90 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 74 73  le. */.      Fts
14da0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
14db0 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
14dc0 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 66 74  ter++];.      ft
14dd0 73 35 53 65 67 49 74 65 72 48 61 73 68 49 6e 69  s5SegIterHashIni
14de0 74 28 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72  t(p, pTerm, nTer
14df0 6d 2c 20 66 6c 61 67 73 2c 20 70 49 74 65 72 29  m, flags, pIter)
14e00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
14e10 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
14e20 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
14e30 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
14e40 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70 4c 76      for(iSeg=pLv
14e50 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65 67 3e  l->nSeg-1; iSeg>
14e60 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20 20 20  =0; iSeg--){.   
14e70 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75       Fts5Structu
14e80 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20  reSegment *pSeg 
14e90 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53  = &pLvl->aSeg[iS
14ea0 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 46 74 73  eg];.        Fts
14eb0 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
14ec0 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
14ed0 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
14ee0 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29 7b 0a  if( pTerm==0 ){.
14ef0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 53 65            fts5Se
14f00 67 49 74 65 72 49 6e 69 74 28 70 2c 20 70 53 65  gIterInit(p, pSe
14f10 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  g, pIter);.     
14f20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14f30 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 53      fts5SegIterS
14f40 65 65 6b 49 6e 69 74 28 70 2c 20 26 62 75 66 2c  eekInit(p, &buf,
14f50 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
14f60 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49 74 65  lags, pSeg, pIte
14f70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
14f80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
14f90 6c 73 65 7b 0a 20 20 20 20 70 4c 76 6c 20 3d 20  lse{.    pLvl = 
14fa0 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
14fb0 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 66 6f  [iLevel];.    fo
14fc0 72 28 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69  r(iSeg=nSeg-1; i
14fd0 53 65 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b  Seg>=0; iSeg--){
14fe0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
14ff0 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d  erInit(p, &pLvl-
15000 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e  >aSeg[iSeg], &pN
15010 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
15020 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ]);.    }.  }.  
15030 61 73 73 65 72 74 28 20 69 49 74 65 72 3d 3d 6e  assert( iIter==n
15040 53 65 67 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  Seg );..  /* If 
15050 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73 75  the above was su
15060 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63  ccessful, each c
15070 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f  omponent iterato
15080 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20  rs now points . 
15090 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74   ** to the first
150a0 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65   entry in its se
150b0 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63  gment. In this c
150c0 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  ase initialize t
150d0 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b  he .  ** aFirst[
150e0 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  ] array. Or, if 
150f0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
15100 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65 20  urred, free the 
15110 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62  iterator.  ** ob
15120 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68 65  ject and set the
15130 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
15140 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20   to NULL.  */.  
15150 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
15160 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28  E_OK ){.    for(
15170 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67  iIter=pNew->nSeg
15180 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
15190 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
151a0 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
151b0 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
151c0 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
151d0 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
151e0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
151f0 65 72 4e 65 78 74 28 70 2c 20 26 70 4e 65 77 2d  erNext(p, &pNew-
15200 3e 61 53 65 67 5b 69 45 71 5d 2c 20 30 29 3b 0a  >aSeg[iEq], 0);.
15210 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74          fts5Mult
15220 69 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c  iIterAdvanced(p,
15230 20 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65   pNew, iEq, iIte
15240 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
15250 7d 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49  }.    fts5MultiI
15260 74 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b  terSetEof(pNew);
15270 0a 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d  .    fts5AssertM
15280 75 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c  ultiIterSetup(p,
15290 20 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28   pNew);..    if(
152a0 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
152b0 79 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74  y && fts5MultiIt
152c0 65 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65  erIsEmpty(p, pNe
152d0 77 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  w) ){.      fts5
152e0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
152f0 20 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20   pNew, 0, 0);.  
15300 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
15310 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
15320 65 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20  ee(p, pNew);.   
15330 20 2a 70 70 4f 75 74 20 3d 20 30 3b 0a 20 20 7d   *ppOut = 0;.  }
15340 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65  .  fts5BufferFre
15350 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(&buf);.}../*.*
15360 2a 20 43 72 65 61 74 65 20 61 6e 20 46 74 73 35  * Create an Fts5
15370 49 6e 64 65 78 49 74 65 72 20 74 68 61 74 20 69  IndexIter that i
15380 74 65 72 61 74 65 73 20 74 68 72 6f 75 67 68 20  terates through 
15390 74 68 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76  the doclist prov
153a0 69 64 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ided.** as the s
153b0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
153c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
153d0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
153e0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
153f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15400 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
15410 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
15420 69 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44  ithin */.  Fts5D
15430 61 74 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20  ata *pData,     
15440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
15450 63 6c 69 73 74 20 74 6f 20 69 74 65 72 61 74 65  clist to iterate
15460 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e   through */.  in
15470 74 20 62 44 65 73 63 2c 20 20 20 20 20 20 20 20  t bDesc,        
15480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15490 20 54 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e   True for descen
154a0 64 69 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72  ding rowid order
154b0 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64 65 78 49   */.  Fts5IndexI
154c0 74 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20  ter **ppOut     
154d0 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a        /* New obj
154e0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ect */.){.  Fts5
154f0 49 6e 64 65 78 49 74 65 72 20 2a 70 4e 65 77 3b  IndexIter *pNew;
15500 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 4d 75  .  pNew = fts5Mu
15510 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70 2c 20  ltiIterAlloc(p, 
15520 32 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29  2);.  if( pNew )
15530 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
15540 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65 77  r *pIter = &pNew
15550 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20 20 20 20  ->aSeg[1];..    
15560 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 3d 20 46  pIter->flags = F
15570 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54  TS5_SEGITER_ONET
15580 45 52 4d 3b 0a 20 20 20 20 69 66 28 20 70 44 61  ERM;.    if( pDa
15590 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20 29 7b 0a  ta->szLeaf>0 ){.
155a0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65        pIter->pLe
155b0 61 66 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20  af = pData;.    
155c0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
155d0 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
155e0 72 69 6e 74 28 70 44 61 74 61 2d 3e 70 2c 20 28  rint(pData->p, (
155f0 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
15600 77 69 64 29 3b 0a 20 20 20 20 20 20 70 49 74 65  wid);.      pIte
15610 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74  r->iEndofDoclist
15620 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b 0a 20 20   = pData->nn;.  
15630 20 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74      pNew->aFirst
15640 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20 31 3b 0a  [1].iFirst = 1;.
15650 20 20 20 20 20 20 69 66 28 20 62 44 65 73 63 20        if( bDesc 
15660 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
15670 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20 20 20 20  >bRev = 1;.     
15680 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
15690 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  |= FTS5_SEGITER_
156a0 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 20  REVERSE;.       
156b0 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65   fts5SegIterReve
156c0 72 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70  rseInitPage(p, p
156d0 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Iter);.      }el
156e0 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35  se{.        fts5
156f0 53 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28  SegIterLoadNPos(
15700 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20  p, pIter);.     
15710 20 7d 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d   }.      pData =
15720 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
15730 20 20 20 20 20 70 4e 65 77 2d 3e 62 45 6f 66 20       pNew->bEof 
15740 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
15750 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
15760 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
15770 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
15780 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
15790 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
157a0 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
157b0 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
157c0 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
157d0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
157e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
157f0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
15800 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
15810 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
15820 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
15830 72 63 20 0a 20 20 20 20 20 20 7c 7c 20 28 70 49  rc .      || (pI
15840 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
15850 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
15860 73 74 20 5d 2e 70 4c 65 61 66 3d 3d 30 29 3d 3d  st ].pLeaf==0)==
15870 70 49 74 65 72 2d 3e 62 45 6f 66 20 0a 20 20 29  pIter->bEof .  )
15880 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
15890 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 45 6f 66  c || pIter->bEof
158a0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
158b0 72 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20  rn the rowid of 
158c0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
158d0 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
158e0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20  ently points.** 
158f0 74 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61  to. If the itera
15900 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f  tor points to EO
15910 46 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  F when this func
15920 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
15930 68 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72  he.** results ar
15940 65 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a  e undefined..*/.
15950 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d  static i64 fts5M
15960 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74  ultiIterRowid(Ft
15970 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74  s5IndexIter *pIt
15980 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
15990 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
159a0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
159b0 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
159c0 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
159d0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
159e0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
159f0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
15a00 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
15a10 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
15a20 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
15a30 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
15a40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
15a50 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
15a60 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
15a70 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74  , .  Fts5IndexIt
15a80 65 72 20 2a 70 49 74 65 72 2c 20 0a 20 20 69 36  er *pIter, .  i6
15a90 34 20 69 4d 61 74 63 68 0a 29 7b 0a 20 20 77 68  4 iMatch.){.  wh
15aa0 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
15ab0 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 66 74  4 iRowid;.    ft
15ac0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
15ad0 70 2c 20 70 49 74 65 72 2c 20 31 2c 20 69 4d 61  p, pIter, 1, iMa
15ae0 74 63 68 29 3b 0a 20 20 20 20 69 66 28 20 66 74  tch);.    if( ft
15af0 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
15b00 2c 20 70 49 74 65 72 29 20 29 20 62 72 65 61 6b  , pIter) ) break
15b10 3b 0a 20 20 20 20 69 52 6f 77 69 64 20 3d 20 66  ;.    iRowid = f
15b20 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69  ts5MultiIterRowi
15b30 64 28 70 49 74 65 72 29 3b 0a 20 20 20 20 69 66  d(pIter);.    if
15b40 28 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30  ( pIter->bRev==0
15b50 20 26 26 20 69 52 6f 77 69 64 3e 3d 69 4d 61 74   && iRowid>=iMat
15b60 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ch ) break;.    
15b70 69 66 28 20 70 49 74 65 72 2d 3e 62 52 65 76 21  if( pIter->bRev!
15b80 3d 30 20 26 26 20 69 52 6f 77 69 64 3c 3d 69 4d  =0 && iRowid<=iM
15b90 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a 20 20  atch ) break;.  
15ba0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
15bb0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
15bc0 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
15bd0 6e 67 20 74 68 65 20 74 65 72 6d 20 61 73 73 6f  ng the term asso
15be0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
15bf0 0a 2a 2a 20 65 6e 74 72 79 20 74 68 61 74 20 74  .** entry that t
15c00 68 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72  he iterator curr
15c10 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
15c20 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
15c30 20 75 38 20 2a 66 74 73 35 4d 75 6c 74 69 49 74   u8 *fts5MultiIt
15c40 65 72 54 65 72 6d 28 46 74 73 35 49 6e 64 65 78  erTerm(Fts5Index
15c50 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
15c60 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
15c70 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
15c80 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
15c90 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
15ca0 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65  ];.  *pn = p->te
15cb0 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  rm.n;.  return p
15cc0 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 73 74 61  ->term.p;.}..sta
15cd0 74 69 63 20 76 6f 69 64 20 66 74 73 35 43 68 75  tic void fts5Chu
15ce0 6e 6b 49 74 65 72 61 74 65 28 0a 20 20 46 74 73  nkIterate(.  Fts
15cf0 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15d10 49 6e 64 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a  Index object */.
15d20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
15d30 53 65 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Seg,            
15d40 20 20 2f 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20    /* Poslist of 
15d50 74 68 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f  this iterator */
15d60 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 20  .  void *pCtx,  
15d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d80 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f     /* Context po
15d90 69 6e 74 65 72 20 66 6f 72 20 78 43 68 75 6e 6b  inter for xChunk
15da0 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   callback */.  v
15db0 6f 69 64 20 28 2a 78 43 68 75 6e 6b 29 28 46 74  oid (*xChunk)(Ft
15dc0 73 35 49 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c  s5Index*, void*,
15dd0 20 63 6f 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29   const u8*, int)
15de0 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d  .){.  int nRem =
15df0 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20   pSeg->nPos;    
15e00 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
15e10 6f 66 20 62 79 74 65 73 20 73 74 69 6c 6c 20 74  of bytes still t
15e20 6f 20 63 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35  o come */.  Fts5
15e30 44 61 74 61 20 2a 70 44 61 74 61 20 3d 20 30 3b  Data *pData = 0;
15e40 0a 20 20 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20  .  u8 *pChunk = 
15e50 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
15e60 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
15e70 74 5d 3b 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b  t];.  int nChunk
15e80 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65   = MIN(nRem, pSe
15e90 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  g->pLeaf->szLeaf
15ea0 20 2d 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66   - pSeg->iLeafOf
15eb0 66 73 65 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e  fset);.  int pgn
15ec0 6f 20 3d 20 70 53 65 67 2d 3e 69 4c 65 61 66 50  o = pSeg->iLeafP
15ed0 67 6e 6f 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53  gno;.  int pgnoS
15ee0 61 76 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ave = 0;..  if( 
15ef0 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20 46  (pSeg->flags & F
15f00 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
15f10 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  RSE)==0 ){.    p
15f20 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b 31  gnoSave = pgno+1
15f30 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
15f40 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b 28  1 ){.    xChunk(
15f50 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b 2c  p, pCtx, pChunk,
15f60 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e 52   nChunk);.    nR
15f70 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20 20  em -= nChunk;.  
15f80 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
15f90 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69 66  e(pData);.    if
15fa0 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20 20  ( nRem<=0 ){.   
15fb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
15fc0 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f 2b  lse{.      pgno+
15fd0 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d  +;.      pData =
15fe0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
15ff0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
16000 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d 3e  WID(pSeg->pSeg->
16010 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b 0a  iSegid, pgno));.
16020 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61 3d        if( pData=
16030 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
16040 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61 74    pChunk = &pDat
16050 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20 6e  a->p[4];.      n
16060 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65 6d  Chunk = MIN(nRem
16070 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  , pData->szLeaf 
16080 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  - 4);.      if( 
16090 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20 29  pgno==pgnoSave )
160a0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
160b0 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61  ( pSeg->pNextLea
160c0 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  f==0 );.        
160d0 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66 20  pSeg->pNextLeaf 
160e0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20 20  = pData;.       
160f0 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   pData = 0;.    
16100 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
16110 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
16120 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
16130 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
16140 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
16150 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
16160 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
16170 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
16180 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
16190 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
161a0 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
161b0 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
161c0 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
161d0 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
161e0 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
161f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
16200 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
16210 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
16220 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
16230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
16240 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
16250 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
16260 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
16270 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
16280 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
16290 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
162a0 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
162b0 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
162c0 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
162d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
162e0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
162f0 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
16300 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
16310 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
16320 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
16330 73 65 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  se{.      while(
16340 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
16350 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20        int iLvl, 
16360 69 53 65 67 3b 0a 20 20 20 20 20 20 20 20 73 71  iSeg;.        sq
16370 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
16380 28 73 69 7a 65 6f 66 28 75 33 32 29 2c 20 28 76  (sizeof(u32), (v
16390 6f 69 64 2a 29 26 69 53 65 67 69 64 29 3b 0a 20  oid*)&iSegid);. 
163a0 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d 20         iSegid = 
163b0 69 53 65 67 69 64 20 26 20 28 28 31 20 3c 3c 20  iSegid & ((1 << 
163c0 46 54 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 2d  FTS5_DATA_ID_B)-
163d0 31 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  1);.        for(
163e0 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74  iLvl=0; iLvl<pSt
163f0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c  ruct->nLevel; iL
16400 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  vl++){.         
16410 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
16420 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
16430 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
16440 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
16450 20 20 20 69 66 28 20 69 53 65 67 69 64 3d 3d 70     if( iSegid==p
16460 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
16470 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e  Lvl].aSeg[iSeg].
16480 69 53 65 67 69 64 20 29 7b 0a 20 20 20 20 20 20  iSegid ){.      
16490 20 20 20 20 20 20 20 20 69 53 65 67 69 64 20 3d          iSegid =
164a0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
164b0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
164c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
164d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
164e0 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f  urn iSegid;.}../
164f0 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61 6c 6c  *.** Discard all
16500 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c 79 20   data currently 
16510 63 61 63 68 65 64 20 69 6e 20 74 68 65 20 68 61  cached in the ha
16520 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74  sh-tables..*/.st
16530 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
16540 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28 46  dexDiscardData(F
16550 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
16560 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61 73 68  assert( p->pHash
16570 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44   || p->nPendingD
16580 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ata==0 );.  if( 
16590 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20 20 20  p->pHash ){.    
165a0 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 43  sqlite3Fts5HashC
165b0 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29 3b 0a  lear(p->pHash);.
165c0 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
165d0 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ata = 0;.  }.}..
165e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
165f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70 72 65   size of the pre
16600 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c 20 74  fix, in bytes, t
16610 68 61 74 20 62 75 66 66 65 72 20 28 6e 4e 65 77  hat buffer (nNew
16620 2f 70 4e 65 77 29 20 73 68 61 72 65 73 0a 2a 2a  /pNew) shares.**
16630 20 77 69 74 68 20 62 75 66 66 65 72 20 28 6e 4f   with buffer (nO
16640 6c 64 2f 70 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61  ld/pOld)..*/.sta
16650 74 69 63 20 69 6e 74 20 66 74 73 35 50 72 65 66  tic int fts5Pref
16660 69 78 43 6f 6d 70 72 65 73 73 28 0a 20 20 69 6e  ixCompress(.  in
16670 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73 74 20 75 38  t nOld, const u8
16680 20 2a 70 4f 6c 64 2c 0a 20 20 69 6e 74 20 6e 4e   *pOld,.  int nN
16690 65 77 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e  ew, const u8 *pN
166a0 65 77 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ew.){.  int i;. 
166b0 20 61 73 73 65 72 74 28 20 66 74 73 35 42 6c 6f   assert( fts5Blo
166c0 62 43 6f 6d 70 61 72 65 28 70 4f 6c 64 2c 20 6e  bCompare(pOld, n
166d0 4f 6c 64 2c 20 70 4e 65 77 2c 20 6e 4e 65 77 29  Old, pNew, nNew)
166e0 3c 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  <0 );.  for(i=0;
166f0 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
16700 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d     if( pOld[i]!=
16710 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b  pNew[i] ) break;
16720 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
16730 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16740 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c  fts5WriteDlidxCl
16750 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ear(.  Fts5Index
16760 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
16770 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
16780 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20    int bFlush    
16790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
167a0 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72    /* If true, wr
167b0 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73  ite dlidx to dis
167c0 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  k */.){.  int i;
167d0 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c 75 73  .  assert( bFlus
167e0 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72  h==0 || (pWriter
167f0 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
16800 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
16810 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66  .buf.n>0) );.  f
16820 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
16830 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b  r->nDlidx; i++){
16840 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
16850 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
16860 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
16870 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69  i];.    if( pDli
16880 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62  dx->buf.n==0 ) b
16890 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46  reak;.    if( bF
168a0 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  lush ){.      as
168b0 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67  sert( pDlidx->pg
168c0 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  no!=0 );.      f
168d0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
168e0 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
168f0 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69  DLIDX_ROWID(pWri
16900 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
16910 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20  pDlidx->pgno),. 
16920 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d           pDlidx-
16930 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e  >buf.p, pDlidx->
16940 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20  buf.n.      );. 
16950 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16960 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
16970 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
16980 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
16990 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alid = 0;.  }.}.
169a0 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20  ./*.** Grow the 
169b0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
169c0 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65  ] array to at le
169d0 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74  ast nLvl element
169e0 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e  s in size..** An
169f0 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d  y new array elem
16a00 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20  ents are zeroed 
16a10 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
16a20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16a30 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72  fts5WriteDlidxGr
16a40 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ow(.  Fts5Index 
16a50 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69  *p,.  Fts5SegWri
16a60 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
16a70 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66  int nLvl.){.  if
16a80 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
16a90 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69  OK && nLvl>=pWri
16aa0 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20  ter->nDlidx ){. 
16ab0 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
16ac0 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74  er *aDlidx = (Ft
16ad0 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73  s5DlidxWriter*)s
16ae0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
16af0 20 20 20 20 20 20 20 20 70 57 72 69 74 65 72 2d          pWriter-
16b00 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f 66 28  >aDlidx, sizeof(
16b10 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72 29  Fts5DlidxWriter)
16b20 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b 0a 20   * nLvl.    );. 
16b30 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d 3d 30     if( aDlidx==0
16b40 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
16b50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
16b60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
16b70 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a   int nByte = siz
16b80 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57 72 69  eof(Fts5DlidxWri
16b90 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d 20 70  ter) * (nLvl - p
16ba0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 29 3b  Writer->nDlidx);
16bb0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 61  .      memset(&a
16bc0 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d 3e 6e  Dlidx[pWriter->n
16bd0 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79 74 65  Dlidx], 0, nByte
16be0 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  );.      pWriter
16bf0 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c 69 64  ->aDlidx = aDlid
16c00 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74 65 72  x;.      pWriter
16c10 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76 6c 3b  ->nDlidx = nLvl;
16c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16c30 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a  urn p->rc;.}../*
16c40 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
16c50 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  nt doclist-index
16c60 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20 69 6e   accumulating in
16c70 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
16c80 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a 20 65  [] is large.** e
16c90 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69 74 20  nough, flush it 
16ca0 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65 74 75  to disk and retu
16cb0 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73 65 20  rn 1. Otherwise 
16cc0 64 69 73 63 61 72 64 20 69 74 20 61 6e 64 20 72  discard it and r
16cd0 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  eturn.** zero..*
16ce0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
16cf0 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78  5WriteFlushDlidx
16d00 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
16d10 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
16d20 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62 46  riter){.  int bF
16d30 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  lag = 0;..  /* I
16d40 66 20 74 68 65 72 65 20 77 65 72 65 20 46 54 53  f there were FTS
16d50 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49 5a 45  5_MIN_DLIDX_SIZE
16d60 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79 20 6c   or more empty l
16d70 65 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65  eaf pages writte
16d80 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 64 61  n.  ** to the da
16d90 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77 72 69  tabase, also wri
16da0 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74 2d 69  te the doclist-i
16db0 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20 20 2a  ndex to disk.  *
16dc0 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65 72 2d  /.  if( pWriter-
16dd0 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e  >aDlidx[0].buf.n
16de0 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 6e  >0 && pWriter->n
16df0 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49 4e 5f  Empty>=FTS5_MIN_
16e00 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a 20 20  DLIDX_SIZE ){.  
16e10 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20 20 7d    bFlag = 1;.  }
16e20 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  .  fts5WriteDlid
16e30 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69 74 65  xClear(p, pWrite
16e40 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70 57 72  r, bFlag);.  pWr
16e50 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d 20 30  iter->nEmpty = 0
16e60 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c 61 67  ;.  return bFlag
16e70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
16e80 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
16e90 65 64 20 77 68 65 6e 65 76 65 72 20 70 72 6f 63  ed whenever proc
16ea0 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20 64 6f  essing of the do
16eb0 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20 0a 2a  clist for the .*
16ec0 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e 20 6c  * last term on l
16ed0 65 61 66 20 70 61 67 65 20 28 70 57 72 69 74 65  eaf page (pWrite
16ee0 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73 20 63  r->iBtPage) is c
16ef0 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a 2a 2a  ompleted. .**.**
16f00 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64   The doclist-ind
16f10 65 78 20 66 6f 72 20 74 68 61 74 20 74 65 72 6d  ex for that term
16f20 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 73 74   is currently st
16f30 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 77  ored in-memory w
16f40 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46 74 73  ithin the.** Fts
16f50 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c 69 64  5SegWriter.aDlid
16f60 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20 69 74  x[] array. If it
16f70 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68   is large enough
16f80 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
16f90 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f 75 74  ** writes it out
16fa0 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20 69 66   to disk. Or, if
16fb0 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c   it is too small
16fc0 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74 68 2c   to bother with,
16fd0 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69 74 2e   discards.** it.
16fe0 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67 57 72  .**.** Fts5SegWr
16ff0 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75 72 72  iter.btterm curr
17000 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 74  ently contains t
17010 68 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e  he first term on
17020 20 70 61 67 65 20 69 42 74 50 61 67 65 2e 0a 2a   page iBtPage..*
17030 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
17040 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
17050 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
17060 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
17070 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20 62  Writer){.  int b
17080 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  Flag;..  assert(
17090 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
170a0 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e 6e 45  e || pWriter->nE
170b0 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69 66 28  mpty==0 );.  if(
170c0 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67   pWriter->iBtPag
170d0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
170e0 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57 72 69   bFlag = fts5Wri
170f0 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70 2c 20  teFlushDlidx(p, 
17100 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69 66 28  pWriter);..  if(
17110 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
17120 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  K ){.    const c
17130 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69 74 65  har *z = (pWrite
17140 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f 28 63  r->btterm.n>0?(c
17150 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72 69 74  onst char*)pWrit
17160 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22 22 29  er->btterm.p:"")
17170 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c  ;.    /* The fol
17180 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72 65 61  lowing was alrea
17190 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73 35 57  dy done in fts5W
171a0 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f 0a 20  riteInit(): */. 
171b0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 62 69     /* sqlite3_bi
171c0 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72  nd_int(p->pIdxWr
171d0 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72  iter, 1, pWriter
171e0 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a 20 20  ->iSegid); */.  
171f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
17200 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69 74 65  lob(p->pIdxWrite
17210 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74 65 72  r, 2, z, pWriter
17220 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51 4c 49  ->btterm.n, SQLI
17230 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
17240 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
17250 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  64(p->pIdxWriter
17260 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28 28 69  , 3, bFlag + ((i
17270 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42 74 50  64)pWriter->iBtP
17280 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20 73 71  age<<1));.    sq
17290 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70 49  lite3_step(p->pI
172a0 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20 70  dxWriter);.    p
172b0 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72  ->rc = sqlite3_r
172c0 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72 69 74  eset(p->pIdxWrit
172d0 65 72 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69 74  er);.  }.  pWrit
172e0 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30 3b  er->iBtPage = 0;
172f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
17300 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66 6f  s called once fo
17310 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67 65  r each leaf page
17320 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72 73   except the firs
17330 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  t that contains.
17340 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ** at least one 
17350 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20 28  term. Argument (
17360 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73 20  nTerm/pTerm) is 
17370 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d 20  the split-key - 
17380 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20 69  a term that.** i
17390 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61 6c  s larger than al
173a0 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e 20  l terms written 
173b0 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76 65  to earlier leave
173c0 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f 20  s, and equal to 
173d0 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74 68  or.** smaller th
173e0 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65 72  an the first ter
173f0 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65 61  m on the new lea
17400 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  f..**.** If an e
17410 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
17420 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c 65  error code is le
17430 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78 2e  ft in Fts5Index.
17440 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 0a  rc. If an error.
17450 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f  ** has already o
17460 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68 69  ccurred when thi
17470 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
17480 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
17490 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  -op..*/.static v
174a0 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
174b0 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e  eeTerm(.  Fts5In
174c0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
174d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
174e0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
174f0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72 69   */.  Fts5SegWri
17500 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20  ter *pWriter,   
17510 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20        /* Writer 
17520 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
17530 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
17540 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20 46  *pTerm      /* F
17550 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65 77  irst term on new
17560 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66 74   page */.){.  ft
17570 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
17580 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  e(p, pWriter);. 
17590 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
175a0 70 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d  p->rc, &pWriter-
175b0 3e 62 74 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  >btterm, nTerm, 
175c0 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65  pTerm);.  pWrite
175d0 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72  r->iBtPage = pWr
175e0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
175f0 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  o;.}../*.** This
17600 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
17610 6c 65 64 20 77 68 65 6e 20 66 6c 75 73 68 69 6e  led when flushin
17620 67 20 61 20 6c 65 61 66 20 70 61 67 65 20 74 68  g a leaf page th
17630 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a  at contains no.*
17640 2a 20 74 65 72 6d 73 20 61 74 20 61 6c 6c 20 74  * terms at all t
17650 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  o disk..*/.stati
17660 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65  c void fts5Write
17670 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46  BtreeNoTerm(.  F
17680 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
17690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
176a0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
176b0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
176c0 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
176d0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72  r          /* Wr
176e0 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  iter object */.)
176f0 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  {.  /* If there 
17700 77 65 72 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f  were no rowids o
17710 6e 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20  n the leaf page 
17720 65 69 74 68 65 72 20 61 6e 64 20 74 68 65 20 64  either and the d
17730 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a  oclist-index.  *
17740 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  * has already be
17750 65 6e 20 73 74 61 72 74 65 64 2c 20 61 70 70 65  en started, appe
17760 6e 64 20 61 6e 20 30 78 30 30 20 62 79 74 65 20  nd an 0x00 byte 
17770 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28  to it.  */.  if(
17780 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
17790 52 6f 77 69 64 49 6e 50 61 67 65 20 26 26 20 70  RowidInPage && p
177a0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
177b0 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20  ].buf.n>0 ){.   
177c0 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
177d0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
177e0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a  ter->aDlidx[0];.
177f0 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
17800 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29  dx->bPrevValid )
17810 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
17820 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
17830 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c  int(&p->rc, &pDl
17840 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20  idx->buf, 0);.  
17850 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  }..  /* Incremen
17860 74 20 74 68 65 20 22 6e 75 6d 62 65 72 20 6f 66  t the "number of
17870 20 73 65 71 75 65 6e 74 69 61 6c 20 6c 65 61 76   sequential leav
17880 65 73 20 77 69 74 68 6f 75 74 20 61 20 74 65 72  es without a ter
17890 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20  m" counter. */. 
178a0 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79   pWriter->nEmpty
178b0 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36  ++;.}..static i6
178c0 34 20 66 74 73 35 44 6c 69 64 78 45 78 74 72 61  4 fts5DlidxExtra
178d0 63 74 46 69 72 73 74 52 6f 77 69 64 28 46 74 73  ctFirstRowid(Fts
178e0 35 42 75 66 66 65 72 20 2a 70 42 75 66 29 7b 0a  5Buffer *pBuf){.
178f0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20 20    i64 iRowid;.  
17900 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66  int iOff;..  iOf
17910 66 20 3d 20 31 20 2b 20 66 74 73 35 47 65 74 56  f = 1 + fts5GetV
17920 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31  arint(&pBuf->p[1
17930 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
17940 29 3b 0a 20 20 66 74 73 35 47 65 74 56 61 72 69  );.  fts5GetVari
17950 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66  nt(&pBuf->p[iOff
17960 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64  ], (u64*)&iRowid
17970 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 52 6f 77  );.  return iRow
17980 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77  id;.}../*.** Row
17990 69 64 20 69 52 6f 77 69 64 20 68 61 73 20 6a 75  id iRowid has ju
179a0 73 74 20 62 65 65 6e 20 61 70 70 65 6e 64 65 64  st been appended
179b0 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20   to the current 
179c0 6c 65 61 66 20 70 61 67 65 2e 20 49 74 20 69 73  leaf page. It is
179d0 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e   the.** first on
179e0 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73 20   the page. This 
179f0 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
17a00 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
17a10 65 6e 74 72 79 20 74 6f 20 74 68 65 20 63 75 72  entry to the cur
17a20 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d  rent.** doclist-
17a30 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63  index..*/.static
17a40 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44   void fts5WriteD
17a50 6c 69 64 78 41 70 70 65 6e 64 28 0a 20 20 46 74  lidxAppend(.  Ft
17a60 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
17a70 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
17a80 72 69 74 65 72 2c 20 0a 20 20 69 36 34 20 69 52  riter, .  i64 iR
17a90 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  owid.){.  int i;
17aa0 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
17ab0 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
17ac0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
17ad0 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
17ae0 7b 0a 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a  {.    i64 iVal;.
17af0 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
17b00 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
17b10 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
17b20 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69  ];..    if( pDli
17b30 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43  dx->buf.n>=p->pC
17b40 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
17b50 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 72       /* The curr
17b60 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65  ent doclist-inde
17b70 78 20 70 61 67 65 20 69 73 20 66 75 6c 6c 2e 20  x page is full. 
17b80 57 72 69 74 65 20 69 74 20 74 6f 20 64 69 73 6b  Write it to disk
17b90 20 61 6e 64 20 70 75 73 68 0a 20 20 20 20 20 20   and push.      
17ba0 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 69 52 6f  ** a copy of iRo
17bb0 77 69 64 20 28 77 68 69 63 68 20 77 69 6c 6c 20  wid (which will 
17bc0 62 65 63 6f 6d 65 20 74 68 65 20 66 69 72 73 74  become the first
17bd0 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20 6e 65   rowid on the ne
17be0 78 74 0a 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c  xt.      ** docl
17bf0 69 73 74 2d 69 6e 64 65 78 20 6c 65 61 66 20 70  ist-index leaf p
17c00 61 67 65 29 20 75 70 20 69 6e 74 6f 20 74 68 65  age) up into the
17c10 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f 66 20 74   next level of t
17c20 68 65 20 62 2d 74 72 65 65 20 0a 20 20 20 20 20  he b-tree .     
17c30 20 2a 2a 20 68 69 65 72 61 72 63 68 79 2e 20 49   ** hierarchy. I
17c40 66 20 74 68 65 20 6e 6f 64 65 20 62 65 69 6e 67  f the node being
17c50 20 66 6c 75 73 68 65 64 20 69 73 20 63 75 72 72   flushed is curr
17c60 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e  ently the root n
17c70 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c  ode,.      ** al
17c80 73 6f 20 70 75 73 68 20 69 74 73 20 66 69 72 73  so push its firs
17c90 74 20 72 6f 77 69 64 20 75 70 77 61 72 64 73 2e  t rowid upwards.
17ca0 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c 69 64 78   */.      pDlidx
17cb0 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30  ->buf.p[0] = 0x0
17cc0 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65  1;    /* Not the
17cd0 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20   root node */.  
17ce0 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
17cf0 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20 20  e(p, .          
17d00 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44  FTS5_DLIDX_ROWID
17d10 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64  (pWriter->iSegid
17d20 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e  , i, pDlidx->pgn
17d30 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 44  o),.          pD
17d40 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c  lidx->buf.p, pDl
17d50 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20  idx->buf.n.     
17d60 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57 72   );.      fts5Wr
17d70 69 74 65 44 6c 69 64 78 47 72 6f 77 28 70 2c 20  iteDlidxGrow(p, 
17d80 70 57 72 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20  pWriter, i+2);. 
17d90 20 20 20 20 20 70 44 6c 69 64 78 20 3d 20 26 70       pDlidx = &p
17da0 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69  Writer->aDlidx[i
17db0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ];.      if( p->
17dc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17dd0 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e   pDlidx[1].buf.n
17de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
17df0 36 34 20 69 46 69 72 73 74 20 3d 20 66 74 73 35  64 iFirst = fts5
17e00 44 6c 69 64 78 45 78 74 72 61 63 74 46 69 72 73  DlidxExtractFirs
17e10 74 52 6f 77 69 64 28 26 70 44 6c 69 64 78 2d 3e  tRowid(&pDlidx->
17e20 62 75 66 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  buf);..        /
17e30 2a 20 54 68 69 73 20 77 61 73 20 74 68 65 20 72  * This was the r
17e40 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73 68 20 69  oot node. Push i
17e50 74 73 20 66 69 72 73 74 20 72 6f 77 69 64 20 75  ts first rowid u
17e60 70 20 74 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f  p to the new roo
17e70 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 44  t. */.        pD
17e80 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70  lidx[1].pgno = p
17e90 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20  Dlidx->pgno;.   
17ea0 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
17eb0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
17ec0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69  nt(&p->rc, &pDli
17ed0 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20  dx[1].buf, 0);. 
17ee0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
17ef0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
17f00 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
17f10 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c  lidx[1].buf, pDl
17f20 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  idx->pgno);.    
17f30 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
17f40 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
17f50 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
17f60 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69 72 73 74  x[1].buf, iFirst
17f70 29 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  );.        pDlid
17f80 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c 69 64 20  x[1].bPrevValid 
17f90 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 44 6c  = 1;.        pDl
17fa0 69 64 78 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69  idx[1].iPrev = i
17fb0 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a  First;.      }..
17fc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
17fd0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 44 6c  5BufferZero(&pDl
17fe0 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20  idx->buf);.     
17ff0 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61   pDlidx->bPrevVa
18000 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  lid = 0;.      p
18010 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20  Dlidx->pgno++;. 
18020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18030 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d  bDone = 1;.    }
18040 0a 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78  ..    if( pDlidx
18050 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 29 7b 0a  ->bPrevValid ){.
18060 20 20 20 20 20 20 69 56 61 6c 20 3d 20 69 52 6f        iVal = iRo
18070 77 69 64 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50  wid - pDlidx->iP
18080 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rev;.    }else{.
18090 20 20 20 20 20 20 69 36 34 20 69 50 67 6e 6f 20        i64 iPgno 
180a0 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72 69 74 65  = (i==0 ? pWrite
180b0 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a  r->writer.pgno :
180c0 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f   pDlidx[-1].pgno
180d0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
180e0 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d   pDlidx->buf.n==
180f0 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
18100 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
18110 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
18120 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21   &pDlidx->buf, !
18130 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20 20 73 71  bDone);.      sq
18140 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
18150 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
18160 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
18170 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , iPgno);.      
18180 69 56 61 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20  iVal = iRowid;. 
18190 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65     }..    sqlite
181a0 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
181b0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
181c0 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56  &pDlidx->buf, iV
181d0 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d  al);.    pDlidx-
181e0 3e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31 3b  >bPrevValid = 1;
181f0 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 69 50 72  .    pDlidx->iPr
18200 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d  ev = iRowid;.  }
18210 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
18220 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65  fts5WriteFlushLe
18230 61 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  af(Fts5Index *p,
18240 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
18250 70 57 72 69 74 65 72 29 7b 0a 20 20 73 74 61 74  pWriter){.  stat
18260 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f  ic const u8 zero
18270 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20 30 78 30  [] = { 0x00, 0x0
18280 30 2c 20 30 78 30 30 2c 20 30 78 30 30 20 7d 3b  0, 0x00, 0x00 };
18290 0a 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65  .  Fts5PageWrite
182a0 72 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69  r *pPage = &pWri
182b0 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69  ter->writer;.  i
182c0 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73  64 iRowid;..  as
182d0 73 65 72 74 28 20 28 70 50 61 67 65 2d 3e 70 67  sert( (pPage->pg
182e0 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69  idx.n==0)==(pWri
182f0 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
18300 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20  nPage) );..  /* 
18310 53 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68  Set the szLeaf h
18320 65 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a  eader field. */.
18330 20 20 61 73 73 65 72 74 28 20 30 3d 3d 66 74 73    assert( 0==fts
18340 35 47 65 74 55 31 36 28 26 70 50 61 67 65 2d 3e  5GetU16(&pPage->
18350 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66  buf.p[2]) );.  f
18360 74 73 35 50 75 74 55 31 36 28 26 70 50 61 67 65  ts5PutU16(&pPage
18370 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 70 50 61 67  ->buf.p[2], pPag
18380 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 69 66  e->buf.n);..  if
18390 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
183a0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
183b0 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20 77 61     /* No term wa
183c0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69  s written to thi
183d0 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 61  s page. */.    a
183e0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
183f0 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  idx.n==0 );.    
18400 66 74 73 35 57 72 69 74 65 42 74 72 65 65 4e 6f  fts5WriteBtreeNo
18410 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65 72 29  Term(p, pWriter)
18420 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
18430 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70 67 69  * Append the pgi
18440 64 78 20 74 6f 20 74 68 65 20 70 61 67 65 20 62  dx to the page b
18450 75 66 66 65 72 2e 20 53 65 74 20 74 68 65 20 73  uffer. Set the s
18460 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66 69 65  zLeaf header fie
18470 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 42  ld. */.    fts5B
18480 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
18490 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
184a0 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  buf, pPage->pgid
184b0 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67 69 64  x.n, pPage->pgid
184c0 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  x.p);.  }..  /* 
184d0 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 6f  Write the page o
184e0 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20  ut to disk */.  
184f0 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  iRowid = FTS5_SE
18500 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57 72 69  GMENT_ROWID(pWri
18510 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70 50 61  ter->iSegid, pPa
18520 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66 74 73  ge->pgno);.  fts
18530 35 44 61 74 61 57 72 69 74 65 28 70 2c 20 69 52  5DataWrite(p, iR
18540 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62 75 66  owid, pPage->buf
18550 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  .p, pPage->buf.n
18560 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  );..  /* Initial
18570 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70 61 67  ize the next pag
18580 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66  e. */.  fts5Buff
18590 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 62  erZero(&pPage->b
185a0 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  uf);.  fts5Buffe
185b0 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e 70 67  rZero(&pPage->pg
185c0 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66  idx);.  fts5Buff
185d0 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
185e0 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
185f0 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20 70 50  , 4, zero);.  pP
18600 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 20  age->iPrevPgidx 
18610 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67  = 0;.  pPage->pg
18620 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72  no++;..  /* Incr
18630 65 61 73 65 20 74 68 65 20 6c 65 61 76 65 73 20  ease the leaves 
18640 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65 72 20  written counter 
18650 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 4c  */.  pWriter->nL
18660 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a 0a 20  eafWritten++;.. 
18670 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65 61 66   /* The new leaf
18680 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d 73 20   holds no terms 
18690 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20 20 70  or rowids */.  p
186a0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
186b0 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
186c0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
186d0 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31 3b 0a  owidInPage = 1;.
186e0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  }../*.** Append 
186f0 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65 72 6d  term pTerm/nTerm
18700 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
18710 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 62 79  being written by
18720 20 74 68 65 20 77 72 69 74 65 72 20 70 61 73 73   the writer pass
18730 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
18740 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
18750 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
18760 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
18770 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
18780 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
18790 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
187a0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
187b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
187c0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
187d0 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
187e0 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20 20 46  eAppendTerm(.  F
187f0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
18800 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70  Fts5SegWriter *p
18810 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20 6e 54  Writer,.  int nT
18820 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70  erm, const u8 *p
18830 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74 20 6e  Term .){.  int n
18840 50 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20  Prefix;         
18850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
18860 74 65 73 20 6f 66 20 70 72 65 66 69 78 20 63 6f  tes of prefix co
18870 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20 74 65  mpression for te
18880 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65  rm */.  Fts5Page
18890 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20  Writer *pPage = 
188a0 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
188b0 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ;.  Fts5Buffer *
188c0 70 50 67 69 64 78 20 3d 20 26 70 57 72 69 74 65  pPgidx = &pWrite
188d0 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78 3b  r->writer.pgidx;
188e0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
188f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
18900 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
18910 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61  >buf.n>=4 );.  a
18920 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
18930 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72  f.n>4 || pWriter
18940 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
18950 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ge );..  /* If t
18960 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
18970 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
18980 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
18990 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d  */.  if( (pPage-
189a0 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d  >buf.n + pPgidx-
189b0 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e  >n + nTerm + 2)>
189c0 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
189d0 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  z ){.    if( pPa
189e0 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20  ge->buf.n>4 ){. 
189f0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
18a00 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
18a10 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  er);.    }.    f
18a20 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
18a30 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
18a40 66 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41  f, nTerm+FTS5_DA
18a50 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d  TA_PADDING);.  }
18a60 0a 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20  .  .  /* TODO1: 
18a70 55 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68  Updating pgidx h
18a80 65 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78  ere. */.  pPgidx
18a90 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
18aa0 73 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20  s5PutVarint(.   
18ab0 20 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50     &pPgidx->p[pP
18ac0 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d  gidx->n], pPage-
18ad0 3e 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e  >buf.n - pPage->
18ae0 69 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a  iPrevPgidx.  );.
18af0 20 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67    pPage->iPrevPg
18b00 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66  idx = pPage->buf
18b10 2e 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35  .n;.#if 0.  fts5
18b20 50 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e  PutU16(&pPgidx->
18b30 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50  p[pPgidx->n], pP
18b40 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70  age->buf.n);.  p
18b50 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23  Pgidx->n += 2;.#
18b60 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72  endif..  if( pWr
18b70 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d  iter->bFirstTerm
18b80 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50  InPage ){.    nP
18b90 72 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69  refix = 0;.    i
18ba0 66 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d  f( pPage->pgno!=
18bb0 31 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  1 ){.      /* Th
18bc0 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
18bd0 74 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74  term on a leaf t
18be0 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c  hat is not the l
18bf0 65 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a  eftmost leaf in.
18c00 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67        ** the seg
18c10 6d 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20  ment b-tree. In 
18c20 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
18c30 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64  necessary to add
18c40 20 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20   a term to.     
18c50 20 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68   ** the b-tree h
18c60 69 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73  ierarchy that is
18c70 20 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e   (a) larger than
18c80 20 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72   the largest ter
18c90 6d 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65  m .      ** alre
18ca0 61 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ady written to t
18cb0 68 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28  he segment and (
18cc0 62 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  b) smaller than 
18cd0 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20  or equal to.    
18ce0 20 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20    ** this term. 
18cf0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
18d00 61 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65  a prefix of (pTe
18d10 72 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69  rm/nTerm) that i
18d20 73 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62  s one.      ** b
18d30 79 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20  yte longer than 
18d40 74 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66  the longest pref
18d50 69 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29  ix (pTerm/nTerm)
18d60 20 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65   shares with the
18d70 0a 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f  .      ** previo
18d80 75 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20  us term. .      
18d90 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61  **.      ** Usua
18da0 6c 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75  lly, the previou
18db0 73 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61  s term is availa
18dc0 62 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65  ble in pPage->te
18dd0 72 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f  rm. The exceptio
18de0 6e 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66  n.      ** is if
18df0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
18e00 73 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20  st term written 
18e10 69 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  in an incrementa
18e20 6c 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20  l-merge step..  
18e30 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
18e40 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
18e50 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61   term is not ava
18e60 69 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20  ilable, so just 
18e70 77 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a  write a.      **
18e80 20 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f   copy of (pTerm/
18e90 6e 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20  nTerm) into the 
18ea0 70 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69  parent node. Thi
18eb0 73 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20  s is slightly.  
18ec0 20 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65      ** inefficie
18ed0 6e 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f  nt, but still co
18ee0 72 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20  rrect.  */.     
18ef0 20 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a   int n = nTerm;.
18f00 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
18f10 3e 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20  >term.n ){.     
18f20 20 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50     n = 1 + fts5P
18f30 72 65 66 69 78 43 6f 6d 70 72 65 73 73 28 70 50  refixCompress(pP
18f40 61 67 65 2d 3e 74 65 72 6d 2e 6e 2c 20 70 50 61  age->term.n, pPa
18f50 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 6e 54 65 72  ge->term.p, nTer
18f60 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20  m, pTerm);.     
18f70 20 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69   }.      fts5Wri
18f80 74 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70  teBtreeTerm(p, p
18f90 57 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d  Writer, n, pTerm
18fa0 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d  );.      pPage =
18fb0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
18fc0 72 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  r;.    }.  }else
18fd0 7b 0a 20 20 20 20 6e 50 72 65 66 69 78 20 3d 20  {.    nPrefix = 
18fe0 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
18ff0 73 73 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e 6e  ss(pPage->term.n
19000 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70 2c  , pPage->term.p,
19010 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a   nTerm, pTerm);.
19020 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
19030 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
19040 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
19050 6e 50 72 65 66 69 78 29 3b 0a 20 20 7d 0a 0a 20  nPrefix);.  }.. 
19060 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 6e   /* Append the n
19070 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
19080 66 20 6e 65 77 20 64 61 74 61 2c 20 74 68 65 6e  f new data, then
19090 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 69   the term data i
190a0 74 73 65 6c 66 0a 20 20 2a 2a 20 74 6f 20 74 68  tself.  ** to th
190b0 65 20 70 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73  e page. */.  fts
190c0 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
190d0 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61  int(&p->rc, &pPa
190e0 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d  ge->buf, nTerm -
190f0 20 6e 50 72 65 66 69 78 29 3b 0a 20 20 66 74 73   nPrefix);.  fts
19100 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
19110 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
19120 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 20 2d 20 6e  ->buf, nTerm - n
19130 50 72 65 66 69 78 2c 20 26 70 54 65 72 6d 5b 6e  Prefix, &pTerm[n
19140 50 72 65 66 69 78 5d 29 3b 0a 0a 20 20 2f 2a 20  Prefix]);..  /* 
19150 55 70 64 61 74 65 20 74 68 65 20 46 74 73 35 50  Update the Fts5P
19160 61 67 65 57 72 69 74 65 72 2e 74 65 72 6d 20 66  ageWriter.term f
19170 69 65 6c 64 2e 20 2a 2f 0a 20 20 66 74 73 35 42  ield. */.  fts5B
19180 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63 2c  ufferSet(&p->rc,
19190 20 26 70 50 61 67 65 2d 3e 74 65 72 6d 2c 20 6e   &pPage->term, n
191a0 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
191b0 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54  pWriter->bFirstT
191c0 65 72 6d 49 6e 50 61 67 65 20 3d 20 30 3b 0a 0a  ermInPage = 0;..
191d0 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
191e0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30  tRowidInPage = 0
191f0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
19200 72 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73  rstRowidInDoclis
19210 74 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74  t = 1;..  assert
19220 28 20 70 2d 3e 72 63 20 7c 7c 20 28 70 57 72 69  ( p->rc || (pWri
19230 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26  ter->nDlidx>0 &&
19240 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
19250 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30 29 20 29 3b  [0].buf.n==0) );
19260 0a 20 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  .  pWriter->aDli
19270 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d 20 70 50 61  dx[0].pgno = pPa
19280 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ge->pgno;.}../*.
19290 2a 2a 20 41 70 70 65 6e 64 20 61 20 72 6f 77 69  ** Append a rowi
192a0 64 20 61 6e 64 20 70 6f 73 69 74 69 6f 6e 2d 6c  d and position-l
192b0 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 74  ist size field t
192c0 6f 20 74 68 65 20 77 72 69 74 65 72 73 20 6f 75  o the writers ou
192d0 74 70 75 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  tput. .*/.static
192e0 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41   void fts5WriteA
192f0 70 70 65 6e 64 52 6f 77 69 64 28 0a 20 20 46 74  ppendRowid(.  Ft
19300 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
19310 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
19320 72 69 74 65 72 2c 0a 20 20 69 36 34 20 69 52 6f  riter,.  i64 iRo
19330 77 69 64 2c 0a 20 20 69 6e 74 20 6e 50 6f 73 0a  wid,.  int nPos.
19340 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
19350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19360 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20   Fts5PageWriter 
19370 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65  *pPage = &pWrite
19380 72 2d 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20  r->writer;..    
19390 69 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e  if( (pPage->buf.
193a0 6e 20 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78  n + pPage->pgidx
193b0 2e 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d  .n)>=p->pConfig-
193c0 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66  >pgsz ){.      f
193d0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
193e0 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
193f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
19400 74 68 69 73 20 69 73 20 74 6f 20 62 65 20 74 68  this is to be th
19410 65 20 66 69 72 73 74 20 72 6f 77 69 64 20 77 72  e first rowid wr
19420 69 74 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67  itten to the pag
19430 65 2c 20 73 65 74 20 74 68 65 20 0a 20 20 20 20  e, set the .    
19440 2a 2a 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72  ** rowid-pointer
19450 20 69 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61   in the page-hea
19460 64 65 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64  der. Also append
19470 20 61 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20   a value to the 
19480 64 6c 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66  dlidx.    ** buf
19490 66 65 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64  fer, in case a d
194a0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20  oclist-index is 
194b0 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20  required.  */.  
194c0 20 20 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62    if( pWriter->b
194d0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
194e0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75   ){.      fts5Pu
194f0 74 55 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e  tU16(pPage->buf.
19500 70 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  p, pPage->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 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
19530 70 57 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  pWriter, iRowid)
19540 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19550 57 72 69 74 65 20 74 68 65 20 72 6f 77 69 64 2e  Write the rowid.
19560 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57 72 69   */.    if( pWri
19570 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
19580 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72  InDoclist || pWr
19590 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69  iter->bFirstRowi
195a0 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
195b0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
195c0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
195d0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f  &pPage->buf, iRo
195e0 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  wid);.    }else{
195f0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19600 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70  ->rc || iRowid>p
19610 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
19620 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  id );.      fts5
19630 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
19640 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
19650 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d  e->buf, iRowid -
19660 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
19670 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
19680 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
19690 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
196a0 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
196b0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
196c0 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
196d0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
196e0 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 66  Page = 0;..    f
196f0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
19700 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
19710 50 61 67 65 2d 3e 62 75 66 2c 20 6e 50 6f 73 29  Page->buf, nPos)
19720 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
19730 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 41 70  void fts5WriteAp
19740 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28  pendPoslistData(
19750 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19760 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
19770 72 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63  r *pWriter, .  c
19780 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20  onst u8 *aData, 
19790 0a 20 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a  .  int nData.){.
197a0 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
197b0 20 2a 70 50 61 67 65 20 3d 20 26 70 57 72 69 74   *pPage = &pWrit
197c0 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f  er->writer;.  co
197d0 6e 73 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74  nst u8 *a = aDat
197e0 61 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61  a;.  int n = nDa
197f0 74 61 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28  ta;.  .  assert(
19800 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
19810 7a 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  z>0 );.  while( 
19820 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
19830 20 0a 20 20 20 20 20 26 26 20 28 70 50 61 67 65   .     && (pPage
19840 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d  ->buf.n + pPage-
19850 3e 70 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70  >pgidx.n + n)>=p
19860 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20  ->pConfig->pgsz 
19870 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52  .  ){.    int nR
19880 65 71 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  eq = p->pConfig-
19890 3e 70 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62  >pgsz - pPage->b
198a0 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67  uf.n - pPage->pg
198b0 69 64 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  idx.n;.    int n
198c0 43 6f 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68  Copy = 0;.    wh
198d0 69 6c 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20  ile( nCopy<nReq 
198e0 29 7b 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d  ){.      i64 dum
198f0 6d 79 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20  my;.      nCopy 
19900 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
19910 28 26 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34  (&a[nCopy], (u64
19920 2a 29 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d  *)&dummy);.    }
19930 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41  .    fts5BufferA
19940 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63  ppendBlob(&p->rc
19950 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e  , &pPage->buf, n
19960 43 6f 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20  Copy, a);.    a 
19970 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20  += nCopy;.    n 
19980 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74  -= nCopy;.    ft
19990 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66  s5WriteFlushLeaf
199a0 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20  (p, pWriter);.  
199b0 7d 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  }.  if( n>0 ){. 
199c0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
199d0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
199e0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20  &pPage->buf, n, 
199f0 61 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  a);.  }.}../*.**
19a00 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20   Flush any data 
19a10 63 61 63 68 65 64 20 62 79 20 74 68 65 20 77 72  cached by the wr
19a20 69 74 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74  iter object to t
19a30 68 65 20 64 61 74 61 62 61 73 65 2e 20 46 72 65  he database. Fre
19a40 65 20 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74  e any.** allocat
19a50 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20  ions associated 
19a60 77 69 74 68 20 74 68 65 20 77 72 69 74 65 72 2e  with the writer.
19a70 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19a80 66 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28  fts5WriteFinish(
19a90 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19aa0 20 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65   .  Fts5SegWrite
19ab0 72 20 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20  r *pWriter,     
19ac0 20 20 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62      /* Writer ob
19ad0 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ject */.  int *p
19ae0 6e 4c 65 61 66 20 20 20 20 20 20 20 20 20 20 20  nLeaf           
19af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
19b00 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66  : Number of leaf
19b10 20 70 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65   pages in b-tree
19b20 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
19b30 20 20 46 74 73 35 50 61 67 65 57 72 69 74 65 72    Fts5PageWriter
19b40 20 2a 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74   *pLeaf = &pWrit
19b50 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66  er->writer;.  if
19b60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
19b70 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19b80 28 20 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31  ( pLeaf->pgno>=1
19b90 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61   );.    if( pLea
19ba0 66 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20  f->buf.n>4 ){.  
19bb0 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
19bc0 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65  shLeaf(p, pWrite
19bd0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  r);.    }.    *p
19be0 6e 4c 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70  nLeaf = pLeaf->p
19bf0 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35 57  gno-1;.    fts5W
19c00 72 69 74 65 46 6c 75 73 68 42 74 72 65 65 28 70  riteFlushBtree(p
19c10 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
19c20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
19c30 28 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a  (&pLeaf->term);.
19c40 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
19c50 28 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20  (&pLeaf->buf);. 
19c60 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
19c70 26 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a  &pLeaf->pgidx);.
19c80 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
19c90 28 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72  (&pWriter->btter
19ca0 6d 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  m);..  for(i=0; 
19cb0 69 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  i<pWriter->nDlid
19cc0 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  x; i++){.    sql
19cd0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72  ite3Fts5BufferFr
19ce0 65 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c  ee(&pWriter->aDl
19cf0 69 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d  idx[i].buf);.  }
19d00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19d10 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29  pWriter->aDlidx)
19d20 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.}..static void
19d30 20 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a   fts5WriteInit(.
19d40 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
19d50 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
19d60 20 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e   *pWriter, .  in
19d70 74 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f  t iSegid.){.  co
19d80 6e 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20  nst int nBuffer 
19d90 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
19da0 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50  sz + FTS5_DATA_P
19db0 41 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65  ADDING;..  memse
19dc0 74 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69  t(pWriter, 0, si
19dd0 7a 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74  zeof(Fts5SegWrit
19de0 65 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d  er));.  pWriter-
19df0 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
19e00 3b 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c  ;..  fts5WriteDl
19e10 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74  idxGrow(p, pWrit
19e20 65 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65  er, 1);.  pWrite
19e30 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  r->writer.pgno =
19e40 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62   1;.  pWriter->b
19e50 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20  FirstTermInPage 
19e60 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  = 1;.  pWriter->
19e70 69 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20  iBtPage = 1;..  
19e80 2f 2a 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20  /* Grow the two 
19e90 62 75 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20  buffers to pgsz 
19ea0 2b 20 70 61 64 64 69 6e 67 20 62 79 74 65 73 20  + padding bytes 
19eb0 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 66 74  in size. */.  ft
19ec0 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
19ed0 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77  >rc, &pWriter->w
19ee0 72 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75  riter.pgidx, nBu
19ef0 66 66 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66  ffer);.  fts5Buf
19f00 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20  ferGrow(&p->rc, 
19f10 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72  &pWriter->writer
19f20 2e 62 75 66 2c 20 6e 42 75 66 66 65 72 29 3b 0a  .buf, nBuffer);.
19f30 0a 20 20 69 66 28 20 70 2d 3e 70 49 64 78 57 72  .  if( p->pIdxWr
19f40 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 46  iter==0 ){.    F
19f50 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
19f60 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
19f70 0a 20 20 20 20 66 74 73 35 49 6e 64 65 78 50 72  .    fts5IndexPr
19f80 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26 70 2d  epareStmt(p, &p-
19f90 3e 70 49 64 78 57 72 69 74 65 72 2c 20 73 71 6c  >pIdxWriter, sql
19fa0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
19fb0 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20          "INSERT 
19fc0 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 69 64  INTO '%q'.'%q_id
19fd0 78 27 28 73 65 67 69 64 2c 74 65 72 6d 2c 70 67  x'(segid,term,pg
19fe0 6e 6f 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f  no) VALUES(?,?,?
19ff0 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  )", .          p
1a000 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
1a010 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20  nfig->zName.    
1a020 29 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  ));.  }..  if( p
1a030 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
1a040 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  ){.    /* Initia
1a050 6c 69 7a 65 20 74 68 65 20 34 2d 62 79 74 65 20  lize the 4-byte 
1a060 6c 65 61 66 2d 70 61 67 65 20 68 65 61 64 65 72  leaf-page header
1a070 20 74 6f 20 30 78 30 30 2e 20 2a 2f 0a 20 20 20   to 0x00. */.   
1a080 20 6d 65 6d 73 65 74 28 70 57 72 69 74 65 72 2d   memset(pWriter-
1a090 3e 77 72 69 74 65 72 2e 62 75 66 2e 70 2c 20 30  >writer.buf.p, 0
1a0a0 2c 20 34 29 3b 0a 20 20 20 20 70 57 72 69 74 65  , 4);.    pWrite
1a0b0 72 2d 3e 77 72 69 74 65 72 2e 62 75 66 2e 6e 20  r->writer.buf.n 
1a0c0 3d 20 34 3b 0a 0a 20 20 20 20 2f 2a 20 42 69 6e  = 4;..    /* Bin
1a0d0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75  d the current ou
1a0e0 74 70 75 74 20 73 65 67 6d 65 6e 74 20 69 64 20  tput segment id 
1a0f0 74 6f 20 74 68 65 20 69 6e 64 65 78 2d 77 72 69  to the index-wri
1a100 74 65 72 2e 20 54 68 69 73 20 69 73 20 61 6e 0a  ter. This is an.
1a110 20 20 20 20 2a 2a 20 6f 70 74 69 6d 69 7a 61 74      ** optimizat
1a120 69 6f 6e 20 6f 76 65 72 20 62 69 6e 64 69 6e 67  ion over binding
1a130 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
1a140 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 20 61 73  over and over as
1a150 20 72 6f 77 73 20 61 72 65 0a 20 20 20 20 2a 2a   rows are.    **
1a160 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1a170 5f 69 64 78 20 62 79 20 74 68 65 20 63 75 72 72  _idx by the curr
1a180 65 6e 74 20 77 72 69 74 65 72 2e 20 20 2a 2f 0a  ent writer.  */.
1a190 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1a1a0 5f 69 6e 74 28 70 2d 3e 70 49 64 78 57 72 69 74  _int(p->pIdxWrit
1a1b0 65 72 2c 20 31 2c 20 70 57 72 69 74 65 72 2d 3e  er, 1, pWriter->
1a1c0 69 53 65 67 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a  iSegid);.  }.}..
1a1d0 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72 20 70  /*.** Iterator p
1a1e0 49 74 65 72 20 77 61 73 20 75 73 65 64 20 74 6f  Iter was used to
1a1f0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1a200 20 74 68 65 20 69 6e 70 75 74 20 73 65 67 6d 65   the input segme
1a210 6e 74 73 20 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20  nts of on an.** 
1a220 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d 65 72 67  incremental merg
1a230 65 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69  e operation. Thi
1a240 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1a250 6c 6c 65 64 20 69 66 20 74 68 65 20 69 6e 63 72  lled if the incr
1a260 65 6d 65 6e 74 61 6c 0a 2a 2a 20 6d 65 72 67 65  emental.** merge
1a270 20 73 74 65 70 20 68 61 73 20 66 69 6e 69 73 68   step has finish
1a280 65 64 20 62 75 74 20 74 68 65 20 69 6e 70 75 74  ed but the input
1a290 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
1a2a0 6d 70 6c 65 74 65 6c 79 20 65 78 68 61 75 73 74  mpletely exhaust
1a2b0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
1a2c0 69 64 20 66 74 73 35 54 72 69 6d 53 65 67 6d 65  id fts5TrimSegme
1a2d0 6e 74 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  nts(Fts5Index *p
1a2e0 2c 20 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  , Fts5IndexIter 
1a2f0 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20 69  *pIter){.  int i
1a300 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 62  ;.  Fts5Buffer b
1a310 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62 75  uf;.  memset(&bu
1a320 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  f, 0, sizeof(Fts
1a330 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f 72  5Buffer));.  for
1a340 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
1a350 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46  Seg; i++){.    F
1a360 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
1a370 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
1a380 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67  i];.    if( pSeg
1a390 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a 20 20 20  ->pSeg==0 ){.   
1a3a0 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
1a3b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 53 65     }else if( pSe
1a3c0 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b 0a 20  g->pLeaf==0 ){. 
1a3d0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 6b 65 79 73       /* All keys
1a3e0 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74   from this input
1a3f0 20 73 65 67 6d 65 6e 74 20 68 61 76 65 20 62 65   segment have be
1a400 65 6e 20 74 72 61 6e 73 66 65 72 65 64 20 74 6f  en transfered to
1a410 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20   the output..   
1a420 20 20 20 2a 2a 20 53 65 74 20 62 6f 74 68 20 74     ** Set both t
1a430 68 65 20 66 69 72 73 74 20 61 6e 64 20 6c 61 73  he first and las
1a440 74 20 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 74  t page-numbers t
1a450 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 20  o 0 to indicate 
1a460 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a  that the.      *
1a470 2a 20 73 65 67 6d 65 6e 74 20 69 73 20 6e 6f 77  * segment is now
1a480 20 65 6d 70 74 79 2e 20 2a 2f 0a 20 20 20 20 20   empty. */.     
1a490 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1a4a0 6f 4c 61 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  oLast = 0;.     
1a4b0 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e   pSeg->pSeg->pgn
1a4c0 6f 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20  oFirst = 0;.    
1a4d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
1a4e0 20 69 4f 66 66 20 3d 20 70 53 65 67 2d 3e 69 54   iOff = pSeg->iT
1a4f0 65 72 6d 4c 65 61 66 4f 66 66 73 65 74 3b 20 20  ermLeafOffset;  
1a500 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 6e 20     /* Offset on 
1a510 6e 65 77 20 66 69 72 73 74 20 6c 65 61 66 20 70  new first leaf p
1a520 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34  age */.      i64
1a530 20 69 4c 65 61 66 52 6f 77 69 64 3b 0a 20 20 20   iLeafRowid;.   
1a540 20 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61     Fts5Data *pDa
1a550 74 61 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 49  ta;.      int iI
1a560 64 20 3d 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e  d = pSeg->pSeg->
1a570 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 75 38  iSegid;.      u8
1a580 20 61 48 64 72 5b 34 5d 20 3d 20 7b 30 78 30 30   aHdr[4] = {0x00
1a590 2c 20 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78  , 0x00, 0x00, 0x
1a5a0 30 30 7d 3b 0a 0a 20 20 20 20 20 20 69 4c 65 61  00};..      iLea
1a5b0 66 52 6f 77 69 64 20 3d 20 46 54 53 35 5f 53 45  fRowid = FTS5_SE
1a5c0 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1a5d0 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66   pSeg->iTermLeaf
1a5e0 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 70 44 61  Pgno);.      pDa
1a5f0 74 61 20 3d 20 66 74 73 35 44 61 74 61 52 65 61  ta = fts5DataRea
1a600 64 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 29  d(p, iLeafRowid)
1a610 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74  ;.      if( pDat
1a620 61 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  a ){.        fts
1a630 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66  5BufferZero(&buf
1a640 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  );.        fts5B
1a650 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
1a660 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d 3e 6e  , &buf, pData->n
1a670 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
1a680 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1a690 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 73  (&p->rc, &buf, s
1a6a0 69 7a 65 6f 66 28 61 48 64 72 29 2c 20 61 48 64  izeof(aHdr), aHd
1a6b0 72 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  r);.        fts5
1a6c0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1a6d0 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c  nt(&p->rc, &buf,
1a6e0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a   pSeg->term.n);.
1a6f0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a700 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1a710 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d  >rc, &buf, pSeg-
1a720 3e 74 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74  >term.n, pSeg->t
1a730 65 72 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20  erm.p);.        
1a740 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1a750 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1a760 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f, pData->szLeaf
1a770 2d 69 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  -iOff, &pData->p
1a780 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20  [iOff]);.       
1a790 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1a7a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1a7b0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 73 7a     /* Set the sz
1a7c0 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20  Leaf field */.  
1a7d0 20 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55          fts5PutU
1a7e0 31 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 62 75  16(&buf.p[2], bu
1a7f0 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  f.n);.        }.
1a800 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20  .        /* Set 
1a810 75 70 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d  up the new page-
1a820 69 6e 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20  index array */. 
1a830 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1a840 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1a850 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a  ->rc, &buf, 4);.
1a860 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65 67          if( pSeg
1a870 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70 53 65  ->iLeafPgno==pSe
1a880 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f  g->iTermLeafPgno
1a890 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 53   .         && pS
1a8a0 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  eg->iEndofDoclis
1a8b0 74 3c 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  t<pData->szLeaf 
1a8c0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
1a8d0 20 20 20 20 20 20 69 6e 74 20 6e 44 69 66 66 20        int nDiff 
1a8e0 3d 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20  = pData->szLeaf 
1a8f0 2d 20 70 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f  - pSeg->iEndofDo
1a900 63 6c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20  clist;.         
1a910 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1a920 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1a930 26 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20  &buf, buf.n - 1 
1a940 2d 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20  - nDiff - 4);.  
1a950 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1a960 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d  erAppendBlob(&p-
1a970 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20  >rc, &buf, .    
1a980 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
1a990 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69  >nn - pSeg->iPgi
1a9a0 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  dxOff, &pData->p
1a9b0 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66  [pSeg->iPgidxOff
1a9c0 5d 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  ].          );. 
1a9d0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1a9e0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
1a9f0 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
1aa00 20 20 70 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67    pSeg->pSeg->pg
1aa10 6e 6f 46 69 72 73 74 20 3d 20 70 53 65 67 2d 3e  noFirst = pSeg->
1aa20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20  iTermLeafPgno;. 
1aa30 20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44         fts5DataD
1aa40 65 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45  elete(p, FTS5_SE
1aa50 47 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c  GMENT_ROWID(iId,
1aa60 20 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29   1), iLeafRowid)
1aa70 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  ;.        fts5Da
1aa80 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61 66  taWrite(p, iLeaf
1aa90 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62 75  Rowid, buf.p, bu
1aaa0 66 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  f.n);.      }.  
1aab0 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42 75    }.  }.  fts5Bu
1aac0 66 66 65 72 46 72 65 65 28 26 62 75 66 29 3b 0a  fferFree(&buf);.
1aad0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
1aae0 74 73 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c  ts5MergeChunkCal
1aaf0 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
1ab00 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
1ab10 70 43 74 78 2c 20 0a 20 20 63 6f 6e 73 74 20 75  pCtx, .  const u
1ab20 38 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e  8 *pChunk, int n
1ab30 43 68 75 6e 6b 0a 29 7b 0a 20 20 46 74 73 35 53  Chunk.){.  Fts5S
1ab40 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74 65  egWriter *pWrite
1ab50 72 20 3d 20 28 46 74 73 35 53 65 67 57 72 69 74  r = (Fts5SegWrit
1ab60 65 72 2a 29 70 43 74 78 3b 0a 20 20 66 74 73 35  er*)pCtx;.  fts5
1ab70 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c 69  WriteAppendPosli
1ab80 73 74 44 61 74 61 28 70 2c 20 70 57 72 69 74 65  stData(p, pWrite
1ab90 72 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e  r, pChunk, nChun
1aba0 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  k);.}../*.**.*/.
1abb0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1abc0 49 6e 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28  IndexMergeLevel(
1abd0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abf0 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
1ac00 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  nd object */.  F
1ac10 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
1ac20 70 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f  pStruct,       /
1ac30 2a 20 49 4e 2f 4f 55 54 3a 20 53 74 75 63 74 75  * IN/OUT: Stuctu
1ac40 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20  re of index */. 
1ac50 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20 20 20 20   int iLvl,      
1ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac70 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20 72 65 61   /* Level to rea
1ac80 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 2a 2f 0a  d input from */.
1ac90 20 20 69 6e 74 20 2a 70 6e 52 65 6d 20 20 20 20    int *pnRem    
1aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1acb0 20 20 2f 2a 20 57 72 69 74 65 20 75 70 20 74 6f    /* Write up to
1acc0 20 74 68 69 73 20 6d 61 6e 79 20 6f 75 74 70 75   this many outpu
1acd0 74 20 6c 65 61 76 65 73 20 2a 2f 0a 29 7b 0a 20  t leaves */.){. 
1ace0 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
1acf0 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
1ad00 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75 63  uct;.  Fts5Struc
1ad10 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
1ad20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1ad30 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 46 74 73 35  el[iLvl];.  Fts5
1ad40 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a  StructureLevel *
1ad50 70 4c 76 6c 4f 75 74 3b 0a 20 20 46 74 73 35 49  pLvlOut;.  Fts5I
1ad60 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
1ad70 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74  = 0;       /* It
1ad80 65 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69  erator to read i
1ad90 6e 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69  nput data */.  i
1ada0 6e 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20  nt nRem = pnRem 
1adb0 3f 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f  ? *pnRem : 0;  /
1adc0 2a 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61  * Output leaf pa
1add0 67 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74  ges left to writ
1ade0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75  e */.  int nInpu
1adf0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
1ae00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1ae10 20 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e   of input segmen
1ae20 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ts */.  Fts5SegW
1ae30 72 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20  riter writer;   
1ae40 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1ae50 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  r object */.  Ft
1ae60 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
1ae70 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a  nt *pSeg;     /*
1ae80 20 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20   Output segment 
1ae90 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
1aea0 74 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64  term;.  int bOld
1aeb0 65 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  est;            
1aec0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1aed0 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  if the output se
1aee0 67 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64  gment is the old
1aef0 65 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  est */..  assert
1af00 28 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ( iLvl<pStruct->
1af10 6e 4c 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65  nLevel );.  asse
1af20 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65  rt( pLvl->nMerge
1af30 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a  <=pLvl->nSeg );.
1af40 0a 20 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65  .  memset(&write
1af50 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  r, 0, sizeof(Fts
1af60 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20  5SegWriter));.  
1af70 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c  memset(&term, 0,
1af80 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
1af90 65 72 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c  er));.  if( pLvl
1afa0 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20  ->nMerge ){.    
1afb0 70 4c 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75  pLvlOut = &pStru
1afc0 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b  ct->aLevel[iLvl+
1afd0 31 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1];.    assert( 
1afe0 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20  pLvlOut->nSeg>0 
1aff0 29 3b 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20  );.    nInput = 
1b000 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20  pLvl->nMerge;.  
1b010 20 20 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75    pSeg = &pLvlOu
1b020 74 2d 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d  t->aSeg[pLvlOut-
1b030 3e 6e 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66  >nSeg-1];..    f
1b040 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1b050 26 77 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69  &writer, pSeg->i
1b060 53 65 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74  Segid);.    writ
1b070 65 72 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d  er.writer.pgno =
1b080 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b   pSeg->pgnoLast+
1b090 31 3b 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42  1;.    writer.iB
1b0a0 74 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  tPage = 0;.  }el
1b0b0 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67  se{.    int iSeg
1b0c0 69 64 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74  id = fts5Allocat
1b0d0 65 53 65 67 69 64 28 70 2c 20 70 53 74 72 75 63  eSegid(p, pStruc
1b0e0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65  t);..    /* Exte
1b0f0 6e 64 20 74 68 65 20 46 74 73 35 53 74 72 75 63  nd the Fts5Struc
1b100 74 75 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72  ture object as r
1b110 65 71 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72  equired to ensur
1b120 65 20 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20  e the output.   
1b130 20 2a 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73   ** segment exis
1b140 74 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  ts. */.    if( i
1b150 4c 76 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c  Lvl==pStruct->nL
1b160 65 76 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20  evel-1 ){.      
1b170 66 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64  fts5StructureAdd
1b180 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70  Level(&p->rc, pp
1b190 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
1b1a0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1b1b0 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ct;.    }.    ft
1b1c0 73 35 53 74 72 75 63 74 75 72 65 45 78 74 65 6e  s5StructureExten
1b1d0 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70  dLevel(&p->rc, p
1b1e0 53 74 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20  Struct, iLvl+1, 
1b1f0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70  1, 0);.    if( p
1b200 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20  ->rc ) return;. 
1b210 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75     pLvl = &pStru
1b220 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b230 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20  ;.    pLvlOut = 
1b240 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
1b250 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66  [iLvl+1];..    f
1b260 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1b270 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1b280 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68  ;..    /* Add th
1b290 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f  e new segment to
1b2a0 20 74 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65   the output leve
1b2b0 6c 20 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20  l */.    pSeg = 
1b2c0 26 70 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70  &pLvlOut->aSeg[p
1b2d0 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20  LvlOut->nSeg];. 
1b2e0 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67     pLvlOut->nSeg
1b2f0 2b 2b 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67  ++;.    pSeg->pg
1b300 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1b310 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20   pSeg->iSegid = 
1b320 69 53 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72  iSegid;.    pStr
1b330 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b  uct->nSegment++;
1b340 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e  ..    /* Read in
1b350 70 75 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67  put from all seg
1b360 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
1b370 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ut level */.    
1b380 6e 49 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e  nInput = pLvl->n
1b390 53 65 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65  Seg;.  }.  bOlde
1b3a0 73 74 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e  st = (pLvlOut->n
1b3b0 53 65 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63  Seg==1 && pStruc
1b3c0 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b  t->nLevel==iLvl+
1b3d0 32 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  2);..  assert( i
1b3e0 4c 76 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28  Lvl>=0 );.  for(
1b3f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
1b400 28 70 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20  (p, pStruct, 0, 
1b410 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c 20 6e  0, 0, 0, iLvl, n
1b420 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29 3b 0a  Input, &pIter);.
1b430 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
1b440 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
1b450 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  ==0;.      fts5M
1b460 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1b470 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29  pIter, 0, 0).  )
1b480 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  {.    Fts5SegIte
1b490 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20 26 70  r *pSegIter = &p
1b4a0 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1b4b0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1b4c0 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74 20 6e  rst ];.    int n
1b4d0 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Pos;            
1b4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f 73 69           /* posi
1b4f0 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66  tion-list size f
1b500 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a 20 20  ield value */.  
1b510 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20 20 20    int nTerm;.   
1b520 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d   const u8 *pTerm
1b530 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  ;..    /* Check 
1b540 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68 69 6c 61  for key annihila
1b550 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  tion. */.    if(
1b560 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3d   pSegIter->nPos=
1b570 3d 30 20 26 26 20 28 62 4f 6c 64 65 73 74 20 7c  =0 && (bOldest |
1b580 7c 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c  | pSegIter->bDel
1b590 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ==0) ) continue;
1b5a0 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d 20 66 74  ..    pTerm = ft
1b5b0 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28  s5MultiIterTerm(
1b5c0 70 49 74 65 72 2c 20 26 6e 54 65 72 6d 29 3b 0a  pIter, &nTerm);.
1b5d0 20 20 20 20 69 66 28 20 6e 54 65 72 6d 21 3d 74      if( nTerm!=t
1b5e0 65 72 6d 2e 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  erm.n || memcmp(
1b5f0 70 54 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e  pTerm, term.p, n
1b600 54 65 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69  Term) ){.      i
1b610 66 28 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74  f( pnRem && writ
1b620 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e  er.nLeafWritten>
1b630 6e 52 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  nRem ){.        
1b640 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a  break;.      }..
1b650 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73        /* This is
1b660 20 61 20 6e 65 77 20 74 65 72 6d 2e 20 41 70 70   a new term. App
1b670 65 6e 64 20 61 20 74 65 72 6d 20 74 6f 20 74 68  end a term to th
1b680 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1b690 2e 20 2a 2f 0a 20 20 20 20 20 20 66 74 73 35 57  . */.      fts5W
1b6a0 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 70  riteAppendTerm(p
1b6b0 2c 20 26 77 72 69 74 65 72 2c 20 6e 54 65 72 6d  , &writer, nTerm
1b6c0 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1b6d0 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
1b6e0 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20 6e 54 65  ->rc, &term, nTe
1b6f0 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20  rm, pTerm);.    
1b700 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  }..    /* Append
1b710 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74 68   the rowid to th
1b720 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  e output */.    
1b730 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54 53  /* WRITEPOSLISTS
1b740 49 5a 45 20 2a 2f 0a 20 20 20 20 6e 50 6f 73 20  IZE */.    nPos 
1b750 3d 20 70 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73  = pSegIter->nPos
1b760 2a 32 20 2b 20 70 53 65 67 49 74 65 72 2d 3e 62  *2 + pSegIter->b
1b770 44 65 6c 3b 0a 20 20 20 20 66 74 73 35 57 72 69  Del;.    fts5Wri
1b780 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 70 2c  teAppendRowid(p,
1b790 20 26 77 72 69 74 65 72 2c 20 66 74 73 35 4d 75   &writer, fts5Mu
1b7a0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1b7b0 65 72 29 2c 20 6e 50 6f 73 29 3b 0a 0a 20 20 20  er), nPos);..   
1b7c0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1b7d0 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74  osition-list dat
1b7e0 61 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  a to the output 
1b7f0 2a 2f 0a 20 20 20 20 66 74 73 35 43 68 75 6e 6b  */.    fts5Chunk
1b800 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49  Iterate(p, pSegI
1b810 74 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69  ter, (void*)&wri
1b820 74 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68  ter, fts5MergeCh
1b830 75 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  unkCallback);.  
1b840 7d 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68  }..  /* Flush th
1b850 65 20 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65  e last leaf page
1b860 20 74 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68   to disk. Set th
1b870 65 20 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74  e output segment
1b880 20 62 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20   b-tree height. 
1b890 20 2a 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61   ** and last lea
1b8a0 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74  f page number at
1b8b0 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20   the same time. 
1b8c0 20 2a 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46   */.  fts5WriteF
1b8d0 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74 65 72  inish(p, &writer
1b8e0 2c 20 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73  , &pSeg->pgnoLas
1b8f0 74 29 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d  t);..  if( fts5M
1b900 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70  ultiIterEof(p, p
1b910 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74  Iter) ){.    int
1b920 20 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f   i;..    /* Remo
1b930 76 65 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74  ve the redundant
1b940 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74   segments from t
1b950 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
1b960 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
1b970 69 3c 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a  i<nInput; i++){.
1b980 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
1b990 6d 6f 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70  moveSegment(p, p
1b9a0 4c 76 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65  Lvl->aSeg[i].iSe
1b9b0 67 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  gid);.    }..   
1b9c0 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72   /* Remove the r
1b9d0 65 64 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74  edundant segment
1b9e0 73 20 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74  s from the input
1b9f0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66   level */.    if
1ba00 28 20 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49  ( pLvl->nSeg!=nI
1ba10 6e 70 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e  nput ){.      in
1ba20 74 20 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d  t nMove = (pLvl-
1ba30 3e 6e 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20  >nSeg - nInput) 
1ba40 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
1ba50 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a  uctureSegment);.
1ba60 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c        memmove(pL
1ba70 76 6c 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d  vl->aSeg, &pLvl-
1ba80 3e 61 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e  >aSeg[nInput], n
1ba90 4d 6f 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Move);.    }.   
1baa0 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1bab0 6e 74 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20  nt -= nInput;.  
1bac0 20 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20    pLvl->nSeg -= 
1bad0 6e 49 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c  nInput;.    pLvl
1bae0 2d 3e 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20  ->nMerge = 0;.  
1baf0 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f    if( pSeg->pgno
1bb00 4c 61 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Last==0 ){.     
1bb10 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d   pLvlOut->nSeg--
1bb20 3b 0a 20 20 20 20 20 20 70 53 74 72 75 63 74 2d  ;.      pStruct-
1bb30 3e 6e 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20  >nSegment--;.   
1bb40 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1bb50 61 73 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67  assert( pSeg->pg
1bb60 6e 6f 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20  noLast>0 );.    
1bb70 66 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73  fts5TrimSegments
1bb80 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
1bb90 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e  pLvl->nMerge = n
1bba0 49 6e 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74  Input;.  }..  ft
1bbb0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
1bbc0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 66 74 73  p, pIter);.  fts
1bbd0 35 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72  5BufferFree(&ter
1bbe0 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65 6d 20  m);.  if( pnRem 
1bbf0 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72 69 74  ) *pnRem -= writ
1bc00 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3b  er.nLeafWritten;
1bc10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75 70 20  .}../*.** Do up 
1bc20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f 66 20  to nPg pages of 
1bc30 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b 20 6f  automerge work o
1bc40 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n the index..*/.
1bc50 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1bc60 49 6e 64 65 78 4d 65 72 67 65 28 0a 20 20 46 74  IndexMerge(.  Ft
1bc70 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
1bc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1bc90 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
1bca0 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
1bcb0 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
1bcc0 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
1bcd0 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74 72  OUT: Current str
1bce0 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
1bcf0 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 20 20 20 20  */.  int nPg    
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 2f 2a 20 50 61 67 65 73 20 6f 66       /* Pages of
1bd20 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a 2f 0a 29   work to do */.)
1bd30 7b 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e  {.  int nRem = n
1bd40 50 67 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74  Pg;.  Fts5Struct
1bd50 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a  ure *pStruct = *
1bd60 70 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c  ppStruct;.  whil
1bd70 65 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e  e( nRem>0 && p->
1bd80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1bd90 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
1bda0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdb0 20 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74   /* To iterate t
1bdc0 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f  hrough levels */
1bdd0 0a 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76  .    int iBestLv
1bde0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
1bdf0 20 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69   /* Level offeri
1be00 6e 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75  ng the most inpu
1be10 74 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20  t segments */.  
1be20 20 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b    int nBest = 0;
1be30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1be40 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74   Number of input
1be50 20 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73   segments on bes
1be60 74 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20  t level */..    
1be70 2f 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20  /* Set iBestLvl 
1be80 74 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20  to the level to 
1be90 72 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65  read input segme
1bea0 6e 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20  nts from. */.   
1beb0 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
1bec0 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20  ->nLevel>0 );.  
1bed0 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c    for(iLvl=0; iL
1bee0 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  vl<pStruct->nLev
1bef0 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20  el; iLvl++){.   
1bf00 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1bf10 4c 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70  Level *pLvl = &p
1bf20 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
1bf30 4c 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Lvl];.      if( 
1bf40 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a  pLvl->nMerge ){.
1bf50 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c          if( pLvl
1bf60 2d 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29  ->nMerge>nBest )
1bf70 7b 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73  {.          iBes
1bf80 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20  tLvl = iLvl;.   
1bf90 20 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70         nBest = p
1bfa0 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20  Lvl->nMerge;.   
1bfb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
1bfc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1bfd0 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53      if( pLvl->nS
1bfe0 65 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20  eg>nBest ){.    
1bff0 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c      nBest = pLvl
1c000 2d 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20  ->nSeg;.        
1c010 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b  iBestLvl = iLvl;
1c020 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c030 20 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20      /* If nBest 
1c040 69 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e  is still 0, then
1c050 20 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20   the index must 
1c060 62 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66  be empty. */.#if
1c070 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1c080 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b  .    for(iLvl=0;
1c090 20 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76   nBest==0 && iLv
1c0a0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1c0b0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1c0c0 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63    assert( pStruc
1c0d0 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
1c0e0 6e 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  nSeg==0 );.    }
1c0f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28  .#endif..    if(
1c100 20 6e 42 65 73 74 3c 70 2d 3e 70 43 6f 6e 66 69   nBest<p->pConfi
1c110 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65 20 0a 20  g->nAutomerge . 
1c120 20 20 20 20 20 20 20 26 26 20 70 53 74 72 75 63         && pStruc
1c130 74 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c  t->aLevel[iBestL
1c140 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 0a 20  vl].nMerge==0 . 
1c150 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72       ){.      br
1c160 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eak;.    }.    f
1c170 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65 76  ts5IndexMergeLev
1c180 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20  el(p, &pStruct, 
1c190 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65 6d 29  iBestLvl, &nRem)
1c1a0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d  ;.    if( p->rc=
1c1b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
1c1c0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
1c1d0 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
1c1e0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53  0 ){.      fts5S
1c1f0 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1c200 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c 20 70  p, iBestLvl+1, p
1c210 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20  Struct);.    }. 
1c220 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74 20 3d   }.  *ppStruct =
1c230 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 2f 2a 0a   pStruct;.}../*.
1c240 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e 4c  ** A total of nL
1c250 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20 6f  eaf leaf pages o
1c260 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74 20  f data has just 
1c270 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f 20  been flushed to 
1c280 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65 67  a level-0.** seg
1c290 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63 74  ment. This funct
1c2a0 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65 20  ion updates the 
1c2b0 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61 63  write-counter ac
1c2c0 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20 69  cordingly and, i
1c2d0 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c 20  f.** necessary, 
1c2e0 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d 65  performs increme
1c2f0 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b 2e  ntal merge work.
1c300 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1c310 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
1c320 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
1c330 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
1c340 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
1c350 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1c360 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1c370 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1c380 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
1c390 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a 20  ndexAutomerge(. 
1c3a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
1c3b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3c0 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
1c3d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
1c3e0 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
1c3f0 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
1c400 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
1c410 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
1c420 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65 61  ex */.  int nLea
1c430 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
1c440 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1c450 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61 76  r of output leav
1c460 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 20  es just written 
1c470 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72  */.){.  if( p->r
1c480 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1c490 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75 74  p->pConfig->nAut
1c4a0 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20 20  omerge>0 ){.    
1c4b0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1c4c0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1c4d0 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72 69  ct;.    u64 nWri
1c4e0 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
1c4f0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
1c500 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65 2d   value of write-
1c510 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
1c520 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20 20  nt nWork;       
1c530 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c540 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d 71  Number of work-q
1c550 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72 6d  uanta to perform
1c560 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65 6d   */.    int nRem
1c570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1c580 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c590 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c 65  of leaf pages le
1c5a0 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a  ft to write */..
1c5b0 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68      /* Update th
1c5c0 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 2e  e write-counter.
1c5d0 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   While doing so,
1c5e0 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a 20   set nWork. */. 
1c5f0 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74 72     nWrite = pStr
1c600 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74  uct->nWriteCount
1c610 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d 20  er;.    nWork = 
1c620 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20 2b  (int)(((nWrite +
1c630 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57 6f   nLeaf) / p->nWo
1c640 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69 74  rkUnit) - (nWrit
1c650 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  e / p->nWorkUnit
1c660 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74 2d  ));.    pStruct-
1c670 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20 2b  >nWriteCounter +
1c680 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52 65  = nLeaf;.    nRe
1c690 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57 6f  m = (int)(p->nWo
1c6a0 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20 2a  rkUnit * nWork *
1c6b0 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
1c6c0 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64 65  );..    fts5Inde
1c6d0 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72 75  xMerge(p, ppStru
1c6e0 63 74 2c 20 6e 52 65 6d 29 3b 0a 20 20 7d 0a 7d  ct, nRem);.  }.}
1c6f0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
1c700 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72  s5IndexCrisismer
1c710 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ge(.  Fts5Index 
1c720 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
1c730 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
1c740 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
1c750 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
1c760 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20 20 20  **ppStruct      
1c770 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43 75 72    /* IN/OUT: Cur
1c780 72 65 6e 74 20 73 74 72 75 63 74 75 72 65 20 6f  rent structure o
1c790 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  f index */.){.  
1c7a0 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69 73 69  const int nCrisi
1c7b0 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  s = p->pConfig->
1c7c0 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a 20 20  nCrisisMerge;.  
1c7d0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
1c7e0 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75  Struct = *ppStru
1c7f0 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c 20 3d  ct;.  int iLvl =
1c800 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1c810 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1c820 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  || pStruct->nLev
1c830 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28  el>0 );.  while(
1c840 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1c850 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  K && pStruct->aL
1c860 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3e  evel[iLvl].nSeg>
1c870 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20 20 20  =nCrisis ){.    
1c880 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
1c890 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74 2c  vel(p, &pStruct,
1c8a0 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20 20 61   iLvl, 0);.    a
1c8b0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
1c8c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72 75  LITE_OK || pStru
1c8d0 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c 76 6c  ct->nLevel>(iLvl
1c8e0 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73 35 53  +1) );.    fts5S
1c8f0 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28  tructurePromote(
1c900 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74 72 75  p, iLvl+1, pStru
1c910 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b 2b 3b  ct);.    iLvl++;
1c920 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
1c930 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a 0a 73   = pStruct;.}..s
1c940 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e  tatic int fts5In
1c950 64 65 78 52 65 74 75 72 6e 28 46 74 73 35 49 6e  dexReturn(Fts5In
1c960 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dex *p){.  int r
1c970 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70 2d 3e  c = p->rc;.  p->
1c980 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c990 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1c9a0 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
1c9b0 74 73 35 46 6c 75 73 68 43 74 78 20 46 74 73 35  ts5FlushCtx Fts5
1c9c0 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75 63 74  FlushCtx;.struct
1c9d0 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 7b 0a   Fts5FlushCtx {.
1c9e0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 49 64    Fts5Index *pId
1c9f0 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72 69 74  x;.  Fts5SegWrit
1ca00 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b 0a 0a  er writer; .};..
1ca10 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61 42 75  /*.** Buffer aBu
1ca20 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61 20 6c  f[] contains a l
1ca30 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73 2c 20  ist of varints, 
1ca40 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68  all small enough
1ca50 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20 61 20   to fit.** in a 
1ca60 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2e 20  32-bit integer. 
1ca70 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a 65 20  Return the size 
1ca80 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74 20 70  of the largest p
1ca90 72 65 66 69 78 20 6f 66 20 74 68 69 73 20 0a 2a  refix of this .*
1caa0 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79 74 65  * list nMax byte
1cab0 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73 69 7a  s or less in siz
1cac0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1cad0 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
1cae0 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61 42 75  ix(const u8 *aBu
1caf0 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a 20 20  f, int nMax){.  
1cb00 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32 20 64  int ret;.  u32 d
1cb10 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20 66 74  ummy;.  ret = ft
1cb20 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 61 42  s5GetVarint32(aB
1cb30 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 69 66  uf, dummy);.  if
1cb40 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a 20 20  ( ret<nMax ){.  
1cb50 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
1cb60 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74 73 35      int i = fts5
1cb70 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 42 75  GetVarint32(&aBu
1cb80 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29 3b 0a  f[ret], dummy);.
1cb90 20 20 20 20 20 20 69 66 28 20 28 72 65 74 20 2b        if( (ret +
1cba0 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62 72 65   i) > nMax ) bre
1cbb0 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20 2b 3d  ak;.      ret +=
1cbc0 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   i;.    }.  }.  
1cbd0 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23  return ret;.}..#
1cbe0 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
1cbf0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
1cc00 70 42 75 66 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  pBuf, pBlob, nBl
1cc10 6f 62 29 20 7b 20 20 20 20 20 5c 0a 20 20 61 73  ob) {     \.  as
1cc20 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 53  sert( (pBuf)->nS
1cc30 70 61 63 65 3e 3d 28 28 70 42 75 66 29 2d 3e 6e  pace>=((pBuf)->n
1cc40 2b 6e 42 6c 6f 62 29 20 29 3b 20 20 20 20 20 20  +nBlob) );      
1cc50 20 20 20 20 20 20 20 5c 0a 20 20 6d 65 6d 63 70         \.  memcp
1cc60 79 28 26 28 70 42 75 66 29 2d 3e 70 5b 28 70 42  y(&(pBuf)->p[(pB
1cc70 75 66 29 2d 3e 6e 5d 2c 20 70 42 6c 6f 62 2c 20  uf)->n], pBlob, 
1cc80 6e 42 6c 6f 62 29 3b 20 20 20 20 20 20 20 20 20  nBlob);         
1cc90 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29 2d 3e      \.  (pBuf)->
1cca0 6e 20 2b 3d 20 6e 42 6c 6f 62 3b 20 20 20 20 20  n += nBlob;     
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ccd0 20 5c 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74   \.}..#define ft
1cce0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1ccf0 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
1cd00 56 61 6c 29 20 7b 20 20 20 20 20 20 20 20 20 20  Val) {          
1cd10 20 20 20 20 20 20 5c 0a 20 20 28 70 42 75 66 29        \.  (pBuf)
1cd20 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  ->n += sqlite3Ft
1cd30 73 35 50 75 74 56 61 72 69 6e 74 28 26 28 70 42  s5PutVarint(&(pB
1cd40 75 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e  uf)->p[(pBuf)->n
1cd50 5d 2c 20 28 69 56 61 6c 29 29 3b 20 20 5c 0a 20  ], (iVal));  \. 
1cd60 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
1cd70 3e 6e 53 70 61 63 65 3e 3d 28 70 42 75 66 29 2d  >nSpace>=(pBuf)-
1cd80 3e 6e 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  >n );           
1cd90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1cda0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20  .}../*.** Flush 
1cdb0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1cdc0 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74  in-memory hash t
1cdd0 61 62 6c 65 20 69 48 61 73 68 20 74 6f 20 61 20  able iHash to a 
1cde0 6e 65 77 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20  new level-0 .** 
1cdf0 73 65 67 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e  segment on disk.
1ce00 20 41 6c 73 6f 20 75 70 64 61 74 65 20 74 68 65   Also update the
1ce10 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 73   corresponding s
1ce20 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
1ce30 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
1ce40 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74  or occurs, set t
1ce50 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20  he Fts5Index.rc 
1ce60 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61  error code. If a
1ce70 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20  n error has .** 
1ce80 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
1ce90 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
1cea0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
1ceb0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 46  tatic void fts5F
1cec0 6c 75 73 68 4f 6e 65 48 61 73 68 28 46 74 73 35  lushOneHash(Fts5
1ced0 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73  Index *p){.  Fts
1cee0 35 48 61 73 68 20 2a 70 48 61 73 68 20 3d 20 70  5Hash *pHash = p
1cef0 2d 3e 70 48 61 73 68 3b 0a 20 20 46 74 73 35 53  ->pHash;.  Fts5S
1cf00 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
1cf10 74 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b  t;.  int iSegid;
1cf20 0a 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20  .  int pgnoLast 
1cf30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1cf40 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61       /* Last lea
1cf50 66 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e  f page number in
1cf60 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f   segment */..  /
1cf70 2a 20 4f 62 74 61 69 6e 20 61 20 72 65 66 65 72  * Obtain a refer
1cf80 65 6e 63 65 20 74 6f 20 74 68 65 20 69 6e 64 65  ence to the inde
1cf90 78 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  x structure and 
1cfa0 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 73  allocate a new s
1cfb0 65 67 6d 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66  egment-id.  ** f
1cfc0 6f 72 20 74 68 65 20 6e 65 77 20 6c 65 76 65 6c  or the new level
1cfd0 2d 30 20 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a  -0 segment.  */.
1cfe0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
1cff0 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
1d000 3b 0a 20 20 69 53 65 67 69 64 20 3d 20 66 74 73  ;.  iSegid = fts
1d010 35 41 6c 6c 6f 63 61 74 65 53 65 67 69 64 28 70  5AllocateSegid(p
1d020 2c 20 70 53 74 72 75 63 74 29 3b 0a 0a 20 20 69  , pStruct);..  i
1d030 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20 20 20  f( iSegid ){.   
1d040 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
1d050 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67  = p->pConfig->pg
1d060 73 7a 3b 0a 0a 20 20 20 20 46 74 73 35 53 74 72  sz;..    Fts5Str
1d070 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1d080 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73 65  Seg;   /* New se
1d090 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53 74  gment within pSt
1d0a0 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73 35  ruct */.    Fts5
1d0b0 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20 20  Buffer *pBuf;   
1d0c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66            /* Buf
1d0d0 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20  fer in which to 
1d0e0 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70 61  assemble leaf pa
1d0f0 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42 75  ge */.    Fts5Bu
1d100 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20 20  ffer *pPgidx;   
1d110 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
1d120 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61 73  r in which to as
1d130 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f 0a  semble pgidx */.
1d140 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69 74  .    Fts5SegWrit
1d150 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20 66  er writer;.    f
1d160 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20  ts5WriteInit(p, 
1d170 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64 29  &writer, iSegid)
1d180 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26 77  ;..    pBuf = &w
1d190 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
1d1a0 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20 26  ;.    pPgidx = &
1d1b0 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70 67  writer.writer.pg
1d1c0 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74 73  idx;..    /* fts
1d1d0 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68 6f  5WriteInit() sho
1d1e0 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61 6c  uld have initial
1d1f0 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72 73  ized the buffers
1d200 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c 79   to (most likely
1d210 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 78  ).    ** the max
1d220 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75 69  imum space requi
1d230 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  red. */.    asse
1d240 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42 75  rt( p->rc || pBu
1d250 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73 7a  f->nSpace>=(pgsz
1d260 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44   + FTS5_DATA_PAD
1d270 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73 73  DING) );.    ass
1d280 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 50  ert( p->rc || pP
1d290 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28 70  gidx->nSpace>=(p
1d2a0 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f  gsz + FTS5_DATA_
1d2b0 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20 20  PADDING) );..   
1d2c0 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e 69   /* Begin scanni
1d2d0 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68 20  ng through hash 
1d2e0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20 54  table entries. T
1d2f0 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f 6e  his loop runs on
1d300 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20 20  ce for each.    
1d310 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74 20  ** term/doclist 
1d320 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65 64  currently stored
1d330 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73 68   within the hash
1d340 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 69   table. */.    i
1d350 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1d360 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
1d370 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
1d380 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48 61  HashScanInit(pHa
1d390 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  sh, 0, 0);.    }
1d3a0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
1d3b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1d3c0 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48 61  0==sqlite3Fts5Ha
1d3d0 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68 29  shScanEof(pHash)
1d3e0 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1d3f0 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20 20  char *zTerm;    
1d400 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
1d410 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d 20  containing term 
1d420 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  */.      const u
1d430 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20 20  8 *pDoclist;    
1d440 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
1d450 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20 74  to doclist for t
1d460 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20  his term */.    
1d470 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 20    int nDoclist; 
1d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d490 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73 74   Size of doclist
1d4a0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20   in bytes */..  
1d4b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1d4c0 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20 65   term for this e
1d4d0 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  ntry to disk. */
1d4e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
1d4f0 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28  s5HashScanEntry(
1d500 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20 26  pHash, &zTerm, &
1d510 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63 6c  pDoclist, &nDocl
1d520 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ist);.      fts5
1d530 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28  WriteAppendTerm(
1d540 70 2c 20 26 77 72 69 74 65 72 2c 20 73 74 72 6c  p, &writer, strl
1d550 65 6e 28 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73  en(zTerm), (cons
1d560 74 20 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 0a 20  t u8*)zTerm);.. 
1d570 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72 69       assert( wri
1d580 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64 49  ter.bFirstRowidI
1d590 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20 20  nPage==0 );.    
1d5a0 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42 75    if( pgsz>=(pBu
1d5b0 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e  f->n + pPgidx->n
1d5c0 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31 29   + nDoclist + 1)
1d5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
1d5e0 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
1d5f0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
1d600 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e 20  e current leaf. 
1d610 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  */.        fts5B
1d620 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
1d630 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c 69  lob(pBuf, pDocli
1d640 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 20  st, nDoclist);. 
1d650 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d660 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
1d670 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20   0;.        i64 
1d680 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20 20  iDelta = 0;.    
1d690 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
1d6a0 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1d6b0 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73 74  e entire doclist
1d6c0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
1d6d0 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65 20   this leaf. The 
1d6e0 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20 20  following .     
1d6f0 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72 61     ** loop itera
1d700 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65 20  tes through the 
1d710 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d 61  poslists that ma
1d720 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ke up the curren
1d730 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 6f  t .        ** do
1d740 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20  clist.  */.     
1d750 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
1d760 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
1d770 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ff<nDoclist ){. 
1d780 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 6f           int nPo
1d790 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  s;.          int
1d7a0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20   nCopy;.        
1d7b0 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20 20    int bDummy;.  
1d7c0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
1d7d0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  fts5GetVarint(&p
1d7e0 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 28  Doclist[iOff], (
1d7f0 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20  u64*)&iDelta);. 
1d800 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
1d810 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
1d820 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f  ize(&pDoclist[iO
1d830 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75  ff], &nPos, &bDu
1d840 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  mmy);.          
1d850 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20  nCopy += nPos;. 
1d860 20 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20           iRowid 
1d870 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20  += iDelta;.     
1d880 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
1d890 69 66 28 20 77 72 69 74 65 72 2e 62 46 69 72 73  if( writer.bFirs
1d8a0 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a  tRowidInPage ){.
1d8b0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1d8c0 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e 70 5b  PutU16(&pBuf->p[
1d8d0 30 5d 2c 20 70 42 75 66 2d 3e 6e 29 3b 20 20 20  0], pBuf->n);   
1d8e0 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  /* first rowid o
1d8f0 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
1d900 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
1d910 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
1d920 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
1d930 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
1d940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ;.            wr
1d950 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
1d960 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  InPage = 0;.    
1d970 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1d980 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
1d990 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  &writer, iRowid)
1d9a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1d9b0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
1d9c0 42 75 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65  Buf->n += sqlite
1d9d0 33 46 74 73 35 50 75 74 56 61 72 69 6e 74 28 26  3Fts5PutVarint(&
1d9e0 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1d9f0 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20  , iDelta);.     
1da00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1da10 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
1da20 3c 3d 70 42 75 66 2d 3e 6e 53 70 61 63 65 20 29  <=pBuf->nSpace )
1da30 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ;..          if(
1da40 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69   (pBuf->n + pPgi
1da50 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c  dx->n + nCopy) <
1da60 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20  = pgsz ){.      
1da70 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
1da80 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
1da90 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
1daa0 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70  ent leaf. So cop
1dab0 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  y.            **
1dac0 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 2a   it in one go. *
1dad0 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  /.            ft
1dae0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
1daf0 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 44  ndBlob(pBuf, &pD
1db00 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c 20 6e 43  oclist[iOff], nC
1db10 6f 70 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opy);.          
1db20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1db30 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69 72 65     /* The entire
1db40 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c 20 6e 6f   poslist will no
1db50 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20 6c 65  t fit on this le
1db60 61 66 2e 20 53 6f 20 69 74 20 6e 65 65 64 73 0a  af. So it needs.
1db70 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
1db80 6f 20 62 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f  o be broken into
1db90 20 73 65 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f   sections. The o
1dba0 6e 6c 79 20 71 75 61 6c 69 66 69 63 61 74 69 6f  nly qualificatio
1dbb0 6e 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20 20  n being.        
1dbc0 20 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68      ** that each
1dbd0 20 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20   varint must be 
1dbe0 73 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75  stored contiguou
1dbf0 73 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  sly.  */.       
1dc00 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
1dc10 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c  Poslist = &pDocl
1dc20 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20  ist[iOff];.     
1dc30 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20         int iPos 
1dc40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
1dc50 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1dc60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1dc70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53            int nS
1dc80 70 61 63 65 20 3d 20 70 67 73 7a 20 2d 20 70 42  pace = pgsz - pB
1dc90 75 66 2d 3e 6e 20 2d 20 70 50 67 69 64 78 2d 3e  uf->n - pPgidx->
1dca0 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
1dcb0 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 20 20   int n = 0;.    
1dcc0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e            if( (n
1dcd0 43 6f 70 79 20 2d 20 69 50 6f 73 29 3c 3d 6e 53  Copy - iPos)<=nS
1dce0 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  pace ){.        
1dcf0 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70          n = nCop
1dd00 79 20 2d 20 69 50 6f 73 3b 0a 20 20 20 20 20 20  y - iPos;.      
1dd10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
1dd30 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72   = fts5PoslistPr
1dd40 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69  efix(&pPoslist[i
1dd50 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20  Pos], nSpace);. 
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73               ass
1dd80 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20 20 20  ert( n>0 );.    
1dd90 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1dda0 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42 6c  fferSafeAppendBl
1ddb0 6f 62 28 70 42 75 66 2c 20 26 70 50 6f 73 6c 69  ob(pBuf, &pPosli
1ddc0 73 74 5b 69 50 6f 73 5d 2c 20 6e 29 3b 0a 20 20  st[iPos], n);.  
1ddd0 20 20 20 20 20 20 20 20 20 20 20 20 69 50 6f 73              iPos
1dde0 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   += n;.         
1ddf0 20 20 20 20 20 69 66 28 20 28 70 42 75 66 2d 3e       if( (pBuf->
1de00 6e 20 2b 20 70 50 67 69 64 78 2d 3e 6e 29 3e 3d  n + pPgidx->n)>=
1de10 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
1de20 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
1de30 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 26 77  eFlushLeaf(p, &w
1de40 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  riter);.        
1de50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1de60 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d        if( iPos>=
1de70 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20  nCopy ) break;. 
1de80 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1de90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dea0 20 20 20 69 4f 66 66 20 2b 3d 20 6e 43 6f 70 79     iOff += nCopy
1deb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1dec0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
1ded0 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72  DO2: Doclist ter
1dee0 6d 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20  minator written 
1def0 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  here. */.      /
1df00 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  * pBuf->p[pBuf->
1df10 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a  n++] = '\0'; */.
1df20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
1df30 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70  uf->n<=pBuf->nSp
1df40 61 63 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ace );.      sql
1df50 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
1df60 4e 65 78 74 28 70 48 61 73 68 29 3b 0a 20 20 20  Next(pHash);.   
1df70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74   }.    sqlite3Ft
1df80 73 35 48 61 73 68 43 6c 65 61 72 28 70 48 61 73  s5HashClear(pHas
1df90 68 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74  h);.    fts5Writ
1dfa0 65 46 69 6e 69 73 68 28 70 2c 20 26 77 72 69 74  eFinish(p, &writ
1dfb0 65 72 2c 20 26 70 67 6e 6f 4c 61 73 74 29 3b 0a  er, &pgnoLast);.
1dfc0 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
1dfd0 68 65 20 46 74 73 35 53 74 72 75 63 74 75 72 65  he Fts5Structure
1dfe0 2e 20 49 74 20 69 73 20 77 72 69 74 74 65 6e 20  . It is written 
1dff0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
1e000 62 61 73 65 20 62 79 20 74 68 65 0a 20 20 20 20  base by the.    
1e010 2a 2a 20 66 74 73 35 53 74 72 75 63 74 75 72 65  ** fts5Structure
1e020 52 65 6c 65 61 73 65 28 29 20 63 61 6c 6c 20 62  Release() call b
1e030 65 6c 6f 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66  elow.  */.    if
1e040 28 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  ( pStruct->nLeve
1e050 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74  l==0 ){.      ft
1e060 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
1e070 76 65 6c 28 26 70 2d 3e 72 63 2c 20 26 70 53 74  vel(&p->rc, &pSt
1e080 72 75 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ruct);.    }.   
1e090 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78   fts5StructureEx
1e0a0 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63  tendLevel(&p->rc
1e0b0 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 31 2c  , pStruct, 0, 1,
1e0c0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
1e0d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e0e0 0a 20 20 20 20 20 20 70 53 65 67 20 3d 20 26 70  .      pSeg = &p
1e0f0 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
1e100 5d 2e 61 53 65 67 5b 20 70 53 74 72 75 63 74 2d  ].aSeg[ pStruct-
1e110 3e 61 4c 65 76 65 6c 5b 30 5d 2e 6e 53 65 67 2b  >aLevel[0].nSeg+
1e120 2b 20 5d 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  + ];.      pSeg-
1e130 3e 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64  >iSegid = iSegid
1e140 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 70 67  ;.      pSeg->pg
1e150 6e 6f 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  noFirst = 1;.   
1e160 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73     pSeg->pgnoLas
1e170 74 20 3d 20 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  t = pgnoLast;.  
1e180 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e 53 65      pStruct->nSe
1e190 67 6d 65 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20  gment++;.    }. 
1e1a0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1e1b0 50 72 6f 6d 6f 74 65 28 70 2c 20 30 2c 20 70 53  Promote(p, 0, pS
1e1c0 74 72 75 63 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  truct);.  }..  f
1e1d0 74 73 35 49 6e 64 65 78 41 75 74 6f 6d 65 72 67  ts5IndexAutomerg
1e1e0 65 28 70 2c 20 26 70 53 74 72 75 63 74 2c 20 70  e(p, &pStruct, p
1e1f0 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 66 74 73 35  gnoLast);.  fts5
1e200 49 6e 64 65 78 43 72 69 73 69 73 6d 65 72 67 65  IndexCrisismerge
1e210 28 70 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20  (p, &pStruct);. 
1e220 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
1e230 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
1e240 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
1e250 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
1e260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68  ;.}../*.** Flush
1e270 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
1e280 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1e290 79 20 68 61 73 68 20 74 61 62 6c 65 73 20 74 6f  y hash tables to
1e2a0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
1e2b0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1e2c0 73 35 49 6e 64 65 78 46 6c 75 73 68 28 46 74 73  s5IndexFlush(Fts
1e2d0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 2f 2a  5Index *p){.  /*
1e2e0 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 65 6d   Unless it is em
1e2f0 70 74 79 2c 20 66 6c 75 73 68 20 74 68 65 20 68  pty, flush the h
1e300 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73  ash table to dis
1e310 6b 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 6e 50  k */.  if( p->nP
1e320 65 6e 64 69 6e 67 44 61 74 61 20 29 7b 0a 20 20  endingData ){.  
1e330 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1e340 73 68 20 29 3b 0a 20 20 20 20 70 2d 3e 6e 50 65  sh );.    p->nPe
1e350 6e 64 69 6e 67 44 61 74 61 20 3d 20 30 3b 0a 20  ndingData = 0;. 
1e360 20 20 20 66 74 73 35 46 6c 75 73 68 4f 6e 65 48     fts5FlushOneH
1e370 61 73 68 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a  ash(p);.  }.}...
1e380 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1e390 6e 64 65 78 4f 70 74 69 6d 69 7a 65 28 46 74 73  ndexOptimize(Fts
1e3a0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 46 74  5Index *p){.  Ft
1e3b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
1e3c0 72 75 63 74 3b 0a 20 20 46 74 73 35 53 74 72 75  ruct;.  Fts5Stru
1e3d0 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b  cture *pNew = 0;
1e3e0 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b  .  int nSeg = 0;
1e3f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1e400 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1e410 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
1e420 28 70 29 3b 0a 20 20 70 53 74 72 75 63 74 20 3d  (p);.  pStruct =
1e430 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
1e440 61 64 28 70 29 3b 0a 0a 20 20 69 66 28 20 70 53  ad(p);..  if( pS
1e450 74 72 75 63 74 20 29 7b 0a 20 20 20 20 61 73 73  truct ){.    ass
1e460 65 72 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53  ert( pStruct->nS
1e470 65 67 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75  egment==fts5Stru
1e480 63 74 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e  ctureCountSegmen
1e490 74 73 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20  ts(pStruct) );. 
1e4a0 20 20 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63     nSeg = pStruc
1e4b0 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20  t->nSegment;.   
1e4c0 20 69 66 28 20 6e 53 65 67 3e 31 20 29 7b 0a 20   if( nSeg>1 ){. 
1e4d0 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
1e4e0 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
1e4f0 63 74 75 72 65 29 3b 0a 20 20 20 20 20 20 6e 42  cture);.      nB
1e500 79 74 65 20 2b 3d 20 28 70 53 74 72 75 63 74 2d  yte += (pStruct-
1e510 3e 6e 4c 65 76 65 6c 2b 31 29 20 2a 20 73 69 7a  >nLevel+1) * siz
1e520 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
1e530 65 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20 20 70  eLevel);.      p
1e540 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75 63  New = (Fts5Struc
1e550 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74 73  ture*)sqlite3Fts
1e560 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1e570 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1e580 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 4e 65 77  }.  }.  if( pNew
1e590 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75   ){.    Fts5Stru
1e5a0 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
1e5b0 3b 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  ;.    int nByte 
1e5c0 3d 20 6e 53 65 67 20 2a 20 73 69 7a 65 6f 66 28  = nSeg * sizeof(
1e5d0 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1e5e0 6d 65 6e 74 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ment);.    pNew-
1e5f0 3e 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72 75 63  >nLevel = pStruc
1e600 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b 0a 20 20 20  t->nLevel+1;.   
1e610 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b   pNew->nRef = 1;
1e620 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 57 72 69 74  .    pNew->nWrit
1e630 65 43 6f 75 6e 74 65 72 20 3d 20 70 53 74 72 75  eCounter = pStru
1e640 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65  ct->nWriteCounte
1e650 72 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26 70  r;.    pLvl = &p
1e660 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 70 53 74 72  New->aLevel[pStr
1e670 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d 3b 0a 20 20  uct->nLevel];.  
1e680 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d 20 28    pLvl->aSeg = (
1e690 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
1e6a0 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46 74 73  ment*)sqlite3Fts
1e6b0 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d 3e  5MallocZero(&p->
1e6c0 72 63 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  rc, nByte);.    
1e6d0 69 66 28 20 70 4c 76 6c 2d 3e 61 53 65 67 20 29  if( pLvl->aSeg )
1e6e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 76 6c  {.      int iLvl
1e6f0 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20 69 6e  , iSeg;.      in
1e700 74 20 69 53 65 67 4f 75 74 20 3d 20 30 3b 0a 20  t iSegOut = 0;. 
1e710 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b       for(iLvl=0;
1e720 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e   iLvl<pStruct->n
1e730 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a  Level; iLvl++){.
1e740 20 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67          for(iSeg
1e750 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74  =0; iSeg<pStruct
1e760 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
1e770 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
1e780 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 61 53          pLvl->aS
1e790 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d 20 70 53  eg[iSegOut] = pS
1e7a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
1e7b0 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 3b 0a  vl].aSeg[iSeg];.
1e7c0 20 20 20 20 20 20 20 20 20 20 69 53 65 67 4f 75            iSegOu
1e7d0 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
1e7e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4e 65       }.      pNe
1e7f0 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d 20 70 4c  w->nSegment = pL
1e800 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53 65 67 3b  vl->nSeg = nSeg;
1e810 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e820 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1e830 4e 65 77 29 3b 0a 20 20 20 20 20 20 70 4e 65 77  New);.      pNew
1e840 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
1e850 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
1e860 20 20 20 69 6e 74 20 69 4c 76 6c 20 3d 20 70 4e     int iLvl = pN
1e870 65 77 2d 3e 6e 4c 65 76 65 6c 2d 31 3b 0a 20 20  ew->nLevel-1;.  
1e880 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
1e890 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65  SQLITE_OK && pNe
1e8a0 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
1e8b0 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSeg>0 ){.      
1e8c0 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f  int nRem = FTS5_
1e8d0 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  OPT_WORK_UNIT;. 
1e8e0 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65       fts5IndexMe
1e8f0 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65  rgeLevel(p, &pNe
1e900 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  w, iLvl, &nRem);
1e910 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
1e920 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
1e930 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  , pNew);.    fts
1e940 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
1e950 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
1e960 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
1e970 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20  ease(pStruct);. 
1e980 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
1e990 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a  xReturn(p); .}..
1e9a0 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
1e9b0 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e  ndexMerge(Fts5In
1e9c0 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72  dex *p, int nMer
1e9d0 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  ge){.  Fts5Struc
1e9e0 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 0a  ture *pStruct;..
1e9f0 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73 35    pStruct = fts5
1ea00 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
1ea10 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20  ;.  if( pStruct 
1ea20 26 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  && pStruct->nLev
1ea30 65 6c 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  el ){.    fts5In
1ea40 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70 53 74  dexMerge(p, &pSt
1ea50 72 75 63 74 2c 20 6e 4d 65 72 67 65 29 3b 0a 20  ruct, nMerge);. 
1ea60 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
1ea70 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63 74  Write(p, pStruct
1ea80 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 53 74 72  );.  }.  fts5Str
1ea90 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
1eaa0 74 72 75 63 74 29 3b 0a 0a 20 20 72 65 74 75 72  truct);..  retur
1eab0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
1eac0 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(p);.}..static 
1ead0 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69 73 74  void fts5Poslist
1eae0 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73 35  Callback(.  Fts5
1eaf0 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69  Index *p, .  voi
1eb00 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  d *pContext, .  
1eb10 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
1eb20 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
1eb30 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43 68    assert_nc( nCh
1eb40 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unk>=0 );.  if( 
1eb50 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20  nChunk>0 ){.    
1eb60 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1eb70 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 28 46 74  Blob(&p->rc, (Ft
1eb80 73 35 42 75 66 66 65 72 2a 29 70 43 6f 6e 74 65  s5Buffer*)pConte
1eb90 78 74 2c 20 6e 43 68 75 6e 6b 2c 20 70 43 68 75  xt, nChunk, pChu
1eba0 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65  nk);.  }.}..type
1ebb0 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c 69  def struct Posli
1ebc0 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f  stCallbackCtx Po
1ebd0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
1ebe0 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74  ;.struct Poslist
1ebf0 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20  CallbackCtx {.  
1ec00 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1ec10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ec20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69  /* Append to thi
1ec30 73 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74  s buffer */.  Ft
1ec40 73 35 45 78 70 72 43 6f 6c 73 65 74 20 2a 70 43  s5ExprColset *pC
1ec50 6f 6c 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  olset;        /*
1ec60 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68 65   Restrict matche
1ec70 73 20 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e  s to this column
1ec80 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74 61 74 65   */.  int eState
1ec90 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1eca0 20 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f        /* See abo
1ecb0 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ve */.};../*.** 
1ecc0 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73 20  TODO: Make this 
1ecd0 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21 0a  more efficient!.
1ece0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  */.static int ft
1ecf0 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
1ed00 74 28 46 74 73 35 45 78 70 72 43 6f 6c 73 65 74  t(Fts5ExprColset
1ed10 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69   *pColset, int i
1ed20 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Col){.  int i;. 
1ed30 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c   for(i=0; i<pCol
1ed40 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  set->nCol; i++){
1ed50 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74  .    if( pColset
1ed60 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c  ->aiCol[i]==iCol
1ed70 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
1ed80 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1ed90 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1eda0 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c  PoslistFilterCal
1edb0 6c 62 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64  lback(.  Fts5Ind
1edc0 65 78 20 2a 70 2c 20 0a 20 20 76 6f 69 64 20 2a  ex *p, .  void *
1edd0 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f 6e  pContext, .  con
1ede0 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
1edf0 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 50  nt nChunk.){.  P
1ee00 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74  oslistCallbackCt
1ee10 78 20 2a 70 43 74 78 20 3d 20 28 50 6f 73 6c 69  x *pCtx = (Posli
1ee20 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 2a 29 70  stCallbackCtx*)p
1ee30 43 6f 6e 74 65 78 74 3b 0a 20 20 61 73 73 65 72  Context;.  asser
1ee40 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20  t_nc( nChunk>=0 
1ee50 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e  );.  if( nChunk>
1ee60 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
1ee70 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20 66 69  ch through to fi
1ee80 6e 64 20 74 68 65 20 66 69 72 73 74 20 76 61 72  nd the first var
1ee90 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65 20 31  int with value 1
1eea0 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a 20 20  . This is the.  
1eeb0 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20 74 68    ** start of th
1eec0 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73 20 68  e next columns h
1eed0 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  its. */.    int 
1eee0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
1eef0 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20 20 20  Start = 0;..    
1ef00 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65  if( pCtx->eState
1ef10 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==2 ){.      int
1ef20 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66 74 73   iCol;.      fts
1ef30 35 49 6e 64 65 78 47 65 74 56 61 72 69 6e 74 33  5IndexGetVarint3
1ef40 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f  2(pChunk, i, iCo
1ef50 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74  l);.      if( ft
1ef60 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73  s5IndexColsetTes
1ef70 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c  t(pCtx->pColset,
1ef80 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20   iCol) ){.      
1ef90 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d    pCtx->eState =
1efa0 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35   1;.        fts5
1efb0 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1efc0 6e 74 28 26 70 2d 3e 72 63 2c 20 70 43 74 78 2d  nt(&p->rc, pCtx-
1efd0 3e 70 42 75 66 2c 20 31 29 3b 0a 20 20 20 20 20  >pBuf, 1);.     
1efe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1eff0 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 30  pCtx->eState = 0
1f000 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1f010 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
1f020 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
1f030 26 26 20 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78  && pChunk[i]!=0x
1f040 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  01 ){.        wh
1f050 69 6c 65 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26  ile( pChunk[i] &
1f060 20 30 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20   0x80 ) i++;.   
1f070 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1f080 7d 0a 20 20 20 20 20 20 69 66 28 20 70 43 74 78  }.      if( pCtx
1f090 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1f0a0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1f0b0 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c  pendBlob(&p->rc,
1f0c0 20 70 43 74 78 2d 3e 70 42 75 66 2c 20 69 2d 69   pCtx->pBuf, i-i
1f0d0 53 74 61 72 74 2c 20 26 70 43 68 75 6e 6b 5b 69  Start, &pChunk[i
1f0e0 53 74 61 72 74 5d 29 3b 0a 20 20 20 20 20 20 7d  Start]);.      }
1f0f0 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43 68  .      if( i<nCh
1f100 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  unk ){.        i
1f110 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
1f120 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
1f130 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
1f140 20 20 69 66 28 20 69 3e 3d 6e 43 68 75 6e 6b 20    if( i>=nChunk 
1f150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43 74  ){.          pCt
1f160 78 2d 3e 65 53 74 61 74 65 20 3d 20 32 3b 0a 20  x->eState = 2;. 
1f170 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1f180 20 20 20 20 20 20 20 20 66 74 73 35 49 6e 64 65          fts5Inde
1f190 78 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68  xGetVarint32(pCh
1f1a0 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20  unk, i, iCol);. 
1f1b0 20 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65           pCtx->e
1f1c0 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65  State = fts5Inde
1f1d0 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78  xColsetTest(pCtx
1f1e0 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c 29  ->pColset, iCol)
1f1f0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f200 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29 7b 0a  pCtx->eState ){.
1f210 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1f220 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62  BufferAppendBlob
1f230 28 26 70 2d 3e 72 63 2c 20 70 43 74 78 2d 3e 70  (&p->rc, pCtx->p
1f240 42 75 66 2c 20 69 2d 69 53 74 61 72 74 2c 20 26  Buf, i-iStart, &
1f250 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 29 3b  pChunk[iStart]);
1f260 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 53 74  .            iSt
1f270 61 72 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  art = i;.       
1f280 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1f290 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
1f2a0 65 28 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20  e( i<nChunk );. 
1f2b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
1f2c0 61 74 6f 72 20 70 49 74 65 72 20 63 75 72 72 65  ator pIter curre
1f2d0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61  ntly points to a
1f2e0 20 76 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f   valid entry (no
1f2f0 74 20 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20  t EOF). This.** 
1f300 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73  function appends
1f310 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
1f320 73 74 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  st data for the 
1f330 63 75 72 72 65 6e 74 20 65 6e 74 72 79 20 74 6f  current entry to
1f340 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e  .** buffer pBuf.
1f350 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b   It does not mak
1f360 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
1f370 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
1f380 7a 65 0a 2a 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a  ze.** field..*/.
1f390 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1f3a0 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 0a  SegiterPoslist(.
1f3b0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a    Fts5Index *p,.
1f3c0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
1f3d0 53 65 67 2c 0a 20 20 46 74 73 35 45 78 70 72 43  Seg,.  Fts5ExprC
1f3e0 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 0a  olset *pColset,.
1f3f0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
1f400 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 43 6f 6c  uf.){.  if( pCol
1f410 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74  set==0 ){.    ft
1f420 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
1f430 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 70  , pSeg, (void*)p
1f440 42 75 66 2c 20 66 74 73 35 50 6f 73 6c 69 73 74  Buf, fts5Poslist
1f450 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 65 6c  Callback);.  }el
1f460 73 65 7b 0a 20 20 20 20 50 6f 73 6c 69 73 74 43  se{.    PoslistC
1f470 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b  allbackCtx sCtx;
1f480 0a 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d  .    sCtx.pBuf =
1f490 20 70 42 75 66 3b 0a 20 20 20 20 73 43 74 78 2e   pBuf;.    sCtx.
1f4a0 70 43 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65  pColset = pColse
1f4b0 74 3b 0a 20 20 20 20 73 43 74 78 2e 65 53 74 61  t;.    sCtx.eSta
1f4c0 74 65 20 3d 20 70 43 6f 6c 73 65 74 20 3f 20 66  te = pColset ? f
1f4d0 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
1f4e0 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29 20 3a  st(pColset, 0) :
1f4f0 20 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   1;.    assert( 
1f500 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30 20 7c  sCtx.eState==0 |
1f510 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 31  | sCtx.eState==1
1f520 20 29 3b 0a 20 20 20 20 66 74 73 35 43 68 75 6e   );.    fts5Chun
1f530 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65 67  kIterate(p, pSeg
1f540 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c 20  , (void*)&sCtx, 
1f550 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
1f560 72 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 7d 0a  rCallback);.  }.
1f570 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f  }../*.** Iterato
1f580 72 20 70 4d 75 6c 74 69 20 63 75 72 72 65 6e 74  r pMulti current
1f590 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76  ly points to a v
1f5a0 61 6c 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20  alid entry (not 
1f5b0 45 4f 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75  EOF). This.** fu
1f5c0 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61  nction appends a
1f5d0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
1f5e0 69 74 69 6f 6e 2d 6c 69 73 74 20 6f 66 20 74 68  ition-list of th
1f5f0 65 20 65 6e 74 72 79 20 70 4d 75 6c 74 69 20 0a  e entry pMulti .
1f600 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69  ** currently poi
1f610 6e 74 73 20 74 6f 20 74 6f 20 62 75 66 66 65 72  nts to to buffer
1f620 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   pBuf..**.** If 
1f630 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1f640 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
1f650 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e  s left in p->rc.
1f660 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 0a 2a   It is assumed.*
1f670 2a 20 6e 6f 20 65 72 72 6f 72 20 68 61 73 20 61  * no error has a
1f680 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 20  lready occurred 
1f690 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
1f6a0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
1f6b0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
1f6c0 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
1f6d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1f6e0 2c 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65  ,.  Fts5IndexIte
1f6f0 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73  r *pMulti,.  Fts
1f700 35 45 78 70 72 43 6f 6c 73 65 74 20 2a 70 43 6f  5ExprColset *pCo
1f710 6c 73 65 74 2c 0a 20 20 69 6e 74 20 62 53 7a 2c  lset,.  int bSz,
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
1f740 64 20 61 20 73 69 7a 65 20 66 69 65 6c 64 20 62  d a size field b
1f750 65 66 6f 72 65 20 74 68 65 20 64 61 74 61 20 2a  efore the data *
1f760 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
1f770 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 70 2d  pBuf.){.  if( p-
1f780 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1f790 7b 0a 20 20 20 20 69 6e 74 20 69 53 7a 3b 0a 20  {.    int iSz;. 
1f7a0 20 20 20 69 6e 74 20 69 44 61 74 61 3b 0a 0a 20     int iData;.. 
1f7b0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1f7c0 70 53 65 67 20 3d 20 26 70 4d 75 6c 74 69 2d 3e  pSeg = &pMulti->
1f7d0 61 53 65 67 5b 20 70 4d 75 6c 74 69 2d 3e 61 46  aSeg[ pMulti->aF
1f7e0 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
1f7f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 66 74  ;.    assert( ft
1f800 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70  s5MultiIterEof(p
1f810 2c 20 70 4d 75 6c 74 69 29 3d 3d 30 20 29 3b 0a  , pMulti)==0 );.
1f820 0a 20 20 20 20 69 66 28 20 62 53 7a 20 29 7b 0a  .    if( bSz ){.
1f830 20 20 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f        /* WRITEPO
1f840 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20  SLISTSIZE */.   
1f850 20 20 20 69 53 7a 20 3d 20 70 42 75 66 2d 3e 6e     iSz = pBuf->n
1f860 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
1f870 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1f880 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53 65  p->rc, pBuf, pSe
1f890 67 2d 3e 6e 50 6f 73 2a 32 29 3b 0a 20 20 20 20  g->nPos*2);.    
1f8a0 20 20 69 44 61 74 61 20 3d 20 70 42 75 66 2d 3e    iData = pBuf->
1f8b0 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74  n;.    }..    ft
1f8c0 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
1f8d0 28 70 2c 20 70 53 65 67 2c 20 70 43 6f 6c 73 65  (p, pSeg, pColse
1f8e0 74 2c 20 70 42 75 66 29 3b 0a 0a 20 20 20 20 69  t, pBuf);..    i
1f8f0 66 28 20 62 53 7a 20 26 26 20 70 43 6f 6c 73 65  f( bSz && pColse
1f900 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t ){.      int n
1f910 41 63 74 75 61 6c 20 3d 20 70 42 75 66 2d 3e 6e  Actual = pBuf->n
1f920 20 2d 20 69 44 61 74 61 3b 0a 20 20 20 20 20 20   - iData;.      
1f930 69 66 28 20 6e 41 63 74 75 61 6c 21 3d 70 53 65  if( nActual!=pSe
1f940 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20 20 20  g->nPos ){.     
1f950 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49     /* WRITEPOSLI
1f960 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20  STSIZE */.      
1f970 20 20 69 66 28 20 6e 41 63 74 75 61 6c 3d 3d 30    if( nActual==0
1f980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1f990 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1f9a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f9b0 20 69 6e 74 20 6e 52 65 71 20 3d 20 73 71 6c 69   int nReq = sqli
1f9c0 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
1f9d0 4c 65 6e 28 28 75 33 32 29 28 6e 41 63 74 75 61  Len((u32)(nActua
1f9e0 6c 2a 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20  l*2));.         
1f9f0 20 77 68 69 6c 65 28 20 69 53 7a 3c 28 69 44 61   while( iSz<(iDa
1fa00 74 61 2d 6e 52 65 71 29 20 29 7b 20 70 42 75 66  ta-nReq) ){ pBuf
1fa10 2d 3e 70 5b 69 53 7a 2b 2b 5d 20 3d 20 30 78 38  ->p[iSz++] = 0x8
1fa20 30 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73  0; }.          s
1fa30 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61 72  qlite3Fts5PutVar
1fa40 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69 53 7a  int(&pBuf->p[iSz
1fa50 5d 2c 20 6e 41 63 74 75 61 6c 2a 32 29 3b 0a 20  ], nActual*2);. 
1fa60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1fa70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
1fa80 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
1fa90 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69  c void fts5Docli
1faa0 73 74 49 74 65 72 4e 65 78 74 28 46 74 73 35 44  stIterNext(Fts5D
1fab0 6f 63 6c 69 73 74 49 74 65 72 20 2a 70 49 74 65  oclistIter *pIte
1fac0 72 29 7b 0a 20 20 75 38 20 2a 70 20 3d 20 70 49  r){.  u8 *p = pI
1fad0 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 2b 20  ter->aPoslist + 
1fae0 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69 73 74 3b  pIter->nPoslist;
1faf0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
1fb00 72 2d 3e 61 50 6f 73 6c 69 73 74 20 29 3b 0a 20  r->aPoslist );. 
1fb10 20 69 66 28 20 70 3e 3d 70 49 74 65 72 2d 3e 61   if( p>=pIter->a
1fb20 45 6f 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72  Eof ){.    pIter
1fb30 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 30 3b 0a  ->aPoslist = 0;.
1fb40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
1fb50 20 69 44 65 6c 74 61 3b 0a 0a 20 20 20 20 70 20   iDelta;..    p 
1fb60 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
1fb70 28 70 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  (p, (u64*)&iDelt
1fb80 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  a);.    pIter->i
1fb90 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b  Rowid += iDelta;
1fba0 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 70 6f  ..    /* Read po
1fbb0 73 69 74 69 6f 6e 20 6c 69 73 74 20 73 69 7a 65  sition list size
1fbc0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 5b 30 5d   */.    if( p[0]
1fbd0 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20 20 20   & 0x80 ){.     
1fbe0 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20   int nPos;.     
1fbf0 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   p += fts5GetVar
1fc00 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a  int32(p, nPos);.
1fc10 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
1fc20 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31  slist = (nPos>>1
1fc30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1fc40 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c      pIter->nPosl
1fc50 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30  ist = ((int)(p[0
1fc60 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20  ])) >> 1;.      
1fc70 70 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  p++;.    }..    
1fc80 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
1fc90 3d 20 70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  = p;.  }.}..stat
1fca0 69 63 20 76 6f 69 64 20 66 74 73 35 44 6f 63 6c  ic void fts5Docl
1fcb0 69 73 74 49 74 65 72 49 6e 69 74 28 0a 20 20 46  istIterInit(.  F
1fcc0 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
1fcd0 20 0a 20 20 46 74 73 35 44 6f 63 6c 69 73 74 49   .  Fts5DoclistI
1fce0 74 65 72 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20  ter *pIter.){.  
1fcf0 6d 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c  memset(pIter, 0,
1fd00 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 72 29 29   sizeof(*pIter))
1fd10 3b 0a 20 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  ;.  pIter->aPosl
1fd20 69 73 74 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20  ist = pBuf->p;. 
1fd30 20 70 49 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26   pIter->aEof = &
1fd40 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d  pBuf->p[pBuf->n]
1fd50 3b 0a 20 20 66 74 73 35 44 6f 63 6c 69 73 74 49  ;.  fts5DoclistI
1fd60 74 65 72 4e 65 78 74 28 70 49 74 65 72 29 3b 0a  terNext(pIter);.
1fd70 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41  }..#if 0./*.** A
1fd80 70 70 65 6e 64 20 61 20 64 6f 63 6c 69 73 74 20  ppend a doclist 
1fd90 74 6f 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  to buffer pBuf..
1fda0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
1fdb0 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
1fdc0 20 73 70 61 63 65 20 77 69 74 68 69 6e 20 74 68   space within th
1fdd0 65 20 62 75 66 66 65 72 20 68 61 73 20 61 6c 72  e buffer has alr
1fde0 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c  eady been.** all
1fdf0 6f 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ocated..*/.stati
1fe00 63 20 76 6f 69 64 20 66 74 73 35 4d 65 72 67 65  c void fts5Merge
1fe10 41 70 70 65 6e 64 44 6f 63 69 64 28 0a 20 20 46  AppendDocid(.  F
1fe20 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c  ts5Buffer *pBuf,
1fe30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fe40 2a 20 42 75 66 66 65 72 20 74 6f 20 77 72 69 74  * Buffer to writ
1fe50 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70  e to */.  i64 *p
1fe60 69 4c 61 73 74 52 6f 77 69 64 2c 20 20 20 20 20  iLastRowid,     
1fe70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
1fe80 4f 55 54 3a 20 50 72 65 76 69 6f 75 73 20 72 6f  OUT: Previous ro
1fe90 77 69 64 20 77 72 69 74 74 65 6e 20 28 69 66 20  wid written (if 
1fea0 61 6e 79 29 20 2a 2f 0a 20 20 69 36 34 20 69 52  any) */.  i64 iR
1feb0 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20 20  owid            
1fec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 77            /* Row
1fed0 69 64 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a  id to append */.
1fee0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 42 75  ){.  assert( pBu
1fef0 66 2d 3e 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c  f->n!=0 || (*piL
1ff00 61 73 74 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a  astRowid)==0 );.
1ff10 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
1ff20 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
1ff30 66 2c 20 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c  f, iRowid - *piL
1ff40 61 73 74 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69  astRowid);.  *pi
1ff50 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f 77  LastRowid = iRow
1ff60 69 64 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64  id;.}.#endif..#d
1ff70 65 66 69 6e 65 20 66 74 73 35 4d 65 72 67 65 41  efine fts5MergeA
1ff80 70 70 65 6e 64 44 6f 63 69 64 28 70 42 75 66 2c  ppendDocid(pBuf,
1ff90 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 52 6f   iLastRowid, iRo
1ffa0 77 69 64 29 20 7b 20 20 20 20 20 20 20 5c 0a 20  wid) {       \. 
1ffb0 20 61 73 73 65 72 74 28 20 28 70 42 75 66 29 2d   assert( (pBuf)-
1ffc0 3e 6e 21 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52  >n!=0 || (iLastR
1ffd0 6f 77 69 64 29 3d 3d 30 20 29 3b 20 20 20 20 20  owid)==0 );     
1ffe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fff0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
20000 41 70 70 65 6e 64 56 61 72 69 6e 74 28 28 70 42  AppendVarint((pB
20010 75 66 29 2c 20 28 69 52 6f 77 69 64 29 20 2d 20  uf), (iRowid) - 
20020 28 69 4c 61 73 74 52 6f 77 69 64 29 29 3b 20 5c  (iLastRowid)); \
20030 0a 20 20 28 69 4c 61 73 74 52 6f 77 69 64 29 20  .  (iLastRowid) 
20040 3d 20 28 69 52 6f 77 69 64 29 3b 20 20 20 20 20  = (iRowid);     
20050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20070 5c 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65  \.}../*.** Buffe
20080 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f 6e  rs p1 and p2 con
20090 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20 54  tain doclists. T
200a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65 72  his function mer
200b0 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 0a  ges the content.
200c0 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64 6f  ** of the two do
200d0 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72 20  clists together 
200e0 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72 20  and sets buffer 
200f0 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c 74  p1 to the result
20100 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72   before.** retur
20110 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
20120 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
20130 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
20140 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e 20   left in p->rc. 
20150 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 0a  If an error has.
20160 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72  ** already occur
20170 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  red, this functi
20180 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
20190 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
201a0 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69 73  s5MergePrefixLis
201b0 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ts(.  Fts5Index 
201c0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
201d0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
201e0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
201f0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 31    Fts5Buffer *p1
20200 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20210 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74 20    /* First list 
20220 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46 74  to merge */.  Ft
20230 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20 20  s5Buffer *p2    
20240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20250 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f 20   Second list to 
20260 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 66  merge */.){.  if
20270 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20 69  ( p2->n ){.    i
20280 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20  64 iLastRowid = 
20290 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c 69  0;.    Fts5Docli
202a0 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20 46  stIter i1;.    F
202b0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20 69  ts5DoclistIter i
202c0 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  2;.    Fts5Buffe
202d0 72 20 6f 75 74 3b 0a 20 20 20 20 46 74 73 35 42  r out;.    Fts5B
202e0 75 66 66 65 72 20 74 6d 70 3b 0a 20 20 20 20 6d  uffer tmp;.    m
202f0 65 6d 73 65 74 28 26 6f 75 74 2c 20 30 2c 20 73  emset(&out, 0, s
20300 69 7a 65 6f 66 28 6f 75 74 29 29 3b 0a 20 20 20  izeof(out));.   
20310 20 6d 65 6d 73 65 74 28 26 74 6d 70 2c 20 30 2c   memset(&tmp, 0,
20320 20 73 69 7a 65 6f 66 28 74 6d 70 29 29 3b 0a 0a   sizeof(tmp));..
20330 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
20340 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72 63  ufferGrow(&p->rc
20350 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20 2b 20  , &out, p1->n + 
20360 70 32 2d 3e 6e 29 3b 0a 20 20 20 20 66 74 73 35  p2->n);.    fts5
20370 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28  DoclistIterInit(
20380 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74  p1, &i1);.    ft
20390 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
203a0 74 28 70 32 2c 20 26 69 32 29 3b 0a 20 20 20 20  t(p2, &i2);.    
203b0 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51  while( p->rc==SQ
203c0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 31 2e 61  LITE_OK && (i1.a
203d0 50 6f 73 6c 69 73 74 21 3d 30 20 7c 7c 20 69 32  Poslist!=0 || i2
203e0 2e 61 50 6f 73 6c 69 73 74 21 3d 30 29 20 29 7b  .aPoslist!=0) ){
203f0 0a 20 20 20 20 20 20 69 66 28 20 69 32 2e 61 50  .      if( i2.aP
20400 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 28 69 31  oslist==0 || (i1
20410 2e 61 50 6f 73 6c 69 73 74 20 26 26 20 69 31 2e  .aPoslist && i1.
20420 69 52 6f 77 69 64 3c 69 32 2e 69 52 6f 77 69 64  iRowid<i2.iRowid
20430 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
20440 43 6f 70 79 20 65 6e 74 72 79 20 66 72 6f 6d 20  Copy entry from 
20450 69 31 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74  i1 */.        ft
20460 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63  s5MergeAppendDoc
20470 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f  id(&out, iLastRo
20480 77 69 64 2c 20 69 31 2e 69 52 6f 77 69 64 29 3b  wid, i1.iRowid);
20490 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52 49 54  .        /* WRIT
204a0 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f 0a  EPOSLISTSIZE */.
204b0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
204c0 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
204d0 6e 74 28 26 6f 75 74 2c 20 69 31 2e 6e 50 6f 73  nt(&out, i1.nPos
204e0 6c 69 73 74 20 2a 20 32 29 3b 0a 20 20 20 20 20  list * 2);.     
204f0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
20500 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
20510 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
20520 31 2e 6e 50 6f 73 6c 69 73 74 29 3b 0a 20 20 20  1.nPoslist);.   
20530 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
20540 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20  IterNext(&i1);. 
20550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73       }.      els
20560 65 20 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73  e if( i1.aPoslis
20570 74 3d 3d 30 20 7c 7c 20 69 32 2e 69 52 6f 77 69  t==0 || i2.iRowi
20580 64 21 3d 69 31 2e 69 52 6f 77 69 64 20 29 7b 0a  d!=i1.iRowid ){.
20590 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
205a0 65 6e 74 72 79 20 66 72 6f 6d 20 69 32 20 2a 2f  entry from i2 */
205b0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72  .        fts5Mer
205c0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
205d0 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
205e0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
205f0 20 20 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c      /* WRITEPOSL
20600 49 53 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20  ISTSIZE */.     
20610 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
20620 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f  eAppendVarint(&o
20630 75 74 2c 20 69 32 2e 6e 50 6f 73 6c 69 73 74 20  ut, i2.nPoslist 
20640 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66 74  * 2);.        ft
20650 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
20660 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e  ndBlob(&out, i2.
20670 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f  aPoslist, i2.nPo
20680 73 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 20 20  slist);.        
20690 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
206a0 65 78 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20  ext(&i2);.      
206b0 7d 0a 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20  }.      else{.  
206c0 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 31 20        i64 iPos1 
206d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
206e0 20 69 50 6f 73 32 20 3d 20 30 3b 0a 20 20 20 20   iPos2 = 0;.    
206f0 20 20 20 20 69 6e 74 20 69 4f 66 66 31 20 3d 20      int iOff1 = 
20700 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  0;.        int i
20710 4f 66 66 32 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Off2 = 0;..     
20720 20 20 20 46 74 73 35 50 6f 73 6c 69 73 74 57 72     Fts5PoslistWr
20730 69 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20  iter writer;.   
20740 20 20 20 20 20 6d 65 6d 73 65 74 28 26 77 72 69       memset(&wri
20750 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77  ter, 0, sizeof(w
20760 72 69 74 65 72 29 29 3b 0a 0a 20 20 20 20 20 20  riter));..      
20770 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20 74    /* Merge the t
20780 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  wo position list
20790 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20 66  s. */ .        f
207a0 74 73 35 4d 65 72 67 65 41 70 70 65 6e 64 44 6f  ts5MergeAppendDo
207b0 63 69 64 28 26 6f 75 74 2c 20 69 4c 61 73 74 52  cid(&out, iLastR
207c0 6f 77 69 64 2c 20 69 32 2e 69 52 6f 77 69 64 29  owid, i2.iRowid)
207d0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  ;.        fts5Bu
207e0 66 66 65 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a  fferZero(&tmp);.
207f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20800 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
20810 34 28 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  4(i1.aPoslist, i
20820 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
20830 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
20840 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
20850 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 69 32  PoslistNext64(i2
20860 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50  .aPoslist, i2.nP
20870 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20  oslist, &iOff2, 
20880 26 69 50 6f 73 32 29 3b 0a 0a 20 20 20 20 20 20  &iPos2);..      
20890 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
208a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 69 50  SQLITE_OK && (iP
208b0 6f 73 31 3e 3d 30 20 7c 7c 20 69 50 6f 73 32 3e  os1>=0 || iPos2>
208c0 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
208d0 20 69 36 34 20 69 4e 65 77 3b 0a 20 20 20 20 20   i64 iNew;.     
208e0 20 20 20 20 20 69 66 28 20 69 50 6f 73 32 3c 30       if( iPos2<0
208f0 20 7c 7c 20 28 69 50 6f 73 31 3e 3d 30 20 26 26   || (iPos1>=0 &&
20900 20 69 50 6f 73 31 3c 69 50 6f 73 32 29 20 29 7b   iPos1<iPos2) ){
20910 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4e 65  .            iNe
20920 77 20 3d 20 69 50 6f 73 31 3b 0a 20 20 20 20 20  w = iPos1;.     
20930 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
20940 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28  s5PoslistNext64(
20950 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e  i1.aPoslist, i1.
20960 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 31  nPoslist, &iOff1
20970 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20 20  , &iPos1);.     
20980 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20990 20 20 20 20 20 20 20 20 69 4e 65 77 20 3d 20 69          iNew = i
209a0 50 6f 73 32 3b 0a 20 20 20 20 20 20 20 20 20 20  Pos2;.          
209b0 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
209c0 6c 69 73 74 4e 65 78 74 36 34 28 69 32 2e 61 50  listNext64(i2.aP
209d0 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f 73 6c  oslist, i2.nPosl
209e0 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
209f0 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os2);.          
20a00 20 20 69 66 28 20 69 50 6f 73 31 3d 3d 69 50 6f    if( iPos1==iPo
20a10 73 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s2 ){.          
20a20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
20a30 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 69 31 2e  oslistNext64(i1.
20a40 61 50 6f 73 6c 69 73 74 2c 20 69 31 2e 6e 50 6f  aPoslist, i1.nPo
20a50 73 6c 69 73 74 2c 20 26 69 4f 66 66 31 2c 26 69  slist, &iOff1,&i
20a60 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
20a70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
20a80 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
20a90 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f   = sqlite3Fts5Po
20aa0 73 6c 69 73 74 57 72 69 74 65 72 41 70 70 65 6e  slistWriterAppen
20ab0 64 28 26 74 6d 70 2c 20 26 77 72 69 74 65 72 2c  d(&tmp, &writer,
20ac0 20 69 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20   iNew);.        
20ad0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 52  }..        /* WR
20ae0 49 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a  ITEPOSLISTSIZE *
20af0 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  /.        fts5Bu
20b00 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56 61  fferSafeAppendVa
20b10 72 69 6e 74 28 26 6f 75 74 2c 20 74 6d 70 2e 6e  rint(&out, tmp.n
20b20 20 2a 20 32 29 3b 0a 20 20 20 20 20 20 20 20 66   * 2);.        f
20b30 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
20b40 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 74 6d  endBlob(&out, tm
20b50 70 2e 70 2c 20 74 6d 70 2e 6e 29 3b 0a 20 20 20  p.p, tmp.n);.   
20b60 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69 73 74       fts5Doclist
20b70 49 74 65 72 4e 65 78 74 28 26 69 31 29 3b 0a 20  IterNext(&i1);. 
20b80 20 20 20 20 20 20 20 66 74 73 35 44 6f 63 6c 69         fts5Docli
20b90 73 74 49 74 65 72 4e 65 78 74 28 26 69 32 29 3b  stIterNext(&i2);
20ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
20bb0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
20bc0 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20 6f 75  t(&p->rc, p1, ou
20bd0 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20 20 20  t.n, out.p);.   
20be0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
20bf0 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73 35 42  &tmp);.    fts5B
20c00 75 66 66 65 72 46 72 65 65 28 26 6f 75 74 29 3b  ufferFree(&out);
20c10 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
20c20 6f 69 64 20 66 74 73 35 42 75 66 66 65 72 53 77  oid fts5BufferSw
20c30 61 70 28 46 74 73 35 42 75 66 66 65 72 20 2a 70  ap(Fts5Buffer *p
20c40 31 2c 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  1, Fts5Buffer *p
20c50 32 29 7b 0a 20 20 46 74 73 35 42 75 66 66 65 72  2){.  Fts5Buffer
20c60 20 74 6d 70 20 3d 20 2a 70 31 3b 0a 20 20 2a 70   tmp = *p1;.  *p
20c70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a 70 32 20 3d  1 = *p2;.  *p2 =
20c80 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61 74 69 63 20   tmp;.}..static 
20c90 76 6f 69 64 20 66 74 73 35 53 65 74 75 70 50 72  void fts5SetupPr
20ca0 65 66 69 78 49 74 65 72 28 0a 20 20 46 74 73 35  efixIter(.  Fts5
20cb0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
20cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
20cd0 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66 72 6f  ndex to read fro
20ce0 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63  m */.  int bDesc
20cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
20d00 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
20d10 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77  or "ORDER BY row
20d20 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63 6f  id DESC" */.  co
20d30 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c 20  nst u8 *pToken, 
20d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20d50 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
20d60 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61 74  ng prefix to mat
20d70 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 6b  ch */.  int nTok
20d80 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  en,             
20d90 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
20da0 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65 6e  of buffer pToken
20db0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 46   in bytes */.  F
20dc0 74 73 35 45 78 70 72 43 6f 6c 73 65 74 20 2a 70  ts5ExprColset *p
20dd0 43 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 2f  Colset,        /
20de0 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63 68  * Restrict match
20df0 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c 75  es to these colu
20e00 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  mns */.  Fts5Ind
20e10 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20  exIter **ppIter 
20e20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
20e30 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 2a 2f   New iterator */
20e40 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74  .){.  Fts5Struct
20e50 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20  ure *pStruct;.  
20e60 46 74 73 35 42 75 66 66 65 72 20 2a 61 42 75 66  Fts5Buffer *aBuf
20e70 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42  ;.  const int nB
20e80 75 66 20 3d 20 33 32 3b 0a 0a 20 20 61 42 75 66  uf = 32;..  aBuf
20e90 20 3d 20 28 46 74 73 35 42 75 66 66 65 72 2a 29   = (Fts5Buffer*)
20ea0 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70 2c  fts5IdxMalloc(p,
20eb0 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
20ec0 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70 53 74  er)*nBuf);.  pSt
20ed0 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
20ee0 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a 20 20  tureRead(p);..  
20ef0 69 66 28 20 61 42 75 66 20 26 26 20 70 53 74 72  if( aBuf && pStr
20f00 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  uct ){.    const
20f10 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46 54 53   int flags = FTS
20f20 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
20f30 4e 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  N;.    int i;.  
20f40 20 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64    i64 iLastRowid
20f50 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 49 6e   = 0;.    Fts5In
20f60 64 65 78 49 74 65 72 20 2a 70 31 20 3d 20 30 3b  dexIter *p1 = 0;
20f70 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
20f80 20 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20   used to gather 
20f90 64 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20  data from index 
20fa0 2a 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20  */.    Fts5Data 
20fb0 2a 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35  *pData;.    Fts5
20fc0 42 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a  Buffer doclist;.
20fd0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 64 6f 63  .    memset(&doc
20fe0 6c 69 73 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  list, 0, sizeof(
20ff0 64 6f 63 6c 69 73 74 29 29 3b 0a 20 20 20 20 66  doclist));.    f
21000 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
21010 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
21020 31 2c 20 66 6c 61 67 73 2c 20 70 54 6f 6b 65 6e  1, flags, pToken
21030 2c 20 6e 54 6f 6b 65 6e 2c 20 2d 31 2c 20 30 2c  , nToken, -1, 0,
21040 20 26 70 31 29 3b 0a 20 20 20 20 20 20 20 20 66   &p1);.        f
21050 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
21060 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20 20 20  p, p1)==0;.     
21070 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
21080 4e 65 78 74 28 70 2c 20 70 31 2c 20 30 2c 20 30  Next(p, p1, 0, 0
21090 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69  ).    ){.      i
210a0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
210b0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
210c0 31 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54  1);.      int nT
210d0 65 72 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  erm;.      const
210e0 20 75 38 20 2a 70 54 65 72 6d 20 3d 20 66 74 73   u8 *pTerm = fts
210f0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
21100 31 2c 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20  1, &nTerm);.    
21110 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6d 65 6d    assert_nc( mem
21120 63 6d 70 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72  cmp(pToken, pTer
21130 6d 2c 20 4d 49 4e 28 6e 54 6f 6b 65 6e 2c 20 6e  m, MIN(nToken, n
21140 54 65 72 6d 29 29 3c 3d 30 20 29 3b 0a 20 20 20  Term))<=0 );.   
21150 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e 54 6f     if( nTerm<nTo
21160 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 54  ken || memcmp(pT
21170 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e 54 6f  oken, pTerm, nTo
21180 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a 0a 20  ken) ) break;.. 
21190 20 20 20 20 20 69 66 28 20 64 6f 63 6c 69 73 74       if( doclist
211a0 2e 6e 3e 30 20 26 26 20 69 52 6f 77 69 64 3c 3d  .n>0 && iRowid<=
211b0 69 4c 61 73 74 52 6f 77 69 64 20 29 7b 0a 20 20  iLastRowid ){.  
211c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
211d0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
211e0 26 26 20 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b  && doclist.n; i+
211f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  +){.          as
21200 73 65 72 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a  sert( i<nBuf );.
21210 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 42            if( aB
21220 75 66 5b 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20  uf[i].n==0 ){.  
21230 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
21240 66 66 65 72 53 77 61 70 28 26 64 6f 63 6c 69 73  fferSwap(&doclis
21250 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
21260 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
21270 66 66 65 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73  fferZero(&doclis
21280 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  t);.          }e
21290 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
212a0 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
212b0 4c 69 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73  Lists(p, &doclis
212c0 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20  t, &aBuf[i]);.  
212d0 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
212e0 66 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69  fferZero(&aBuf[i
212f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
21300 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21310 20 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30    iLastRowid = 0
21320 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
21330 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 46   if( 0==sqlite3F
21340 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
21350 2d 3e 72 63 2c 20 26 64 6f 63 6c 69 73 74 2c 20  ->rc, &doclist, 
21360 39 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  9) ){.        in
21370 74 20 69 53 61 76 65 20 3d 20 64 6f 63 6c 69 73  t iSave = doclis
21380 74 2e 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t.n;.        ass
21390 65 72 74 28 20 64 6f 63 6c 69 73 74 2e 6e 21 3d  ert( doclist.n!=
213a0 30 20 7c 7c 20 69 4c 61 73 74 52 6f 77 69 64 3d  0 || iLastRowid=
213b0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74  =0 );.        ft
213c0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
213d0 6e 64 56 61 72 69 6e 74 28 26 64 6f 63 6c 69 73  ndVarint(&doclis
213e0 74 2c 20 69 52 6f 77 69 64 20 2d 20 69 4c 61 73  t, iRowid - iLas
213f0 74 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  tRowid);.       
21400 20 69 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74   if( fts5MultiIt
21410 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 31 2c  erPoslist(p, p1,
21420 20 70 43 6f 6c 73 65 74 2c 20 31 2c 20 26 64 6f   pColset, 1, &do
21430 63 6c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  clist) ){.      
21440 20 20 20 20 64 6f 63 6c 69 73 74 2e 6e 20 3d 20      doclist.n = 
21450 69 53 61 76 65 3b 0a 20 20 20 20 20 20 20 20 7d  iSave;.        }
21460 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21470 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 69 52 6f  iLastRowid = iRo
21480 77 69 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  wid;.        }. 
21490 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
214a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 75    for(i=0; i<nBu
214b0 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  f; i++){.      i
214c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
214d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 66  _OK ){.        f
214e0 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
214f0 73 74 73 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  sts(p, &doclist,
21500 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
21510 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 42 75    }.      fts5Bu
21520 66 66 65 72 46 72 65 65 28 26 61 42 75 66 5b 69  fferFree(&aBuf[i
21530 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  ]);.    }.    ft
21540 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
21550 70 2c 20 70 31 29 3b 0a 0a 20 20 20 20 70 44 61  p, p1);..    pDa
21560 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c 6c  ta = fts5IdxMall
21570 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73  oc(p, sizeof(Fts
21580 35 44 61 74 61 29 20 2b 20 64 6f 63 6c 69 73 74  5Data) + doclist
21590 2e 6e 29 3b 0a 20 20 20 20 69 66 28 20 70 44 61  .n);.    if( pDa
215a0 74 61 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74  ta ){.      pDat
215b0 61 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 44 61  a->p = (u8*)&pDa
215c0 74 61 5b 31 5d 3b 0a 20 20 20 20 20 20 70 44 61  ta[1];.      pDa
215d0 74 61 2d 3e 6e 6e 20 3d 20 70 44 61 74 61 2d 3e  ta->nn = pData->
215e0 73 7a 4c 65 61 66 20 3d 20 64 6f 63 6c 69 73 74  szLeaf = doclist
215f0 2e 6e 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  .n;.      memcpy
21600 28 70 44 61 74 61 2d 3e 70 2c 20 64 6f 63 6c 69  (pData->p, docli
21610 73 74 2e 70 2c 20 64 6f 63 6c 69 73 74 2e 6e 29  st.p, doclist.n)
21620 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
21630 69 49 74 65 72 4e 65 77 32 28 70 2c 20 70 44 61  iIterNew2(p, pDa
21640 74 61 2c 20 62 44 65 73 63 2c 20 70 70 49 74 65  ta, bDesc, ppIte
21650 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  r);.    }.    ft
21660 73 35 42 75 66 66 65 72 46 72 65 65 28 26 64 6f  s5BufferFree(&do
21670 63 6c 69 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 66  clist);.  }..  f
21680 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
21690 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a 20 20  ase(pStruct);.  
216a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 42 75  sqlite3_free(aBu
216b0 66 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6e  f);.}.../*.** In
216c0 64 69 63 61 74 65 20 74 68 61 74 20 61 6c 6c 20  dicate that all 
216d0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
216e0 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
216f0 6e 64 65 78 57 72 69 74 65 28 29 20 70 65 72 74  ndexWrite() pert
21700 61 69 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 6f  ain.** to the do
21710 63 75 6d 65 6e 74 20 77 69 74 68 20 72 6f 77 69  cument with rowi
21720 64 20 69 52 6f 77 69 64 2e 0a 2a 2f 0a 69 6e 74  d iRowid..*/.int
21730 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
21740 78 42 65 67 69 6e 57 72 69 74 65 28 46 74 73 35  xBeginWrite(Fts5
21750 49 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 62 44  Index *p, int bD
21760 65 6c 65 74 65 2c 20 69 36 34 20 69 52 6f 77 69  elete, i64 iRowi
21770 64 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  d){.  assert( p-
21780 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
21790 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
217a0 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
217b0 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61 6c  if it has not al
217c0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
217d0 61 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d  ated */.  if( p-
217e0 3e 70 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >pHash==0 ){.   
217f0 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
21800 46 74 73 35 48 61 73 68 4e 65 77 28 26 70 2d 3e  Fts5HashNew(&p->
21810 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65 6e 64  pHash, &p->nPend
21820 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20  ingData);.  }.. 
21830 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20 68 61   /* Flush the ha
21840 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69 73 6b  sh table to disk
21850 20 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a   if required */.
21860 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70 2d 3e    if( iRowid<p->
21870 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20 20 20  iWriteRowid .   
21880 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d 3e 69  || (iRowid==p->i
21890 57 72 69 74 65 52 6f 77 69 64 20 26 26 20 70 2d  WriteRowid && p-
218a0 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20 20 20  >bDelete==0).   
218b0 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e 67 44  || (p->nPendingD
218c0 61 74 61 20 3e 20 70 2d 3e 6e 4d 61 78 50 65 6e  ata > p->nMaxPen
218d0 64 69 6e 67 44 61 74 61 29 20 0a 20 20 29 7b 0a  dingData) .  ){.
218e0 20 20 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75      fts5IndexFlu
218f0 73 68 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 70 2d  sh(p);.  }..  p-
21900 3e 69 57 72 69 74 65 52 6f 77 69 64 20 3d 20 69  >iWriteRowid = i
21910 52 6f 77 69 64 3b 0a 20 20 70 2d 3e 62 44 65 6c  Rowid;.  p->bDel
21920 65 74 65 20 3d 20 62 44 65 6c 65 74 65 3b 0a 20  ete = bDelete;. 
21930 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
21940 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f  xReturn(p);.}../
21950 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 64 61 74 61  *.** Commit data
21960 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74   to disk..*/.int
21970 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
21980 78 53 79 6e 63 28 46 74 73 35 49 6e 64 65 78 20  xSync(Fts5Index 
21990 2a 70 2c 20 69 6e 74 20 62 43 6f 6d 6d 69 74 29  *p, int bCommit)
219a0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
219b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
219c0 20 20 66 74 73 35 49 6e 64 65 78 46 6c 75 73 68    fts5IndexFlush
219d0 28 70 29 3b 0a 20 20 69 66 28 20 62 43 6f 6d 6d  (p);.  if( bComm
219e0 69 74 20 29 20 66 74 73 35 43 6c 6f 73 65 52 65  it ) fts5CloseRe
219f0 61 64 65 72 28 70 29 3b 0a 20 20 72 65 74 75 72  ader(p);.  retur
21a00 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
21a10 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n(p);.}../*.** D
21a20 69 73 63 61 72 64 20 61 6e 79 20 64 61 74 61 20  iscard any data 
21a30 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69 6e  stored in the in
21a40 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62  -memory hash tab
21a50 6c 65 73 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74  les. Do not writ
21a60 65 20 69 74 0a 2a 2a 20 74 6f 20 74 68 65 20 64  e it.** to the d
21a70 61 74 61 62 61 73 65 2e 20 41 64 64 69 74 69 6f  atabase. Additio
21a80 6e 61 6c 6c 79 2c 20 61 73 73 75 6d 65 20 74 68  nally, assume th
21a90 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
21aa0 6f 66 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  of the %_data.**
21ab0 20 74 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20   table may have 
21ac0 63 68 61 6e 67 65 64 20 6f 6e 20 64 69 73 6b 2e  changed on disk.
21ad0 20 53 6f 20 61 6e 79 20 69 6e 2d 6d 65 6d 6f 72   So any in-memor
21ae0 79 20 63 61 63 68 65 73 20 6f 66 20 25 5f 64 61  y caches of %_da
21af0 74 61 20 0a 2a 2a 20 72 65 63 6f 72 64 73 20 6d  ta .** records m
21b00 75 73 74 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ust be invalidat
21b10 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
21b20 65 33 46 74 73 35 49 6e 64 65 78 52 6f 6c 6c 62  e3Fts5IndexRollb
21b30 61 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ack(Fts5Index *p
21b40 29 7b 0a 20 20 66 74 73 35 43 6c 6f 73 65 52 65  ){.  fts5CloseRe
21b50 61 64 65 72 28 70 29 3b 0a 20 20 66 74 73 35 49  ader(p);.  fts5I
21b60 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61 28  ndexDiscardData(
21b70 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p);.  assert( p-
21b80 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
21b90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21ba0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
21bb0 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20  he %_data table 
21bc0 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  is completely em
21bd0 70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75  pty when this fu
21be0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
21bf0 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
21c00 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20  on populates it 
21c10 77 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c  with the initial
21c20 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
21c30 74 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65  ts for each inde
21c40 78 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e  x,.** and the in
21c50 69 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66  itial version of
21c60 20 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20   the "averages" 
21c70 72 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62  record (a zero-b
21c80 79 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e  yte blob)..*/.in
21c90 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
21ca0 65 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64  exReinit(Fts5Ind
21cb0 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
21cc0 72 75 63 74 75 72 65 20 73 3b 0a 20 20 6d 65 6d  ructure s;.  mem
21cd0 73 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f  set(&s, 0, sizeo
21ce0 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 29  f(Fts5Structure)
21cf0 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
21d00 74 65 28 70 2c 20 46 54 53 35 5f 41 56 45 52 41  te(p, FTS5_AVERA
21d10 47 45 53 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73  GES_ROWID, (cons
21d20 74 20 75 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20  t u8*)"", 0);.  
21d30 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69  fts5StructureWri
21d40 74 65 28 70 2c 20 26 73 29 3b 0a 20 20 72 65 74  te(p, &s);.  ret
21d50 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
21d60 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
21d70 20 4f 70 65 6e 20 61 20 6e 65 77 20 46 74 73 35   Open a new Fts5
21d80 49 6e 64 65 78 20 68 61 6e 64 6c 65 2e 20 49 66  Index handle. If
21d90 20 74 68 65 20 62 43 72 65 61 74 65 20 61 72 67   the bCreate arg
21da0 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20 63  ument is true, c
21db0 72 65 61 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69  reate.** and ini
21dc0 74 69 61 6c 69 7a 65 20 74 68 65 20 75 6e 64 65  tialize the unde
21dd0 72 6c 79 69 6e 67 20 25 5f 64 61 74 61 20 74 61  rlying %_data ta
21de0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ble..**.** If su
21df0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 2a 70  ccessful, set *p
21e00 70 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  p to point to th
21e10 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 61 6e 64  e new object and
21e20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21e30 4b 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  K..** Otherwise,
21e40 20 73 65 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c   set *pp to NULL
21e50 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 53   and return an S
21e60 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
21e70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
21e80 46 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20  Fts5IndexOpen(. 
21e90 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f   Fts5Config *pCo
21ea0 6e 66 69 67 2c 20 0a 20 20 69 6e 74 20 62 43 72  nfig, .  int bCr
21eb0 65 61 74 65 2c 20 0a 20 20 46 74 73 35 49 6e 64  eate, .  Fts5Ind
21ec0 65 78 20 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20  ex **pp,.  char 
21ed0 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74  **pzErr.){.  int
21ee0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21ef0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 3b  .  Fts5Index *p;
21f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f10 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74     /* New object
21f20 20 2a 2f 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d   */..  *pp = p =
21f30 20 28 46 74 73 35 49 6e 64 65 78 2a 29 73 71 6c   (Fts5Index*)sql
21f40 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
21f50 72 6f 28 26 72 63 2c 20 73 69 7a 65 6f 66 28 46  ro(&rc, sizeof(F
21f60 74 73 35 49 6e 64 65 78 29 29 3b 0a 20 20 69 66  ts5Index));.  if
21f70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
21f80 29 7b 0a 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69  ){.    p->pConfi
21f90 67 20 3d 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20  g = pConfig;.   
21fa0 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20   p->nWorkUnit = 
21fb0 46 54 53 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a  FTS5_WORK_UNIT;.
21fc0 20 20 20 20 70 2d 3e 6e 4d 61 78 50 65 6e 64 69      p->nMaxPendi
21fd0 6e 67 44 61 74 61 20 3d 20 31 30 32 34 2a 31 30  ngData = 1024*10
21fe0 32 34 3b 0a 20 20 20 20 70 2d 3e 7a 44 61 74 61  24;.    p->zData
21ff0 54 62 6c 20 3d 20 73 71 6c 69 74 65 33 46 74 73  Tbl = sqlite3Fts
22000 35 4d 70 72 69 6e 74 66 28 26 72 63 2c 20 22 25  5Mprintf(&rc, "%
22010 73 5f 64 61 74 61 22 2c 20 70 43 6f 6e 66 69 67  s_data", pConfig
22020 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ->zName);.    if
22030 28 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 26 26  ( p->zDataTbl &&
22040 20 62 43 72 65 61 74 65 20 29 7b 0a 20 20 20 20   bCreate ){.    
22050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
22060 73 35 43 72 65 61 74 65 54 61 62 6c 65 28 0a 20  s5CreateTable(. 
22070 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
22080 2c 20 22 64 61 74 61 22 2c 20 22 69 64 20 49 4e  , "data", "id IN
22090 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
220a0 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 22 2c 20  Y, block BLOB", 
220b0 30 2c 20 70 7a 45 72 72 0a 20 20 20 20 20 20 29  0, pzErr.      )
220c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
220d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
220e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
220f0 33 46 74 73 35 43 72 65 61 74 65 54 61 62 6c 65  3Fts5CreateTable
22100 28 70 43 6f 6e 66 69 67 2c 20 22 69 64 78 22 2c  (pConfig, "idx",
22110 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 73   .            "s
22120 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f  egid, term, pgno
22130 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 73 65  , PRIMARY KEY(se
22140 67 69 64 2c 20 74 65 72 6d 29 22 2c 20 0a 20 20  gid, term)", .  
22150 20 20 20 20 20 20 20 20 20 20 31 2c 20 70 7a 45            1, pzE
22160 72 72 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  rr.        );.  
22170 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22190 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
221a0 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 52 65  lite3Fts5IndexRe
221b0 69 6e 69 74 28 70 29 3b 0a 20 20 20 20 20 20 7d  init(p);.      }
221c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
221d0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
221e0 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
221f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 69 66 28  LITE_OK );.  if(
22200 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
22210 65 33 46 74 73 35 49 6e 64 65 78 43 6c 6f 73 65  e3Fts5IndexClose
22220 28 70 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20 30  (p);.    *pp = 0
22230 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22240 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  c;.}../*.** Clos
22250 65 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  e a handle opene
22260 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20  d by an earlier 
22270 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46  call to sqlite3F
22280 74 73 35 49 6e 64 65 78 4f 70 65 6e 28 29 2e 0a  ts5IndexOpen()..
22290 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
222a0 73 35 49 6e 64 65 78 43 6c 6f 73 65 28 46 74 73  s5IndexClose(Fts
222b0 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e  5Index *p){.  in
222c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
222d0 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
222e0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 52 65 61   assert( p->pRea
222f0 64 65 72 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  der==0 );.    sq
22300 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
22310 2d 3e 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  ->pWriter);.    
22320 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
22330 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
22340 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
22350 69 7a 65 28 70 2d 3e 70 49 64 78 57 72 69 74 65  ize(p->pIdxWrite
22360 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
22370 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78  finalize(p->pIdx
22380 44 65 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71  Deleter);.    sq
22390 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
223a0 2d 3e 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20  ->pIdxSelect);. 
223b0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
223c0 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
223d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
223e0 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
223f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
22400 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
22410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22420 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
22430 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
22440 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
22450 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
22460 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
22470 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
22480 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
22490 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
224a0 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
224b0 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
224c0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
224d0 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
224e0 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
224f0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
22500 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
22510 6e 54 6f 42 79 74 65 6c 65 6e 28 63 6f 6e 73 74  nToBytelen(const
22520 20 63 68 61 72 20 2a 70 2c 20 69 6e 74 20 6e 42   char *p, int nB
22530 79 74 65 2c 20 69 6e 74 20 6e 43 68 61 72 29 7b  yte, int nChar){
22540 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
22550 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
22560 3b 20 69 3c 6e 43 68 61 72 3b 20 69 2b 2b 29 7b  ; i<nChar; i++){
22570 0a 20 20 20 20 69 66 28 20 6e 3e 3d 6e 42 79 74  .    if( n>=nByt
22580 65 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  e ) return 0;   
22590 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 6f 6e 74     /* Input cont
225a0 61 69 6e 73 20 66 65 77 65 72 20 74 68 61 6e 20  ains fewer than 
225b0 6e 43 68 61 72 20 63 68 61 72 73 20 2a 2f 0a 20  nChar chars */. 
225c0 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
225d0 20 63 68 61 72 29 70 5b 6e 2b 2b 5d 3e 3d 30 78   char)p[n++]>=0x
225e0 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  c0 ){.      whil
225f0 65 28 20 28 70 5b 6e 5d 20 26 20 30 78 63 30 29  e( (p[n] & 0xc0)
22600 3d 3d 30 78 38 30 20 29 20 6e 2b 2b 3b 0a 20 20  ==0x80 ) n++;.  
22610 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
22620 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 49 6e   n;.}../*.** pIn
22630 20 69 73 20 61 20 55 54 46 2d 38 20 65 6e 63 6f   is a UTF-8 enco
22640 64 65 64 20 73 74 72 69 6e 67 2c 20 6e 49 6e 20  ded string, nIn 
22650 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 52  bytes in size. R
22660 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
22670 20 6f 66 0a 2a 2a 20 75 6e 69 63 6f 64 65 20 63   of.** unicode c
22680 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
22690 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
226a0 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78  ic int fts5Index
226b0 43 68 61 72 6c 65 6e 28 63 6f 6e 73 74 20 63 68  Charlen(const ch
226c0 61 72 20 2a 70 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *pIn, int nIn
226d0 29 7b 0a 20 20 69 6e 74 20 6e 43 68 61 72 20 3d  ){.  int nChar =
226e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 0a   0;            .
226f0 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 77    int i = 0;.  w
22700 68 69 6c 65 28 20 69 3c 6e 49 6e 20 29 7b 0a 20  hile( i<nIn ){. 
22710 20 20 20 69 66 28 20 28 75 6e 73 69 67 6e 65 64     if( (unsigned
22720 20 63 68 61 72 29 70 49 6e 5b 69 2b 2b 5d 3e 3d   char)pIn[i++]>=
22730 30 78 63 30 20 29 7b 0a 20 20 20 20 20 20 77 68  0xc0 ){.      wh
22740 69 6c 65 28 20 69 3c 6e 49 6e 20 26 26 20 28 70  ile( i<nIn && (p
22750 49 6e 5b 69 5d 20 26 20 30 78 63 30 29 3d 3d 30  In[i] & 0xc0)==0
22760 78 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 7d  x80 ) i++;.    }
22770 0a 20 20 20 20 6e 43 68 61 72 2b 2b 3b 0a 20 20  .    nChar++;.  
22780 7d 0a 20 20 72 65 74 75 72 6e 20 6e 43 68 61 72  }.  return nChar
22790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
227a0 74 20 6f 72 20 72 65 6d 6f 76 65 20 64 61 74 61  t or remove data
227b0 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20   to or from the 
227c0 69 6e 64 65 78 2e 20 45 61 63 68 20 74 69 6d 65  index. Each time
227d0 20 61 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 0a   a document is .
227e0 2a 2a 20 61 64 64 65 64 20 74 6f 20 6f 72 20 72  ** added to or r
227f0 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
22800 69 6e 64 65 78 2c 20 74 68 69 73 20 66 75 6e 63  index, this func
22810 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6f  tion is called o
22820 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 74 69  ne or more.** ti
22830 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61  mes..**.** For a
22840 6e 20 69 6e 73 65 72 74 2c 20 69 74 20 6d 75 73  n insert, it mus
22850 74 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65  t be called once
22860 20 66 6f 72 20 65 61 63 68 20 74 6f 6b 65 6e 20   for each token 
22870 69 6e 20 74 68 65 20 6e 65 77 20 64 6f 63 75 6d  in the new docum
22880 65 6e 74 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ent..** If the o
22890 70 65 72 61 74 69 6f 6e 20 69 73 20 61 20 64 65  peration is a de
228a0 6c 65 74 65 2c 20 69 74 20 6d 75 73 74 20 62 65  lete, it must be
228b0 20 63 61 6c 6c 65 64 20 28 61 74 20 6c 65 61 73   called (at leas
228c0 74 29 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  t) once for each
228d0 0a 2a 2a 20 75 6e 69 71 75 65 20 74 6f 6b 65 6e  .** unique token
228e0 20 69 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74   in the document
228f0 20 77 69 74 68 20 61 6e 20 69 43 6f 6c 20 76 61   with an iCol va
22900 6c 75 65 20 6c 65 73 73 20 74 68 61 6e 20 7a 65  lue less than ze
22910 72 6f 2e 20 54 68 65 20 69 50 6f 73 0a 2a 2a 20  ro. The iPos.** 
22920 61 72 67 75 6d 65 6e 74 20 69 73 20 69 67 6e 6f  argument is igno
22930 72 65 64 20 66 6f 72 20 61 20 64 65 6c 65 74 65  red for a delete
22940 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22950 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28 0a  Fts5IndexWrite(.
22960 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
22970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22980 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f 20 77 72    /* Index to wr
22990 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ite to */.  int 
229a0 69 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iCol,           
229b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
229c0 6f 6c 75 6d 6e 20 74 6f 6b 65 6e 20 61 70 70 65  olumn token appe
229d0 61 72 73 20 69 6e 20 28 2d 76 65 20 2d 3e 20 64  ars in (-ve -> d
229e0 65 6c 65 74 65 29 20 2a 2f 0a 20 20 69 6e 74 20  elete) */.  int 
229f0 69 50 6f 73 2c 20 20 20 20 20 20 20 20 20 20 20  iPos,           
22a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
22a10 6f 73 69 74 69 6f 6e 20 6f 66 20 74 6f 6b 65 6e  osition of token
22a20 20 77 69 74 68 69 6e 20 63 6f 6c 75 6d 6e 20 2a   within column *
22a30 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
22a40 70 54 6f 6b 65 6e 2c 20 69 6e 74 20 6e 54 6f 6b  pToken, int nTok
22a50 65 6e 20 20 2f 2a 20 54 6f 6b 65 6e 20 74 6f 20  en  /* Token to 
22a60 61 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 74 6f  add or remove to
22a70 20 6f 72 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a   or from index *
22a80 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  /.){.  int i;   
22a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22aa0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
22ab0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
22ac0 68 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 69  h indexes */.  i
22ad0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
22ae0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
22af0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
22b00 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
22b10 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
22b20 66 69 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  fig;..  assert( 
22b30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
22b40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69   );.  assert( (i
22b50 43 6f 6c 3c 30 29 3d 3d 70 2d 3e 62 44 65 6c 65  Col<0)==p->bDele
22b60 74 65 20 29 3b 0a 0a 20 20 2f 2a 20 41 64 64 20  te );..  /* Add 
22b70 74 68 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65  the entry to the
22b80 20 6d 61 69 6e 20 74 65 72 6d 73 20 69 6e 64 65   main terms inde
22b90 78 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  x. */.  rc = sql
22ba0 69 74 65 33 46 74 73 35 48 61 73 68 57 72 69 74  ite3Fts5HashWrit
22bb0 65 28 0a 20 20 20 20 20 20 70 2d 3e 70 48 61 73  e(.      p->pHas
22bc0 68 2c 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  h, p->iWriteRowi
22bd0 64 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46  d, iCol, iPos, F
22be0 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2c  TS5_MAIN_PREFIX,
22bf0 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 0a   pToken, nToken.
22c00 20 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b    );..  for(i=0;
22c10 20 69 3c 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65   i<pConfig->nPre
22c20 66 69 78 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  fix && rc==SQLIT
22c30 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
22c40 69 6e 74 20 6e 42 79 74 65 20 3d 20 66 74 73 35  int nByte = fts5
22c50 49 6e 64 65 78 43 68 61 72 6c 65 6e 54 6f 42 79  IndexCharlenToBy
22c60 74 65 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54  telen(pToken, nT
22c70 6f 6b 65 6e 2c 20 70 43 6f 6e 66 69 67 2d 3e 61  oken, pConfig->a
22c80 50 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20  Prefix[i]);.    
22c90 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
22ca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
22cb0 74 73 35 48 61 73 68 57 72 69 74 65 28 70 2d 3e  ts5HashWrite(p->
22cc0 70 48 61 73 68 2c 20 0a 20 20 20 20 20 20 20 20  pHash, .        
22cd0 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64    p->iWriteRowid
22ce0 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 46 54  , iCol, iPos, FT
22cf0 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 2b 69  S5_MAIN_PREFIX+i
22d00 2b 31 2c 20 70 54 6f 6b 65 6e 2c 20 6e 42 79 74  +1, pToken, nByt
22d10 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
22d20 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
22d30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
22d40 20 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20   a new iterator 
22d50 74 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67  to iterate thoug
22d60 68 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74  h all rowid that
22d70 20 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73   match the .** s
22d80 70 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f  pecified token o
22d90 72 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a  r token prefix..
22da0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
22db0 73 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20  s5IndexQuery(.  
22dc0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 2f 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20  /* FTS index to 
22df0 71 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74  query */.  const
22e00 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69   char *pToken, i
22e10 6e 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f  nt nToken, /* To
22e20 6b 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20  ken (or prefix) 
22e30 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a  to query for */.
22e40 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53    /* Mask of FTS
22e70 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66  5INDEX_QUERY_X f
22e80 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 45 78  lags */.  Fts5Ex
22e90 70 72 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65  prColset *pColse
22ea0 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74  t,        /* Mat
22eb0 63 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73  ch these columns
22ec0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49   only */.  Fts5I
22ed0 6e 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65  ndexIter **ppIte
22ee0 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  r          /* OU
22ef0 54 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20  T: New iterator 
22f00 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46  object */.){.  F
22f10 74 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66  ts5Config *pConf
22f20 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b  ig = p->pConfig;
22f30 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
22f40 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 69 6e   *pRet = 0;.  in
22f50 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 46 74  t iIdx = 0;.  Ft
22f60 73 35 42 75 66 66 65 72 20 62 75 66 20 3d 20 7b  s5Buffer buf = {
22f70 30 2c 20 30 2c 20 30 7d 3b 0a 0a 20 20 2f 2a 20  0, 0, 0};..  /* 
22f80 49 66 20 74 68 65 20 51 55 45 52 59 5f 53 43 41  If the QUERY_SCA
22f90 4e 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61  N flag is set, a
22fa0 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 20 6d  ll other flags m
22fb0 75 73 74 20 62 65 20 63 6c 65 61 72 2e 20 2a 2f  ust be clear. */
22fc0 0a 20 20 61 73 73 65 72 74 28 20 28 66 6c 61 67  .  assert( (flag
22fd0 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
22fe0 45 52 59 5f 53 43 41 4e 29 3d 3d 30 0a 20 20 20  ERY_SCAN)==0.   
22ff0 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 20 26 20      || (flags & 
23000 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
23010 53 43 41 4e 29 3d 3d 46 54 53 35 49 4e 44 45 58  SCAN)==FTS5INDEX
23020 5f 51 55 45 52 59 5f 53 43 41 4e 0a 20 20 29 3b  _QUERY_SCAN.  );
23030 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 46  ..  if( sqlite3F
23040 74 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70  ts5BufferGrow(&p
23050 2d 3e 72 63 2c 20 26 62 75 66 2c 20 6e 54 6f 6b  ->rc, &buf, nTok
23060 65 6e 2b 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  en+1)==0 ){.    
23070 6d 65 6d 63 70 79 28 26 62 75 66 2e 70 5b 31 5d  memcpy(&buf.p[1]
23080 2c 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  , pToken, nToken
23090 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
230a0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
230b0 66 20 74 68 65 20 51 55 45 52 59 5f 54 45 53 54  f the QUERY_TEST
230c0 5f 4e 4f 49 44 58 20 66 6c 61 67 20 77 61 73 20  _NOIDX flag was 
230d0 73 70 65 63 69 66 69 65 64 2c 20 74 68 65 6e 20  specified, then 
230e0 74 68 69 73 20 6d 75 73 74 20 62 65 20 61 0a 20  this must be a. 
230f0 20 20 20 2a 2a 20 70 72 65 66 69 78 2d 71 75 65     ** prefix-que
23100 72 79 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 75  ry. Instead of u
23110 73 69 6e 67 20 61 20 70 72 65 66 69 78 2d 69 6e  sing a prefix-in
23120 64 65 78 20 28 69 66 20 6f 6e 65 20 65 78 69 73  dex (if one exis
23130 74 73 29 2c 20 0a 20 20 20 20 2a 2a 20 65 76 61  ts), .    ** eva
23140 6c 75 61 74 65 20 74 68 65 20 70 72 65 66 69 78  luate the prefix
23150 20 71 75 65 72 79 20 75 73 69 6e 67 20 74 68 65   query using the
23160 20 6d 61 69 6e 20 46 54 53 20 69 6e 64 65 78 2e   main FTS index.
23170 20 54 68 69 73 20 69 73 20 75 73 65 64 0a 20 20   This is used.  
23180 20 20 2a 2a 20 66 6f 72 20 69 6e 74 65 72 6e 61    ** for interna
23190 6c 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  l sanity checkin
231a0 67 20 62 79 20 74 68 65 20 69 6e 74 65 67 72 69  g by the integri
231b0 74 79 2d 63 68 65 63 6b 20 69 6e 20 64 65 62 75  ty-check in debu
231c0 67 20 0a 20 20 20 20 2a 2a 20 6d 6f 64 65 20 6f  g .    ** mode o
231d0 6e 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  nly.  */.    if(
231e0 20 70 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69   pConfig->bPrefi
231f0 78 49 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c  xIndex==0 || (fl
23200 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
23210 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
23220 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
23230 74 28 20 66 6c 61 67 73 20 26 20 46 54 53 35 49  t( flags & FTS5I
23240 4e 44 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49  NDEX_QUERY_PREFI
23250 58 20 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20  X );.      iIdx 
23260 3d 20 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72  = 1+pConfig->nPr
23270 65 66 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  efix;.    }else.
23280 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
23290 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
232a0 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b  _QUERY_PREFIX ){
232b0 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72  .      int nChar
232c0 20 3d 20 66 74 73 35 49 6e 64 65 78 43 68 61 72   = fts5IndexChar
232d0 6c 65 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b  len(pToken, nTok
232e0 65 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  en);.      for(i
232f0 49 64 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f  Idx=1; iIdx<=pCo
23300 6e 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69  nfig->nPrefix; i
23310 49 64 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Idx++){.        
23320 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72  if( pConfig->aPr
23330 65 66 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43  efix[iIdx-1]==nC
23340 68 61 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  har ) break;.   
23350 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
23360 69 66 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  if( iIdx<=pConfi
23370 67 2d 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20  g->nPrefix ){.  
23380 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
23390 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
233a0 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
233b0 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  );.      buf.p[0
233c0 5d 20 3d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] = FTS5_MAIN_PR
233d0 45 46 49 58 20 2b 20 69 49 64 78 3b 0a 20 20 20  EFIX + iIdx;.   
233e0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29     if( pStruct )
233f0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75  {.        fts5Mu
23400 6c 74 69 49 74 65 72 4e 65 77 28 70 2c 20 70 53  ltiIterNew(p, pS
23410 74 72 75 63 74 2c 20 31 2c 20 66 6c 61 67 73 2c  truct, 1, flags,
23420 20 62 75 66 2e 70 2c 20 6e 54 6f 6b 65 6e 2b 31   buf.p, nToken+1
23430 2c 20 2d 31 2c 20 30 2c 20 26 70 52 65 74 29 3b  , -1, 0, &pRet);
23440 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 74 72  .        fts5Str
23450 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 53  uctureRelease(pS
23460 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a  truct);.      }.
23470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23480 20 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c   int bDesc = (fl
23490 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
234a0 51 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a  QUERY_DESC)!=0;.
234b0 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
234c0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
234d0 58 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74  X;.      fts5Set
234e0 75 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20  upPrefixIter(p, 
234f0 62 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54  bDesc, buf.p, nT
23500 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c  oken+1, pColset,
23510 20 26 70 52 65 74 29 3b 0a 20 20 20 20 7d 0a 0a   &pRet);.    }..
23520 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b      if( p->rc ){
23530 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
23540 73 35 49 74 65 72 43 6c 6f 73 65 28 70 52 65 74  s5IterClose(pRet
23550 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20  );.      pRet = 
23560 30 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f  0;.      fts5Clo
23570 73 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20  seReader(p);.   
23580 20 7d 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d   }.    *ppIter =
23590 20 70 52 65 74 3b 0a 20 20 20 20 73 71 6c 69 74   pRet;.    sqlit
235a0 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
235b0 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (&buf);.  }.  re
235c0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
235d0 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
235e0 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
235f0 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
23600 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
23610 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20   argument is at 
23620 45 4f 46 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  EOF..*/.int sqli
23630 74 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 46  te3Fts5IterEof(F
23640 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70 49  ts5IndexIter *pI
23650 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ter){.  assert( 
23660 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72  pIter->pIndex->r
23670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
23680 20 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e    return pIter->
23690 62 45 6f 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  bEof;.}../*.** M
236a0 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
236b0 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20  matching rowid. 
236c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
236d0 74 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35  ts5IterNext(Fts5
236e0 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
236f0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  ){.  assert( pIt
23700 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d  er->pIndex->rc==
23710 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66  SQLITE_OK );.  f
23720 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74  ts5MultiIterNext
23730 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
23740 70 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  pIter, 0, 0);.  
23750 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
23760 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49  Return(pIter->pI
23770 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndex);.}../*.** 
23780 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74  Move to the next
23790 20 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72   matching term/r
237a0 6f 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68  owid. Used by th
237b0 65 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75  e fts5vocab modu
237c0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
237d0 65 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63  e3Fts5IterNextSc
237e0 61 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  an(Fts5IndexIter
237f0 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74 73 35   *pIter){.  Fts5
23800 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72  Index *p = pIter
23810 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73  ->pIndex;..  ass
23820 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
23830 65 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ex->rc==SQLITE_O
23840 4b 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74  K );..  fts5Mult
23850 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74  iIterNext(p, pIt
23860 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28  er, 0, 0);.  if(
23870 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23880 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  K ){.    Fts5Seg
23890 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49  Iter *pSeg = &pI
238a0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
238b0 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72  ->aFirst[1].iFir
238c0 73 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  st ];.    if( pS
238d0 65 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65  eg->pLeaf && pSe
238e0 67 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54  g->term.p[0]!=FT
238f0 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29  S5_MAIN_PREFIX )
23900 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
23910 52 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c  Release(pSeg->pL
23920 65 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67  eaf);.      pSeg
23930 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20  ->pLeaf = 0;.   
23940 20 20 20 70 49 74 65 72 2d 3e 62 45 6f 66 20 3d     pIter->bEof =
23950 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   1;.    }.  }.. 
23960 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65   return fts5Inde
23970 78 52 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70  xReturn(pIter->p
23980 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Index);.}../*.**
23990 20 4d 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78   Move to the nex
239a0 74 20 6d 61 74 63 68 69 6e 67 20 72 6f 77 69 64  t matching rowid
239b0 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
239c0 6f 72 20 61 66 74 65 72 20 69 4d 61 74 63 68 2e  or after iMatch.
239d0 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e 69 74 69   The.** definiti
239e0 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20 61 66 74  on of "at or aft
239f0 65 72 22 20 64 65 70 65 6e 64 73 20 6f 6e 20 77  er" depends on w
23a00 68 65 74 68 65 72 20 74 68 69 73 20 69 74 65 72  hether this iter
23a10 61 74 6f 72 20 69 74 65 72 61 74 65 73 0a 2a 2a  ator iterates.**
23a20 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
23a30 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77 69   descending rowi
23a40 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69 6e 74 20  d order..*/.int 
23a50 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 4e  sqlite3Fts5IterN
23a60 65 78 74 46 72 6f 6d 28 46 74 73 35 49 6e 64 65  extFrom(Fts5Inde
23a70 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 36  xIter *pIter, i6
23a80 34 20 69 4d 61 74 63 68 29 7b 0a 20 20 66 74 73  4 iMatch){.  fts
23a90 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72  5MultiIterNextFr
23aa0 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  om(pIter->pIndex
23ab0 2c 20 70 49 74 65 72 2c 20 69 4d 61 74 63 68 29  , pIter, iMatch)
23ac0 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
23ad0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
23ae0 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
23af0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
23b00 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 0a 2a 2f  urrent rowid..*/
23b10 0a 69 36 34 20 73 71 6c 69 74 65 33 46 74 73 35  .i64 sqlite3Fts5
23b20 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 49 6e  IterRowid(Fts5In
23b30 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  dexIter *pIter){
23b40 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 4d 75  .  return fts5Mu
23b50 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
23b60 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
23b70 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
23b80 20 74 65 72 6d 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   term..*/.const 
23b90 63 68 61 72 20 2a 73 71 6c 69 74 65 33 46 74 73  char *sqlite3Fts
23ba0 35 49 74 65 72 54 65 72 6d 28 46 74 73 35 49 6e  5IterTerm(Fts5In
23bb0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20  dexIter *pIter, 
23bc0 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20  int *pn){.  int 
23bd0 6e 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n;.  const char 
23be0 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  *z = (const char
23bf0 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54  *)fts5MultiIterT
23c00 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b 0a  erm(pIter, &n);.
23c10 20 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72    *pn = n-1;.  r
23c20 65 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a  eturn &z[1];.}..
23c30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
23c40 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66  pointer to a buf
23c50 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
23c60 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73   copy of the pos
23c70 69 74 69 6f 6e 20 6c 69 73 74 20 66 6f 72 0a 2a  ition list for.*
23c80 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  * the current en
23c90 74 72 79 2e 20 4f 75 74 70 75 74 20 76 61 72 69  try. Output vari
23ca0 61 62 6c 65 20 2a 70 6e 20 69 73 20 73 65 74 20  able *pn is set 
23cb0 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
23cc0 68 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 69 6e  he buffer .** in
23cd0 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 72 65   bytes before re
23ce0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  turning..**.** T
23cf0 68 65 20 72 65 74 75 72 6e 65 64 20 70 6f 73 69  he returned posi
23d00 74 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e  tion list does n
23d10 6f 74 20 69 6e 63 6c 75 64 65 20 74 68 65 20 22  ot include the "
23d20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 22  number of bytes"
23d30 20 76 61 72 69 6e 74 0a 2a 2a 20 66 69 65 6c 64   varint.** field
23d40 20 74 68 61 74 20 73 74 61 72 74 73 20 74 68 65   that starts the
23d50 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 6f   position list o
23d60 6e 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  n disk..*/.int s
23d70 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
23d80 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
23d90 65 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 0a  exIter *pIter, .
23da0 20 20 63 6f 6e 73 74 20 75 38 20 2a 2a 70 70 2c    const u8 **pp,
23db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23dc0 20 20 2f 2a 20 4f 55 54 3a 20 50 6f 69 6e 74 65    /* OUT: Pointe
23dd0 72 20 74 6f 20 70 6f 73 69 74 69 6f 6e 2d 6c 69  r to position-li
23de0 73 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  st data */.  int
23df0 20 2a 70 6e 2c 20 20 20 20 20 20 20 20 20 20 20   *pn,           
23e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23e10 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73  OUT: Size of pos
23e20 69 74 69 6f 6e 2d 6c 69 73 74 20 69 6e 20 62 79  ition-list in by
23e30 74 65 73 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69  tes */.  i64 *pi
23e40 52 6f 77 69 64 20 20 20 20 20 20 20 20 20 20 20  Rowid           
23e50 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
23e60 20 43 75 72 72 65 6e 74 20 72 6f 77 69 64 20 2a   Current rowid *
23e70 2f 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74  /.){.  Fts5SegIt
23e80 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
23e90 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
23ea0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
23eb0 20 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49   ];.  assert( pI
23ec0 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d  ter->pIndex->rc=
23ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
23ee0 2a 70 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  *piRowid = pSeg-
23ef0 3e 69 52 6f 77 69 64 3b 0a 20 20 2a 70 6e 20 3d  >iRowid;.  *pn =
23f00 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 20 20 69   pSeg->nPos;.  i
23f10 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
23f20 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 20  fset+pSeg->nPos 
23f30 3c 3d 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e  <= pSeg->pLeaf->
23f40 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2a 70  szLeaf ){.    *p
23f50 70 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66  p = &pSeg->pLeaf
23f60 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f  ->p[pSeg->iLeafO
23f70 66 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  ffset];.  }else{
23f80 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a  .    fts5BufferZ
23f90 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
23fa0 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65  ist);.    fts5Se
23fb0 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74  giterPoslist(pIt
23fc0 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67  er->pIndex, pSeg
23fd0 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  , 0, &pIter->pos
23fe0 6c 69 73 74 29 3b 0a 20 20 20 20 2a 70 70 20 3d  list);.    *pp =
23ff0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
24000 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  p;.  }.  return 
24010 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
24020 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a  pIter->pIndex);.
24030 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
24040 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61  nction is simila
24050 72 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35  r to sqlite3Fts5
24060 49 74 65 72 50 6f 73 6c 69 73 74 28 29 2c 20 65  IterPoslist(), e
24070 78 63 65 70 74 20 74 68 61 74 20 69 74 0a 2a 2a  xcept that it.**
24080 20 63 6f 70 69 65 73 20 74 68 65 20 70 6f 73 69   copies the posi
24090 74 69 6f 6e 20 6c 69 73 74 20 69 6e 74 6f 20 74  tion list into t
240a0 68 65 20 62 75 66 66 65 72 20 73 75 70 70 6c 69  he buffer suppli
240b0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
240c0 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a   .** argument..*
240d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
240e0 35 49 74 65 72 50 6f 73 6c 69 73 74 42 75 66 66  5IterPoslistBuff
240f0 65 72 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  er(Fts5IndexIter
24100 20 2a 70 49 74 65 72 2c 20 46 74 73 35 42 75 66   *pIter, Fts5Buf
24110 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 46 74  fer *pBuf){.  Ft
24120 73 35 49 6e 64 65 78 20 2a 70 20 3d 20 70 49 74  s5Index *p = pIt
24130 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61  er->pIndex;..  a
24140 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51  ssert( p->rc==SQ
24150 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
24160 35 42 75 66 66 65 72 5a 65 72 6f 28 70 42 75 66  5BufferZero(pBuf
24170 29 3b 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74  );.  fts5MultiIt
24180 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 70 49 74  erPoslist(p, pIt
24190 65 72 2c 20 30 2c 20 30 2c 20 70 42 75 66 29 3b  er, 0, 0, pBuf);
241a0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
241b0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
241c0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
241d0 69 74 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20  iterator opened 
241e0 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
241f0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73  ll to sqlite3Fts
24200 35 49 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a  5IndexQuery()..*
24210 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74  /.void sqlite3Ft
24220 73 35 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35  s5IterClose(Fts5
24230 49 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72  IndexIter *pIter
24240 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20 29  ){.  if( pIter )
24250 7b 0a 20 20 20 20 46 74 73 35 49 6e 64 65 78 20  {.    Fts5Index 
24260 2a 70 49 6e 64 65 78 20 3d 20 70 49 74 65 72 2d  *pIndex = pIter-
24270 3e 70 49 6e 64 65 78 3b 0a 20 20 20 20 66 74 73  >pIndex;.    fts
24280 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
24290 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
242a0 74 65 72 29 3b 0a 20 20 20 20 66 74 73 35 43 6c  ter);.    fts5Cl
242b0 6f 73 65 52 65 61 64 65 72 28 70 49 6e 64 65 78  oseReader(pIndex
242c0 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
242d0 52 65 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20  Read and decode 
242e0 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
242f0 65 63 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 64  ecord from the d
24300 61 74 61 62 61 73 65 2e 20 0a 2a 2a 0a 2a 2a 20  atabase. .**.** 
24310 50 61 72 61 6d 65 74 65 72 20 61 6e 53 69 7a 65  Parameter anSize
24320 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
24330 6e 20 61 72 72 61 79 20 6f 66 20 73 69 7a 65 20  n array of size 
24340 6e 43 6f 6c 2c 20 77 68 65 72 65 20 6e 43 6f 6c  nCol, where nCol
24350 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65   is.** the numbe
24360 72 20 6f 66 20 75 73 65 72 20 64 65 66 69 6e 65  r of user define
24370 64 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  d columns in the
24380 20 46 54 53 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   FTS table..*/.i
24390 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  nt sqlite3Fts5In
243a0 64 65 78 47 65 74 41 76 65 72 61 67 65 73 28 46  dexGetAverages(F
243b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34  ts5Index *p, i64
243c0 20 2a 70 6e 52 6f 77 2c 20 69 36 34 20 2a 61 6e   *pnRow, i64 *an
243d0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 6e 43 6f  Size){.  int nCo
243e0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
243f0 6e 43 6f 6c 3b 0a 20 20 46 74 73 35 44 61 74 61  nCol;.  Fts5Data
24400 20 2a 70 44 61 74 61 3b 0a 0a 20 20 2a 70 6e 52   *pData;..  *pnR
24410 6f 77 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  ow = 0;.  memset
24420 28 61 6e 53 69 7a 65 2c 20 30 2c 20 73 69 7a 65  (anSize, 0, size
24430 6f 66 28 69 36 34 29 20 2a 20 6e 43 6f 6c 29 3b  of(i64) * nCol);
24440 0a 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 44  .  pData = fts5D
24450 61 74 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f  ataRead(p, FTS5_
24460 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 29 3b  AVERAGES_ROWID);
24470 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
24480 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44 61 74 61  LITE_OK && pData
24490 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20  ->nn ){.    int 
244a0 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  i = 0;.    int i
244b0 43 6f 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 66 74  Col;.    i += ft
244c0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44 61  s5GetVarint(&pDa
244d0 74 61 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29  ta->p[i], (u64*)
244e0 70 6e 52 6f 77 29 3b 0a 20 20 20 20 66 6f 72 28  pnRow);.    for(
244f0 69 43 6f 6c 3d 30 3b 20 69 3c 70 44 61 74 61 2d  iCol=0; i<pData-
24500 3e 6e 6e 20 26 26 20 69 43 6f 6c 3c 6e 43 6f 6c  >nn && iCol<nCol
24510 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
24520 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72   i += fts5GetVar
24530 69 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d  int(&pData->p[i]
24540 2c 20 28 75 36 34 2a 29 26 61 6e 53 69 7a 65 5b  , (u64*)&anSize[
24550 69 43 6f 6c 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  iCol]);.    }.  
24560 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c  }..  fts5DataRel
24570 65 61 73 65 28 70 44 61 74 61 29 3b 0a 20 20 72  ease(pData);.  r
24580 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
24590 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  eturn(p);.}../*.
245a0 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
245b0 75 72 72 65 6e 74 20 22 61 76 65 72 61 67 65 73  urrent "averages
245c0 22 20 72 65 63 6f 72 64 20 77 69 74 68 20 74 68  " record with th
245d0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
245e0 65 20 62 75 66 66 65 72 20 0a 2a 2a 20 73 75 70  e buffer .** sup
245f0 70 6c 69 65 64 20 61 73 20 74 68 65 20 73 65 63  plied as the sec
24600 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
24610 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24620 49 6e 64 65 78 53 65 74 41 76 65 72 61 67 65 73  IndexSetAverages
24630 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 63  (Fts5Index *p, c
24640 6f 6e 73 74 20 75 38 20 2a 70 44 61 74 61 2c 20  onst u8 *pData, 
24650 69 6e 74 20 6e 44 61 74 61 29 7b 0a 20 20 61 73  int nData){.  as
24660 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
24670 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35  ITE_OK );.  fts5
24680 44 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53  DataWrite(p, FTS
24690 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44  5_AVERAGES_ROWID
246a0 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b  , pData, nData);
246b0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
246c0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a  dexReturn(p);.}.
246d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
246e0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
246f0 66 20 62 6c 6f 63 6b 73 20 74 68 69 73 20 6d 6f  f blocks this mo
24700 64 75 6c 65 20 68 61 73 20 72 65 61 64 20 66 72  dule has read fr
24710 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 0a 2a 2a  om the %_data.**
24720 20 74 61 62 6c 65 20 73 69 6e 63 65 20 69 74 20   table since it 
24730 77 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a  was created..*/.
24740 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
24750 6e 64 65 78 52 65 61 64 73 28 46 74 73 35 49 6e  ndexReads(Fts5In
24760 64 65 78 20 2a 70 29 7b 0a 20 20 72 65 74 75 72  dex *p){.  retur
24770 6e 20 70 2d 3e 6e 52 65 61 64 3b 0a 7d 0a 0a 2f  n p->nRead;.}../
24780 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 33 32 2d  *.** Set the 32-
24790 62 69 74 20 63 6f 6f 6b 69 65 20 76 61 6c 75 65  bit cookie value
247a0 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73   stored at the s
247b0 74 61 72 74 20 6f 66 20 61 6c 6c 20 73 74 72 75  tart of all stru
247c0 63 74 75 72 65 20 0a 2a 2a 20 72 65 63 6f 72 64  cture .** record
247d0 73 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 70  s to the value p
247e0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
247f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
24800 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
24810 45 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66  E_OK if successf
24820 75 6c 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  ul, or an SQLite
24830 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
24840 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
24850 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
24860 33 46 74 73 35 49 6e 64 65 78 53 65 74 43 6f 6f  3Fts5IndexSetCoo
24870 6b 69 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  kie(Fts5Index *p
24880 2c 20 69 6e 74 20 69 4e 65 77 29 7b 0a 20 20 69  , int iNew){.  i
24890 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
248a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
248c0 64 65 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6e 66  de */.  Fts5Conf
248d0 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d  ig *pConfig = p-
248e0 3e 70 43 6f 6e 66 69 67 3b 20 20 20 20 2f 2a 20  >pConfig;    /* 
248f0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 62  Configuration ob
24900 6a 65 63 74 20 2a 2f 0a 20 20 75 38 20 61 43 6f  ject */.  u8 aCo
24910 6f 6b 69 65 5b 34 5d 3b 20 20 20 20 20 20 20 20  okie[4];        
24920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24930 2a 20 42 69 6e 61 72 79 20 72 65 70 72 65 73 65  * Binary represe
24940 6e 74 61 74 69 6f 6e 20 6f 66 20 69 4e 65 77 20  ntation of iNew 
24950 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f  */.  sqlite3_blo
24960 62 20 2a 70 42 6c 6f 62 20 3d 20 30 3b 0a 0a 20  b *pBlob = 0;.. 
24970 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
24980 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 73  SQLITE_OK );.  s
24990 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
249a0 61 43 6f 6f 6b 69 65 2c 20 69 4e 65 77 29 3b 0a  aCookie, iNew);.
249b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
249c0 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f 6e 66 69  blob_open(pConfi
249d0 67 2d 3e 64 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  g->db, pConfig->
249e0 7a 44 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c  zDb, p->zDataTbl
249f0 2c 20 0a 20 20 20 20 20 20 22 62 6c 6f 63 6b 22  , .      "block"
24a00 2c 20 46 54 53 35 5f 53 54 52 55 43 54 55 52 45  , FTS5_STRUCTURE
24a10 5f 52 4f 57 49 44 2c 20 31 2c 20 26 70 42 6c 6f  _ROWID, 1, &pBlo
24a20 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  b.  );.  if( rc=
24a30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24a40 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77    sqlite3_blob_w
24a50 72 69 74 65 28 70 42 6c 6f 62 2c 20 61 43 6f 6f  rite(pBlob, aCoo
24a60 6b 69 65 2c 20 34 2c 20 30 29 3b 0a 20 20 20 20  kie, 4, 0);.    
24a70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
24a80 62 5f 63 6c 6f 73 65 28 70 42 6c 6f 62 29 3b 0a  b_close(pBlob);.
24a90 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
24aa0 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
24ab0 46 74 73 35 49 6e 64 65 78 4c 6f 61 64 43 6f 6e  Fts5IndexLoadCon
24ac0 66 69 67 28 46 74 73 35 49 6e 64 65 78 20 2a 70  fig(Fts5Index *p
24ad0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
24ae0 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 70  re *pStruct;.  p
24af0 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
24b00 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
24b10 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24b20 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
24b30 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64    return fts5Ind
24b40 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a  exReturn(p);.}..
24b50 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
24b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
24ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
24be0 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
24bf0 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
24c00 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
24c10 20 6f 66 20 74 68 65 20 69 6e 74 65 67 72 69 74   of the integrit
24c20 79 2d 63 68 65 63 6b 20 0a 2a 2a 20 66 75 6e 63  y-check .** func
24c30 74 69 6f 6e 61 6c 69 74 79 2e 0a 2a 2f 0a 0a 2f  tionality..*/../
24c40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69  *.** Return a si
24c50 6d 70 6c 65 20 63 68 65 63 6b 73 75 6d 20 76 61  mple checksum va
24c60 6c 75 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  lue based on the
24c70 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 73   arguments..*/.s
24c80 74 61 74 69 63 20 75 36 34 20 66 74 73 35 49 6e  tatic u64 fts5In
24c90 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 0a 20  dexEntryCksum(. 
24ca0 20 69 36 34 20 69 52 6f 77 69 64 2c 20 0a 20 20   i64 iRowid, .  
24cb0 69 6e 74 20 69 43 6f 6c 2c 20 0a 20 20 69 6e 74  int iCol, .  int
24cc0 20 69 50 6f 73 2c 20 0a 20 20 69 6e 74 20 69 49   iPos, .  int iI
24cd0 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  dx,.  const char
24ce0 20 2a 70 54 65 72 6d 2c 0a 20 20 69 6e 74 20 6e   *pTerm,.  int n
24cf0 54 65 72 6d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Term.){.  int i;
24d00 0a 20 20 75 36 34 20 72 65 74 20 3d 20 69 52 6f  .  u64 ret = iRo
24d10 77 69 64 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  wid;.  ret += (r
24d20 65 74 3c 3c 33 29 20 2b 20 69 43 6f 6c 3b 0a 20  et<<3) + iCol;. 
24d30 20 72 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29   ret += (ret<<3)
24d40 20 2b 20 69 50 6f 73 3b 0a 20 20 69 66 28 20 69   + iPos;.  if( i
24d50 49 64 78 3e 3d 30 20 29 20 72 65 74 20 2b 3d 20  Idx>=0 ) ret += 
24d60 28 72 65 74 3c 3c 33 29 20 2b 20 28 46 54 53 35  (ret<<3) + (FTS5
24d70 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 2b 20 69  _MAIN_PREFIX + i
24d80 49 64 78 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Idx);.  for(i=0;
24d90 20 69 3c 6e 54 65 72 6d 3b 20 69 2b 2b 29 20 72   i<nTerm; i++) r
24da0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
24db0 20 70 54 65 72 6d 5b 69 5d 3b 0a 20 20 72 65 74   pTerm[i];.  ret
24dc0 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 23 69 66 64  urn ret;.}..#ifd
24dd0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
24de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
24df0 69 6f 6e 20 69 73 20 70 75 72 65 6c 79 20 61 6e  ion is purely an
24e00 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20   internal test. 
24e10 49 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  It does not cont
24e20 72 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54  ribute to .** FT
24e30 53 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c  S functionality,
24e40 20 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74   or even the int
24e50 65 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e  egrity-check, in
24e60 20 61 6e 79 20 77 61 79 2e 0a 2a 2a 0a 2a 2a 20   any way..**.** 
24e70 49 6e 73 74 65 61 64 2c 20 69 74 20 74 65 73 74  Instead, it test
24e80 73 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20  s that the same 
24e90 73 65 74 20 6f 66 20 70 67 6e 6f 2f 72 6f 77 69  set of pgno/rowi
24ea0 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 61  d combinations a
24eb0 72 65 20 0a 2a 2a 20 76 69 73 69 74 65 64 20 72  re .** visited r
24ec0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
24ed0 74 68 65 72 20 74 68 65 20 64 6f 63 6c 69 73 74  ther the doclist
24ee0 2d 69 6e 64 65 78 20 69 64 65 6e 74 69 66 69 65  -index identifie
24ef0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 73 0a  d by parameters.
24f00 2a 2a 20 69 53 65 67 69 64 2f 69 4c 65 61 66 20  ** iSegid/iLeaf 
24f10 69 73 20 69 74 65 72 61 74 65 64 20 69 6e 20 66  is iterated in f
24f20 6f 72 77 61 72 64 73 20 6f 72 20 72 65 76 65 72  orwards or rever
24f30 73 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  se order..*/.sta
24f40 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73  tic void fts5Tes
24f50 74 44 6c 69 64 78 52 65 76 65 72 73 65 28 0a 20  tDlidxReverse(. 
24f60 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
24f70 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20 20 20    int iSegid,   
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f90 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 69 64 20    /* Segment id 
24fa0 74 6f 20 6c 6f 61 64 20 66 72 6f 6d 20 2a 2f 0a  to load from */.
24fb0 20 20 69 6e 74 20 69 4c 65 61 66 20 20 20 20 20    int iLeaf     
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24fd0 20 20 2f 2a 20 4c 6f 61 64 20 64 6f 63 6c 69 73    /* Load doclis
24fe0 74 2d 69 6e 64 65 78 20 66 6f 72 20 74 68 69 73  t-index for this
24ff0 20 6c 65 61 66 20 2a 2f 0a 29 7b 0a 20 20 46 74   leaf */.){.  Ft
25000 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 44 6c  s5DlidxIter *pDl
25010 69 64 78 20 3d 20 30 3b 0a 20 20 75 36 34 20 63  idx = 0;.  u64 c
25020 6b 73 75 6d 31 20 3d 20 31 33 3b 0a 20 20 75 36  ksum1 = 13;.  u6
25030 34 20 63 6b 73 75 6d 32 20 3d 20 31 33 3b 0a 0a  4 cksum2 = 13;..
25040 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74 73    for(pDlidx=fts
25050 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28 70  5DlidxIterInit(p
25060 2c 20 30 2c 20 69 53 65 67 69 64 2c 20 69 4c 65  , 0, iSegid, iLe
25070 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35 44  af);.      fts5D
25080 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
25090 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
250a0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65   fts5DlidxIterNe
250b0 78 74 28 70 2c 20 70 44 6c 69 64 78 29 0a 20 20  xt(p, pDlidx).  
250c0 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69  ){.    i64 iRowi
250d0 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  d = fts5DlidxIte
250e0 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b 0a  rRowid(pDlidx);.
250f0 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20 66      int pgno = f
25100 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
25110 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61 73  (pDlidx);.    as
25120 73 65 72 74 28 20 70 67 6e 6f 3e 69 4c 65 61 66  sert( pgno>iLeaf
25130 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 31 20 2b   );.    cksum1 +
25140 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36 34  = iRowid + ((i64
25150 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d 0a  )pgno<<32);.  }.
25160 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 46    fts5DlidxIterF
25170 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 70  ree(pDlidx);.  p
25180 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 66 6f  Dlidx = 0;..  fo
25190 72 28 70 44 6c 69 64 78 3d 66 74 73 35 44 6c 69  r(pDlidx=fts5Dli
251a0 64 78 49 74 65 72 49 6e 69 74 28 70 2c 20 31 2c  dxIterInit(p, 1,
251b0 20 69 53 65 67 69 64 2c 20 69 4c 65 61 66 29 3b   iSegid, iLeaf);
251c0 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
251d0 49 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64  IterEof(p, pDlid
251e0 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  x)==0;.      fts
251f0 35 44 6c 69 64 78 49 74 65 72 50 72 65 76 28 70  5DlidxIterPrev(p
25200 2c 20 70 44 6c 69 64 78 29 0a 20 20 29 7b 0a 20  , pDlidx).  ){. 
25210 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d 20     i64 iRowid = 
25220 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f 77  fts5DlidxIterRow
25230 69 64 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  id(pDlidx);.    
25240 69 6e 74 20 70 67 6e 6f 20 3d 20 66 74 73 35 44  int pgno = fts5D
25250 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
25260 69 64 78 29 3b 0a 20 20 20 20 61 73 73 65 72 74  idx);.    assert
25270 28 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50  ( fts5DlidxIterP
25280 67 6e 6f 28 70 44 6c 69 64 78 29 3e 69 4c 65 61  gno(pDlidx)>iLea
25290 66 20 29 3b 0a 20 20 20 20 63 6b 73 75 6d 32 20  f );.    cksum2 
252a0 2b 3d 20 69 52 6f 77 69 64 20 2b 20 28 28 69 36  += iRowid + ((i6
252b0 34 29 70 67 6e 6f 3c 3c 33 32 29 3b 0a 20 20 7d  4)pgno<<32);.  }
252c0 0a 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  .  fts5DlidxIter
252d0 46 72 65 65 28 70 44 6c 69 64 78 29 3b 0a 20 20  Free(pDlidx);.  
252e0 70 44 6c 69 64 78 20 3d 20 30 3b 0a 0a 20 20 69  pDlidx = 0;..  i
252f0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
25300 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 31 21 3d 63  _OK && cksum1!=c
25310 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
25320 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a  FTS5_CORRUPT;.}.
25330 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
25340 51 75 65 72 79 43 6b 73 75 6d 28 0a 20 20 46 74  QueryCksum(.  Ft
25350 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
25360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25370 20 46 74 73 35 20 69 6e 64 65 78 20 6f 62 6a 65   Fts5 index obje
25380 63 74 20 2a 2f 0a 20 20 69 6e 74 20 69 49 64 78  ct */.  int iIdx
25390 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
253a0 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
253b0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6b 65 79      /* Index key
253c0 20 74 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f   to query for */
253d0 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20  .  int n,       
253e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 69 6e     /* Size of in
25400 64 65 78 20 6b 65 79 20 69 6e 20 62 79 74 65 73  dex key in bytes
25410 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
25420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25430 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
25440 6f 72 20 46 74 73 35 49 6e 64 65 78 51 75 65 72  or Fts5IndexQuer
25450 79 20 2a 2f 0a 20 20 75 36 34 20 2a 70 43 6b 73  y */.  u64 *pCks
25460 75 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  um              
25470 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
25480 3a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  : Checksum value
25490 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 63 6b 73   */.){.  u64 cks
254a0 75 6d 20 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20  um = *pCksum;.  
254b0 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a 70  Fts5IndexIter *p
254c0 49 64 78 49 74 65 72 20 3d 20 30 3b 0a 20 20 69  IdxIter = 0;.  i
254d0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46  nt rc = sqlite3F
254e0 74 73 35 49 6e 64 65 78 51 75 65 72 79 28 70 2c  ts5IndexQuery(p,
254f0 20 7a 2c 20 6e 2c 20 66 6c 61 67 73 2c 20 30 2c   z, n, flags, 0,
25500 20 26 70 49 64 78 49 74 65 72 29 3b 0a 0a 20 20   &pIdxIter);..  
25510 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
25520 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
25530 65 33 46 74 73 35 49 74 65 72 45 6f 66 28 70 49  e3Fts5IterEof(pI
25540 64 78 49 74 65 72 29 20 29 7b 0a 20 20 20 20 69  dxIter) ){.    i
25550 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20 63 6f  64 dummy;.    co
25560 6e 73 74 20 75 38 20 2a 70 50 6f 73 3b 0a 20 20  nst u8 *pPos;.  
25570 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20    int nPos;.    
25580 69 36 34 20 72 6f 77 69 64 20 3d 20 73 71 6c 69  i64 rowid = sqli
25590 74 65 33 46 74 73 35 49 74 65 72 52 6f 77 69 64  te3Fts5IterRowid
255a0 28 70 49 64 78 49 74 65 72 29 3b 0a 20 20 20 20  (pIdxIter);.    
255b0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
255c0 49 74 65 72 50 6f 73 6c 69 73 74 28 70 49 64 78  IterPoslist(pIdx
255d0 49 74 65 72 2c 20 26 70 50 6f 73 2c 20 26 6e 50  Iter, &pPos, &nP
255e0 6f 73 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  os, &dummy);.   
255f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
25600 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  OK ){.      Fts5
25610 50 6f 73 6c 69 73 74 52 65 61 64 65 72 20 73 52  PoslistReader sR
25620 65 61 64 65 72 3b 0a 20 20 20 20 20 20 66 6f 72  eader;.      for
25630 28 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c  (sqlite3Fts5Posl
25640 69 73 74 52 65 61 64 65 72 49 6e 69 74 28 2d 31  istReaderInit(-1
25650 2c 20 70 50 6f 73 2c 20 6e 50 6f 73 2c 20 26 73  , pPos, nPos, &s
25660 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20 20  Reader);.       
25670 20 20 20 73 52 65 61 64 65 72 2e 62 45 6f 66 3d     sReader.bEof=
25680 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  =0;.          sq
25690 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
256a0 52 65 61 64 65 72 4e 65 78 74 28 26 73 52 65 61  ReaderNext(&sRea
256b0 64 65 72 29 0a 20 20 20 20 20 20 29 7b 0a 20 20  der).      ){.  
256c0 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d        int iCol =
256d0 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c 55 4d 4e   FTS5_POS2COLUMN
256e0 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29 3b 0a  (sReader.iPos);.
256f0 20 20 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66          int iOff
25700 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53   = FTS5_POS2OFFS
25710 45 54 28 73 52 65 61 64 65 72 2e 69 50 6f 73 29  ET(sReader.iPos)
25720 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20  ;.        cksum 
25730 5e 3d 20 66 74 73 35 49 6e 64 65 78 45 6e 74 72  ^= fts5IndexEntr
25740 79 43 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43  yCksum(rowid, iC
25750 6f 6c 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20  ol, iOff, iIdx, 
25760 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
25770 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
25780 33 46 74 73 35 49 74 65 72 4e 65 78 74 28 70 49  3Fts5IterNext(pI
25790 64 78 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20  dxIter);.    }. 
257a0 20 7d 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35   }.  sqlite3Fts5
257b0 49 74 65 72 43 6c 6f 73 65 28 70 49 64 78 49 74  IterClose(pIdxIt
257c0 65 72 29 3b 0a 0a 20 20 2a 70 43 6b 73 75 6d 20  er);..  *pCksum 
257d0 3d 20 63 6b 73 75 6d 3b 0a 20 20 72 65 74 75 72  = cksum;.  retur
257e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
257f0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
25800 20 61 6c 73 6f 20 70 75 72 65 6c 79 20 61 6e 20   also purely an 
25810 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 2e 20 49  internal test. I
25820 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 72  t does not contr
25830 69 62 75 74 65 20 74 6f 20 0a 2a 2a 20 46 54 53  ibute to .** FTS
25840 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2c 20   functionality, 
25850 6f 72 20 65 76 65 6e 20 74 68 65 20 69 6e 74 65  or even the inte
25860 67 72 69 74 79 2d 63 68 65 63 6b 2c 20 69 6e 20  grity-check, in 
25870 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 73 74 61 74  any way..*/.stat
25880 69 63 20 76 6f 69 64 20 66 74 73 35 54 65 73 74  ic void fts5Test
25890 54 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65  Term(.  Fts5Inde
258a0 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 42 75 66  x *p, .  Fts5Buf
258b0 66 65 72 20 2a 70 50 72 65 76 2c 20 20 20 20 20  fer *pPrev,     
258c0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 76           /* Prev
258d0 69 6f 75 73 20 74 65 72 6d 20 2a 2f 0a 20 20 63  ious term */.  c
258e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
258f0 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20 20 2f  t n,           /
25900 2a 20 50 6f 73 73 69 62 6c 79 20 6e 65 77 20 74  * Possibly new t
25910 65 72 6d 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  erm to test */. 
25920 20 75 36 34 20 65 78 70 65 63 74 65 64 2c 0a 20   u64 expected,. 
25930 20 75 36 34 20 2a 70 43 6b 73 75 6d 0a 29 7b 0a   u64 *pCksum.){.
25940 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
25950 3b 0a 20 20 69 66 28 20 70 50 72 65 76 2d 3e 6e  ;.  if( pPrev->n
25960 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  ==0 ){.    fts5B
25970 75 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50  ufferSet(&rc, pP
25980 72 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75  rev, n, (const u
25990 38 2a 29 7a 29 3b 0a 20 20 7d 65 6c 73 65 0a 20  8*)z);.  }else. 
259a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
259b0 4f 4b 20 26 26 20 28 70 50 72 65 76 2d 3e 6e 21  OK && (pPrev->n!
259c0 3d 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28 70 50 72  =n || memcmp(pPr
259d0 65 76 2d 3e 70 2c 20 7a 2c 20 6e 29 29 20 29 7b  ev->p, z, n)) ){
259e0 0a 20 20 20 20 75 36 34 20 63 6b 73 75 6d 33 20  .    u64 cksum3 
259f0 3d 20 2a 70 43 6b 73 75 6d 3b 0a 20 20 20 20 63  = *pCksum;.    c
25a00 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d  onst char *zTerm
25a10 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
25a20 26 70 50 72 65 76 2d 3e 70 5b 31 5d 3b 20 20 2f  &pPrev->p[1];  /
25a30 2a 20 74 65 72 6d 20 73 61 6e 73 20 70 72 65 66  * term sans pref
25a40 69 78 2d 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ix-byte */.    i
25a50 6e 74 20 6e 54 65 72 6d 20 3d 20 70 50 72 65 76  nt nTerm = pPrev
25a60 2d 3e 6e 2d 31 3b 20 20 20 20 20 20 20 20 20 20  ->n-1;          
25a70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 7a 54 65    /* Size of zTe
25a80 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
25a90 20 20 20 69 6e 74 20 69 49 64 78 20 3d 20 28 70     int iIdx = (p
25aa0 50 72 65 76 2d 3e 70 5b 30 5d 20 2d 20 46 54 53  Prev->p[0] - FTS
25ab0 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 29 3b 0a  5_MAIN_PREFIX);.
25ac0 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
25ad0 28 69 49 64 78 3d 3d 30 20 3f 20 30 20 3a 20 46  (iIdx==0 ? 0 : F
25ae0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 50  TS5INDEX_QUERY_P
25af0 52 45 46 49 58 29 3b 0a 20 20 20 20 75 36 34 20  REFIX);.    u64 
25b00 63 6b 31 20 3d 20 30 3b 0a 20 20 20 20 75 36 34  ck1 = 0;.    u64
25b10 20 63 6b 32 20 3d 20 30 3b 0a 0a 20 20 20 20 2f   ck2 = 0;..    /
25b20 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
25b30 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e 65   results returne
25b40 64 20 66 6f 72 20 41 53 43 20 61 6e 64 20 44 45  d for ASC and DE
25b50 53 43 20 71 75 65 72 69 65 73 20 61 72 65 0a 20  SC queries are. 
25b60 20 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 2e 20     ** the same. 
25b70 49 66 20 6e 6f 74 2c 20 63 61 6c 6c 20 74 68 69  If not, call thi
25b80 73 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 2a  s corruption.  *
25b90 2f 0a 20 20 20 20 72 63 20 3d 20 66 74 73 35 51  /.    rc = fts5Q
25ba0 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64  ueryCksum(p, iId
25bb0 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  x, zTerm, nTerm,
25bc0 20 66 6c 61 67 73 2c 20 26 63 6b 31 29 3b 0a 20   flags, &ck1);. 
25bd0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25be0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
25bf0 74 20 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35  t f = flags|FTS5
25c00 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
25c10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 74 73  ;.      rc = fts
25c20 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69  5QueryCksum(p, i
25c30 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72  Idx, zTerm, nTer
25c40 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20  m, f, &ck2);.   
25c50 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
25c60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
25c70 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
25c80 5f 43 4f 52 52 55 50 54 3b 0a 0a 20 20 20 20 2f  _CORRUPT;..    /
25c90 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 70  * If this is a p
25ca0 72 65 66 69 78 20 71 75 65 72 79 2c 20 63 68 65  refix query, che
25cb0 63 6b 20 74 68 61 74 20 74 68 65 20 72 65 73 75  ck that the resu
25cc0 6c 74 73 20 72 65 74 75 72 6e 65 64 20 69 66 20  lts returned if 
25cd0 74 68 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 69  the.    ** the i
25ce0 6e 64 65 78 20 69 73 20 64 69 73 61 62 6c 65 64  ndex is disabled
25cf0 20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 49   are the same. I
25d00 6e 20 62 6f 74 68 20 41 53 43 20 61 6e 64 20 44  n both ASC and D
25d10 45 53 43 20 6f 72 64 65 72 2e 20 0a 20 20 20 20  ESC order. .    
25d20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 63  **.    ** This c
25d30 68 65 63 6b 20 6d 61 79 20 6f 6e 6c 79 20 62 65  heck may only be
25d40 20 70 65 72 66 6f 72 6d 65 64 20 69 66 20 74 68   performed if th
25d50 65 20 68 61 73 68 20 74 61 62 6c 65 20 69 73 20  e hash table is 
25d60 65 6d 70 74 79 2e 20 54 68 69 73 0a 20 20 20 20  empty. This.    
25d70 2a 2a 20 69 73 20 62 65 63 61 75 73 65 20 74 68  ** is because th
25d80 65 20 68 61 73 68 20 74 61 62 6c 65 20 6f 6e 6c  e hash table onl
25d90 79 20 73 75 70 70 6f 72 74 73 20 61 20 73 69 6e  y supports a sin
25da0 67 6c 65 20 73 63 61 6e 20 71 75 65 72 79 20 61  gle scan query a
25db0 74 0a 20 20 20 20 2a 2a 20 61 20 74 69 6d 65 2c  t.    ** a time,
25dc0 20 61 6e 64 20 74 68 65 20 6d 75 6c 74 69 2d 69   and the multi-i
25dd0 74 65 72 20 6c 6f 6f 70 20 66 72 6f 6d 20 77 68  ter loop from wh
25de0 69 63 68 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ich this functio
25df0 6e 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  n is called.    
25e00 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 70 65  ** is already pe
25e10 72 66 6f 72 6d 69 6e 67 20 73 75 63 68 20 61 20  rforming such a 
25e20 73 63 61 6e 2e 20 2a 2f 0a 20 20 20 20 69 66 28  scan. */.    if(
25e30 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
25e40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
25e50 20 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53   iIdx>0 && rc==S
25e60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
25e70 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
25e80 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
25e90 59 5f 54 45 53 54 5f 4e 4f 49 44 58 3b 0a 20 20  Y_TEST_NOIDX;.  
25ea0 20 20 20 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20        ck2 = 0;. 
25eb0 20 20 20 20 20 20 20 72 63 20 3d 20 66 74 73 35         rc = fts5
25ec0 51 75 65 72 79 43 6b 73 75 6d 28 70 2c 20 69 49  QueryCksum(p, iI
25ed0 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d  dx, zTerm, nTerm
25ee0 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20  , f, &ck2);.    
25ef0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
25f00 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b  TE_OK && ck1!=ck
25f10 32 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f  2 ) rc = FTS5_CO
25f20 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  RRUPT;.      }. 
25f30 20 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20       if( iIdx>0 
25f40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
25f50 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
25f60 66 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e  f = flags|FTS5IN
25f70 44 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e  DEX_QUERY_TEST_N
25f80 4f 49 44 58 7c 46 54 53 35 49 4e 44 45 58 5f 51  OIDX|FTS5INDEX_Q
25f90 55 45 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20  UERY_DESC;.     
25fa0 20 20 20 63 6b 32 20 3d 20 30 3b 0a 20 20 20 20     ck2 = 0;.    
25fb0 20 20 20 20 72 63 20 3d 20 66 74 73 35 51 75 65      rc = fts5Que
25fc0 72 79 43 6b 73 75 6d 28 70 2c 20 69 49 64 78 2c  ryCksum(p, iIdx,
25fd0 20 7a 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   zTerm, nTerm, f
25fe0 2c 20 26 63 6b 32 29 3b 0a 20 20 20 20 20 20 20  , &ck2);.       
25ff0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26000 4f 4b 20 26 26 20 63 6b 31 21 3d 63 6b 32 20 29  OK && ck1!=ck2 )
26010 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
26020 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
26030 7d 0a 0a 20 20 20 20 63 6b 73 75 6d 33 20 5e 3d  }..    cksum3 ^=
26040 20 63 6b 31 3b 0a 20 20 20 20 66 74 73 35 42 75   ck1;.    fts5Bu
26050 66 66 65 72 53 65 74 28 26 72 63 2c 20 70 50 72  fferSet(&rc, pPr
26060 65 76 2c 20 6e 2c 20 28 63 6f 6e 73 74 20 75 38  ev, n, (const u8
26070 2a 29 7a 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  *)z);..    if( r
26080 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
26090 63 6b 73 75 6d 33 21 3d 65 78 70 65 63 74 65 64  cksum3!=expected
260a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46   ){.      rc = F
260b0 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
260c0 20 7d 0a 20 20 20 20 2a 70 43 6b 73 75 6d 20 3d   }.    *pCksum =
260d0 20 63 6b 73 75 6d 33 3b 0a 20 20 7d 0a 20 20 70   cksum3;.  }.  p
260e0 2d 3e 72 63 20 3d 20 72 63 3b 0a 7d 0a 20 0a 23  ->rc = rc;.}. .#
260f0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 66 74  else.# define ft
26100 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
26110 73 65 28 78 2c 79 2c 7a 29 0a 23 20 64 65 66 69  se(x,y,z).# defi
26120 6e 65 20 66 74 73 35 54 65 73 74 54 65 72 6d 28  ne fts5TestTerm(
26130 75 2c 76 2c 77 2c 78 2c 79 2c 7a 29 0a 23 65 6e  u,v,w,x,y,z).#en
26140 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  dif../*.** Check
26150 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 31   that:.**.**   1
26160 29 20 41 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20  ) All leaves of 
26170 70 53 65 67 20 62 65 74 77 65 65 6e 20 69 46 69  pSeg between iFi
26180 72 73 74 20 61 6e 64 20 69 4c 61 73 74 20 28 69  rst and iLast (i
26190 6e 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20  nclusive) exist 
261a0 61 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74  and.**      cont
261b0 61 69 6e 20 7a 65 72 6f 20 74 65 72 6d 73 2e 0a  ain zero terms..
261c0 2a 2a 20 20 20 32 29 20 41 6c 6c 20 6c 65 61 76  **   2) All leav
261d0 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
261e0 65 6e 20 69 4e 6f 52 6f 77 69 64 20 61 6e 64 20  en iNoRowid and 
261f0 69 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65  iLast (inclusive
26200 29 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20  ) exist and.**  
26210 20 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f      contain zero
26220 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
26230 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
26240 78 49 6e 74 65 67 72 69 74 79 43 68 65 63 6b 45  xIntegrityCheckE
26250 6d 70 74 79 28 0a 20 20 46 74 73 35 49 6e 64 65  mpty(.  Fts5Inde
26260 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 74 72 75  x *p,.  Fts5Stru
26270 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
26280 65 67 2c 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg,     /* Segme
26290 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
262a0 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
262b0 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69 72 73 74   */.  int iFirst
262c0 2c 0a 20 20 69 6e 74 20 69 4e 6f 52 6f 77 69 64  ,.  int iNoRowid
262d0 2c 0a 20 20 69 6e 74 20 69 4c 61 73 74 0a 29 7b  ,.  int iLast.){
262e0 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
262f0 4e 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74  Now check that t
26300 68 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c  he iter.nEmpty l
26310 65 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eaves following 
26320 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
26330 0a 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20  .  ** (a) exist 
26340 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
26350 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 66  no terms. */.  f
26360 6f 72 28 69 3d 69 46 69 72 73 74 3b 20 70 2d 3e  or(i=iFirst; p->
26370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
26380 20 69 3c 3d 69 4c 61 73 74 3b 20 69 2b 2b 29 7b   i<=iLast; i++){
26390 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
263a0 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
263b0 65 61 64 28 70 2c 20 46 54 53 35 5f 53 45 47 4d  ead(p, FTS5_SEGM
263c0 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
263d0 69 53 65 67 69 64 2c 20 69 29 29 3b 0a 20 20 20  iSegid, i));.   
263e0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
263f0 20 20 20 20 69 66 28 20 21 66 74 73 35 4c 65 61      if( !fts5Lea
26400 66 49 73 54 65 72 6d 6c 65 73 73 28 70 4c 65 61  fIsTermless(pLea
26410 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  f) ) p->rc = FTS
26420 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
26430 20 69 66 28 20 69 3e 3d 69 4e 6f 52 6f 77 69 64   if( i>=iNoRowid
26440 20 26 26 20 30 21 3d 66 74 73 35 4c 65 61 66 46   && 0!=fts5LeafF
26450 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 4c 65  irstRowidOff(pLe
26460 61 66 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  af) ) p->rc = FT
26470 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
26480 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
26490 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
264a0 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
264b0 20 66 74 73 35 49 6e 74 65 67 72 69 74 79 43 68   fts5IntegrityCh
264c0 65 63 6b 50 67 69 64 78 28 46 74 73 35 49 6e 64  eckPgidx(Fts5Ind
264d0 65 78 20 2a 70 2c 20 46 74 73 35 44 61 74 61 20  ex *p, Fts5Data 
264e0 2a 70 4c 65 61 66 29 7b 0a 20 20 69 6e 74 20 69  *pLeaf){.  int i
264f0 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20 69  TermOff = 0;.  i
26500 6e 74 20 69 69 3b 0a 0a 20 20 46 74 73 35 42 75  nt ii;..  Fts5Bu
26510 66 66 65 72 20 62 75 66 31 20 3d 20 7b 30 2c 30  ffer buf1 = {0,0
26520 2c 30 7d 3b 0a 20 20 46 74 73 35 42 75 66 66 65  ,0};.  Fts5Buffe
26530 72 20 62 75 66 32 20 3d 20 7b 30 2c 30 2c 30 7d  r buf2 = {0,0,0}
26540 3b 0a 0a 20 20 69 69 20 3d 20 70 4c 65 61 66 2d  ;..  ii = pLeaf-
26550 3e 73 7a 4c 65 61 66 3b 0a 20 20 77 68 69 6c 65  >szLeaf;.  while
26560 28 20 69 69 3c 70 4c 65 61 66 2d 3e 6e 6e 20 26  ( ii<pLeaf->nn &
26570 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  & p->rc==SQLITE_
26580 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 65  OK ){.    int re
26590 73 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  s;.    int iOff;
265a0 0a 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b 0a  .    int nIncr;.
265b0 0a 20 20 20 20 69 69 20 2b 3d 20 66 74 73 35 47  .    ii += fts5G
265c0 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
265d0 66 2d 3e 70 5b 69 69 5d 2c 20 6e 49 6e 63 72 29  f->p[ii], nIncr)
265e0 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b  ;.    iTermOff +
265f0 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 69 4f 66  = nIncr;.    iOf
26600 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 0a 20  f = iTermOff;.. 
26610 20 20 20 69 66 28 20 69 4f 66 66 3e 3d 70 4c 65     if( iOff>=pLe
26620 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
26630 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
26640 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
26650 6c 73 65 20 69 66 28 20 69 54 65 72 6d 4f 66 66  lse if( iTermOff
26660 3d 3d 6e 49 6e 63 72 20 29 7b 0a 20 20 20 20 20  ==nIncr ){.     
26670 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 20 20   int nByte;.    
26680 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
26690 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
266a0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
266b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 4f  );.      if( (iO
266c0 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
266d0 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
266e0 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
266f0 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
26700 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 74  else{.        ft
26710 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
26720 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
26730 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
26740 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
26750 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
26760 20 6e 4b 65 65 70 2c 20 6e 42 79 74 65 3b 0a 20   nKeep, nByte;. 
26770 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73       iOff += fts
26780 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
26790 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b  eaf->p[iOff], nK
267a0 65 65 70 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  eep);.      iOff
267b0 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
267c0 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
267d0 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  ff], nByte);.   
267e0 20 20 20 69 66 28 20 6e 4b 65 65 70 3e 62 75 66     if( nKeep>buf
267f0 31 2e 6e 20 7c 7c 20 28 69 4f 66 66 2b 6e 42 79  1.n || (iOff+nBy
26800 74 65 29 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  te)>pLeaf->szLea
26810 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
26820 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
26830 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
26840 20 20 20 20 20 20 20 20 62 75 66 31 2e 6e 20 3d          buf1.n =
26850 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20 20 20 20   nKeep;.        
26860 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
26870 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
26880 66 31 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61  f1, nByte, &pLea
26890 66 2d 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20  f->p[iOff]);.   
268a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
268b0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
268c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
268d0 3d 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  = fts5BufferComp
268e0 61 72 65 28 26 62 75 66 31 2c 20 26 62 75 66 32  are(&buf1, &buf2
268f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
26900 65 73 3c 3d 30 20 29 20 70 2d 3e 72 63 20 3d 20  es<=0 ) p->rc = 
26910 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
26920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26930 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70  fts5BufferSet(&p
26940 2d 3e 72 63 2c 20 26 62 75 66 32 2c 20 62 75 66  ->rc, &buf2, buf
26950 31 2e 6e 2c 20 62 75 66 31 2e 70 29 3b 0a 20 20  1.n, buf1.p);.  
26960 7d 0a 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  }..  fts5BufferF
26970 72 65 65 28 26 62 75 66 31 29 3b 0a 20 20 66 74  ree(&buf1);.  ft
26980 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
26990 66 32 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  f2);.}..static v
269a0 6f 69 64 20 66 74 73 35 49 6e 64 65 78 49 6e 74  oid fts5IndexInt
269b0 65 67 72 69 74 79 43 68 65 63 6b 53 65 67 6d 65  egrityCheckSegme
269c0 6e 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  nt(.  Fts5Index 
269d0 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
269e0 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
269f0 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
26a00 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
26a10 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 20 20 20  egment *pSeg    
26a20 20 20 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20    /* Segment to 
26a30 63 68 65 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63  check internal c
26a40 6f 6e 73 69 73 74 65 6e 63 79 20 2a 2f 0a 29 7b  onsistency */.){
26a50 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
26a60 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
26a70 66 69 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  fig;.  sqlite3_s
26a80 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
26a90 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 69 6e 74    int rc2;.  int
26aa0 20 69 49 64 78 50 72 65 76 4c 65 61 66 20 3d 20   iIdxPrevLeaf = 
26ab0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2d  pSeg->pgnoFirst-
26ac0 31 3b 0a 20 20 69 6e 74 20 69 44 6c 69 64 78 50  1;.  int iDlidxP
26ad0 72 65 76 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e  revLeaf = pSeg->
26ae0 70 67 6e 6f 4c 61 73 74 3b 0a 0a 20 20 69 66 28  pgnoLast;..  if(
26af0 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74   pSeg->pgnoFirst
26b00 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  ==0 ) return;.. 
26b10 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
26b20 65 53 74 6d 74 28 70 2c 20 26 70 53 74 6d 74 2c  eStmt(p, &pStmt,
26b30 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
26b40 28 0a 20 20 20 20 20 20 22 53 45 4c 45 43 54 20  (.      "SELECT 
26b50 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 28 70 67  segid, term, (pg
26b60 6e 6f 3e 3e 31 29 2c 20 28 70 67 6e 6f 26 31 29  no>>1), (pgno&1)
26b70 20 46 52 4f 4d 20 25 51 2e 27 25 71 5f 69 64 78   FROM %Q.'%q_idx
26b80 27 20 57 48 45 52 45 20 73 65 67 69 64 3d 25 64  ' WHERE segid=%d
26b90 22 2c 0a 20 20 20 20 20 20 70 43 6f 6e 66 69 67  ",.      pConfig
26ba0 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
26bb0 7a 4e 61 6d 65 2c 20 70 53 65 67 2d 3e 69 53 65  zName, pSeg->iSe
26bc0 67 69 64 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  gid.  ));..  /* 
26bd0 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
26be0 74 68 65 20 62 2d 74 72 65 65 20 68 69 65 72 61  the b-tree hiera
26bf0 72 63 68 79 2e 20 20 2a 2f 0a 20 20 77 68 69 6c  rchy.  */.  whil
26c00 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
26c10 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
26c20 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
26c30 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 69 36  pStmt) ){.    i6
26c40 34 20 69 52 6f 77 3b 20 20 20 20 20 20 20 20 20  4 iRow;         
26c50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
26c60 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20 6c 65  owid for this le
26c70 61 66 20 2a 2f 0a 20 20 20 20 46 74 73 35 44 61  af */.    Fts5Da
26c80 74 61 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20  ta *pLeaf;      
26c90 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
26ca0 66 6f 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f  for this leaf */
26cb0 0a 0a 20 20 20 20 69 6e 74 20 6e 49 64 78 54 65  ..    int nIdxTe
26cc0 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  rm = sqlite3_col
26cd0 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
26ce0 20 31 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   1);.    const c
26cf0 68 61 72 20 2a 7a 49 64 78 54 65 72 6d 20 3d 20  har *zIdxTerm = 
26d00 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
26d10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
26d20 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
26d30 69 6e 74 20 69 49 64 78 4c 65 61 66 20 3d 20 73  int iIdxLeaf = s
26d40 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
26d50 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20  t(pStmt, 2);.   
26d60 20 69 6e 74 20 62 49 64 78 44 6c 69 64 78 20 3d   int bIdxDlidx =
26d70 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
26d80 69 6e 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a  int(pStmt, 3);..
26d90 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 65      /* If the le
26da0 61 66 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 68  af in question h
26db0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
26dc0 74 72 69 6d 6d 65 64 20 66 72 6f 6d 20 74 68 65  trimmed from the
26dd0 20 73 65 67 6d 65 6e 74 2c 20 0a 20 20 20 20 2a   segment, .    *
26de0 2a 20 69 67 6e 6f 72 65 20 74 68 69 73 20 62 2d  * ignore this b-
26df0 74 72 65 65 20 65 6e 74 72 79 2e 20 4f 74 68 65  tree entry. Othe
26e00 72 77 69 73 65 2c 20 6c 6f 61 64 20 69 74 20 69  rwise, load it i
26e10 6e 74 6f 20 6d 65 6d 6f 72 79 2e 20 2a 2f 0a 20  nto memory. */. 
26e20 20 20 20 69 66 28 20 69 49 64 78 4c 65 61 66 3c     if( iIdxLeaf<
26e30 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20  pSeg->pgnoFirst 
26e40 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
26e50 69 52 6f 77 20 3d 20 46 54 53 35 5f 53 45 47 4d  iRow = FTS5_SEGM
26e60 45 4e 54 5f 52 4f 57 49 44 28 70 53 65 67 2d 3e  ENT_ROWID(pSeg->
26e70 69 53 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66  iSegid, iIdxLeaf
26e80 29 3b 0a 20 20 20 20 70 4c 65 61 66 20 3d 20 66  );.    pLeaf = f
26e90 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 69  ts5DataRead(p, i
26ea0 52 6f 77 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  Row);.    if( pL
26eb0 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  eaf==0 ) break;.
26ec0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
26ed0 61 74 20 74 68 65 20 6c 65 61 66 20 63 6f 6e 74  at the leaf cont
26ee0 61 69 6e 73 20 61 74 20 6c 65 61 73 74 20 6f 6e  ains at least on
26ef0 65 20 74 65 72 6d 2c 20 61 6e 64 20 74 68 61 74  e term, and that
26f00 20 69 74 20 69 73 20 65 71 75 61 6c 0a 20 20 20   it is equal.   
26f10 20 2a 2a 20 74 6f 20 6f 72 20 6c 61 72 67 65 72   ** to or larger
26f20 20 74 68 61 6e 20 74 68 65 20 73 70 6c 69 74 2d   than the split-
26f30 6b 65 79 20 69 6e 20 7a 49 64 78 54 65 72 6d 2e  key in zIdxTerm.
26f40 20 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61    Also check tha
26f50 74 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 2a  t if there.    *
26f60 2a 20 69 73 20 61 6c 73 6f 20 61 20 72 6f 77 69  * is also a rowi
26f70 64 20 70 6f 69 6e 74 65 72 20 77 69 74 68 69 6e  d pointer within
26f80 20 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 68   the leaf page h
26f90 65 61 64 65 72 2c 20 69 74 20 70 6f 69 6e 74 73  eader, it points
26fa0 20 74 6f 20 61 0a 20 20 20 20 2a 2a 20 6c 6f 63   to a.    ** loc
26fb0 61 74 69 6f 6e 20 62 65 66 6f 72 65 20 74 68 65  ation before the
26fc0 20 74 65 72 6d 2e 20 20 2a 2f 0a 20 20 20 20 69   term.  */.    i
26fd0 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3c 3d 70 4c  f( pLeaf->nn<=pL
26fe0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
26ff0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53       p->rc = FTS
27000 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d  5_CORRUPT;.    }
27010 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
27020 69 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  iOff;           
27030 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
27040 74 20 6f 66 20 66 69 72 73 74 20 74 65 72 6d 20  t of first term 
27050 6f 6e 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20  on leaf */.     
27060 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 3b 20   int iRowidOff; 
27070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27080 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
27090 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 2a 2f  rowid on leaf */
270a0 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d  .      int nTerm
270b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
270c0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
270d0 72 6d 20 6f 6e 20 6c 65 61 66 20 69 6e 20 62 79  rm on leaf in by
270e0 74 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  tes */.      int
270f0 20 72 65 73 3b 20 20 20 20 20 20 20 20 20 20 20   res;           
27100 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
27110 61 72 69 73 6f 6e 20 6f 66 20 74 65 72 6d 20 61  arison of term a
27120 6e 64 20 73 70 6c 69 74 2d 6b 65 79 20 2a 2f 0a  nd split-key */.
27130 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 66 74  .      iOff = ft
27140 73 35 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f  s5LeafFirstTermO
27150 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
27160 20 69 52 6f 77 69 64 4f 66 66 20 3d 20 66 74 73   iRowidOff = fts
27170 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
27180 66 66 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  ff(pLeaf);.     
27190 20 69 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d   if( iRowidOff>=
271a0 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20  iOff ){.        
271b0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
271c0 52 55 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73  RUPT;.      }els
271d0 65 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20  e{.        iOff 
271e0 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
271f0 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
27200 66 5d 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20  f], nTerm);.    
27210 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
27220 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
27230 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e 28  , zIdxTerm, MIN(
27240 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d 29  nTerm, nIdxTerm)
27250 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
27260 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e 54  es==0 ) res = nT
27270 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b 0a  erm - nIdxTerm;.
27280 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 3c          if( res<
27290 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35  0 ) p->rc = FTS5
272a0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
272b0 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e 74  }..      fts5Int
272c0 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78  egrityCheckPgidx
272d0 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20 20  (p, pLeaf);.    
272e0 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52 65  }.    fts5DataRe
272f0 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20 20  lease(pLeaf);.  
27300 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62 72    if( p->rc ) br
27310 65 61 6b 3b 0a 0a 0a 20 20 20 20 2f 2a 20 4e 6f  eak;...    /* No
27320 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
27330 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61   iter.nEmpty lea
27340 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ves following th
27350 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20  e current leaf. 
27360 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20     ** (a) exist 
27370 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
27380 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20  no terms. */.   
27390 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
273a0 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20  ityCheckEmpty(. 
273b0 20 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20         p, pSeg, 
273c0 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20  iIdxPrevLeaf+1, 
273d0 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31  iDlidxPrevLeaf+1
273e0 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20  , iIdxLeaf-1.   
273f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   );.    if( p->r
27400 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
27410 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
27420 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20   doclist-index, 
27430 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f  check that it lo
27440 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  oks right. */.  
27450 20 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20    if( bIdxDlidx 
27460 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  ){.      Fts5Dli
27470 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
27480 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72   0;  /* For iter
27490 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f  ating through do
274a0 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
274b0 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65       int iPrevLe
274c0 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20  af = iIdxLeaf;. 
274d0 20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20       int iSegid 
274e0 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  = pSeg->iSegid;.
274f0 20 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20        int iPg = 
27500 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65  0;.      i64 iKe
27510 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44  y;..      for(pD
27520 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
27530 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65  erInit(p, 0, iSe
27540 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a  gid, iIdxLeaf);.
27550 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
27560 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
27570 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
27580 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
27590 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
275a0 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20  .      ){..     
275b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20     /* Check any 
275c0 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73  rowid-less pages
275d0 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
275e0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  re the current l
275f0 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
27600 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61  for(iPg=iPrevLea
27610 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69  f+1; iPg<fts5Dli
27620 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
27630 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  x); iPg++){.    
27640 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
27650 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
27660 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20  iSegid, iPg);.  
27670 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
27680 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
27690 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  iKey);.         
276a0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
276b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74            if( ft
276c0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
276d0 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20  Off(pLeaf)!=0 ) 
276e0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
276f0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
27700 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
27710 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
27720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27730 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61          iPrevLea
27740 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  f = fts5DlidxIte
27750 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
27760 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
27770 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70   that the leaf p
27780 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  age indicated by
27790 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
277a0 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20  ally does.      
277b0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65    ** contain the
277c0 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64   rowid suggested
277d0 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   by the same. */
277e0 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
277f0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
27800 49 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76  ID(iSegid, iPrev
27810 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70  Leaf);.        p
27820 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
27830 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
27840 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
27850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
27860 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20   iRowid;.       
27870 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
27880 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
27890 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b  RowidOff(pLeaf);
278a0 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52  .          ASSER
278b0 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61  T_SZLEAF_OK(pLea
278c0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
278d0 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65  ( iRowidOff>=pLe
278e0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
278f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
27900 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
27910 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27920 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
27930 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  5GetVarint(&pLea
27940 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c  f->p[iRowidOff],
27950 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
27960 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
27970 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69   iRowid!=fts5Dli
27980 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
27990 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  dx) ) p->rc = FT
279a0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
279b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
279c0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
279d0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
279e0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
279f0 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61     iDlidxPrevLea
27a00 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66  f = iPg;.      f
27a10 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
27a20 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  (pDlidx);.      
27a30 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
27a40 65 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20  erse(p, iSegid, 
27a50 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d  iIdxLeaf);.    }
27a60 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69  else{.      iDli
27a70 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
27a80 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20  g->pgnoLast;.   
27a90 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
27aa0 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f  k there is no do
27ab0 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
27ac0 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72     }..    iIdxPr
27ad0 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61  evLeaf = iIdxLea
27ae0 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  f;.  }..  rc2 = 
27af0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
27b00 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
27b10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
27b20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a  ) p->rc = rc2;..
27b30 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69    /* Page iter.i
27b40 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65  Leaf must now be
27b50 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c   the rightmost l
27b60 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20  eaf-page in the 
27b70 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30  segment */.#if 0
27b80 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
27b90 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e  LITE_OK && iter.
27ba0 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e  iLeaf!=pSeg->pgn
27bb0 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  oLast ){.    p->
27bc0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
27bd0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  T;.  }.#endif.}.
27be0 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65  ../*.** Run inte
27bf0 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65  rnal checks to e
27c00 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46  nsure that the F
27c10 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20  TS index (a) is 
27c20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63  internally .** c
27c30 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62  onsistent and (b
27c40 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  ) contains entri
27c50 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  es for which the
27c60 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63   XOR of the chec
27c70 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63  ksums.** as calc
27c80 75 6c 61 74 65 64 20 62 79 20 66 74 73 35 49 6e  ulated by fts5In
27c90 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 29 20  dexEntryCksum() 
27ca0 69 73 20 63 6b 73 75 6d 2e 0a 2a 2a 0a 2a 2a 20  is cksum..**.** 
27cb0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
27cc0 52 52 55 50 54 20 69 66 20 61 6e 79 20 6f 66 20  RRUPT if any of 
27cd0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 68 65  the internal che
27ce0 63 6b 73 20 66 61 69 6c 2c 20 6f 72 20 69 66 20  cks fail, or if 
27cf0 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 20  the.** checksum 
27d00 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20  does not match. 
27d10 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
27d20 20 69 66 20 61 6c 6c 20 63 68 65 63 6b 73 20 70   if all checks p
27d30 61 73 73 20 77 69 74 68 6f 75 74 0a 2a 2a 20 65  ass without.** e
27d40 72 72 6f 72 2c 20 6f 72 20 73 6f 6d 65 20 6f 74  rror, or some ot
27d50 68 65 72 20 53 51 4c 69 74 65 20 65 72 72 6f 72  her SQLite error
27d60 20 63 6f 64 65 20 69 66 20 61 6e 6f 74 68 65 72   code if another
27d70 20 65 72 72 6f 72 20 28 65 2e 67 2e 20 4f 4f 4d   error (e.g. OOM
27d80 29 0a 2a 2a 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  ).** occurs..*/.
27d90 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
27da0 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
27db0 63 6b 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  ck(Fts5Index *p,
27dc0 20 75 36 34 20 63 6b 73 75 6d 29 7b 0a 20 20 75   u64 cksum){.  u
27dd0 36 34 20 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20  64 cksum2 = 0;  
27de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27df0 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65 64  * Checksum based
27e00 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   on contents of 
27e10 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74 73  indexes */.  Fts
27e20 35 42 75 66 66 65 72 20 70 6f 73 6c 69 73 74 20  5Buffer poslist 
27e30 3d 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20  = {0,0,0};   /* 
27e40 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20 68  Buffer used to h
27e50 6f 6c 64 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f  old a poslist */
27e60 0a 20 20 46 74 73 35 49 6e 64 65 78 49 74 65 72  .  Fts5IndexIter
27e70 20 2a 70 49 74 65 72 3b 20 20 20 20 20 20 20 20   *pIter;        
27e80 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
27e90 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 65 6e  erate through en
27ea0 74 69 72 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20  tire index */.  
27eb0 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70  Fts5Structure *p
27ec0 53 74 72 75 63 74 3b 20 20 20 20 20 20 20 20 20  Struct;         
27ed0 2f 2a 20 49 6e 64 65 78 20 73 74 72 75 63 74 75  /* Index structu
27ee0 72 65 20 2a 2f 0a 0a 20 20 2f 2a 20 55 73 65 64  re */..  /* Used
27ef0 20 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e   by extra intern
27f00 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75  al tests only ru
27f10 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  n if NDEBUG is n
27f20 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  ot defined */.  
27f30 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20  u64 cksum3 = 0; 
27f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f50 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
27f60 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
27f70 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74   indexes */.  Ft
27f80 73 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20  s5Buffer term = 
27f90 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a  {0,0,0};      /*
27fa0 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
27fb0 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74  hold most recent
27fc0 20 74 65 72 6d 20 2a 2f 0a 20 20 0a 20 20 2f 2a   term */.  .  /*
27fd0 20 4c 6f 61 64 20 74 68 65 20 46 54 53 20 69 6e   Load the FTS in
27fe0 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a 2f  dex structure */
27ff0 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74 73  .  pStruct = fts
28000 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
28010 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
28020 68 61 74 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hat the internal
28030 20 6e 6f 64 65 73 20 6f 66 20 65 61 63 68 20 73   nodes of each s
28040 65 67 6d 65 6e 74 20 6d 61 74 63 68 20 74 68 65  egment match the
28050 20 6c 65 61 76 65 73 20 2a 2f 0a 20 20 69 66 28   leaves */.  if(
28060 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
28070 69 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a  int iLvl, iSeg;.
28080 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
28090 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
280a0 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
280b0 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b       for(iSeg=0;
280c0 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61   iSeg<pStruct->a
280d0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67  Level[iLvl].nSeg
280e0 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iSeg++){.     
280f0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
28100 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
28110 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  &pStruct->aLevel
28120 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
28130 5d 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 49  ];.        fts5I
28140 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
28150 63 6b 53 65 67 6d 65 6e 74 28 70 2c 20 70 53 65  ckSegment(p, pSe
28160 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
28170 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
28180 63 6b 73 75 6d 20 61 72 67 75 6d 65 6e 74 20 70  cksum argument p
28190 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
281a0 6e 63 74 69 6f 6e 20 69 73 20 61 20 63 68 65 63  nction is a chec
281b0 6b 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 0a  ksum calculated.
281c0 20 20 2a 2a 20 62 61 73 65 64 20 6f 6e 20 61 6c    ** based on al
281d0 6c 20 65 78 70 65 63 74 65 64 20 65 6e 74 72 69  l expected entri
281e0 65 73 20 69 6e 20 74 68 65 20 46 54 53 20 69 6e  es in the FTS in
281f0 64 65 78 20 28 69 6e 63 6c 75 64 69 6e 67 20 70  dex (including p
28200 72 65 66 69 78 20 69 6e 64 65 78 0a 20 20 2a 2a  refix index.  **
28210 20 65 6e 74 72 69 65 73 29 2e 20 54 68 69 73 20   entries). This 
28220 62 6c 6f 63 6b 20 63 68 65 63 6b 73 20 74 68 61  block checks tha
28230 74 20 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c  t a checksum cal
28240 63 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e  culated based on
28250 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c   the.  ** actual
28260 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 46 54 53   contents of FTS
28270 20 69 6e 64 65 78 20 69 73 20 69 64 65 6e 74 69   index is identi
28280 63 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  cal..  **.  ** T
28290 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  wo versions of t
282a0 68 65 20 73 61 6d 65 20 63 68 65 63 6b 73 75 6d  he same checksum
282b0 20 61 72 65 20 63 61 6c 63 75 6c 61 74 65 64 2e   are calculated.
282c0 20 54 68 65 20 66 69 72 73 74 20 28 73 74 61 63   The first (stac
282d0 6b 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 20  k.  ** variable 
282e0 63 6b 73 75 6d 32 29 20 62 61 73 65 64 20 6f 6e  cksum2) based on
282f0 20 65 6e 74 72 69 65 73 20 65 78 74 72 61 63 74   entries extract
28300 65 64 20 66 72 6f 6d 20 74 68 65 20 66 75 6c 6c  ed from the full
28310 2d 74 65 78 74 20 69 6e 64 65 78 0a 20 20 2a 2a  -text index.  **
28320 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 61 20 6c   while doing a l
28330 69 6e 65 61 72 20 73 63 61 6e 20 6f 66 20 65 61  inear scan of ea
28340 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 69 6e  ch individual in
28350 64 65 78 20 69 6e 20 74 75 72 6e 2e 20 0a 20 20  dex in turn. .  
28360 2a 2a 0a 20 20 2a 2a 20 41 73 20 65 61 63 68 20  **.  ** As each 
28370 74 65 72 6d 20 76 69 73 69 74 65 64 20 62 79 20  term visited by 
28380 74 68 65 20 6c 69 6e 65 61 72 20 73 63 61 6e 73  the linear scans
28390 2c 20 61 20 73 65 70 61 72 61 74 65 20 71 75 65  , a separate que
283a0 72 79 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20  ry for the.  ** 
283b0 73 61 6d 65 20 74 65 72 6d 20 69 73 20 70 65 72  same term is per
283c0 66 6f 72 6d 65 64 2e 20 63 6b 73 75 6d 33 20 69  formed. cksum3 i
283d0 73 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  s calculated bas
283e0 65 64 20 6f 6e 20 74 68 65 20 65 6e 74 72 69 65  ed on the entrie
283f0 73 0a 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64  s.  ** extracted
28400 20 62 79 20 74 68 65 73 65 20 71 75 65 72 69 65   by these querie
28410 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 66 74  s..  */.  for(ft
28420 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
28430 2c 20 70 53 74 72 75 63 74 2c 20 30 2c 20 30 2c  , pStruct, 0, 0,
28440 20 30 2c 20 30 2c 20 2d 31 2c 20 30 2c 20 26 70   0, 0, -1, 0, &p
28450 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66 74 73  Iter);.      fts
28460 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 70 2c  5MultiIterEof(p,
28470 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20   pIter)==0;.    
28480 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e    fts5MultiIterN
28490 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30 2c  ext(p, pIter, 0,
284a0 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74   0).  ){.    int
284b0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
284c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
284d0 20 6f 66 20 74 65 72 6d 20 69 6e 20 62 79 74 65   of term in byte
284e0 73 20 2a 2f 0a 20 20 20 20 69 36 34 20 69 50 6f  s */.    i64 iPo
284f0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
28500 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
28510 20 72 65 61 64 20 66 72 6f 6d 20 70 6f 73 6c 69   read from posli
28520 73 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f  st */.    int iO
28530 66 66 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ff = 0;         
28540 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
28550 77 69 74 68 69 6e 20 70 6f 73 6c 69 73 74 20 2a  within poslist *
28560 2f 0a 20 20 20 20 69 36 34 20 69 52 6f 77 69 64  /.    i64 iRowid
28570 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
28580 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20 20  Rowid(pIter);.  
28590 20 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 68 61    char *z = (cha
285a0 72 2a 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72  r*)fts5MultiIter
285b0 54 65 72 6d 28 70 49 74 65 72 2c 20 26 6e 29 3b  Term(pIter, &n);
285c0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
285d0 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2c 20   is a new term, 
285e0 71 75 65 72 79 20 66 6f 72 20 69 74 2e 20 55 70  query for it. Up
285f0 64 61 74 65 20 63 6b 73 75 6d 33 20 77 69 74 68  date cksum3 with
28600 20 74 68 65 20 72 65 73 75 6c 74 73 2e 20 2a 2f   the results. */
28610 0a 20 20 20 20 66 74 73 35 54 65 73 74 54 65 72  .    fts5TestTer
28620 6d 28 70 2c 20 26 74 65 72 6d 2c 20 7a 2c 20 6e  m(p, &term, z, n
28630 2c 20 63 6b 73 75 6d 32 2c 20 26 63 6b 73 75 6d  , cksum2, &cksum
28640 33 29 3b 0a 0a 20 20 20 20 70 6f 73 6c 69 73 74  3);..    poslist
28650 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35  .n = 0;.    fts5
28660 4d 75 6c 74 69 49 74 65 72 50 6f 73 6c 69 73 74  MultiIterPoslist
28670 28 70 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 2c  (p, pIter, 0, 0,
28680 20 26 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20   &poslist);.    
28690 77 68 69 6c 65 28 20 30 3d 3d 73 71 6c 69 74 65  while( 0==sqlite
286a0 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74  3Fts5PoslistNext
286b0 36 34 28 70 6f 73 6c 69 73 74 2e 70 2c 20 70 6f  64(poslist.p, po
286c0 73 6c 69 73 74 2e 6e 2c 20 26 69 4f 66 66 2c 20  slist.n, &iOff, 
286d0 26 69 50 6f 73 29 20 29 7b 0a 20 20 20 20 20 20  &iPos) ){.      
286e0 69 6e 74 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f  int iCol = FTS5_
286f0 50 4f 53 32 43 4f 4c 55 4d 4e 28 69 50 6f 73 29  POS2COLUMN(iPos)
28700 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 6f 6b  ;.      int iTok
28710 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f 53 32 4f  Off = FTS5_POS2O
28720 46 46 53 45 54 28 69 50 6f 73 29 3b 0a 20 20 20  FFSET(iPos);.   
28730 20 20 20 63 6b 73 75 6d 32 20 5e 3d 20 66 74 73     cksum2 ^= fts
28740 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d  5IndexEntryCksum
28750 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20 69  (iRowid, iCol, i
28760 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20 7a 2c 20 6e  TokOff, -1, z, n
28770 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66  );.    }.  }.  f
28780 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26  ts5TestTerm(p, &
28790 74 65 72 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75  term, 0, 0, cksu
287a0 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20  m2, &cksum3);.. 
287b0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
287c0 65 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ee(p, pIter);.  
287d0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
287e0 45 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 21 3d 63  E_OK && cksum!=c
287f0 6b 73 75 6d 32 20 29 20 70 2d 3e 72 63 20 3d 20  ksum2 ) p->rc = 
28800 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 0a 20  FTS5_CORRUPT;.. 
28810 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
28820 6c 65 61 73 65 28 70 53 74 72 75 63 74 29 3b 0a  lease(pStruct);.
28830 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65    fts5BufferFree
28840 28 26 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  (&term);.  fts5B
28850 75 66 66 65 72 46 72 65 65 28 26 70 6f 73 6c 69  ufferFree(&posli
28860 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  st);.  return ft
28870 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
28880 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63  ;.}.../*.** Calc
28890 75 6c 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  ulate and return
288a0 20 61 20 63 68 65 63 6b 73 75 6d 20 74 68 61 74   a checksum that
288b0 20 69 73 20 74 68 65 20 58 4f 52 20 6f 66 20 74   is the XOR of t
288c0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
288d0 2a 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 61 6c  * checksum of al
288e0 6c 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 77  l entries that w
288f0 6f 75 6c 64 20 62 65 20 67 65 6e 65 72 61 74 65  ould be generate
28900 64 20 62 79 20 74 68 65 20 74 6f 6b 65 6e 20 73  d by the token s
28910 70 65 63 69 66 69 65 64 0a 2a 2a 20 62 79 20 74  pecified.** by t
28920 68 65 20 66 69 6e 61 6c 20 35 20 61 72 67 75 6d  he final 5 argum
28930 65 6e 74 73 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  ents..*/.u64 sql
28940 69 74 65 33 46 74 73 35 49 6e 64 65 78 43 6b 73  ite3Fts5IndexCks
28950 75 6d 28 0a 20 20 46 74 73 35 43 6f 6e 66 69 67  um(.  Fts5Config
28960 20 2a 70 43 6f 6e 66 69 67 2c 20 20 20 20 20 20   *pConfig,      
28970 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
28980 72 61 74 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f  ration object */
28990 0a 20 20 69 36 34 20 69 52 6f 77 69 64 2c 20 20  .  i64 iRowid,  
289a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289b0 20 20 20 2f 2a 20 44 6f 63 75 6d 65 6e 74 20 74     /* Document t
289c0 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
289d0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
289e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
289f0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 65      /* Column te
28a00 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a 2f  rm appears in */
28a10 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20 20  .  int iPos,    
28a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a30 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20 74     /* Position t
28a40 65 72 6d 20 61 70 70 65 61 72 73 20 69 6e 20 2a  erm appears in *
28a50 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
28a60 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
28a70 20 20 20 20 2f 2a 20 54 65 72 6d 20 61 74 20 69      /* Term at i
28a80 50 6f 73 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  Pos */.){.  u64 
28a90 72 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ret = 0;        
28aa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28ab0 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20  eturn value */. 
28ac0 20 69 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20   int iIdx;      
28ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ae0 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
28af0 67 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65  g through indexe
28b00 73 20 2a 2f 0a 0a 20 20 72 65 74 20 3d 20 66 74  s */..  ret = ft
28b10 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75  s5IndexEntryCksu
28b20 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f 6c 2c 20  m(iRowid, iCol, 
28b30 69 50 6f 73 2c 20 30 2c 20 70 54 65 72 6d 2c 20  iPos, 0, pTerm, 
28b40 6e 54 65 72 6d 29 3b 0a 0a 20 20 66 6f 72 28 69  nTerm);..  for(i
28b50 49 64 78 3d 30 3b 20 69 49 64 78 3c 70 43 6f 6e  Idx=0; iIdx<pCon
28b60 66 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49  fig->nPrefix; iI
28b70 64 78 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e  dx++){.    int n
28b80 42 79 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  Byte = fts5Index
28b90 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
28ba0 28 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70  (pTerm, nTerm, p
28bb0 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69 78 5b  Config->aPrefix[
28bc0 69 49 64 78 5d 29 3b 0a 20 20 20 20 69 66 28 20  iIdx]);.    if( 
28bd0 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72  nByte ){.      r
28be0 65 74 20 5e 3d 20 66 74 73 35 49 6e 64 65 78 45  et ^= fts5IndexE
28bf0 6e 74 72 79 43 6b 73 75 6d 28 69 52 6f 77 69 64  ntryCksum(iRowid
28c00 2c 20 69 43 6f 6c 2c 20 69 50 6f 73 2c 20 69 49  , iCol, iPos, iI
28c10 64 78 2b 31 2c 20 70 54 65 72 6d 2c 20 6e 42 79  dx+1, pTerm, nBy
28c20 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  te);.    }.  }..
28c30 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
28c40 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
28c50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 0a 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 2a 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 0a 2a 2a 20 42 65 6c 6f 77 20  ******.** Below 
28ce0 74 68 69 73 20 70 6f 69 6e 74 20 69 73 20 74 68  this point is th
28cf0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
28d00 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65 63   of the fts5_dec
28d10 6f 64 65 28 29 20 73 63 61 6c 61 72 0a 2a 2a 20  ode() scalar.** 
28d20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 2e 0a 2a  function only..*
28d30 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  /../*.** Decode 
28d40 61 20 73 65 67 6d 65 6e 74 2d 64 61 74 61 20 72  a segment-data r
28d50 6f 77 69 64 20 66 72 6f 6d 20 74 68 65 20 25 5f  owid from the %_
28d60 64 61 74 61 20 74 61 62 6c 65 2e 20 54 68 69 73  data table. This
28d70 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20   function is.** 
28d80 74 68 65 20 6f 70 70 6f 73 69 74 65 20 6f 66 20  the opposite of 
28d90 6d 61 63 72 6f 20 46 54 53 35 5f 53 45 47 4d 45  macro FTS5_SEGME
28da0 4e 54 5f 52 4f 57 49 44 28 29 2e 0a 2a 2f 0a 73  NT_ROWID()..*/.s
28db0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
28dc0 65 63 6f 64 65 52 6f 77 69 64 28 0a 20 20 69 36  ecodeRowid(.  i6
28dd0 34 20 69 52 6f 77 69 64 2c 20 20 20 20 20 20 20  4 iRowid,       
28de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28df0 20 52 6f 77 69 64 20 66 72 6f 6d 20 25 5f 64 61   Rowid from %_da
28e00 74 61 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  ta table */.  in
28e10 74 20 2a 70 69 53 65 67 69 64 2c 20 20 20 20 20  t *piSegid,     
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28e30 20 4f 55 54 3a 20 53 65 67 6d 65 6e 74 20 69 64   OUT: Segment id
28e40 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 44 6c 69   */.  int *pbDli
28e50 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
28e60 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 44 6c        /* OUT: Dl
28e70 69 64 78 20 66 6c 61 67 20 2a 2f 0a 20 20 69 6e  idx flag */.  in
28e80 74 20 2a 70 69 48 65 69 67 68 74 2c 20 20 20 20  t *piHeight,    
28e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28ea0 20 4f 55 54 3a 20 48 65 69 67 68 74 20 2a 2f 0a   OUT: Height */.
28eb0 20 20 69 6e 74 20 2a 70 69 50 67 6e 6f 20 20 20    int *piPgno   
28ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28ed0 20 20 2f 2a 20 4f 55 54 3a 20 50 61 67 65 20 6e    /* OUT: Page n
28ee0 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 2a 70  umber */.){.  *p
28ef0 69 50 67 6e 6f 20 3d 20 28 69 6e 74 29 28 69 52  iPgno = (int)(iR
28f00 6f 77 69 64 20 26 20 28 28 28 69 36 34 29 31 20  owid & (((i64)1 
28f10 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47  << FTS5_DATA_PAG
28f20 45 5f 42 29 20 2d 20 31 29 29 3b 0a 20 20 69 52  E_B) - 1));.  iR
28f30 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41  owid >>= FTS5_DA
28f40 54 41 5f 50 41 47 45 5f 42 3b 0a 0a 20 20 2a 70  TA_PAGE_B;..  *p
28f50 69 48 65 69 67 68 74 20 3d 20 28 69 6e 74 29 28  iHeight = (int)(
28f60 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34 29  iRowid & (((i64)
28f70 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f 48  1 << FTS5_DATA_H
28f80 45 49 47 48 54 5f 42 29 20 2d 20 31 29 29 3b 0a  EIGHT_B) - 1));.
28f90 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
28fa0 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 3b  5_DATA_HEIGHT_B;
28fb0 0a 0a 20 20 2a 70 62 44 6c 69 64 78 20 3d 20 28  ..  *pbDlidx = (
28fc0 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 30 78  int)(iRowid & 0x
28fd0 30 30 30 31 29 3b 0a 20 20 69 52 6f 77 69 64 20  0001);.  iRowid 
28fe0 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 44 4c  >>= FTS5_DATA_DL
28ff0 49 5f 42 3b 0a 0a 20 20 2a 70 69 53 65 67 69 64  I_B;..  *piSegid
29000 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
29010 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
29020 53 35 5f 44 41 54 41 5f 49 44 5f 42 29 20 2d 20  S5_DATA_ID_B) - 
29030 31 29 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  1));.}..static v
29040 6f 69 64 20 66 74 73 35 44 65 62 75 67 52 6f 77  oid fts5DebugRow
29050 69 64 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  id(int *pRc, Fts
29060 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 69  5Buffer *pBuf, i
29070 36 34 20 69 4b 65 79 29 7b 0a 20 20 69 6e 74 20  64 iKey){.  int 
29080 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
29090 20 69 50 67 6e 6f 2c 20 62 44 6c 69 64 78 3b 20   iPgno, bDlidx; 
290a0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 63        /* Rowid c
290b0 6f 6d 70 65 6e 65 6e 74 73 20 2a 2f 0a 20 20 66  ompenents */.  f
290c0 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 28 69  ts5DecodeRowid(i
290d0 4b 65 79 2c 20 26 69 53 65 67 69 64 2c 20 26 62  Key, &iSegid, &b
290e0 44 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c  Dlidx, &iHeight,
290f0 20 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 69 66 28   &iPgno);..  if(
29100 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20 20   iSegid==0 ){.  
29110 20 20 69 66 28 20 69 4b 65 79 3d 3d 46 54 53 35    if( iKey==FTS5
29120 5f 41 56 45 52 41 47 45 53 5f 52 4f 57 49 44 20  _AVERAGES_ROWID 
29130 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
29140 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
29150 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
29160 2c 20 22 7b 61 76 65 72 61 67 65 73 7d 20 22 29  , "{averages} ")
29170 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29180 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29190 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
291a0 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 73 74  (pRc, pBuf, "{st
291b0 72 75 63 74 75 72 65 7d 22 29 3b 0a 20 20 20 20  ructure}");.    
291c0 7d 0a 20 20 7d 0a 20 20 65 6c 73 65 7b 0a 20 20  }.  }.  else{.  
291d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
291e0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
291f0 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 25 73 73  pRc, pBuf, "{%ss
29200 65 67 69 64 3d 25 64 20 68 3d 25 64 20 70 67 6e  egid=%d h=%d pgn
29210 6f 3d 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20  o=%d}",.        
29220 62 44 6c 69 64 78 20 3f 20 22 64 6c 69 64 78 20  bDlidx ? "dlidx 
29230 22 20 3a 20 22 22 2c 20 69 53 65 67 69 64 2c 20  " : "", iSegid, 
29240 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 0a 20  iHeight, iPgno. 
29250 20 20 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61     );.  }.}..sta
29260 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 65 62  tic void fts5Deb
29270 75 67 53 74 72 75 63 74 75 72 65 28 0a 20 20 69  ugStructure(.  i
29280 6e 74 20 2a 70 52 63 2c 20 20 20 20 20 20 20 20  nt *pRc,        
29290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
292a0 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20  * IN/OUT: error 
292b0 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 42 75  code */.  Fts5Bu
292c0 66 66 65 72 20 2a 70 42 75 66 2c 0a 20 20 46 74  ffer *pBuf,.  Ft
292d0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 0a 29  s5Structure *p.)
292e0 7b 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53  {.  int iLvl, iS
292f0 65 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  eg;             
29300 20 20 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74      /* Iterate t
29310 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 2c 20 73  hrough levels, s
29320 65 67 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 66 6f  egments */..  fo
29330 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
29340 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
29350 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
29360 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
29370 3d 20 26 70 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  = &p->aLevel[iLv
29380 6c 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l];.    sqlite3F
29390 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
293a0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
293b0 20 0a 20 20 20 20 20 20 20 20 22 20 7b 6c 76 6c   .        " {lvl
293c0 3d 25 64 20 6e 4d 65 72 67 65 3d 25 64 20 6e 53  =%d nMerge=%d nS
293d0 65 67 3d 25 64 22 2c 20 69 4c 76 6c 2c 20 70 4c  eg=%d", iLvl, pL
293e0 76 6c 2d 3e 6e 4d 65 72 67 65 2c 20 70 4c 76 6c  vl->nMerge, pLvl
293f0 2d 3e 6e 53 65 67 0a 20 20 20 20 29 3b 0a 20 20  ->nSeg.    );.  
29400 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53    for(iSeg=0; iS
29410 65 67 3c 70 4c 76 6c 2d 3e 6e 53 65 67 3b 20 69  eg<pLvl->nSeg; i
29420 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  Seg++){.      Ft
29430 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
29440 6e 74 20 2a 70 53 65 67 20 3d 20 26 70 4c 76 6c  nt *pSeg = &pLvl
29450 2d 3e 61 53 65 67 5b 69 53 65 67 5d 3b 0a 20 20  ->aSeg[iSeg];.  
29460 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
29470 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
29480 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 7b  f(pRc, pBuf, " {
29490 69 64 3d 25 64 20 6c 65 61 76 65 73 3d 25 64 2e  id=%d leaves=%d.
294a0 2e 25 64 7d 22 2c 20 0a 20 20 20 20 20 20 20 20  .%d}", .        
294b0 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20    pSeg->iSegid, 
294c0 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 2c  pSeg->pgnoFirst,
294d0 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 0a   pSeg->pgnoLast.
294e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
294f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
29500 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
29510 28 70 52 63 2c 20 70 42 75 66 2c 20 22 7d 22 29  (pRc, pBuf, "}")
29520 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
29530 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 74  his is part of t
29540 68 65 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  he fts5_decode()
29550 20 64 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a   debugging aid..
29560 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20  **.** Arguments 
29570 70 42 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74  pBlob/nBlob cont
29580 61 69 6e 20 61 20 73 65 72 69 61 6c 69 7a 65 64  ain a serialized
29590 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 6f   Fts5Structure o
295a0 62 6a 65 63 74 2e 20 54 68 69 73 0a 2a 2a 20 66  bject. This.** f
295b0 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20  unction appends 
295c0 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
295d0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
295e0 6f 66 20 74 68 65 20 73 61 6d 65 20 6f 62 6a 65  of the same obje
295f0 63 74 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 66  ct.** to the buf
29600 66 65 72 20 70 61 73 73 65 64 20 61 73 20 74 68  fer passed as th
29610 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
29620 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  t. .*/.static vo
29630 69 64 20 66 74 73 35 44 65 63 6f 64 65 53 74 72  id fts5DecodeStr
29640 75 63 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70  ucture(.  int *p
29650 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Rc,             
29660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f            /* IN/
29670 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20  OUT: error code 
29680 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
29690 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20 75  *pBuf,.  const u
296a0 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  8 *pBlob, int nB
296b0 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lob.){.  int rc;
296c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
296d0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
296e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
296f0 35 53 74 72 75 63 74 75 72 65 20 2a 70 20 3d 20  5Structure *p = 
29700 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
29710 44 65 63 6f 64 65 64 20 73 74 72 75 63 74 75 72  Decoded structur
29720 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 72  e object */..  r
29730 63 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72  c = fts5Structur
29740 65 44 65 63 6f 64 65 28 70 42 6c 6f 62 2c 20 6e  eDecode(pBlob, n
29750 42 6c 6f 62 2c 20 30 2c 20 26 70 29 3b 0a 20 20  Blob, 0, &p);.  
29760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29770 4b 20 29 7b 0a 20 20 20 20 2a 70 52 63 20 3d 20  K ){.    *pRc = 
29780 72 63 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  rc;.    return;.
29790 20 20 7d 0a 0a 20 20 66 74 73 35 44 65 62 75 67    }..  fts5Debug
297a0 53 74 72 75 63 74 75 72 65 28 70 52 63 2c 20 70  Structure(pRc, p
297b0 42 75 66 2c 20 70 29 3b 0a 20 20 66 74 73 35 53  Buf, p);.  fts5S
297c0 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
297d0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  p);.}../*.** Thi
297e0 73 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  s is part of the
297f0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
29800 65 62 75 67 67 69 6e 67 20 61 69 64 2e 0a 2a 2a  ebugging aid..**
29810 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 73 20 70 42  .** Arguments pB
29820 6c 6f 62 2f 6e 42 6c 6f 62 20 63 6f 6e 74 61 69  lob/nBlob contai
29830 6e 20 61 6e 20 22 61 76 65 72 61 67 65 73 22 20  n an "averages" 
29840 72 65 63 6f 72 64 2e 20 54 68 69 73 20 66 75 6e  record. This fun
29850 63 74 69 6f 6e 20 0a 2a 2a 20 61 70 70 65 6e 64  ction .** append
29860 73 20 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  s a human-readab
29870 6c 65 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  le representatio
29880 6e 20 6f 66 20 72 65 63 6f 72 64 20 74 6f 20 74  n of record to t
29890 68 65 20 62 75 66 66 65 72 20 70 61 73 73 65 64  he buffer passed
298a0 20 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63 6f   .** as the seco
298b0 6e 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f  nd argument. .*/
298c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
298d0 35 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28  5DecodeAverages(
298e0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
298f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29900 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
29910 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
29920 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
29930 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
29940 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
29950 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63    int i = 0;.  c
29960 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 63  onst char *zSpac
29970 65 20 3d 20 22 22 3b 0a 0a 20 20 77 68 69 6c 65  e = "";..  while
29980 28 20 69 3c 6e 42 6c 6f 62 20 29 7b 0a 20 20 20  ( i<nBlob ){.   
29990 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   u64 iVal;.    i
299a0 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
299b0 65 74 56 61 72 69 6e 74 28 26 70 42 6c 6f 62 5b  etVarint(&pBlob[
299c0 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
299d0 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
299e0 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
299f0 63 2c 20 70 42 75 66 2c 20 22 25 73 25 64 22 2c  c, pBuf, "%s%d",
29a00 20 7a 53 70 61 63 65 2c 20 28 69 6e 74 29 69 56   zSpace, (int)iV
29a10 61 6c 29 3b 0a 20 20 20 20 7a 53 70 61 63 65 20  al);.    zSpace 
29a20 3d 20 22 20 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = " ";.  }.}../*
29a30 0a 2a 2a 20 42 75 66 66 65 72 20 28 61 2f 6e 29  .** Buffer (a/n)
29a40 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63   is assumed to c
29a50 6f 6e 74 61 69 6e 20 61 20 6c 69 73 74 20 6f 66  ontain a list of
29a60 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 72 69   serialized vari
29a70 6e 74 73 2e 20 52 65 61 64 0a 2a 2a 20 65 61 63  nts. Read.** eac
29a80 68 20 76 61 72 69 6e 74 20 61 6e 64 20 61 70 70  h varint and app
29a90 65 6e 64 20 69 74 73 20 73 74 72 69 6e 67 20 72  end its string r
29aa0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 74 6f  epresentation to
29ab0 20 62 75 66 66 65 72 20 70 42 75 66 2e 20 52 65   buffer pBuf. Re
29ac0 74 75 72 6e 0a 2a 2a 20 61 66 74 65 72 20 65 69  turn.** after ei
29ad0 74 68 65 72 20 74 68 65 20 69 6e 70 75 74 20 62  ther the input b
29ae0 75 66 66 65 72 20 69 73 20 65 78 68 61 75 73 74  uffer is exhaust
29af0 65 64 20 6f 72 20 61 20 30 20 76 61 6c 75 65 20  ed or a 0 value 
29b00 69 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54  is read..**.** T
29b10 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
29b20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
29b30 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d   bytes read from
29b40 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66 65   the input buffe
29b50 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
29b60 20 66 74 73 35 44 65 63 6f 64 65 50 6f 73 6c 69   fts5DecodePosli
29b70 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74 73  st(int *pRc, Fts
29b80 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 63  5Buffer *pBuf, c
29b90 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74 20  onst u8 *a, int 
29ba0 6e 29 7b 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d  n){.  int iOff =
29bb0 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 4f 66   0;.  while( iOf
29bc0 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  f<n ){.    int i
29bd0 56 61 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Val;.    iOff +=
29be0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
29bf0 28 26 61 5b 69 4f 66 66 5d 2c 20 69 56 61 6c 29  (&a[iOff], iVal)
29c00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
29c10 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
29c20 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22  ntf(pRc, pBuf, "
29c30 20 25 64 22 2c 20 69 56 61 6c 29 3b 0a 20 20 7d   %d", iVal);.  }
29c40 0a 20 20 72 65 74 75 72 6e 20 69 4f 66 66 3b 0a  .  return iOff;.
29c50 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 74 61  }../*.** The sta
29c60 72 74 20 6f 66 20 62 75 66 66 65 72 20 28 61 2f  rt of buffer (a/
29c70 6e 29 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  n) contains the 
29c80 73 74 61 72 74 20 6f 66 20 61 20 64 6f 63 6c 69  start of a docli
29c90 73 74 2e 20 54 68 65 20 64 6f 63 6c 69 73 74 0a  st. The doclist.
29ca0 2a 2a 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  ** may or may no
29cb0 74 20 66 69 6e 69 73 68 20 77 69 74 68 69 6e 20  t finish within 
29cc0 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 69 73  the buffer. This
29cd0 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65 6e 64   function append
29ce0 73 20 61 20 74 65 78 74 0a 2a 2a 20 72 65 70 72  s a text.** repr
29cf0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
29d00 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 6f  e part of the do
29d10 63 6c 69 73 74 20 74 68 61 74 20 69 73 20 70 72  clist that is pr
29d20 65 73 65 6e 74 20 74 6f 20 62 75 66 66 65 72 0a  esent to buffer.
29d30 2a 2a 20 70 42 75 66 2e 20 0a 2a 2a 0a 2a 2a 20  ** pBuf. .**.** 
29d40 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
29d50 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
29d60 66 20 62 79 74 65 73 20 72 65 61 64 20 66 72 6f  f bytes read fro
29d70 6d 20 74 68 65 20 69 6e 70 75 74 20 62 75 66 66  m the input buff
29d80 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
29d90 74 20 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c  t fts5DecodeDocl
29da0 69 73 74 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  ist(int *pRc, Ft
29db0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20  s5Buffer *pBuf, 
29dc0 63 6f 6e 73 74 20 75 38 20 2a 61 2c 20 69 6e 74  const u8 *a, int
29dd0 20 6e 29 7b 0a 20 20 69 36 34 20 69 44 6f 63 69   n){.  i64 iDoci
29de0 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 4f 66  d = 0;.  int iOf
29df0 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e  f = 0;..  if( n>
29e00 30 20 29 7b 0a 20 20 20 20 69 4f 66 66 20 3d 20  0 ){.    iOff = 
29e10 73 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61  sqlite3Fts5GetVa
29e20 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29 26 69  rint(a, (u64*)&i
29e30 44 6f 63 69 64 29 3b 0a 20 20 20 20 73 71 6c 69  Docid);.    sqli
29e40 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
29e50 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
29e60 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c 64 22 2c  Buf, " id=%lld",
29e70 20 69 44 6f 63 69 64 29 3b 0a 20 20 7d 0a 20 20   iDocid);.  }.  
29e80 77 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b  while( iOff<n ){
29e90 0a 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a 20  .    int nPos;. 
29ea0 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b 0a 20     int bDummy;. 
29eb0 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
29ec0 65 74 50 6f 73 6c 69 73 74 53 69 7a 65 28 26 61  etPoslistSize(&a
29ed0 5b 69 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26  [iOff], &nPos, &
29ee0 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 69 4f 66  bDummy);.    iOf
29ef0 66 20 2b 3d 20 66 74 73 35 44 65 63 6f 64 65 50  f += fts5DecodeP
29f00 6f 73 6c 69 73 74 28 70 52 63 2c 20 70 42 75 66  oslist(pRc, pBuf
29f10 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d 49 4e 28  , &a[iOff], MIN(
29f20 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29 29 3b 0a  n-iOff, nPos));.
29f30 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 20 29      if( iOff<n )
29f40 7b 0a 20 20 20 20 20 20 69 36 34 20 69 44 65 6c  {.      i64 iDel
29f50 74 61 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  ta;.      iOff +
29f60 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47 65 74  = sqlite3Fts5Get
29f70 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
29f80 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
29f90 0a 20 20 20 20 20 20 69 44 6f 63 69 64 20 2b 3d  .      iDocid +=
29fa0 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 73   iDelta;.      s
29fb0 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
29fc0 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
29fd0 2c 20 70 42 75 66 2c 20 22 20 69 64 3d 25 6c 6c  , pBuf, " id=%ll
29fe0 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a 20 20 20  d", iDocid);.   
29ff0 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
2a000 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   iOff;.}../*.** 
2a010 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
2a020 6f 6e 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e  on of user-defin
2a030 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  ed scalar functi
2a040 6f 6e 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29  on fts5_decode()
2a050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2a060 20 66 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74   fts5DecodeFunct
2a070 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
2a080 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20  ontext *pCtx,   
2a090 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2a0a0 6f 6e 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20  on call context 
2a0b0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2a0e0 66 20 61 72 67 73 20 28 61 6c 77 61 79 73 20 32  f args (always 2
2a0f0 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  ) */.  sqlite3_v
2a100 61 6c 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20  alue **apVal    
2a110 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
2a120 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  on arguments */.
2a130 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
2a140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a150 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f       /* Rowid fo
2a160 72 20 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64  r record being d
2a170 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ecoded */.  int 
2a180 69 53 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69  iSegid,iHeight,i
2a190 50 67 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52  Pgno,bDlidx;/* R
2a1a0 6f 77 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20  owid components 
2a1b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  */.  const u8 *a
2a1c0 42 6c 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20  Blob; int n;    
2a1d0 20 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74       /* Record t
2a1e0 6f 20 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38  o decode */.  u8
2a1f0 20 2a 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42   *a = 0;.  Fts5B
2a200 75 66 66 65 72 20 73 3b 20 20 20 20 20 20 20 20  uffer s;        
2a210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
2a220 69 6c 64 20 75 70 20 74 65 78 74 20 74 6f 20 72  ild up text to r
2a230 65 74 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20  eturn here */.  
2a240 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a250 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2a260 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2a270 2f 0a 20 20 69 6e 74 20 6e 53 70 61 63 65 20 3d  /.  int nSpace =
2a280 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e   0;..  assert( n
2a290 41 72 67 3d 3d 32 20 29 3b 0a 20 20 6d 65 6d 73  Arg==2 );.  mems
2a2a0 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
2a2b0 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
2a2c0 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
2a2d0 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
2a2e0 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d  Val[0]);..  /* M
2a2f0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
2a300 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a310 74 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42  t (a blob) in aB
2a320 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62  lob[]. The aBlob
2a330 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20  [].  ** copy is 
2a340 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35  followed by FTS5
2a350 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
2a360 4e 47 20 30 78 30 30 20 62 79 74 65 73 2c 20 77  NG 0x00 bytes, w
2a370 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20  hich prevents.  
2a380 2a 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ** buffer overre
2a390 61 64 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  ads even if the 
2a3a0 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
2a3b0 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c  t.  */.  n = sql
2a3c0 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
2a3d0 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42  (apVal[1]);.  aB
2a3e0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
2a3f0 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31  lue_blob(apVal[1
2a400 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e  ]);.  nSpace = n
2a410 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
2a420 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d  O_PADDING;.  a =
2a430 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73   (u8*)sqlite3Fts
2a440 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
2a450 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
2a460 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f  a==0 ) goto deco
2a470 64 65 5f 6f 75 74 3b 0a 20 20 6d 65 6d 63 70 79  de_out;.  memcpy
2a480 28 61 2c 20 61 42 6c 6f 62 2c 20 6e 29 3b 0a 0a  (a, aBlob, n);..
2a490 0a 20 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  .  fts5DecodeRow
2a4a0 69 64 28 69 52 6f 77 69 64 2c 20 26 69 53 65 67  id(iRowid, &iSeg
2a4b0 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26 69 48  id, &bDlidx, &iH
2a4c0 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29 3b 0a  eight, &iPgno);.
2a4d0 0a 20 20 66 74 73 35 44 65 62 75 67 52 6f 77 69  .  fts5DebugRowi
2a4e0 64 28 26 72 63 2c 20 26 73 2c 20 69 52 6f 77 69  d(&rc, &s, iRowi
2a4f0 64 29 3b 0a 20 20 69 66 28 20 62 44 6c 69 64 78  d);.  if( bDlidx
2a500 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74 61   ){.    Fts5Data
2a510 20 64 6c 69 64 78 3b 0a 20 20 20 20 46 74 73 35   dlidx;.    Fts5
2a520 44 6c 69 64 78 4c 76 6c 20 6c 76 6c 3b 0a 0a 20  DlidxLvl lvl;.. 
2a530 20 20 20 64 6c 69 64 78 2e 70 20 3d 20 61 3b 0a     dlidx.p = a;.
2a540 20 20 20 20 64 6c 69 64 78 2e 6e 6e 20 3d 20 6e      dlidx.nn = n
2a550 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 6c  ;..    memset(&l
2a560 76 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  vl, 0, sizeof(Ft
2a570 73 35 44 6c 69 64 78 4c 76 6c 29 29 3b 0a 20 20  s5DlidxLvl));.  
2a580 20 20 6c 76 6c 2e 70 44 61 74 61 20 3d 20 26 64    lvl.pData = &d
2a590 6c 69 64 78 3b 0a 20 20 20 20 6c 76 6c 2e 69 4c  lidx;.    lvl.iL
2a5a0 65 61 66 50 67 6e 6f 20 3d 20 69 50 67 6e 6f 3b  eafPgno = iPgno;
2a5b0 0a 0a 20 20 20 20 66 6f 72 28 66 74 73 35 44 6c  ..    for(fts5Dl
2a5c0 69 64 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29  idxLvlNext(&lvl)
2a5d0 3b 20 6c 76 6c 2e 62 45 6f 66 3d 3d 30 3b 20 66  ; lvl.bEof==0; f
2a5e0 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
2a5f0 26 6c 76 6c 29 29 7b 0a 20 20 20 20 20 20 73 71  &lvl)){.      sq
2a600 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2a610 70 70 65 6e 64 50 72 69 6e 74 66 28 26 72 63 2c  ppendPrintf(&rc,
2a620 20 26 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20   &s, .          
2a630 22 20 25 64 28 25 6c 6c 64 29 22 2c 20 6c 76 6c  " %d(%lld)", lvl
2a640 2e 69 4c 65 61 66 50 67 6e 6f 2c 20 6c 76 6c 2e  .iLeafPgno, lvl.
2a650 69 52 6f 77 69 64 0a 20 20 20 20 20 20 29 3b 0a  iRowid.      );.
2a660 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
2a670 28 20 69 53 65 67 69 64 3d 3d 30 20 29 7b 0a 20  ( iSegid==0 ){. 
2a680 20 20 20 69 66 28 20 69 52 6f 77 69 64 3d 3d 46     if( iRowid==F
2a690 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f 57  TS5_AVERAGES_ROW
2a6a0 49 44 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  ID ){.      fts5
2a6b0 44 65 63 6f 64 65 41 76 65 72 61 67 65 73 28 26  DecodeAverages(&
2a6c0 72 63 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20  rc, &s, a, n);. 
2a6d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a6e0 66 74 73 35 44 65 63 6f 64 65 53 74 72 75 63 74  fts5DecodeStruct
2a6f0 75 72 65 28 26 72 63 2c 20 26 73 2c 20 61 2c 20  ure(&rc, &s, a, 
2a700 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  n);.    }.  }els
2a710 65 7b 0a 20 20 20 20 46 74 73 35 42 75 66 66 65  e{.    Fts5Buffe
2a720 72 20 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  r term;         
2a730 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2a740 74 65 72 6d 20 72 65 61 64 20 66 72 6f 6d 20 70  term read from p
2a750 61 67 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  age */.    int s
2a760 7a 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  zLeaf;          
2a770 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2a780 65 74 20 6f 66 20 70 67 69 64 78 20 69 6e 20 61  et of pgidx in a
2a790 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50  [] */.    int iP
2a7a0 67 69 64 78 4f 66 66 3b 0a 20 20 20 20 69 6e 74  gidxOff;.    int
2a7b0 20 69 50 67 69 64 78 50 72 65 76 20 3d 20 30 3b   iPgidxPrev = 0;
2a7c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
2a7d0 65 76 69 6f 75 73 20 76 61 6c 75 65 20 72 65 61  evious value rea
2a7e0 64 20 66 72 6f 6d 20 70 67 69 64 78 20 2a 2f 0a  d from pgidx */.
2a7f0 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66      int iTermOff
2a800 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 52   = 0;.    int iR
2a810 6f 77 69 64 4f 66 66 20 3d 20 30 3b 0a 20 20 20  owidOff = 0;.   
2a820 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 69   int iOff;.    i
2a830 6e 74 20 6e 44 6f 63 6c 69 73 74 3b 0a 0a 20 20  nt nDoclist;..  
2a840 20 20 6d 65 6d 73 65 74 28 26 74 65 72 6d 2c 20    memset(&term, 
2a850 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  0, sizeof(Fts5Bu
2a860 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 69 66 28  ffer));..    if(
2a870 20 6e 3c 34 20 29 7b 0a 20 20 20 20 20 20 73 71   n<4 ){.      sq
2a880 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
2a890 65 74 28 26 72 63 2c 20 26 73 2c 20 37 2c 20 28  et(&rc, &s, 7, (
2a8a0 63 6f 6e 73 74 20 75 38 2a 29 22 63 6f 72 72 75  const u8*)"corru
2a8b0 70 74 22 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  pt");.      goto
2a8c0 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
2a8d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
2a8e0 6f 77 69 64 4f 66 66 20 3d 20 66 74 73 35 47 65  owidOff = fts5Ge
2a8f0 74 55 31 36 28 26 61 5b 30 5d 29 3b 0a 20 20 20  tU16(&a[0]);.   
2a900 20 20 20 69 50 67 69 64 78 4f 66 66 20 3d 20 73     iPgidxOff = s
2a910 7a 4c 65 61 66 20 3d 20 66 74 73 35 47 65 74 55  zLeaf = fts5GetU
2a920 31 36 28 26 61 5b 32 5d 29 3b 0a 20 20 20 20 20  16(&a[2]);.     
2a930 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c 6e   if( iPgidxOff<n
2a940 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
2a950 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
2a960 50 67 69 64 78 4f 66 66 5d 2c 20 69 54 65 72 6d  PgidxOff], iTerm
2a970 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Off);.      }.  
2a980 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
2a990 64 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20  de the position 
2a9a0 6c 69 73 74 20 74 61 69 6c 20 61 74 20 74 68 65  list tail at the
2a9b0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 70 61   start of the pa
2a9c0 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 52  ge */.    if( iR
2a9d0 6f 77 69 64 4f 66 66 21 3d 30 20 29 7b 0a 20 20  owidOff!=0 ){.  
2a9e0 20 20 20 20 69 4f 66 66 20 3d 20 69 52 6f 77 69      iOff = iRowi
2a9f0 64 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 20  dOff;.    }else 
2aa00 69 66 28 20 69 54 65 72 6d 4f 66 66 21 3d 30 20  if( iTermOff!=0 
2aa10 29 7b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20  ){.      iOff = 
2aa20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20 20 7d 65  iTermOff;.    }e
2aa30 6c 73 65 7b 0a 20 20 20 20 20 20 69 4f 66 66 20  lse{.      iOff 
2aa40 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 7d 0a  = szLeaf;.    }.
2aa50 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 50 6f      fts5DecodePo
2aa60 73 6c 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26  slist(&rc, &s, &
2aa70 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29 3b 0a 0a  a[4], iOff-4);..
2aa80 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e      /* Decode an
2aa90 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73 74 20 64  y more doclist d
2aaa0 61 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73  ata that appears
2aab0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 62 65 66   on the page bef
2aac0 6f 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 66  ore the.    ** f
2aad0 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20 20  irst term. */.  
2aae0 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20 28 69 54    nDoclist = (iT
2aaf0 65 72 6d 4f 66 66 20 3f 20 69 54 65 72 6d 4f 66  ermOff ? iTermOf
2ab00 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d 20 69 4f  f : szLeaf) - iO
2ab10 66 66 3b 0a 20 20 20 20 66 74 73 35 44 65 63 6f  ff;.    fts5Deco
2ab20 64 65 44 6f 63 6c 69 73 74 28 26 72 63 2c 20 26  deDoclist(&rc, &
2ab30 73 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 6e 44 6f  s, &a[iOff], nDo
2ab40 63 6c 69 73 74 29 3b 0a 0a 20 20 20 20 77 68 69  clist);..    whi
2ab50 6c 65 28 20 69 50 67 69 64 78 4f 66 66 3c 6e 20  le( iPgidxOff<n 
2ab60 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 62 46 69  ){.      int bFi
2ab70 72 73 74 20 3d 20 28 69 50 67 69 64 78 4f 66 66  rst = (iPgidxOff
2ab80 3d 3d 73 7a 4c 65 61 66 29 3b 20 20 20 20 20 2f  ==szLeaf);     /
2ab90 2a 20 54 72 75 65 20 66 6f 72 20 66 69 72 73 74  * True for first
2aba0 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a 2f   term on page */
2abb0 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
2abc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2abe0 42 79 74 65 73 20 6f 66 20 64 61 74 61 20 2a 2f  Bytes of data */
2abf0 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64 3b  .      int iEnd;
2ac00 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 50  .      .      iP
2ac10 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73 35 47  gidxOff += fts5G
2ac20 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 50  etVarint32(&a[iP
2ac30 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29  gidxOff], nByte)
2ac40 3b 0a 20 20 20 20 20 20 69 50 67 69 64 78 50 72  ;.      iPgidxPr
2ac50 65 76 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20  ev += nByte;.   
2ac60 20 20 20 69 4f 66 66 20 3d 20 69 50 67 69 64 78     iOff = iPgidx
2ac70 50 72 65 76 3b 0a 0a 20 20 20 20 20 20 69 66 28  Prev;..      if(
2ac80 20 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a   iPgidxOff<n ){.
2ac90 20 20 20 20 20 20 20 20 66 74 73 35 47 65 74 56          fts5GetV
2aca0 61 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64  arint32(&a[iPgid
2acb0 78 4f 66 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20  xOff], nByte);. 
2acc0 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 69 50         iEnd = iP
2acd0 67 69 64 78 50 72 65 76 20 2b 20 6e 42 79 74 65  gidxPrev + nByte
2ace0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2acf0 20 20 20 20 20 20 20 69 45 6e 64 20 3d 20 73 7a         iEnd = sz
2ad00 4c 65 61 66 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Leaf;.      }.. 
2ad10 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
2ad20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  =0 ){.        iO
2ad30 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2ad40 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2ad50 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
2ad60 74 65 72 6d 2e 6e 20 3d 20 6e 42 79 74 65 3b 0a  term.n = nByte;.
2ad70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 4f        }.      iO
2ad80 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
2ad90 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
2ada0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 66 74  nByte);.      ft
2adb0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
2adc0 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
2add0 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
2ade0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
2adf0 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Byte;..      sql
2ae00 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2ae10 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
2ae20 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
2ae30 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
2ae40 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
2ae50 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
2ae60 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2ae70 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
2ae80 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
2ae90 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b  ff], iEnd-iOff);
2aea0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
2aeb0 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
2aec0 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64  );.  }.  . decod
2aed0 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
2aee0 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
2aef0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2af00 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
2af10 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
2af20 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
2af30 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
2af40 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
2af50 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
2af60 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
2af70 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
2af80 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
2af90 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
2afa0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
2afb0 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
2afc0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
2afd0 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
2afe0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2aff0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
2b000 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
2b010 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
2b020 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
2b030 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
2b040 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
2b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b060 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2b070 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
2b080 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
2b090 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
2b0a0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
2b0b0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2b0c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
2b0d0 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
2b0e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2b0f0 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
2b100 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
2b110 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
2b120 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
2b130 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
2b140 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
2b150 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
2b160 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
2b170 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
2b180 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
2b190 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
2b1a0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
2b1b0 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c        int segid,
2b1c0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
2b1d0 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
2b1e0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
2b1f0 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
2b200 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
2b210 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
2b220 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
2b230 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  gid, pgno))", -1
2b240 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2b250 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2b260 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
2b270 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
2b280 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [1]);.        pg
2b290 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
2b2a0 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
2b2b0 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
2b2c0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
2b2d0 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e  ROWID(segid, pgn
2b2e0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
2b2f0 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
2b300 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
2b310 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b320 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
2b330 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
2b340 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
2b350 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
2b360 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
2b370 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a  'segment'" , -1.
2b380 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
2b390 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
2b3a0 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
2b3b0 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
2b3c0 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
2b3d0 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
2b3e0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
2b3f0 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
2b400 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
2b410 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
2b420 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
2b430 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
2b440 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
2b450 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2b460 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
2b470 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
2b480 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
2b490 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2b4a0 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
2b4b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
2b4c0 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
2b4d0 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
2b4e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
2b4f0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
2b500 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
2b510 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
2b520 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
2b530 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
2b540 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  0.  );.  if( rc=
2b550 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b560 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
2b570 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a  reate_function(.
2b580 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74 73          db, "fts
2b590 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c 20 53 51  5_rowid", -1, SQ
2b5a0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 66 74  LITE_UTF8, 0, ft
2b5b0 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 2c  s5RowidFunction,
2b5c0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
2b5d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b5e0 0a                                               .