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

Artifact 865302c41aee4e8336b5dd06759e962e5d8b68ed3cb96ccf0e0dee451f399a34:


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: 49 74 65 72 20 46 74 73 35 49 74 65 72 3b 0a 74  Iter Fts5Iter;.t
24e0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46 74  ypedef struct Ft
24f0: 73 35 50 61 67 65 57 72 69 74 65 72 20 46 74 73  s5PageWriter Fts
2500: 35 50 61 67 65 57 72 69 74 65 72 3b 0a 74 79 70  5PageWriter;.typ
2510: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
2520: 53 65 67 49 74 65 72 20 46 74 73 35 53 65 67 49  SegIter Fts5SegI
2530: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2540: 75 63 74 20 46 74 73 35 44 6f 63 6c 69 73 74 49  uct Fts5DoclistI
2550: 74 65 72 20 46 74 73 35 44 6f 63 6c 69 73 74 49  ter Fts5DoclistI
2560: 74 65 72 3b 0a 74 79 70 65 64 65 66 20 73 74 72  ter;.typedef str
2570: 75 63 74 20 46 74 73 35 53 65 67 57 72 69 74 65  uct Fts5SegWrite
2580: 72 20 46 74 73 35 53 65 67 57 72 69 74 65 72 3b  r Fts5SegWriter;
2590: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
25a0: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 46 74  Fts5Structure Ft
25b0: 73 35 53 74 72 75 63 74 75 72 65 3b 0a 74 79 70  s5Structure;.typ
25c0: 65 64 65 66 20 73 74 72 75 63 74 20 46 74 73 35  edef struct Fts5
25d0: 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 46  StructureLevel F
25e0: 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
25f0: 6c 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  l;.typedef struc
2600: 74 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53  t Fts5StructureS
2610: 65 67 6d 65 6e 74 20 46 74 73 35 53 74 72 75 63  egment Fts5Struc
2620: 74 75 72 65 53 65 67 6d 65 6e 74 3b 0a 0a 73 74  tureSegment;..st
2630: 72 75 63 74 20 46 74 73 35 44 61 74 61 20 7b 0a  ruct Fts5Data {.
2640: 20 20 75 38 20 2a 70 3b 20 20 20 20 20 20 20 20    u8 *p;        
2650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2660: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2670: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
2680: 67 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  g record */.  in
2690: 74 20 6e 6e 3b 20 20 20 20 20 20 20 20 20 20 20  t nn;           
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26b0: 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20   Size of record 
26c0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e  in bytes */.  in
26d0: 74 20 73 7a 4c 65 61 66 3b 20 20 20 20 20 20 20  t szLeaf;       
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f0: 20 53 69 7a 65 20 6f 66 20 6c 65 61 66 20 77 69   Size of leaf wi
2700: 74 68 6f 75 74 20 70 61 67 65 2d 69 6e 64 65 78  thout page-index
2710: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 6e   */.};../*.** On
2720: 65 20 6f 62 6a 65 63 74 20 70 65 72 20 25 5f 64  e object per %_d
2730: 61 74 61 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74  ata table..*/.st
2740: 72 75 63 74 20 46 74 73 35 49 6e 64 65 78 20 7b  ruct Fts5Index {
2750: 0a 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70  .  Fts5Config *p
2760: 43 6f 6e 66 69 67 3b 20 20 20 20 20 20 20 20 20  Config;         
2770: 20 20 20 2f 2a 20 56 69 72 74 75 61 6c 20 74 61     /* Virtual ta
2780: 62 6c 65 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ble configuratio
2790: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 61  n */.  char *zDa
27a0: 74 61 54 62 6c 3b 20 20 20 20 20 20 20 20 20 20  taTbl;          
27b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
27c0: 66 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a  f %_data table *
27d0: 2f 0a 20 20 69 6e 74 20 6e 57 6f 72 6b 55 6e 69  /.  int nWorkUni
27e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
27f0: 20 20 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65      /* Leaf page
2800: 73 20 69 6e 20 61 20 22 75 6e 69 74 22 20 6f 66  s in a "unit" of
2810: 20 77 6f 72 6b 20 2a 2f 0a 0a 20 20 2f 2a 0a 20   work */..  /*. 
2820: 20 2a 2a 20 56 61 72 69 61 62 6c 65 73 20 72 65   ** Variables re
2830: 6c 61 74 65 64 20 74 6f 20 74 68 65 20 61 63 63  lated to the acc
2840: 75 6d 75 6c 61 74 69 6f 6e 20 6f 66 20 74 6f 6b  umulation of tok
2850: 65 6e 73 20 61 6e 64 20 64 6f 63 6c 69 73 74 73  ens and doclists
2860: 20 77 69 74 68 69 6e 20 74 68 65 0a 20 20 2a 2a   within the.  **
2870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20   in-memory hash 
2880: 74 61 62 6c 65 73 20 62 65 66 6f 72 65 20 74 68  tables before th
2890: 65 79 20 61 72 65 20 66 6c 75 73 68 65 64 20 74  ey are flushed t
28a0: 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 46  o disk..  */.  F
28b0: 74 73 35 48 61 73 68 20 2a 70 48 61 73 68 3b 20  ts5Hash *pHash; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28d0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 66 6f 72  * Hash table for
28e0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 20   in-memory data 
28f0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 65 6e 64 69 6e  */.  int nPendin
2900: 67 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20  gData;          
2910: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
2920: 62 79 74 65 73 20 6f 66 20 70 65 6e 64 69 6e 67  bytes of pending
2930: 20 64 61 74 61 20 2a 2f 0a 20 20 69 36 34 20 69   data */.  i64 i
2940: 57 72 69 74 65 52 6f 77 69 64 3b 20 20 20 20 20  WriteRowid;     
2950: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f             /* Ro
2960: 77 69 64 20 66 6f 72 20 63 75 72 72 65 6e 74 20  wid for current 
2970: 64 6f 63 20 62 65 69 6e 67 20 77 72 69 74 74 65  doc being writte
2980: 6e 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 6c 65  n */.  int bDele
2990: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
29a0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
29b0: 74 20 77 72 69 74 65 20 69 73 20 61 20 64 65 6c  t write is a del
29c0: 65 74 65 20 2a 2f 0a 0a 20 20 2f 2a 20 45 72 72  ete */..  /* Err
29d0: 6f 72 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69  or state. */.  i
29e0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a00: 2a 20 43 75 72 72 65 6e 74 20 65 72 72 6f 72 20  * Current error 
2a10: 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 53 74  code */..  /* St
2a20: 61 74 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ate used by the 
2a30: 66 74 73 35 44 61 74 61 58 58 58 28 29 20 66 75  fts5DataXXX() fu
2a40: 6e 63 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 73 71  nctions. */.  sq
2a50: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61  lite3_blob *pRea
2a60: 64 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  der;          /*
2a70: 20 52 4f 20 69 6e 63 72 2d 62 6c 6f 62 20 6f 70   RO incr-blob op
2a80: 65 6e 20 6f 6e 20 25 5f 64 61 74 61 20 74 61 62  en on %_data tab
2a90: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2aa0: 73 74 6d 74 20 2a 70 57 72 69 74 65 72 3b 20 20  stmt *pWriter;  
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 22 49 4e 53 45          /* "INSE
2ac0: 52 54 20 2e 2e 2e 20 25 5f 64 61 74 61 20 56 41  RT ... %_data VA
2ad0: 4c 55 45 53 28 3f 2c 3f 29 22 20 2a 2f 0a 20 20  LUES(?,?)" */.  
2ae0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 44  sqlite3_stmt *pD
2af0: 65 6c 65 74 65 72 3b 20 20 20 20 20 20 20 20 20  eleter;         
2b00: 2f 2a 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  /* "DELETE FROM 
2b10: 25 5f 64 61 74 61 20 2e 2e 2e 20 69 64 3e 3d 3f  %_data ... id>=?
2b20: 20 41 4e 44 20 69 64 3c 3d 3f 22 20 2a 2f 0a 20   AND id<=?" */. 
2b30: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2b40: 49 64 78 57 72 69 74 65 72 3b 20 20 20 20 20 20  IdxWriter;      
2b50: 20 2f 2a 20 22 49 4e 53 45 52 54 20 2e 2e 2e 20   /* "INSERT ... 
2b60: 25 5f 69 64 78 20 56 41 4c 55 45 53 28 3f 2c 3f  %_idx VALUES(?,?
2b70: 2c 3f 2c 3f 29 22 20 2a 2f 0a 20 20 73 71 6c 69  ,?,?)" */.  sqli
2b80: 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78 44 65  te3_stmt *pIdxDe
2b90: 6c 65 74 65 72 3b 20 20 20 20 20 20 2f 2a 20 22  leter;      /* "
2ba0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 25 5f 69 64  DELETE FROM %_id
2bb0: 78 20 57 48 45 52 45 20 73 65 67 69 64 3d 3f 20  x WHERE segid=? 
2bc0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  */.  sqlite3_stm
2bd0: 74 20 2a 70 49 64 78 53 65 6c 65 63 74 3b 0a 20  t *pIdxSelect;. 
2be0: 20 69 6e 74 20 6e 52 65 61 64 3b 20 20 20 20 20   int nRead;     
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
2c10: 20 6f 66 20 62 6c 6f 63 6b 73 20 72 65 61 64 20   of blocks read 
2c20: 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  */..  sqlite3_st
2c30: 6d 74 20 2a 70 44 61 74 61 56 65 72 73 69 6f 6e  mt *pDataVersion
2c40: 3b 0a 20 20 69 36 34 20 69 53 74 72 75 63 74 56  ;.  i64 iStructV
2c50: 65 72 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ersion;         
2c60: 20 20 20 20 2f 2a 20 64 61 74 61 5f 76 65 72 73      /* data_vers
2c70: 69 6f 6e 20 77 68 65 6e 20 70 53 74 72 75 63 74  ion when pStruct
2c80: 20 72 65 61 64 20 2a 2f 0a 20 20 46 74 73 35 53   read */.  Fts5S
2c90: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2ca0: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75  t;         /* Cu
2cb0: 72 72 65 6e 74 20 64 62 20 73 74 72 75 63 74 75  rrent db structu
2cc0: 72 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  re (or NULL) */.
2cd0: 7d 3b 0a 0a 73 74 72 75 63 74 20 46 74 73 35 44  };..struct Fts5D
2ce0: 6f 63 6c 69 73 74 49 74 65 72 20 7b 0a 20 20 75  oclistIter {.  u
2cf0: 38 20 2a 61 45 6f 66 3b 20 20 20 20 20 20 20 20  8 *aEof;        
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d10: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62  * Pointer to 1 b
2d20: 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20  yte past end of 
2d30: 64 6f 63 6c 69 73 74 20 2a 2f 0a 0a 20 20 2f 2a  doclist */..  /*
2d40: 20 4f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   Output variable
2d50: 73 2e 20 61 50 6f 73 6c 69 73 74 3d 3d 30 20 61  s. aPoslist==0 a
2d60: 74 20 45 4f 46 20 2a 2f 0a 20 20 69 36 34 20 69  t EOF */.  i64 i
2d70: 52 6f 77 69 64 3b 0a 20 20 75 38 20 2a 61 50 6f  Rowid;.  u8 *aPo
2d80: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 50 6f  slist;.  int nPo
2d90: 73 6c 69 73 74 3b 0a 20 20 69 6e 74 20 6e 53 69  slist;.  int nSi
2da0: 7a 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  ze;.};../*.** Th
2db0: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
2dc0: 65 20 22 73 74 72 75 63 74 75 72 65 22 20 72 65  e "structure" re
2dd0: 63 6f 72 64 20 66 6f 72 20 65 61 63 68 20 69 6e  cord for each in
2de0: 64 65 78 20 61 72 65 20 72 65 70 72 65 73 65 6e  dex are represen
2df0: 74 65 64 0a 2a 2a 20 75 73 69 6e 67 20 61 6e 20  ted.** using an 
2e00: 46 74 73 35 53 74 72 75 63 74 75 72 65 20 72 65  Fts5Structure re
2e10: 63 6f 72 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20  cord in memory. 
2e20: 57 68 69 63 68 20 75 73 65 73 20 69 6e 73 74 61  Which uses insta
2e30: 6e 63 65 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20  nces of the .** 
2e40: 6f 74 68 65 72 20 46 74 73 35 53 74 72 75 63 74  other Fts5Struct
2e50: 75 72 65 58 58 58 20 74 79 70 65 73 20 61 73 20  ureXXX types as 
2e60: 63 6f 6d 70 6f 6e 65 6e 74 73 2e 0a 2a 2f 0a 73  components..*/.s
2e70: 74 72 75 63 74 20 46 74 73 35 53 74 72 75 63 74  truct Fts5Struct
2e80: 75 72 65 53 65 67 6d 65 6e 74 20 7b 0a 20 20 69  ureSegment {.  i
2e90: 6e 74 20 69 53 65 67 69 64 3b 20 20 20 20 20 20  nt iSegid;      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a  * Segment id */.
2ec0: 20 20 69 6e 74 20 70 67 6e 6f 46 69 72 73 74 3b    int pgnoFirst;
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 2f 2a 20 46 69 72 73 74 20 6c 65 61 66 20    /* First leaf 
2ef0: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73  page number in s
2f00: 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20  egment */.  int 
2f10: 70 67 6e 6f 4c 61 73 74 3b 20 20 20 20 20 20 20  pgnoLast;       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2f30: 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ast leaf page nu
2f40: 6d 62 65 72 20 69 6e 20 73 65 67 6d 65 6e 74 20  mber in segment 
2f50: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
2f60: 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20  5StructureLevel 
2f70: 7b 0a 20 20 69 6e 74 20 6e 4d 65 72 67 65 3b 20  {.  int nMerge; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2fa0: 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 69 6e 63   segments in inc
2fb0: 72 2d 6d 65 72 67 65 20 2a 2f 0a 20 20 69 6e 74  r-merge */.  int
2fc0: 20 6e 53 65 67 3b 20 20 20 20 20 20 20 20 20 20   nSeg;          
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fe0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2ff0: 73 65 67 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65  segments on leve
3000: 6c 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  l */.  Fts5Struc
3010: 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 61 53 65  tureSegment *aSe
3020: 67 3b 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20  g;     /* Array 
3030: 6f 66 20 73 65 67 6d 65 6e 74 73 2e 20 61 53 65  of segments. aSe
3040: 67 5b 30 5d 20 69 73 20 6f 6c 64 65 73 74 2e 20  g[0] is oldest. 
3050: 2a 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73  */.};.struct Fts
3060: 35 53 74 72 75 63 74 75 72 65 20 7b 0a 20 20 69  5Structure {.  i
3070: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3090: 2a 20 4f 62 6a 65 63 74 20 72 65 66 65 72 65 6e  * Object referen
30a0: 63 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 36  ce count */.  u6
30b0: 34 20 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 3b  4 nWriteCounter;
30c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30d0: 20 54 6f 74 61 6c 20 6c 65 61 76 65 73 20 77 72   Total leaves wr
30e0: 69 74 74 65 6e 20 74 6f 20 6c 65 76 65 6c 20 30  itten to level 0
30f0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 67 6d 65   */.  int nSegme
3100: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nt;             
3110: 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73        /* Total s
3120: 65 67 6d 65 6e 74 73 20 69 6e 20 74 68 69 73 20  egments in this 
3130: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69  structure */.  i
3140: 6e 74 20 6e 4c 65 76 65 6c 3b 20 20 20 20 20 20  nt nLevel;      
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3160: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 76 65  * Number of leve
3170: 6c 73 20 69 6e 20 74 68 69 73 20 69 6e 64 65 78  ls in this index
3180: 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
3190: 75 72 65 4c 65 76 65 6c 20 61 4c 65 76 65 6c 5b  ureLevel aLevel[
31a0: 31 5d 3b 20 20 20 2f 2a 20 41 72 72 61 79 20 6f  1];   /* Array o
31b0: 66 20 6e 4c 65 76 65 6c 20 6c 65 76 65 6c 20 6f  f nLevel level o
31c0: 62 6a 65 63 74 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  bjects */.};../*
31d0: 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 6f 66  .** An object of
31e0: 20 74 79 70 65 20 46 74 73 35 53 65 67 57 72 69   type Fts5SegWri
31f0: 74 65 72 20 69 73 20 75 73 65 64 20 74 6f 20 77  ter is used to w
3200: 72 69 74 65 20 74 6f 20 73 65 67 6d 65 6e 74 73  rite to segments
3210: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 46 74 73 35  ..*/.struct Fts5
3220: 50 61 67 65 57 72 69 74 65 72 20 7b 0a 20 20 69  PageWriter {.  i
3230: 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  nt pgno;        
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3250: 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
3260: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
3270: 20 69 6e 74 20 69 50 72 65 76 50 67 69 64 78 3b   int iPrevPgidx;
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3290: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76 61 6c   /* Previous val
32a0: 75 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ue written into 
32b0: 70 67 69 64 78 20 2a 2f 0a 20 20 46 74 73 35 42  pgidx */.  Fts5B
32c0: 75 66 66 65 72 20 62 75 66 3b 20 20 20 20 20 20  uffer buf;      
32d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
32e0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
32f0: 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a 20 20 46  leaf data */.  F
3300: 74 73 35 42 75 66 66 65 72 20 70 67 69 64 78 3b  ts5Buffer pgidx;
3310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3320: 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
3330: 69 6e 67 20 70 61 67 65 2d 69 6e 64 65 78 20 2a  ing page-index *
3340: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
3350: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
3360: 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f      /* Buffer co
3370: 6e 74 61 69 6e 69 6e 67 20 70 72 65 76 69 6f 75  ntaining previou
3380: 73 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 2a  s term on page *
3390: 2f 0a 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35  /.};.struct Fts5
33a0: 44 6c 69 64 78 57 72 69 74 65 72 20 7b 0a 20 20  DlidxWriter {.  
33b0: 69 6e 74 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  int pgno;       
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66  /* Page number f
33e0: 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  or this page */.
33f0: 20 20 69 6e 74 20 62 50 72 65 76 56 61 6c 69 64    int bPrevValid
3400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3410: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 50 72    /* True if iPr
3420: 65 76 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  ev is valid */. 
3430: 20 69 36 34 20 69 50 72 65 76 3b 20 20 20 20 20   i64 iPrev;     
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77   /* Previous row
3460: 69 64 20 76 61 6c 75 65 20 77 72 69 74 74 65 6e  id value written
3470: 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 46 74   to page */.  Ft
3480: 73 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20  s5Buffer buf;   
3490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
34a0: 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
34b0: 6e 67 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ng page data */.
34c0: 7d 3b 0a 73 74 72 75 63 74 20 46 74 73 35 53 65  };.struct Fts5Se
34d0: 67 57 72 69 74 65 72 20 7b 0a 20 20 69 6e 74 20  gWriter {.  int 
34e0: 69 53 65 67 69 64 3b 20 20 20 20 20 20 20 20 20  iSegid;         
34f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3500: 65 67 69 64 20 74 6f 20 77 72 69 74 65 20 74 6f  egid to write to
3510: 20 2a 2f 0a 20 20 46 74 73 35 50 61 67 65 57 72   */.  Fts5PageWr
3520: 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
3530: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 57 72 69        /* PageWri
3540: 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ter object */.  
3550: 69 36 34 20 69 50 72 65 76 52 6f 77 69 64 3b 20  i64 iPrevRowid; 
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69  /* Previous rowi
3580: 64 20 77 72 69 74 74 65 6e 20 74 6f 20 63 75 72  d written to cur
3590: 72 65 6e 74 20 6c 65 61 66 20 2a 2f 0a 20 20 75  rent leaf */.  u
35a0: 38 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  8 bFirstRowidInD
35b0: 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 2f  oclist;        /
35c0: 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72  * True if next r
35d0: 6f 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e  owid is first in
35e0: 20 64 6f 63 6c 69 73 74 20 2a 2f 0a 20 20 75 38   doclist */.  u8
35f0: 20 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61   bFirstRowidInPa
3600: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge;           /*
3610: 20 54 72 75 65 20 69 66 20 6e 65 78 74 20 72 6f   True if next ro
3620: 77 69 64 20 69 73 20 66 69 72 73 74 20 69 6e 20  wid is first in 
3630: 70 61 67 65 20 2a 2f 0a 20 20 2f 2a 20 54 4f 44  page */.  /* TOD
3640: 4f 31 3a 20 43 61 6e 20 75 73 65 20 28 77 72 69  O1: Can use (wri
3650: 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d 30 29 20  ter.pgidx.n==0) 
3660: 69 6e 73 74 65 61 64 20 6f 66 20 62 46 69 72 73  instead of bFirs
3670: 74 54 65 72 6d 49 6e 50 61 67 65 20 2a 2f 0a 20  tTermInPage */. 
3680: 20 75 38 20 62 46 69 72 73 74 54 65 72 6d 49 6e   u8 bFirstTermIn
3690: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
36a0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 65 78 74   /* True if next
36b0: 20 74 65 72 6d 20 77 69 6c 6c 20 62 65 20 66 69   term will be fi
36c0: 72 73 74 20 69 6e 20 6c 65 61 66 20 2a 2f 0a 20  rst in leaf */. 
36d0: 20 69 6e 74 20 6e 4c 65 61 66 57 72 69 74 74 65   int nLeafWritte
36e0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
36f0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65   /* Number of le
3700: 61 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  af pages written
3710: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 6d 70 74 79   */.  int nEmpty
3720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3740: 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73 20 74 65  of contiguous te
3750: 72 6d 2d 6c 65 73 73 20 6e 6f 64 65 73 20 2a 2f  rm-less nodes */
3760: 0a 0a 20 20 69 6e 74 20 6e 44 6c 69 64 78 3b 20  ..  int nDlidx; 
3770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3780: 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
3790: 20 73 69 7a 65 20 6f 66 20 61 44 6c 69 64 78 5b   size of aDlidx[
37a0: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 46 74 73  ] array */.  Fts
37b0: 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 61 44  5DlidxWriter *aD
37c0: 6c 69 64 78 3b 20 20 20 20 20 20 20 20 2f 2a 20  lidx;        /* 
37d0: 41 72 72 61 79 20 6f 66 20 46 74 73 35 44 6c 69  Array of Fts5Dli
37e0: 64 78 57 72 69 74 65 72 20 6f 62 6a 65 63 74 73  dxWriter objects
37f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 56 61 6c 75 65 73   */..  /* Values
3800: 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f 20   to insert into 
3810: 74 68 65 20 25 5f 69 64 78 20 74 61 62 6c 65 20  the %_idx table 
3820: 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
3830: 62 74 74 65 72 6d 3b 20 20 20 20 20 20 20 20 20  btterm;         
3840: 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 74 65 72       /* Next ter
3850: 6d 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 74 6f  m to insert into
3860: 20 25 5f 69 64 78 20 74 61 62 6c 65 20 2a 2f 0a   %_idx table */.
3870: 20 20 69 6e 74 20 69 42 74 50 61 67 65 3b 20 20    int iBtPage;  
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
38a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
38b0: 6f 20 62 74 74 65 72 6d 20 2a 2f 0a 7d 3b 0a 0a  o btterm */.};..
38c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 46  typedef struct F
38d0: 74 73 35 43 52 65 73 75 6c 74 20 46 74 73 35 43  ts5CResult Fts5C
38e0: 52 65 73 75 6c 74 3b 0a 73 74 72 75 63 74 20 46  Result;.struct F
38f0: 74 73 35 43 52 65 73 75 6c 74 20 7b 0a 20 20 75  ts5CResult {.  u
3900: 31 36 20 69 46 69 72 73 74 3b 20 20 20 20 20 20  16 iFirst;      
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3920: 2a 20 61 53 65 67 5b 5d 20 69 6e 64 65 78 20 6f  * aSeg[] index o
3930: 66 20 66 69 72 73 74 65 73 74 20 69 74 65 72 61  f firstest itera
3940: 74 6f 72 20 2a 2f 0a 20 20 75 38 20 62 54 65 72  tor */.  u8 bTer
3950: 6d 45 71 3b 20 20 20 20 20 20 20 20 20 20 20 20  mEq;            
3960: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3970: 20 69 66 20 74 68 65 20 74 65 72 6d 73 20 61 72   if the terms ar
3980: 65 20 65 71 75 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f  e equal */.};../
3990: 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 66 6f 72 20  *.** Object for 
39a0: 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67  iterating throug
39b0: 68 20 61 20 73 69 6e 67 6c 65 20 73 65 67 6d 65  h a single segme
39c0: 6e 74 2c 20 76 69 73 69 74 69 6e 67 20 65 61 63  nt, visiting eac
39d0: 68 20 74 65 72 6d 2f 72 6f 77 69 64 0a 2a 2a 20  h term/rowid.** 
39e0: 70 61 69 72 20 69 6e 20 74 68 65 20 73 65 67 6d  pair in the segm
39f0: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 70 53 65 67 3a  ent..**.** pSeg:
3a00: 0a 2a 2a 20 20 20 54 68 65 20 73 65 67 6d 65 6e  .**   The segmen
3a10: 74 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  t to iterate thr
3a20: 6f 75 67 68 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61  ough..**.** iLea
3a30: 66 50 67 6e 6f 3a 0a 2a 2a 20 20 20 43 75 72 72  fPgno:.**   Curr
3a40: 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75  ent leaf page nu
3a50: 6d 62 65 72 20 77 69 74 68 69 6e 20 73 65 67 6d  mber within segm
3a60: 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 69 4c 65 61 66  ent..**.** iLeaf
3a70: 4f 66 66 73 65 74 3a 0a 2a 2a 20 20 20 42 79 74  Offset:.**   Byt
3a80: 65 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e 20  e offset within 
3a90: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66  the current leaf
3aa0: 20 74 68 61 74 20 69 73 20 74 68 65 20 66 69 72   that is the fir
3ab0: 73 74 20 62 79 74 65 20 6f 66 20 74 68 65 20 0a  st byte of the .
3ac0: 2a 2a 20 20 20 70 6f 73 69 74 69 6f 6e 20 6c 69  **   position li
3ad0: 73 74 20 64 61 74 61 20 28 6f 6e 65 20 62 79 74  st data (one byt
3ae0: 65 20 70 61 73 73 65 64 20 74 68 65 20 70 6f 73  e passed the pos
3af0: 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20  ition-list size 
3b00: 66 69 65 6c 64 29 2e 0a 2a 2a 20 20 20 72 6f 77  field)..**   row
3b10: 69 64 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  id field of the 
3b20: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 55  current entry. U
3b30: 73 75 61 6c 6c 79 20 74 68 69 73 20 69 73 20 74  sually this is t
3b40: 68 65 20 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  he size field of
3b50: 20 74 68 65 0a 2a 2a 20 20 20 70 6f 73 69 74 69   the.**   positi
3b60: 6f 6e 20 6c 69 73 74 20 64 61 74 61 2e 20 54 68  on list data. Th
3b70: 65 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 69  e exception is i
3b80: 66 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72 20  f the rowid for 
3b90: 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
3ba0: 79 20 0a 2a 2a 20 20 20 69 73 20 74 68 65 20 6c  y .**   is the l
3bb0: 61 73 74 20 74 68 69 6e 67 20 6f 6e 20 74 68 65  ast thing on the
3bc0: 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2a 0a 2a   leaf page..**.*
3bd0: 2a 20 70 4c 65 61 66 3a 0a 2a 2a 20 20 20 42 75  * pLeaf:.**   Bu
3be0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
3bf0: 63 75 72 72 65 6e 74 20 6c 65 61 66 20 70 61 67  current leaf pag
3c00: 65 20 64 61 74 61 2e 20 53 65 74 20 74 6f 20 4e  e data. Set to N
3c10: 55 4c 4c 20 61 74 20 45 4f 46 2e 0a 2a 2a 0a 2a  ULL at EOF..**.*
3c20: 2a 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 2c  * iTermLeafPgno,
3c30: 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74   iTermLeafOffset
3c40: 3a 0a 2a 2a 20 20 20 4c 65 61 66 20 70 61 67 65  :.**   Leaf page
3c50: 20 6e 75 6d 62 65 72 20 63 6f 6e 74 61 69 6e 69   number containi
3c60: 6e 67 20 74 68 65 20 6c 61 73 74 20 74 65 72 6d  ng the last term
3c70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
3c80: 65 67 6d 65 6e 74 2e 20 41 6e 64 0a 2a 2a 20 20  egment. And.**  
3c90: 20 74 68 65 20 6f 66 66 73 65 74 20 69 6d 6d 65   the offset imme
3ca0: 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e  diately followin
3cb0: 67 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 2e  g the term data.
3cc0: 0a 2a 2a 0a 2a 2a 20 66 6c 61 67 73 3a 0a 2a 2a  .**.** flags:.**
3cd0: 20 20 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 5f     Mask of FTS5_
3ce0: 53 45 47 49 54 45 52 5f 58 58 58 20 76 61 6c 75  SEGITER_XXX valu
3cf0: 65 73 2e 20 49 6e 74 65 72 70 72 65 74 65 64 20  es. Interpreted 
3d00: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
3d10: 2a 20 20 20 46 54 53 35 5f 53 45 47 49 54 45 52  *   FTS5_SEGITER
3d20: 5f 4f 4e 45 54 45 52 4d 3a 0a 2a 2a 20 20 20 20  _ONETERM:.**    
3d30: 20 49 66 20 73 65 74 2c 20 73 65 74 20 74 68 65   If set, set the
3d40: 20 69 74 65 72 61 74 6f 72 20 74 6f 20 70 6f 69   iterator to poi
3d50: 6e 74 20 74 6f 20 45 4f 46 20 61 66 74 65 72 20  nt to EOF after 
3d60: 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
3d70: 69 73 74 20 0a 2a 2a 20 20 20 20 20 68 61 73 20  ist .**     has 
3d80: 62 65 65 6e 20 65 78 68 61 75 73 74 65 64 2e 20  been exhausted. 
3d90: 44 6f 20 6e 6f 74 20 70 72 6f 63 65 65 64 20 74  Do not proceed t
3da0: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
3db0: 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 0a  in the segment..
3dc0: 2a 2a 0a 2a 2a 20 20 20 46 54 53 35 5f 53 45 47  **.**   FTS5_SEG
3dd0: 49 54 45 52 5f 52 45 56 45 52 53 45 3a 0a 2a 2a  ITER_REVERSE:.**
3de0: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 69       This flag i
3df0: 73 20 6f 6e 6c 79 20 65 76 65 72 20 73 65 74 20  s only ever set 
3e00: 69 66 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  if FTS5_SEGITER_
3e10: 4f 4e 45 54 45 52 4d 20 69 73 20 61 6c 73 6f 20  ONETERM is also 
3e20: 73 65 74 2e 20 49 66 0a 2a 2a 20 20 20 20 20 69  set. If.**     i
3e30: 74 20 69 73 20 73 65 74 2c 20 69 74 65 72 61 74  t is set, iterat
3e40: 65 20 74 68 72 6f 75 67 68 20 72 6f 77 69 64 20  e through rowid 
3e50: 69 6e 20 64 65 73 63 65 6e 64 69 6e 67 20 6f 72  in descending or
3e60: 64 65 72 20 69 6e 73 74 65 61 64 20 6f 66 20 74  der instead of t
3e70: 68 65 0a 2a 2a 20 20 20 20 20 64 65 66 61 75 6c  he.**     defaul
3e80: 74 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  t ascending orde
3e90: 72 2e 0a 2a 2a 0a 2a 2a 20 69 52 6f 77 69 64 4f  r..**.** iRowidO
3ea0: 66 66 73 65 74 2f 6e 52 6f 77 69 64 4f 66 66 73  ffset/nRowidOffs
3eb0: 65 74 2f 61 52 6f 77 69 64 4f 66 66 73 65 74 3a  et/aRowidOffset:
3ec0: 0a 2a 2a 20 20 20 20 20 54 68 65 73 65 20 61 72  .**     These ar
3ed0: 65 20 75 73 65 64 20 69 66 20 74 68 65 20 46 54  e used if the FT
3ee0: 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
3ef0: 53 45 20 66 6c 61 67 20 69 73 20 73 65 74 2e 0a  SE flag is set..
3f00: 2a 2a 0a 2a 2a 20 20 20 20 20 46 6f 72 20 65 61  **.**     For ea
3f10: 63 68 20 72 6f 77 69 64 20 6f 6e 20 74 68 65 20  ch rowid on the 
3f20: 70 61 67 65 20 63 6f 72 72 65 73 70 6f 6e 64 69  page correspondi
3f30: 6e 67 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ng to the curren
3f40: 74 20 74 65 72 6d 2c 20 74 68 65 0a 2a 2a 20 20  t term, the.**  
3f50: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
3f60: 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20   aRowidOffset[] 
3f70: 65 6e 74 72 79 20 69 73 20 73 65 74 20 74 6f 20  entry is set to 
3f80: 74 68 65 20 62 79 74 65 20 6f 66 66 73 65 74 20  the byte offset 
3f90: 6f 66 20 74 68 65 0a 2a 2a 20 20 20 20 20 73 74  of the.**     st
3fa0: 61 72 74 20 6f 66 20 74 68 65 20 22 70 6f 73 69  art of the "posi
3fb0: 74 69 6f 6e 2d 6c 69 73 74 2d 73 69 7a 65 22 20  tion-list-size" 
3fc0: 66 69 65 6c 64 20 77 69 74 68 69 6e 20 74 68 65  field within the
3fd0: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 69 54 65   page..**.** iTe
3fe0: 72 6d 49 64 78 3a 0a 2a 2a 20 20 20 20 20 49 6e  rmIdx:.**     In
3ff0: 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20 74  dex of current t
4000: 65 72 6d 20 6f 6e 20 69 54 65 72 6d 4c 65 61 66  erm on iTermLeaf
4010: 50 67 6e 6f 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  Pgno..*/.struct 
4020: 46 74 73 35 53 65 67 49 74 65 72 20 7b 0a 20 20  Fts5SegIter {.  
4030: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
4040: 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 20 20  ment *pSeg;     
4050: 2f 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 69 74  /* Segment to it
4060: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 2a 2f  erate through */
4070: 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20  .  int flags;   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4090: 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 63 6f     /* Mask of co
40a0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 66 6c 61 67  nfiguration flag
40b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  s */.  int iLeaf
40c0: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
40d0: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
40e0: 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
40f0: 65 72 20 2a 2f 0a 20 20 46 74 73 35 44 61 74 61  er */.  Fts5Data
4100: 20 2a 70 4c 65 61 66 3b 20 20 20 20 20 20 20 20   *pLeaf;        
4110: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
4120: 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f 0a  nt leaf data */.
4130: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 78    Fts5Data *pNex
4140: 74 4c 65 61 66 3b 20 20 20 20 20 20 20 20 20 20  tLeaf;          
4150: 20 20 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 28    /* Leaf page (
4160: 69 4c 65 61 66 50 67 6e 6f 2b 31 29 20 2a 2f 0a  iLeafPgno+1) */.
4170: 20 20 69 6e 74 20 69 4c 65 61 66 4f 66 66 73 65    int iLeafOffse
4180: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
4190: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
41a0: 20 77 69 74 68 69 6e 20 63 75 72 72 65 6e 74 20   within current 
41b0: 6c 65 61 66 20 2a 2f 0a 0a 20 20 2f 2a 20 4e 65  leaf */..  /* Ne
41c0: 78 74 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 76  xt method */.  v
41d0: 6f 69 64 20 28 2a 78 4e 65 78 74 29 28 46 74 73  oid (*xNext)(Fts
41e0: 35 49 6e 64 65 78 2a 2c 20 46 74 73 35 53 65 67  5Index*, Fts5Seg
41f0: 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b 0a 0a 20  Iter*, int*);.. 
4200: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 61 6e 64   /* The page and
4210: 20 6f 66 66 73 65 74 20 66 72 6f 6d 20 77 68 69   offset from whi
4220: 63 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ch the current t
4230: 65 72 6d 20 77 61 73 20 72 65 61 64 2e 20 54 68  erm was read. Th
4240: 65 20 6f 66 66 73 65 74 20 0a 20 20 2a 2a 20 69  e offset .  ** i
4250: 73 20 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20  s the offset of 
4260: 74 68 65 20 66 69 72 73 74 20 72 6f 77 69 64 20  the first rowid 
4270: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 64  in the current d
4280: 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 69 6e  oclist.  */.  in
4290: 74 20 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3b  t iTermLeafPgno;
42a0: 0a 20 20 69 6e 74 20 69 54 65 72 6d 4c 65 61 66  .  int iTermLeaf
42b0: 4f 66 66 73 65 74 3b 0a 0a 20 20 69 6e 74 20 69  Offset;..  int i
42c0: 50 67 69 64 78 4f 66 66 3b 20 20 20 20 20 20 20  PgidxOff;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
42e0: 78 74 20 6f 66 66 73 65 74 20 69 6e 20 70 67 69  xt offset in pgi
42f0: 64 78 20 2a 2f 0a 20 20 69 6e 74 20 69 45 6e 64  dx */.  int iEnd
4300: 6f 66 44 6f 63 6c 69 73 74 3b 0a 0a 20 20 2f 2a  ofDoclist;..  /*
4310: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
4320: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 69 66 20  re only used if 
4330: 74 68 65 20 46 54 53 35 5f 53 45 47 49 54 45 52  the FTS5_SEGITER
4340: 5f 52 45 56 45 52 53 45 20 66 6c 61 67 20 69 73  _REVERSE flag is
4350: 20 73 65 74 2e 20 2a 2f 0a 20 20 69 6e 74 20 69   set. */.  int i
4360: 52 6f 77 69 64 4f 66 66 73 65 74 3b 20 20 20 20  RowidOffset;    
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4380: 72 72 65 6e 74 20 65 6e 74 72 79 20 69 6e 20 61  rrent entry in a
4390: 52 6f 77 69 64 4f 66 66 73 65 74 5b 5d 20 2a 2f  RowidOffset[] */
43a0: 0a 20 20 69 6e 74 20 6e 52 6f 77 69 64 4f 66 66  .  int nRowidOff
43b0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
43c0: 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
43d0: 73 69 7a 65 20 6f 66 20 61 52 6f 77 69 64 4f 66  size of aRowidOf
43e0: 66 73 65 74 5b 5d 20 61 72 72 61 79 20 2a 2f 0a  fset[] array */.
43f0: 20 20 69 6e 74 20 2a 61 52 6f 77 69 64 4f 66 66    int *aRowidOff
4400: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
4410: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6f 66    /* Array of of
4420: 66 73 65 74 20 74 6f 20 72 6f 77 69 64 20 66 69  fset to rowid fi
4430: 65 6c 64 73 20 2a 2f 0a 0a 20 20 46 74 73 35 44  elds */..  Fts5D
4440: 6c 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78  lidxIter *pDlidx
4450: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ;          /* If
4460: 20 74 68 65 72 65 20 69 73 20 61 20 64 6f 63 6c   there is a docl
4470: 69 73 74 2d 69 6e 64 65 78 20 2a 2f 0a 0a 20 20  ist-index */..  
4480: 2f 2a 20 56 61 72 69 61 62 6c 65 73 20 70 6f 70  /* Variables pop
4490: 75 6c 61 74 65 64 20 62 61 73 65 64 20 6f 6e 20  ulated based on 
44a0: 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 2a  current entry. *
44b0: 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
44c0: 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  erm;            
44d0: 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 74      /* Current t
44e0: 65 72 6d 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f  erm */.  i64 iRo
44f0: 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  wid;            
4500: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4510: 65 6e 74 20 72 6f 77 69 64 20 2a 2f 0a 20 20 69  ent rowid */.  i
4520: 6e 74 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20  nt nPos;        
4530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4540: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
4550: 73 20 69 6e 20 63 75 72 72 65 6e 74 20 70 6f 73  s in current pos
4560: 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 20 20  ition list */.  
4570: 75 38 20 62 44 65 6c 3b 20 20 20 20 20 20 20 20  u8 bDel;        
4580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4590: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 64  /* True if the d
45a0: 65 6c 65 74 65 20 66 6c 61 67 20 69 73 20 73 65  elete flag is se
45b0: 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  t */.};../*.** A
45c0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
45d0: 6e 74 65 72 20 74 6f 20 61 6e 20 46 74 73 35 44  nter to an Fts5D
45e0: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 74 68  ata structure th
45f0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 0a 2a  at contains a .*
4600: 2a 20 6c 65 61 66 20 70 61 67 65 2e 0a 2a 2f 0a  * leaf page..*/.
4610: 23 64 65 66 69 6e 65 20 41 53 53 45 52 54 5f 53  #define ASSERT_S
4620: 5a 4c 45 41 46 5f 4f 4b 28 78 29 20 61 73 73 65  ZLEAF_OK(x) asse
4630: 72 74 28 20 5c 0a 20 20 20 20 28 78 29 2d 3e 73  rt( \.    (x)->s
4640: 7a 4c 65 61 66 3d 3d 28 78 29 2d 3e 6e 6e 20 7c  zLeaf==(x)->nn |
4650: 7c 20 28 78 29 2d 3e 73 7a 4c 65 61 66 3d 3d 66  | (x)->szLeaf==f
4660: 74 73 35 47 65 74 55 31 36 28 26 28 78 29 2d 3e  ts5GetU16(&(x)->
4670: 70 5b 32 5d 29 20 5c 0a 29 0a 0a 23 64 65 66 69  p[2]) \.)..#defi
4680: 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f  ne FTS5_SEGITER_
4690: 4f 4e 45 54 45 52 4d 20 30 78 30 31 0a 23 64 65  ONETERM 0x01.#de
46a0: 66 69 6e 65 20 46 54 53 35 5f 53 45 47 49 54 45  fine FTS5_SEGITE
46b0: 52 5f 52 45 56 45 52 53 45 20 30 78 30 32 0a 0a  R_REVERSE 0x02..
46c0: 2f 2a 20 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  /* .** Argument 
46d0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
46e0: 61 6e 20 46 74 73 35 44 61 74 61 20 73 74 72 75  an Fts5Data stru
46f0: 63 74 75 72 65 20 74 68 61 74 20 63 6f 6e 74 61  cture that conta
4700: 69 6e 73 20 61 20 6c 65 61 66 0a 2a 2a 20 70 61  ins a leaf.** pa
4710: 67 65 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 65  ge. This macro e
4720: 76 61 6c 75 61 74 65 73 20 74 6f 20 74 72 75 65  valuates to true
4730: 20 69 66 20 74 68 65 20 6c 65 61 66 20 63 6f 6e   if the leaf con
4740: 74 61 69 6e 73 20 6e 6f 20 74 65 72 6d 73 2c 20  tains no terms, 
4750: 6f 72 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69  or.** false if i
4760: 74 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  t contains at le
4770: 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e 0a 2a 2f  ast one term..*/
4780: 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c 65 61  .#define fts5Lea
4790: 66 49 73 54 65 72 6d 6c 65 73 73 28 78 29 20 28  fIsTermless(x) (
47a0: 28 78 29 2d 3e 73 7a 4c 65 61 66 20 3e 3d 20 28  (x)->szLeaf >= (
47b0: 78 29 2d 3e 6e 6e 29 0a 0a 23 64 65 66 69 6e 65  x)->nn)..#define
47c0: 20 66 74 73 35 4c 65 61 66 54 65 72 6d 4f 66 66   fts5LeafTermOff
47d0: 28 78 2c 20 69 29 20 28 66 74 73 35 47 65 74 55  (x, i) (fts5GetU
47e0: 31 36 28 26 28 78 29 2d 3e 70 5b 28 78 29 2d 3e  16(&(x)->p[(x)->
47f0: 73 7a 4c 65 61 66 20 2b 20 28 69 29 2a 32 5d 29  szLeaf + (i)*2])
4800: 29 0a 0a 23 64 65 66 69 6e 65 20 66 74 73 35 4c  )..#define fts5L
4810: 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66  eafFirstRowidOff
4820: 28 78 29 20 28 66 74 73 35 47 65 74 55 31 36 28  (x) (fts5GetU16(
4830: 28 78 29 2d 3e 70 29 29 0a 0a 2f 2a 0a 2a 2a 20  (x)->p))../*.** 
4840: 4f 62 6a 65 63 74 20 66 6f 72 20 69 74 65 72 61  Object for itera
4850: 74 69 6e 67 20 74 68 72 6f 75 67 68 20 74 68 65  ting through the
4860: 20 6d 65 72 67 65 64 20 72 65 73 75 6c 74 73 20   merged results 
4870: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  of one or more s
4880: 65 67 6d 65 6e 74 73 2c 0a 2a 2a 20 76 69 73 69  egments,.** visi
4890: 74 69 6e 67 20 65 61 63 68 20 74 65 72 6d 2f 72  ting each term/r
48a0: 6f 77 69 64 20 70 61 69 72 20 69 6e 20 74 68 65  owid pair in the
48b0: 20 6d 65 72 67 65 64 20 64 61 74 61 2e 0a 2a 2a   merged data..**
48c0: 0a 2a 2a 20 6e 53 65 67 20 69 73 20 61 6c 77 61  .** nSeg is alwa
48d0: 79 73 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77  ys a power of tw
48e0: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
48f0: 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 6e  r equal to the n
4900: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 65 67 6d  umber of.** segm
4910: 65 6e 74 73 20 74 68 61 74 20 74 68 69 73 20 6f  ents that this o
4920: 62 6a 65 63 74 20 69 73 20 6d 65 72 67 69 6e 67  bject is merging
4930: 20 64 61 74 61 20 66 72 6f 6d 2e 20 42 6f 74 68   data from. Both
4940: 20 74 68 65 20 61 53 65 67 5b 5d 20 61 6e 64 0a   the aSeg[] and.
4950: 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
4960: 79 73 20 61 72 65 20 73 69 7a 65 64 20 61 74 20  ys are sized at 
4970: 6e 53 65 67 20 65 6e 74 72 69 65 73 2e 20 54 68  nSeg entries. Th
4980: 65 20 61 53 65 67 5b 5d 20 61 72 72 61 79 20 69  e aSeg[] array i
4990: 73 20 70 61 64 64 65 64 0a 2a 2a 20 77 69 74 68  s padded.** with
49a0: 20 7a 65 72 6f 65 64 20 6f 62 6a 65 63 74 73 20   zeroed objects 
49b0: 2d 20 74 68 65 73 65 20 61 72 65 20 68 61 6e 64  - these are hand
49c0: 6c 65 64 20 61 73 20 69 66 20 74 68 65 79 20 77  led as if they w
49d0: 65 72 65 20 69 74 65 72 61 74 6f 72 73 20 6f 70  ere iterators op
49e0: 65 6e 65 64 0a 2a 2a 20 6f 6e 20 65 6d 70 74 79  ened.** on empty
49f0: 20 73 65 67 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a   segments..**.**
4a00: 20 54 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   The results of 
4a10: 63 6f 6d 70 61 72 69 6e 67 20 73 65 67 6d 65 6e  comparing segmen
4a20: 74 73 20 61 53 65 67 5b 4e 5d 20 61 6e 64 20 61  ts aSeg[N] and a
4a30: 53 65 67 5b 4e 2b 31 5d 2c 20 77 68 65 72 65 20  Seg[N+1], where 
4a40: 4e 20 69 73 20 61 6e 0a 2a 2a 20 65 76 65 6e 20  N is an.** even 
4a50: 6e 75 6d 62 65 72 2c 20 69 73 20 73 74 6f 72 65  number, is store
4a60: 64 20 69 6e 20 61 46 69 72 73 74 5b 28 6e 53 65  d in aFirst[(nSe
4a70: 67 2b 4e 29 2f 32 5d 2e 20 54 68 65 20 22 72 65  g+N)/2]. The "re
4a80: 73 75 6c 74 22 20 6f 66 20 74 68 65 20 0a 2a 2a  sult" of the .**
4a90: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 74   comparison in t
4aa0: 68 69 73 20 63 6f 6e 74 65 78 74 20 69 73 20 74  his context is t
4ab0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
4ac0: 69 74 65 72 61 74 6f 72 20 74 68 61 74 20 63 75  iterator that cu
4ad0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74  rrently.** point
4ae0: 73 20 74 6f 20 74 68 65 20 73 6d 61 6c 6c 65 72  s to the smaller
4af0: 20 74 65 72 6d 2f 72 6f 77 69 64 20 63 6f 6d 62   term/rowid comb
4b00: 69 6e 61 74 69 6f 6e 2e 20 49 74 65 72 61 74 6f  ination. Iterato
4b10: 72 73 20 61 74 20 45 4f 46 20 61 72 65 0a 2a 2a  rs at EOF are.**
4b20: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
4b30: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61  e greater than a
4b40: 6c 6c 20 6f 74 68 65 72 20 69 74 65 72 61 74 6f  ll other iterato
4b50: 72 73 2e 0a 2a 2a 0a 2a 2a 20 61 46 69 72 73 74  rs..**.** aFirst
4b60: 5b 31 5d 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  [1] contains the
4b70: 20 69 6e 64 65 78 20 69 6e 20 61 53 65 67 5b 5d   index in aSeg[]
4b80: 20 6f 66 20 74 68 65 20 69 74 65 72 61 74 6f 72   of the iterator
4b90: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 0a   that points to.
4ba0: 2a 2a 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  ** the smallest 
4bb0: 6b 65 79 20 6f 76 65 72 61 6c 6c 2e 20 61 46 69  key overall. aFi
4bc0: 72 73 74 5b 30 5d 20 69 73 20 75 6e 75 73 65 64  rst[0] is unused
4bd0: 2e 20 0a 2a 2a 0a 2a 2a 20 70 6f 73 6c 69 73 74  . .**.** poslist
4be0: 3a 0a 2a 2a 20 20 20 55 73 65 64 20 62 79 20 73  :.**   Used by s
4bf0: 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 50 6f  qlite3Fts5IterPo
4c00: 73 6c 69 73 74 28 29 20 77 68 65 6e 20 74 68 65  slist() when the
4c10: 20 70 6f 73 6c 69 73 74 20 6e 65 65 64 73 20 74   poslist needs t
4c20: 6f 20 62 65 20 62 75 66 66 65 72 65 64 2e 0a 2a  o be buffered..*
4c30: 2a 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  *   There is no 
4c40: 77 61 79 20 74 6f 20 74 65 6c 6c 20 69 66 20 74  way to tell if t
4c50: 68 69 73 20 69 73 20 70 6f 70 75 6c 61 74 65 64  his is populated
4c60: 20 6f 72 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 72 75   or not..*/.stru
4c70: 63 74 20 46 74 73 35 49 74 65 72 20 7b 0a 20 20  ct Fts5Iter {.  
4c80: 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 62 61  Fts5IndexIter ba
4c90: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
4ca0: 2f 2a 20 42 61 73 65 20 63 6c 61 73 73 20 63 6f  /* Base class co
4cb0: 6e 74 61 69 6e 69 6e 67 20 6f 75 74 70 75 74 20  ntaining output 
4cc0: 76 61 72 73 20 2a 2f 0a 0a 20 20 46 74 73 35 49  vars */..  Fts5I
4cd0: 6e 64 65 78 20 2a 70 49 6e 64 65 78 3b 20 20 20  ndex *pIndex;   
4ce0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
4cf0: 64 65 78 20 74 68 61 74 20 6f 77 6e 73 20 74 68  dex that owns th
4d00: 69 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  is iterator */. 
4d10: 20 46 74 73 35 42 75 66 66 65 72 20 70 6f 73 6c   Fts5Buffer posl
4d20: 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ist;            
4d30: 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61   /* Buffer conta
4d40: 69 6e 69 6e 67 20 63 75 72 72 65 6e 74 20 70 6f  ining current po
4d50: 73 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 43  slist */.  Fts5C
4d60: 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
4d70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
4d80: 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
4d90: 6f 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  o these columns 
4da0: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 76 6f 6b 65 64  */..  /* Invoked
4db0: 20 74 6f 20 73 65 74 20 6f 75 74 70 75 74 20 76   to set output v
4dc0: 61 72 69 61 62 6c 65 73 2e 20 2a 2f 0a 20 20 76  ariables. */.  v
4dd0: 6f 69 64 20 28 2a 78 53 65 74 4f 75 74 70 75 74  oid (*xSetOutput
4de0: 73 29 28 46 74 73 35 49 74 65 72 2a 2c 20 46 74  s)(Fts5Iter*, Ft
4df0: 73 35 53 65 67 49 74 65 72 2a 29 3b 0a 0a 20 20  s5SegIter*);..  
4e00: 69 6e 74 20 6e 53 65 67 3b 20 20 20 20 20 20 20  int nSeg;       
4e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e20: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 53 65 67 5b  /* Size of aSeg[
4e30: 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74  ] array */.  int
4e40: 20 62 52 65 76 3b 20 20 20 20 20 20 20 20 20 20   bRev;          
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4e60: 54 72 75 65 20 74 6f 20 69 74 65 72 61 74 65 20  True to iterate 
4e70: 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
4e80: 20 2a 2f 0a 20 20 75 38 20 62 53 6b 69 70 45 6d   */.  u8 bSkipEm
4e90: 70 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  pty;            
4ea0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
4eb0: 20 73 6b 69 70 20 64 65 6c 65 74 65 64 20 65 6e   skip deleted en
4ec0: 74 72 69 65 73 20 2a 2f 0a 0a 20 20 69 36 34 20  tries */..  i64 
4ed0: 69 53 77 69 74 63 68 52 6f 77 69 64 3b 20 20 20  iSwitchRowid;   
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4ef0: 69 72 73 74 65 73 74 20 72 6f 77 69 64 20 6f 66  irstest rowid of
4f00: 20 6f 74 68 65 72 20 74 68 61 6e 20 61 46 69 72   other than aFir
4f10: 73 74 5b 31 5d 20 2a 2f 0a 20 20 46 74 73 35 43  st[1] */.  Fts5C
4f20: 52 65 73 75 6c 74 20 2a 61 46 69 72 73 74 3b 20  Result *aFirst; 
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
4f40: 72 72 65 6e 74 20 6d 65 72 67 65 20 73 74 61 74  rrent merge stat
4f50: 65 20 28 73 65 65 20 61 62 6f 76 65 29 20 2a 2f  e (see above) */
4f60: 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 61  .  Fts5SegIter a
4f70: 53 65 67 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Seg[1];         
4f80: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
4f90: 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 73  egment iterators
4fa0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 41   */.};.../*.** A
4fb0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
4fc0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65  e following type
4fd0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 74 65 72   is used to iter
4fe0: 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ate through the 
4ff0: 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66 20 61  contents.** of a
5000: 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 72   doclist-index r
5010: 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 70 44 61  ecord..**.** pDa
5020: 74 61 3a 0a 2a 2a 20 20 20 52 65 63 6f 72 64 20  ta:.**   Record 
5030: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
5040: 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 64 61 74  oclist-index dat
5050: 61 2e 0a 2a 2a 0a 2a 2a 20 62 45 6f 66 3a 0a 2a  a..**.** bEof:.*
5060: 2a 20 20 20 53 65 74 20 74 6f 20 74 72 75 65 20  *   Set to true 
5070: 6f 6e 63 65 20 69 74 65 72 61 74 6f 72 20 68 61  once iterator ha
5080: 73 20 72 65 61 63 68 65 64 20 45 4f 46 2e 0a 2a  s reached EOF..*
5090: 2a 0a 2a 2a 20 69 4f 66 66 3a 0a 2a 2a 20 20 20  *.** iOff:.**   
50a0: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 72 65  Set to the curre
50b0: 6e 74 20 6f 66 66 73 65 74 20 77 69 74 68 69 6e  nt offset within
50c0: 20 72 65 63 6f 72 64 20 70 44 61 74 61 2e 0a 2a   record pData..*
50d0: 2f 0a 73 74 72 75 63 74 20 46 74 73 35 44 6c 69  /.struct Fts5Dli
50e0: 64 78 4c 76 6c 20 7b 0a 20 20 46 74 73 35 44 61  dxLvl {.  Fts5Da
50f0: 74 61 20 2a 70 44 61 74 61 3b 20 20 20 20 20 20  ta *pData;      
5100: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
5110: 66 6f 72 20 63 75 72 72 65 6e 74 20 70 61 67 65  for current page
5120: 20 6f 66 20 74 68 69 73 20 6c 65 76 65 6c 20 2a   of this level *
5130: 2f 0a 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20  /.  int iOff;   
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6f 66 66    /* Current off
5160: 73 65 74 20 69 6e 74 6f 20 70 44 61 74 61 20 2a  set into pData *
5170: 2f 0a 20 20 69 6e 74 20 62 45 6f 66 3b 20 20 20  /.  int bEof;   
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 2f 2a 20 41 74 20 45 4f 46 20 61 6c 72 65    /* At EOF alre
51a0: 61 64 79 20 2a 2f 0a 20 20 69 6e 74 20 69 46 69  ady */.  int iFi
51b0: 72 73 74 4f 66 66 3b 20 20 20 20 20 20 20 20 20  rstOff;         
51c0: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
51d0: 79 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74  y reverse iterat
51e0: 6f 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 75 74  ors */..  /* Out
51f0: 70 75 74 20 76 61 72 69 61 62 6c 65 73 20 2a 2f  put variables */
5200: 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
5210: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5220: 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
5230: 6f 66 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  of current leaf 
5240: 70 61 67 65 20 2a 2f 0a 20 20 69 36 34 20 69 52  page */.  i64 iR
5250: 6f 77 69 64 3b 20 20 20 20 20 20 20 20 20 20 20  owid;           
5260: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5270: 20 72 6f 77 69 64 20 6f 6e 20 6c 65 61 66 20 69   rowid on leaf i
5280: 4c 65 61 66 50 67 6e 6f 20 2a 2f 0a 7d 3b 0a 73  LeafPgno */.};.s
5290: 74 72 75 63 74 20 46 74 73 35 44 6c 69 64 78 49  truct Fts5DlidxI
52a0: 74 65 72 20 7b 0a 20 20 69 6e 74 20 6e 4c 76 6c  ter {.  int nLvl
52b0: 3b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a  ;.  int iSegid;.
52c0: 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 61    Fts5DlidxLvl a
52d0: 4c 76 6c 5b 31 5d 3b 0a 7d 3b 0a 0a 73 74 61 74  Lvl[1];.};..stat
52e0: 69 63 20 76 6f 69 64 20 66 74 73 35 50 75 74 55  ic void fts5PutU
52f0: 31 36 28 75 38 20 2a 61 4f 75 74 2c 20 75 31 36  16(u8 *aOut, u16
5300: 20 69 56 61 6c 29 7b 0a 20 20 61 4f 75 74 5b 30   iVal){.  aOut[0
5310: 5d 20 3d 20 28 69 56 61 6c 3e 3e 38 29 3b 0a 20  ] = (iVal>>8);. 
5320: 20 61 4f 75 74 5b 31 5d 20 3d 20 28 69 56 61 6c   aOut[1] = (iVal
5330: 26 30 78 46 46 29 3b 0a 7d 0a 0a 73 74 61 74 69  &0xFF);.}..stati
5340: 63 20 75 31 36 20 66 74 73 35 47 65 74 55 31 36  c u16 fts5GetU16
5350: 28 63 6f 6e 73 74 20 75 38 20 2a 61 49 6e 29 7b  (const u8 *aIn){
5360: 0a 20 20 72 65 74 75 72 6e 20 28 28 75 31 36 29  .  return ((u16)
5370: 61 49 6e 5b 30 5d 20 3c 3c 20 38 29 20 2b 20 61  aIn[0] << 8) + a
5380: 49 6e 5b 31 5d 3b 0a 7d 20 0a 0a 2f 2a 0a 2a 2a  In[1];.} ../*.**
5390: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
53a0: 74 75 72 6e 20 61 20 62 75 66 66 65 72 20 61 74  turn a buffer at
53b0: 20 6c 65 61 73 74 20 6e 42 79 74 65 20 62 79 74   least nByte byt
53c0: 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
53d0: 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
53e0: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
53f0: 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 61 6e  , return NULL an
5400: 64 20 73 65 74 20 74 68 65 20 65 72 72 6f 72 20  d set the error 
5410: 63 6f 64 65 20 69 6e 0a 2a 2a 20 74 68 65 20 46  code in.** the F
5420: 74 73 35 49 6e 64 65 78 20 68 61 6e 64 6c 65 20  ts5Index handle 
5430: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
5440: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  rst argument..*/
5450: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 66 74  .static void *ft
5460: 73 35 49 64 78 4d 61 6c 6c 6f 63 28 46 74 73 35  s5IdxMalloc(Fts5
5470: 49 6e 64 65 78 20 2a 70 2c 20 73 71 6c 69 74 65  Index *p, sqlite
5480: 33 5f 69 6e 74 36 34 20 6e 42 79 74 65 29 7b 0a  3_int64 nByte){.
5490: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
54a0: 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
54b0: 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 7d  p->rc, nByte);.}
54c0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
54d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
54e0: 74 68 65 20 70 4c 65 66 74 20 62 75 66 66 65 72  the pLeft buffer
54f0: 20 77 69 74 68 20 74 68 65 20 70 52 69 67 68 74   with the pRight
5500: 2f 6e 52 69 67 68 74 20 62 6c 6f 62 2e 0a 2a 2a  /nRight blob..**
5510: 0a 2a 2a 20 52 65 74 75 72 6e 20 2d 76 65 20 69  .** Return -ve i
5520: 66 20 70 4c 65 66 74 20 69 73 20 73 6d 61 6c 6c  f pLeft is small
5530: 65 72 20 74 68 61 6e 20 70 52 69 67 68 74 2c 20  er than pRight, 
5540: 30 20 69 66 20 74 68 65 79 20 61 72 65 20 65 71  0 if they are eq
5550: 75 61 6c 20 6f 72 0a 2a 2a 20 2b 76 65 20 69 66  ual or.** +ve if
5560: 20 70 52 69 67 68 74 20 69 73 20 73 6d 61 6c 6c   pRight is small
5570: 65 72 20 74 68 61 6e 20 70 4c 65 66 74 2e 20 49  er than pLeft. I
5580: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 3a 0a 2a  n other words:.*
5590: 2a 0a 2a 2a 20 20 20 20 20 72 65 73 20 3d 20 2a  *.**     res = *
55a0: 70 4c 65 66 74 20 2d 20 2a 70 52 69 67 68 74 0a  pLeft - *pRight.
55b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
55c0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
55d0: 74 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  t fts5BufferComp
55e0: 61 72 65 42 6c 6f 62 28 0a 20 20 46 74 73 35 42  areBlob(.  Fts5B
55f0: 75 66 66 65 72 20 2a 70 4c 65 66 74 2c 20 20 20  uffer *pLeft,   
5600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
5610: 66 74 20 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ft hand side of 
5620: 63 6f 6d 70 61 72 69 73 6f 6e 20 2a 2f 0a 20 20  comparison */.  
5630: 63 6f 6e 73 74 20 75 38 20 2a 70 52 69 67 68 74  const u8 *pRight
5640: 2c 20 69 6e 74 20 6e 52 69 67 68 74 20 20 20 20  , int nRight    
5650: 2f 2a 20 52 69 67 68 74 20 68 61 6e 64 20 73 69  /* Right hand si
5660: 64 65 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  de of comparison
5670: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d   */.){.  int nCm
5680: 70 20 3d 20 4d 49 4e 28 70 4c 65 66 74 2d 3e 6e  p = MIN(pLeft->n
5690: 2c 20 6e 52 69 67 68 74 29 3b 0a 20 20 69 6e 74  , nRight);.  int
56a0: 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 70 4c   res = memcmp(pL
56b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2c 20  eft->p, pRight, 
56c0: 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  nCmp);.  return 
56d0: 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c 65 66 74  (res==0 ? (pLeft
56e0: 2d 3e 6e 20 2d 20 6e 52 69 67 68 74 29 20 3a 20  ->n - nRight) : 
56f0: 72 65 73 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  res);.}.#endif..
5700: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
5710: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
5720: 65 20 74 77 6f 20 62 75 66 66 65 72 73 20 75 73  e two buffers us
5730: 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 49 66  ing memcmp(). If
5740: 20 6f 6e 65 20 62 75 66 66 65 72 0a 2a 2a 20 69   one buffer.** i
5750: 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
5760: 65 20 6f 74 68 65 72 2c 20 69 74 20 69 73 20 63  e other, it is c
5770: 6f 6e 73 69 64 65 72 65 64 20 74 68 65 20 6c 65  onsidered the le
5780: 73 73 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  sser..**.** Retu
5790: 72 6e 20 2d 76 65 20 69 66 20 70 4c 65 66 74 20  rn -ve if pLeft 
57a0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57b0: 70 52 69 67 68 74 2c 20 30 20 69 66 20 74 68 65  pRight, 0 if the
57c0: 79 20 61 72 65 20 65 71 75 61 6c 20 6f 72 0a 2a  y are equal or.*
57d0: 2a 20 2b 76 65 20 69 66 20 70 52 69 67 68 74 20  * +ve if pRight 
57e0: 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
57f0: 70 4c 65 66 74 2e 20 49 6e 20 6f 74 68 65 72 20  pLeft. In other 
5800: 77 6f 72 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  words:.**.**    
5810: 20 72 65 73 20 3d 20 2a 70 4c 65 66 74 20 2d 20   res = *pLeft - 
5820: 2a 70 52 69 67 68 74 0a 2a 2f 0a 73 74 61 74 69  *pRight.*/.stati
5830: 63 20 69 6e 74 20 66 74 73 35 42 75 66 66 65 72  c int fts5Buffer
5840: 43 6f 6d 70 61 72 65 28 46 74 73 35 42 75 66 66  Compare(Fts5Buff
5850: 65 72 20 2a 70 4c 65 66 74 2c 20 46 74 73 35 42  er *pLeft, Fts5B
5860: 75 66 66 65 72 20 2a 70 52 69 67 68 74 29 7b 0a  uffer *pRight){.
5870: 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e    int nCmp = MIN
5880: 28 70 4c 65 66 74 2d 3e 6e 2c 20 70 52 69 67 68  (pLeft->n, pRigh
5890: 74 2d 3e 6e 29 3b 0a 20 20 69 6e 74 20 72 65 73  t->n);.  int res
58a0: 20 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 4c   = fts5Memcmp(pL
58b0: 65 66 74 2d 3e 70 2c 20 70 52 69 67 68 74 2d 3e  eft->p, pRight->
58c0: 70 2c 20 6e 43 6d 70 29 3b 0a 20 20 72 65 74 75  p, nCmp);.  retu
58d0: 72 6e 20 28 72 65 73 3d 3d 30 20 3f 20 28 70 4c  rn (res==0 ? (pL
58e0: 65 66 74 2d 3e 6e 20 2d 20 70 52 69 67 68 74 2d  eft->n - pRight-
58f0: 3e 6e 29 20 3a 20 72 65 73 29 3b 0a 7d 0a 0a 73  >n) : res);.}..s
5900: 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4c 65  tatic int fts5Le
5910: 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66 28 46  afFirstTermOff(F
5920: 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b  ts5Data *pLeaf){
5930: 0a 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 66 74  .  int ret;.  ft
5940: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
5950: 4c 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73  Leaf->p[pLeaf->s
5960: 7a 4c 65 61 66 5d 2c 20 72 65 74 29 3b 0a 20 20  zLeaf], ret);.  
5970: 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a 0a 2f  return ret;.}../
5980: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 72  *.** Close the r
5990: 65 61 64 2d 6f 6e 6c 79 20 62 6c 6f 62 20 68 61  ead-only blob ha
59a0: 6e 64 6c 65 2c 20 69 66 20 69 74 20 69 73 20 6f  ndle, if it is o
59b0: 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pen..*/.static v
59c0: 6f 69 64 20 66 74 73 35 43 6c 6f 73 65 52 65 61  oid fts5CloseRea
59d0: 64 65 72 28 46 74 73 35 49 6e 64 65 78 20 2a 70  der(Fts5Index *p
59e0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 52 65 61  ){.  if( p->pRea
59f0: 64 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  der ){.    sqlit
5a00: 65 33 5f 62 6c 6f 62 20 2a 70 52 65 61 64 65 72  e3_blob *pReader
5a10: 20 3d 20 70 2d 3e 70 52 65 61 64 65 72 3b 0a 20   = p->pReader;. 
5a20: 20 20 20 70 2d 3e 70 52 65 61 64 65 72 20 3d 20     p->pReader = 
5a30: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  0;.    sqlite3_b
5a40: 6c 6f 62 5f 63 6c 6f 73 65 28 70 52 65 61 64 65  lob_close(pReade
5a50: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
5a60: 20 52 65 74 72 69 65 76 65 20 61 20 72 65 63 6f   Retrieve a reco
5a70: 72 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  rd from the %_da
5a80: 74 61 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ta table..**.** 
5a90: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
5aa0: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
5ab0: 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72 72 6f  rned and an erro
5ac0: 72 20 6c 65 66 74 20 69 6e 20 74 68 65 20 0a 2a  r left in the .*
5ad0: 2a 20 46 74 73 35 49 6e 64 65 78 20 6f 62 6a 65  * Fts5Index obje
5ae0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 74  ct..*/.static Ft
5af0: 73 35 44 61 74 61 20 2a 66 74 73 35 44 61 74 61  s5Data *fts5Data
5b00: 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20 2a  Read(Fts5Index *
5b10: 70 2c 20 69 36 34 20 69 52 6f 77 69 64 29 7b 0a  p, i64 iRowid){.
5b20: 20 20 46 74 73 35 44 61 74 61 20 2a 70 52 65 74    Fts5Data *pRet
5b30: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 72   = 0;.  if( p->r
5b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5b50: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
5b60: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 20 20 69 66 28  ITE_OK;..    if(
5b70: 20 70 2d 3e 70 52 65 61 64 65 72 20 29 7b 0a 20   p->pReader ){. 
5b80: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c       /* This cal
5b90: 6c 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  l may return SQL
5ba0: 49 54 45 5f 41 42 4f 52 54 20 69 66 20 74 68 65  ITE_ABORT if the
5bb0: 72 65 20 68 61 73 20 62 65 65 6e 20 61 20 73 61  re has been a sa
5bc0: 76 65 70 6f 69 6e 74 0a 20 20 20 20 20 20 2a 2a  vepoint.      **
5bd0: 20 72 6f 6c 6c 62 61 63 6b 20 73 69 6e 63 65 20   rollback since 
5be0: 69 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64  it was last used
5bf0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
5c00: 20 6e 65 77 20 62 6c 6f 62 20 68 61 6e 64 6c 65   new blob handle
5c10: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71  .      ** is req
5c20: 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20  uired.  */.     
5c30: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
5c40: 42 6c 6f 62 20 3d 20 70 2d 3e 70 52 65 61 64 65  Blob = p->pReade
5c50: 72 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 61  r;.      p->pRea
5c60: 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  der = 0;.      r
5c70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
5c80: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
5c90: 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 61 73  Rowid);.      as
5ca0: 73 65 72 74 28 20 70 2d 3e 70 52 65 61 64 65 72  sert( p->pReader
5cb0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ==0 );.      p->
5cc0: 70 52 65 61 64 65 72 20 3d 20 70 42 6c 6f 62 3b  pReader = pBlob;
5cd0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
5ce0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5cf0: 20 20 20 20 66 74 73 35 43 6c 6f 73 65 52 65 61      fts5CloseRea
5d00: 64 65 72 28 70 29 3b 0a 20 20 20 20 20 20 7d 0a  der(p);.      }.
5d10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
5d20: 4c 49 54 45 5f 41 42 4f 52 54 20 29 20 72 63 20  LITE_ABORT ) rc 
5d30: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
5d40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
5d50: 65 20 62 6c 6f 62 20 68 61 6e 64 6c 65 20 69 73  e blob handle is
5d60: 20 6e 6f 74 20 6f 70 65 6e 20 61 74 20 74 68 69   not open at thi
5d70: 73 20 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 69 74  s point, open it
5d80: 20 61 6e 64 20 73 65 65 6b 20 0a 20 20 20 20 2a   and seek .    *
5d90: 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73 74  * to the request
5da0: 65 64 20 65 6e 74 72 79 2e 20 20 2a 2f 0a 20 20  ed entry.  */.  
5db0: 20 20 69 66 28 20 70 2d 3e 70 52 65 61 64 65 72    if( p->pReader
5dc0: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
5dd0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 46 74  E_OK ){.      Ft
5de0: 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
5df0: 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
5e00: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
5e10: 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70 43 6f  e3_blob_open(pCo
5e20: 6e 66 69 67 2d 3e 64 62 2c 20 0a 20 20 20 20 20  nfig->db, .     
5e30: 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
5e40: 62 2c 20 70 2d 3e 7a 44 61 74 61 54 62 6c 2c 20  b, p->zDataTbl, 
5e50: 22 62 6c 6f 63 6b 22 2c 20 69 52 6f 77 69 64 2c  "block", iRowid,
5e60: 20 30 2c 20 26 70 2d 3e 70 52 65 61 64 65 72 0a   0, &p->pReader.
5e70: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a        );.    }..
5e80: 20 20 20 20 2f 2a 20 49 66 20 65 69 74 68 65 72      /* If either
5e90: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f   of the sqlite3_
5ea0: 62 6c 6f 62 5f 6f 70 65 6e 28 29 20 6f 72 20 73  blob_open() or s
5eb0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
5ec0: 65 6e 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a  en() calls.    *
5ed0: 2a 20 61 62 6f 76 65 20 72 65 74 75 72 6e 65 64  * above returned
5ee0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 72   SQLITE_ERROR, r
5ef0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
5f00: 52 55 50 54 5f 56 54 41 42 20 69 6e 73 74 65 61  RUPT_VTAB instea
5f10: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 6c 20 74 68  d..    ** All th
5f20: 65 20 72 65 61 73 6f 6e 73 20 74 68 6f 73 65 20  e reasons those 
5f30: 66 75 6e 63 74 69 6f 6e 73 20 6d 69 67 68 74 20  functions might 
5f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
5f50: 52 4f 52 20 2d 20 6d 69 73 73 69 6e 67 0a 20 20  ROR - missing.  
5f60: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 6d 69 73 73    ** table, miss
5f70: 69 6e 67 20 72 6f 77 2c 20 6e 6f 6e 2d 62 6c 6f  ing row, non-blo
5f80: 62 2f 74 65 78 74 20 69 6e 20 62 6c 6f 63 6b 20  b/text in block 
5f90: 63 6f 6c 75 6d 6e 20 2d 20 69 6e 64 69 63 61 74  column - indicat
5fa0: 65 20 0a 20 20 20 20 2a 2a 20 62 61 63 6b 69 6e  e .    ** backin
5fb0: 67 20 73 74 6f 72 65 20 63 6f 72 72 75 70 74 69  g store corrupti
5fc0: 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  on.  */.    if( 
5fd0: 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
5fe0: 20 29 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52   ) rc = FTS5_COR
5ff0: 52 55 50 54 3b 0a 0a 20 20 20 20 69 66 28 20 72  RUPT;..    if( r
6000: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6010: 20 20 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d        u8 *aOut =
6020: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
6030: 20 20 2f 2a 20 52 65 61 64 20 62 6c 6f 62 20 64    /* Read blob d
6040: 61 74 61 20 69 6e 74 6f 20 74 68 69 73 20 62 75  ata into this bu
6050: 66 66 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ffer */.      in
6060: 74 20 6e 42 79 74 65 20 3d 20 73 71 6c 69 74 65  t nByte = sqlite
6070: 33 5f 62 6c 6f 62 5f 62 79 74 65 73 28 70 2d 3e  3_blob_bytes(p->
6080: 70 52 65 61 64 65 72 29 3b 0a 20 20 20 20 20 20  pReader);.      
6090: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 41  sqlite3_int64 nA
60a0: 6c 6c 6f 63 20 3d 20 73 69 7a 65 6f 66 28 46 74  lloc = sizeof(Ft
60b0: 73 35 44 61 74 61 29 20 2b 20 6e 42 79 74 65 20  s5Data) + nByte 
60c0: 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41 44 44  + FTS5_DATA_PADD
60d0: 49 4e 47 3b 0a 20 20 20 20 20 20 70 52 65 74 20  ING;.      pRet 
60e0: 3d 20 28 46 74 73 35 44 61 74 61 2a 29 73 71 6c  = (Fts5Data*)sql
60f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 41  ite3_malloc64(nA
6100: 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 69 66 28  lloc);.      if(
6110: 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20   pRet ){.       
6120: 20 70 52 65 74 2d 3e 6e 6e 20 3d 20 6e 42 79 74   pRet->nn = nByt
6130: 65 3b 0a 20 20 20 20 20 20 20 20 61 4f 75 74 20  e;.        aOut 
6140: 3d 20 70 52 65 74 2d 3e 70 20 3d 20 28 75 38 2a  = pRet->p = (u8*
6150: 29 26 70 52 65 74 5b 31 5d 3b 0a 20 20 20 20 20  )&pRet[1];.     
6160: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
6180: 4d 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  M;.      }..    
6190: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
61a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
61b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
61c0: 5f 72 65 61 64 28 70 2d 3e 70 52 65 61 64 65 72  _read(p->pReader
61d0: 2c 20 61 4f 75 74 2c 20 6e 42 79 74 65 2c 20 30  , aOut, nByte, 0
61e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
61f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6200: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
6210: 6c 69 74 65 33 5f 66 72 65 65 28 70 52 65 74 29  lite3_free(pRet)
6220: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 20 3d  ;.        pRet =
6230: 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
6240: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f  .        /* TODO
6250: 31 3a 20 46 69 78 20 74 68 69 73 20 2a 2f 0a 20  1: Fix this */. 
6260: 20 20 20 20 20 20 20 70 52 65 74 2d 3e 70 5b 6e         pRet->p[n
6270: 42 79 74 65 5d 20 3d 20 30 78 30 30 3b 0a 20 20  Byte] = 0x00;.  
6280: 20 20 20 20 20 20 70 52 65 74 2d 3e 73 7a 4c 65        pRet->szLe
6290: 61 66 20 3d 20 66 74 73 35 47 65 74 55 31 36 28  af = fts5GetU16(
62a0: 26 70 52 65 74 2d 3e 70 5b 32 5d 29 3b 0a 20 20  &pRet->p[2]);.  
62b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
62c0: 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20  p->rc = rc;.    
62d0: 70 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 7d 0a  p->nRead++;.  }.
62e0: 0a 20 20 61 73 73 65 72 74 28 20 28 70 52 65 74  .  assert( (pRet
62f0: 3d 3d 30 29 3d 3d 28 70 2d 3e 72 63 21 3d 53 51  ==0)==(p->rc!=SQ
6300: 4c 49 54 45 5f 4f 4b 29 20 29 3b 0a 20 20 72 65  LITE_OK) );.  re
6310: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn pRet;.}../*
6320: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 72 65  .** Release a re
6330: 66 65 72 65 6e 63 65 20 74 6f 20 64 61 74 61 20  ference to data 
6340: 72 65 63 6f 72 64 20 72 65 74 75 72 6e 65 64 20  record returned 
6350: 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61  by an earlier ca
6360: 6c 6c 20 74 6f 0a 2a 2a 20 66 74 73 35 44 61 74  ll to.** fts5Dat
6370: 61 52 65 61 64 28 29 2e 0a 2a 2f 0a 73 74 61 74  aRead()..*/.stat
6380: 69 63 20 76 6f 69 64 20 66 74 73 35 44 61 74 61  ic void fts5Data
6390: 52 65 6c 65 61 73 65 28 46 74 73 35 44 61 74 61  Release(Fts5Data
63a0: 20 2a 70 44 61 74 61 29 7b 0a 20 20 73 71 6c 69   *pData){.  sqli
63b0: 74 65 33 5f 66 72 65 65 28 70 44 61 74 61 29 3b  te3_free(pData);
63c0: 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 44  .}..static Fts5D
63d0: 61 74 61 20 2a 66 74 73 35 4c 65 61 66 52 65 61  ata *fts5LeafRea
63e0: 64 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  d(Fts5Index *p, 
63f0: 69 36 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 46  i64 iRowid){.  F
6400: 74 73 35 44 61 74 61 20 2a 70 52 65 74 20 3d 20  ts5Data *pRet = 
6410: 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
6420: 69 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 70  iRowid);.  if( p
6430: 52 65 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Ret ){.    if( p
6440: 52 65 74 2d 3e 73 7a 4c 65 61 66 3e 70 52 65 74  Ret->szLeaf>pRet
6450: 2d 3e 6e 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d  ->nn ){.      p-
6460: 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
6470: 50 54 3b 0a 20 20 20 20 20 20 66 74 73 35 44 61  PT;.      fts5Da
6480: 74 61 52 65 6c 65 61 73 65 28 70 52 65 74 29 3b  taRelease(pRet);
6490: 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
64a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
64b0: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 73 74 61  urn pRet;.}..sta
64c0: 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
64d0: 78 50 72 65 70 61 72 65 53 74 6d 74 28 0a 20 20  xPrepareStmt(.  
64e0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20  Fts5Index *p,.  
64f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
6500: 70 53 74 6d 74 2c 0a 20 20 63 68 61 72 20 2a 7a  pStmt,.  char *z
6510: 53 71 6c 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Sql.){.  if( p->
6520: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6530: 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 20 29 7b  .    if( zSql ){
6540: 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  .      p->rc = s
6550: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
6560: 33 28 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 64 62  3(p->pConfig->db
6570: 2c 20 7a 53 71 6c 2c 20 2d 31 2c 0a 20 20 20 20  , zSql, -1,.    
6580: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 50 52 45        SQLITE_PRE
6590: 50 41 52 45 5f 50 45 52 53 49 53 54 45 4e 54 7c  PARE_PERSISTENT|
65a0: 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 4e  SQLITE_PREPARE_N
65b0: 4f 5f 56 54 41 42 2c 0a 20 20 20 20 20 20 20 20  O_VTAB,.        
65c0: 20 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20    ppStmt, 0);.  
65d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
65e0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  ->rc = SQLITE_NO
65f0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
6600: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
6610: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ql);.  return p-
6620: 3e 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49  >rc;.}.../*.** I
6630: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
6640: 20 61 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74   a record into t
6650: 68 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  he %_data table.
6660: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6670: 66 74 73 35 44 61 74 61 57 72 69 74 65 28 46 74  fts5DataWrite(Ft
6680: 73 35 49 6e 64 65 78 20 2a 70 2c 20 69 36 34 20  s5Index *p, i64 
6690: 69 52 6f 77 69 64 2c 20 63 6f 6e 73 74 20 75 38  iRowid, const u8
66a0: 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61   *pData, int nDa
66b0: 74 61 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63  ta){.  if( p->rc
66c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
66d0: 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  turn;..  if( p->
66e0: 70 57 72 69 74 65 72 3d 3d 30 20 29 7b 0a 20 20  pWriter==0 ){.  
66f0: 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70 43    Fts5Config *pC
6700: 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e 66  onfig = p->pConf
6710: 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64 65  ig;.    fts5Inde
6720: 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
6730: 26 70 2d 3e 70 57 72 69 74 65 72 2c 20 73 71 6c  &p->pWriter, sql
6740: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
6750: 20 20 20 20 20 20 20 20 22 52 45 50 4c 41 43 45          "REPLACE
6760: 20 49 4e 54 4f 20 27 25 71 27 2e 27 25 71 5f 64   INTO '%q'.'%q_d
6770: 61 74 61 27 28 69 64 2c 20 62 6c 6f 63 6b 29 20  ata'(id, block) 
6780: 56 41 4c 55 45 53 28 3f 2c 3f 29 22 2c 20 0a 20  VALUES(?,?)", . 
6790: 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66 69 67           pConfig
67a0: 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67 2d 3e  ->zDb, pConfig->
67b0: 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a 20 20  zName.    ));.  
67c0: 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65    if( p->rc ) re
67d0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  turn;.  }..  sql
67e0: 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
67f0: 70 2d 3e 70 57 72 69 74 65 72 2c 20 31 2c 20 69  p->pWriter, 1, i
6800: 52 6f 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65  Rowid);.  sqlite
6810: 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
6820: 57 72 69 74 65 72 2c 20 32 2c 20 70 44 61 74 61  Writer, 2, pData
6830: 2c 20 6e 44 61 74 61 2c 20 53 51 4c 49 54 45 5f  , nData, SQLITE_
6840: 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
6850: 65 33 5f 73 74 65 70 28 70 2d 3e 70 57 72 69 74  e3_step(p->pWrit
6860: 65 72 29 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 73  er);.  p->rc = s
6870: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
6880: 70 57 72 69 74 65 72 29 3b 0a 20 20 73 71 6c 69  pWriter);.  sqli
6890: 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d  te3_bind_null(p-
68a0: 3e 70 57 72 69 74 65 72 2c 20 32 29 3b 0a 7d 0a  >pWriter, 2);.}.
68b0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 74  ./*.** Execute t
68c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 53 51 4c  he following SQL
68d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 44 45 4c 45  :.**.**     DELE
68e0: 54 45 20 46 52 4f 4d 20 25 5f 64 61 74 61 20 57  TE FROM %_data W
68f0: 48 45 52 45 20 69 64 20 42 45 54 57 45 45 4e 20  HERE id BETWEEN 
6900: 24 69 46 69 72 73 74 20 41 4e 44 20 24 69 4c 61  $iFirst AND $iLa
6910: 73 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  st.*/.static voi
6920: 64 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65  d fts5DataDelete
6930: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 69  (Fts5Index *p, i
6940: 36 34 20 69 46 69 72 73 74 2c 20 69 36 34 20 69  64 iFirst, i64 i
6950: 4c 61 73 74 29 7b 0a 20 20 69 66 28 20 70 2d 3e  Last){.  if( p->
6960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6970: 72 65 74 75 72 6e 3b 0a 0a 20 20 69 66 28 20 70  return;..  if( p
6980: 2d 3e 70 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b  ->pDeleter==0 ){
6990: 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
69a0: 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
69b0: 6f 6e 66 69 67 3b 0a 20 20 20 20 63 68 61 72 20  onfig;.    char 
69c0: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
69d0: 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
69e0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 27 25   "DELETE FROM '%
69f0: 71 27 2e 27 25 71 5f 64 61 74 61 27 20 57 48 45  q'.'%q_data' WHE
6a00: 52 45 20 69 64 3e 3d 3f 20 41 4e 44 20 69 64 3c  RE id>=? AND id<
6a10: 3d 3f 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  =?", .          
6a20: 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
6a30: 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20 20 20  onfig->zName.   
6a40: 20 29 3b 0a 20 20 20 20 69 66 28 20 66 74 73 35   );.    if( fts5
6a50: 49 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74  IndexPrepareStmt
6a60: 28 70 2c 20 26 70 2d 3e 70 44 65 6c 65 74 65 72  (p, &p->pDeleter
6a70: 2c 20 7a 53 71 6c 29 20 29 20 72 65 74 75 72 6e  , zSql) ) return
6a80: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
6a90: 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70  _bind_int64(p->p
6aa0: 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 46 69 72  Deleter, 1, iFir
6ab0: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62  st);.  sqlite3_b
6ac0: 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 44 65  ind_int64(p->pDe
6ad0: 6c 65 74 65 72 2c 20 32 2c 20 69 4c 61 73 74 29  leter, 2, iLast)
6ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
6af0: 28 70 2d 3e 70 44 65 6c 65 74 65 72 29 3b 0a 20  (p->pDeleter);. 
6b00: 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
6b10: 5f 72 65 73 65 74 28 70 2d 3e 70 44 65 6c 65 74  _reset(p->pDelet
6b20: 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
6b30: 6d 6f 76 65 20 61 6c 6c 20 72 65 63 6f 72 64 73  move all records
6b40: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
6b50: 20 73 65 67 6d 65 6e 74 20 69 53 65 67 69 64 2e   segment iSegid.
6b60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6b70: 66 74 73 35 44 61 74 61 52 65 6d 6f 76 65 53 65  fts5DataRemoveSe
6b80: 67 6d 65 6e 74 28 46 74 73 35 49 6e 64 65 78 20  gment(Fts5Index 
6b90: 2a 70 2c 20 69 6e 74 20 69 53 65 67 69 64 29 7b  *p, int iSegid){
6ba0: 0a 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20  .  i64 iFirst = 
6bb0: 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
6bc0: 49 44 28 69 53 65 67 69 64 2c 20 30 29 3b 0a 20  ID(iSegid, 0);. 
6bd0: 20 69 36 34 20 69 4c 61 73 74 20 3d 20 46 54 53   i64 iLast = FTS
6be0: 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
6bf0: 69 53 65 67 69 64 2b 31 2c 20 30 29 2d 31 3b 0a  iSegid+1, 0)-1;.
6c00: 20 20 66 74 73 35 44 61 74 61 44 65 6c 65 74 65    fts5DataDelete
6c10: 28 70 2c 20 69 46 69 72 73 74 2c 20 69 4c 61 73  (p, iFirst, iLas
6c20: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 49 64  t);.  if( p->pId
6c30: 78 44 65 6c 65 74 65 72 3d 3d 30 20 29 7b 0a 20  xDeleter==0 ){. 
6c40: 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
6c50: 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43 6f 6e  Config = p->pCon
6c60: 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49 6e 64  fig;.    fts5Ind
6c70: 65 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c  exPrepareStmt(p,
6c80: 20 26 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72   &p->pIdxDeleter
6c90: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
6ca0: 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 44 45  f(.          "DE
6cb0: 4c 45 54 45 20 46 52 4f 4d 20 27 25 71 27 2e 27  LETE FROM '%q'.'
6cc0: 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
6cd0: 67 69 64 3d 3f 22 2c 0a 20 20 20 20 20 20 20 20  gid=?",.        
6ce0: 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
6cf0: 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
6d00: 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28     ));.  }.  if(
6d10: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
6d20: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
6d30: 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64  _bind_int(p->pId
6d40: 78 44 65 6c 65 74 65 72 2c 20 31 2c 20 69 53 65  xDeleter, 1, iSe
6d50: 67 69 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  gid);.    sqlite
6d60: 33 5f 73 74 65 70 28 70 2d 3e 70 49 64 78 44 65  3_step(p->pIdxDe
6d70: 6c 65 74 65 72 29 3b 0a 20 20 20 20 70 2d 3e 72  leter);.    p->r
6d80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
6d90: 74 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  t(p->pIdxDeleter
6da0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6db0: 52 65 6c 65 61 73 65 20 61 20 72 65 66 65 72 65  Release a refere
6dc0: 6e 63 65 20 74 6f 20 61 6e 20 46 74 73 35 53 74  nce to an Fts5St
6dd0: 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 20 72  ructure object r
6de0: 65 74 75 72 6e 65 64 20 62 79 20 61 6e 20 65 61  eturned by an ea
6df0: 72 6c 69 65 72 20 0a 2a 2a 20 63 61 6c 6c 20 74  rlier .** call t
6e00: 6f 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  o fts5StructureR
6e10: 65 61 64 28 29 20 6f 72 20 66 74 73 35 53 74 72  ead() or fts5Str
6e20: 75 63 74 75 72 65 44 65 63 6f 64 65 28 29 2e 0a  uctureDecode()..
6e30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
6e40: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65  ts5StructureRele
6e50: 61 73 65 28 46 74 73 35 53 74 72 75 63 74 75 72  ase(Fts5Structur
6e60: 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69  e *pStruct){.  i
6e70: 66 28 20 70 53 74 72 75 63 74 20 26 26 20 30 3e  f( pStruct && 0>
6e80: 3d 28 2d 2d 70 53 74 72 75 63 74 2d 3e 6e 52 65  =(--pStruct->nRe
6e90: 66 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  f) ){.    int i;
6ea0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74  .    assert( pSt
6eb0: 72 75 63 74 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ruct->nRef==0 );
6ec0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6ed0: 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b  pStruct->nLevel;
6ee0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
6ef0: 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75 63  ite3_free(pStruc
6f00: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61 53 65  t->aLevel[i].aSe
6f10: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  g);.    }.    sq
6f20: 6c 69 74 65 33 5f 66 72 65 65 28 70 53 74 72 75  lite3_free(pStru
6f30: 63 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  ct);.  }.}..stat
6f40: 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72 75  ic void fts5Stru
6f50: 63 74 75 72 65 52 65 66 28 46 74 73 35 53 74 72  ctureRef(Fts5Str
6f60: 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
6f70: 7b 0a 20 20 70 53 74 72 75 63 74 2d 3e 6e 52 65  {.  pStruct->nRe
6f80: 66 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  f++;.}../*.** De
6f90: 73 65 72 69 61 6c 69 7a 65 20 61 6e 64 20 72 65  serialize and re
6fa0: 74 75 72 6e 20 74 68 65 20 73 74 72 75 63 74 75  turn the structu
6fb0: 72 65 20 72 65 63 6f 72 64 20 63 75 72 72 65 6e  re record curren
6fc0: 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 20 73 65  tly stored in se
6fd0: 72 69 61 6c 69 7a 65 64 0a 2a 2a 20 66 6f 72 6d  rialized.** form
6fe0: 20 77 69 74 68 69 6e 20 62 75 66 66 65 72 20 70   within buffer p
6ff0: 44 61 74 61 2f 6e 44 61 74 61 2e 0a 2a 2a 0a 2a  Data/nData..**.*
7000: 2a 20 54 68 65 20 46 74 73 35 53 74 72 75 63 74  * The Fts5Struct
7010: 75 72 65 2e 61 4c 65 76 65 6c 5b 5d 20 61 6e 64  ure.aLevel[] and
7020: 20 65 61 63 68 20 46 74 73 35 53 74 72 75 63 74   each Fts5Struct
7030: 75 72 65 4c 65 76 65 6c 2e 61 53 65 67 5b 5d 20  ureLevel.aSeg[] 
7040: 61 72 72 61 79 0a 2a 2a 20 61 72 65 20 6f 76 65  array.** are ove
7050: 72 2d 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 6f  r-allocated by o
7060: 6e 65 20 73 6c 6f 74 2e 20 54 68 69 73 20 61 6c  ne slot. This al
7070: 6c 6f 77 73 20 74 68 65 20 73 74 72 75 63 74 75  lows the structu
7080: 72 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 74  re contents.** t
7090: 6f 20 62 65 20 6d 6f 72 65 20 65 61 73 69 6c 79  o be more easily
70a0: 20 65 64 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   edited..**.** I
70b0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
70c0: 73 2c 20 2a 70 70 4f 75 74 20 69 73 20 73 65 74  s, *ppOut is set
70d0: 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 61 6e 20   to NULL and an 
70e0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
70f0: 65 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  e.** returned. O
7100: 74 68 65 72 77 69 73 65 2c 20 2a 70 70 4f 75 74  therwise, *ppOut
7110: 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   is set to point
7120: 20 74 6f 20 74 68 65 20 6e 65 77 20 6f 62 6a 65   to the new obje
7130: 63 74 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  ct and.** SQLITE
7140: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
7150: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
7160: 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
7170: 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
7180: 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
7190: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e     /* Buffer con
71a0: 74 61 69 6e 69 6e 67 20 73 65 72 69 61 6c 69 7a  taining serializ
71b0: 65 64 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ed structure */.
71c0: 20 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 20    int nData,    
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71e0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75 66    /* Size of buf
71f0: 66 65 72 20 70 44 61 74 61 20 69 6e 20 62 79 74  fer pData in byt
7200: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 43  es */.  int *piC
7210: 6f 6f 6b 69 65 2c 20 20 20 20 20 20 20 20 20 20  ookie,          
7220: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
7230: 67 75 72 61 74 69 6f 6e 20 63 6f 6f 6b 69 65 20  guration cookie 
7240: 76 61 6c 75 65 20 2a 2f 0a 20 20 46 74 73 35 53  value */.  Fts5S
7250: 74 72 75 63 74 75 72 65 20 2a 2a 70 70 4f 75 74  tructure **ppOut
7260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
7270: 54 3a 20 44 65 73 65 72 69 61 6c 69 7a 65 64 20  T: Deserialized 
7280: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
7290: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
72a0: 4b 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  K;.  int i = 0;.
72b0: 20 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 69 6e    int iLvl;.  in
72c0: 74 20 6e 4c 65 76 65 6c 20 3d 20 30 3b 0a 20 20  t nLevel = 0;.  
72d0: 69 6e 74 20 6e 53 65 67 6d 65 6e 74 20 3d 20 30  int nSegment = 0
72e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
72f0: 34 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  4 nByte;        
7300: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
7310: 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
7320: 65 20 61 74 20 70 52 65 74 20 2a 2f 0a 20 20 46  e at pRet */.  F
7330: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 52  ts5Structure *pR
7340: 65 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  et = 0;        /
7350: 2a 20 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65  * Structure obje
7360: 63 74 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  ct to return */.
7370: 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65 20 63  .  /* Grab the c
7380: 6f 6f 6b 69 65 20 76 61 6c 75 65 20 2a 2f 0a 20  ookie value */. 
7390: 20 69 66 28 20 70 69 43 6f 6f 6b 69 65 20 29 20   if( piCookie ) 
73a0: 2a 70 69 43 6f 6f 6b 69 65 20 3d 20 73 71 6c 69  *piCookie = sqli
73b0: 74 65 33 46 74 73 35 47 65 74 33 32 28 70 44 61  te3Fts5Get32(pDa
73c0: 74 61 29 3b 0a 20 20 69 20 3d 20 34 3b 0a 0a 20  ta);.  i = 4;.. 
73d0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 74 6f 74   /* Read the tot
73e0: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 6c 65 76  al number of lev
73f0: 65 6c 73 20 61 6e 64 20 73 65 67 6d 65 6e 74 73  els and segments
7400: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 72 74 20   from the start 
7410: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 74 72 75  of the.  ** stru
7420: 63 74 75 72 65 20 72 65 63 6f 72 64 2e 20 20 2a  cture record.  *
7430: 2f 0a 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74  /.  i += fts5Get
7440: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
7450: 69 5d 2c 20 6e 4c 65 76 65 6c 29 3b 0a 20 20 69  i], nLevel);.  i
7460: 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
7470: 74 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e  t32(&pData[i], n
7480: 53 65 67 6d 65 6e 74 29 3b 0a 20 20 69 66 28 20  Segment);.  if( 
7490: 6e 4c 65 76 65 6c 3e 46 54 53 35 5f 4d 41 58 5f  nLevel>FTS5_MAX_
74a0: 53 45 47 4d 45 4e 54 20 20 20 7c 7c 20 6e 4c 65  SEGMENT   || nLe
74b0: 76 65 6c 3c 30 0a 20 20 20 7c 7c 20 6e 53 65 67  vel<0.   || nSeg
74c0: 6d 65 6e 74 3e 46 54 53 35 5f 4d 41 58 5f 53 45  ment>FTS5_MAX_SE
74d0: 47 4d 45 4e 54 20 7c 7c 20 6e 53 65 67 6d 65 6e  GMENT || nSegmen
74e0: 74 3c 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  t<0.  ){.    ret
74f0: 75 72 6e 20 46 54 53 35 5f 43 4f 52 52 55 50 54  urn FTS5_CORRUPT
7500: 3b 0a 20 20 7d 0a 20 20 6e 42 79 74 65 20 3d 20  ;.  }.  nByte = 
7510: 28 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  (.      sizeof(F
7520: 74 73 35 53 74 72 75 63 74 75 72 65 29 20 2b 20  ts5Structure) + 
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7540: 20 20 20 2f 2a 20 4d 61 69 6e 20 73 74 72 75 63     /* Main struc
7550: 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 73 69  ture */.      si
7560: 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75  zeof(Fts5Structu
7570: 72 65 4c 65 76 65 6c 29 20 2a 20 28 6e 4c 65 76  reLevel) * (nLev
7580: 65 6c 2d 31 29 20 20 20 20 2f 2a 20 61 4c 65 76  el-1)    /* aLev
7590: 65 6c 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  el[] array */.  
75a0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 28 46 74 73  );.  pRet = (Fts
75b0: 35 53 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69  5Structure*)sqli
75c0: 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72  te3Fts5MallocZer
75d0: 6f 28 26 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a  o(&rc, nByte);..
75e0: 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20    if( pRet ){.  
75f0: 20 20 70 52 65 74 2d 3e 6e 52 65 66 20 3d 20 31    pRet->nRef = 1
7600: 3b 0a 20 20 20 20 70 52 65 74 2d 3e 6e 4c 65 76  ;.    pRet->nLev
7610: 65 6c 20 3d 20 6e 4c 65 76 65 6c 3b 0a 20 20 20  el = nLevel;.   
7620: 20 70 52 65 74 2d 3e 6e 53 65 67 6d 65 6e 74 20   pRet->nSegment 
7630: 3d 20 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20  = nSegment;.    
7640: 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
7650: 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
7660: 5b 69 5d 2c 20 26 70 52 65 74 2d 3e 6e 57 72 69  [i], &pRet->nWri
7670: 74 65 43 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20  teCounter);..   
7680: 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 72 63 3d   for(iLvl=0; rc=
7690: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c  =SQLITE_OK && iL
76a0: 76 6c 3c 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  vl<nLevel; iLvl+
76b0: 2b 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74  +){.      Fts5St
76c0: 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c  ructureLevel *pL
76d0: 76 6c 20 3d 20 26 70 52 65 74 2d 3e 61 4c 65 76  vl = &pRet->aLev
76e0: 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20 20 20  el[iLvl];.      
76f0: 69 6e 74 20 6e 54 6f 74 61 6c 20 3d 20 30 3b 0a  int nTotal = 0;.
7700: 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b 0a        int iSeg;.
7710: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 44  .      if( i>=nD
7720: 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ata ){.        r
7730: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7740: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7750: 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35         i += fts5
7760: 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 44 61  GetVarint32(&pDa
7770: 74 61 5b 69 5d 2c 20 70 4c 76 6c 2d 3e 6e 4d 65  ta[i], pLvl->nMe
7780: 72 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 20  rge);.        i 
7790: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
77a0: 33 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 6e 54  32(&pData[i], nT
77b0: 6f 74 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  otal);.        i
77c0: 66 28 20 6e 54 6f 74 61 6c 3c 70 4c 76 6c 2d 3e  f( nTotal<pLvl->
77d0: 6e 4d 65 72 67 65 20 29 20 72 63 20 3d 20 46 54  nMerge ) rc = FT
77e0: 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
77f0: 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67 20 3d      pLvl->aSeg =
7800: 20 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53   (Fts5StructureS
7810: 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65 33 46  egment*)sqlite3F
7820: 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72  ts5MallocZero(&r
7830: 63 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  c, .            
7840: 6e 54 6f 74 61 6c 20 2a 20 73 69 7a 65 6f 66 28  nTotal * sizeof(
7850: 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67  Fts5StructureSeg
7860: 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 20 29 3b  ment).        );
7870: 0a 20 20 20 20 20 20 20 20 6e 53 65 67 6d 65 6e  .        nSegmen
7880: 74 20 2d 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20 20  t -= nTotal;.   
7890: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
78a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
78b0: 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d 3e 6e  .        pLvl->n
78c0: 53 65 67 20 3d 20 6e 54 6f 74 61 6c 3b 0a 20 20  Seg = nTotal;.  
78d0: 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30        for(iSeg=0
78e0: 3b 20 69 53 65 67 3c 6e 54 6f 74 61 6c 3b 20 69  ; iSeg<nTotal; i
78f0: 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Seg++){.        
7900: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
7910: 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20 26  egment *pSeg = &
7920: 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 5d  pLvl->aSeg[iSeg]
7930: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
7940: 69 3e 3d 6e 44 61 74 61 20 29 7b 0a 20 20 20 20  i>=nData ){.    
7950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 46 54 53          rc = FTS
7960: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
7970: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
7980: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7990: 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74      i += fts5Get
79a0: 56 61 72 69 6e 74 33 32 28 26 70 44 61 74 61 5b  Varint32(&pData[
79b0: 69 5d 2c 20 70 53 65 67 2d 3e 69 53 65 67 69 64  i], pSeg->iSegid
79c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b  );.          i +
79d0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
79e0: 32 28 26 70 44 61 74 61 5b 69 5d 2c 20 70 53 65  2(&pData[i], pSe
79f0: 67 2d 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g->pgnoFirst);. 
7a00: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 66 74           i += ft
7a10: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70  s5GetVarint32(&p
7a20: 44 61 74 61 5b 69 5d 2c 20 70 53 65 67 2d 3e 70  Data[i], pSeg->p
7a30: 67 6e 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20  gnoLast);.      
7a40: 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67      if( pSeg->pg
7a50: 6e 6f 4c 61 73 74 3c 70 53 65 67 2d 3e 70 67 6e  noLast<pSeg->pgn
7a60: 6f 46 69 72 73 74 20 29 7b 0a 20 20 20 20 20 20  oFirst ){.      
7a70: 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
7a80: 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
7a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7aa0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7ab0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4c  }.        if( iL
7ac0: 76 6c 3e 30 20 26 26 20 70 4c 76 6c 5b 2d 31 5d  vl>0 && pLvl[-1]
7ad0: 2e 6e 4d 65 72 67 65 20 26 26 20 6e 54 6f 74 61  .nMerge && nTota
7ae0: 6c 3d 3d 30 20 29 20 72 63 20 3d 20 46 54 53 35  l==0 ) rc = FTS5
7af0: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b00: 20 20 69 66 28 20 69 4c 76 6c 3d 3d 6e 4c 65 76    if( iLvl==nLev
7b10: 65 6c 2d 31 20 26 26 20 70 4c 76 6c 2d 3e 6e 4d  el-1 && pLvl->nM
7b20: 65 72 67 65 20 29 20 72 63 20 3d 20 46 54 53 35  erge ) rc = FTS5
7b30: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
7b40: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7b50: 6e 53 65 67 6d 65 6e 74 21 3d 30 20 26 26 20 72  nSegment!=0 && r
7b60: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c==SQLITE_OK ) r
7b70: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
7b80: 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
7b90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7ba0: 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52    fts5StructureR
7bb0: 65 6c 65 61 73 65 28 70 52 65 74 29 3b 0a 20 20  elease(pRet);.  
7bc0: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
7bd0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 4f 75    }.  }..  *ppOu
7be0: 74 20 3d 20 70 52 65 74 3b 0a 20 20 72 65 74 75  t = pRet;.  retu
7bf0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a  rn rc;.}../*.**.
7c00: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
7c10: 74 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c  ts5StructureAddL
7c20: 65 76 65 6c 28 69 6e 74 20 2a 70 52 63 2c 20 46  evel(int *pRc, F
7c30: 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70  ts5Structure **p
7c40: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 66 28 20  pStruct){.  if( 
7c50: 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
7c60: 29 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75 63  ){.    Fts5Struc
7c70: 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20  ture *pStruct = 
7c80: 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 20 20 69  *ppStruct;.    i
7c90: 6e 74 20 6e 4c 65 76 65 6c 20 3d 20 70 53 74 72  nt nLevel = pStr
7ca0: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 0a 20 20 20  uct->nLevel;.   
7cb0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
7cc0: 42 79 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20  Byte = (.       
7cd0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
7ce0: 63 74 75 72 65 29 20 2b 20 20 20 20 20 20 20 20  cture) +        
7cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 69            /* Mai
7d00: 6e 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  n structure */. 
7d10: 20 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74         sizeof(Ft
7d20: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7d30: 29 20 2a 20 28 6e 4c 65 76 65 6c 2b 31 29 20 20  ) * (nLevel+1)  
7d40: 2f 2a 20 61 4c 65 76 65 6c 5b 5d 20 61 72 72 61  /* aLevel[] arra
7d50: 79 20 2a 2f 0a 20 20 20 20 29 3b 0a 0a 20 20 20  y */.    );..   
7d60: 20 70 53 74 72 75 63 74 20 3d 20 73 71 6c 69 74   pStruct = sqlit
7d70: 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 53 74  e3_realloc64(pSt
7d80: 72 75 63 74 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ruct, nByte);.  
7d90: 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
7da0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70  .      memset(&p
7db0: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 6e  Struct->aLevel[n
7dc0: 4c 65 76 65 6c 5d 2c 20 30 2c 20 73 69 7a 65 6f  Level], 0, sizeo
7dd0: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 4c  f(Fts5StructureL
7de0: 65 76 65 6c 29 29 3b 0a 20 20 20 20 20 20 70 53  evel));.      pS
7df0: 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 2b 3b  truct->nLevel++;
7e00: 0a 20 20 20 20 20 20 2a 70 70 53 74 72 75 63 74  .      *ppStruct
7e10: 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 20 20   = pStruct;.    
7e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 52  }else{.      *pR
7e30: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
7e40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7e50: 2a 0a 2a 2a 20 45 78 74 65 6e 64 20 6c 65 76 65  *.** Extend leve
7e60: 6c 20 69 4c 76 6c 20 73 6f 20 74 68 61 74 20 74  l iLvl so that t
7e70: 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 66 6f 72  here is room for
7e80: 20 61 74 20 6c 65 61 73 74 20 6e 45 78 74 72 61   at least nExtra
7e90: 20 6d 6f 72 65 0a 2a 2a 20 73 65 67 6d 65 6e 74   more.** segment
7ea0: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7eb0: 64 20 66 74 73 35 53 74 72 75 63 74 75 72 65 45  d fts5StructureE
7ec0: 78 74 65 6e 64 4c 65 76 65 6c 28 0a 20 20 69 6e  xtendLevel(.  in
7ed0: 74 20 2a 70 52 63 2c 20 0a 20 20 46 74 73 35 53  t *pRc, .  Fts5S
7ee0: 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
7ef0: 74 2c 20 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20  t, .  int iLvl, 
7f00: 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 0a  .  int nExtra, .
7f10: 20 20 69 6e 74 20 62 49 6e 73 65 72 74 0a 29 7b    int bInsert.){
7f20: 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
7f30: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74  ITE_OK ){.    Ft
7f40: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
7f50: 20 2a 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63   *pLvl = &pStruc
7f60: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b  t->aLevel[iLvl];
7f70: 0a 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75  .    Fts5Structu
7f80: 72 65 53 65 67 6d 65 6e 74 20 2a 61 4e 65 77 3b  reSegment *aNew;
7f90: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  .    sqlite3_int
7fa0: 36 34 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e  64 nByte;..    n
7fb0: 42 79 74 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e 53  Byte = (pLvl->nS
7fc0: 65 67 20 2b 20 6e 45 78 74 72 61 29 20 2a 20 73  eg + nExtra) * s
7fd0: 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63 74  izeof(Fts5Struct
7fe0: 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20  ureSegment);.   
7ff0: 20 61 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   aNew = sqlite3_
8000: 72 65 61 6c 6c 6f 63 36 34 28 70 4c 76 6c 2d 3e  realloc64(pLvl->
8010: 61 53 65 67 2c 20 6e 42 79 74 65 29 3b 0a 20 20  aSeg, nByte);.  
8020: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
8030: 20 20 20 20 69 66 28 20 62 49 6e 73 65 72 74 3d      if( bInsert=
8040: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =0 ){.        me
8050: 6d 73 65 74 28 26 61 4e 65 77 5b 70 4c 76 6c 2d  mset(&aNew[pLvl-
8060: 3e 6e 53 65 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nSeg], 0, sizeo
8070: 66 28 46 74 73 35 53 74 72 75 63 74 75 72 65 53  f(Fts5StructureS
8080: 65 67 6d 65 6e 74 29 20 2a 20 6e 45 78 74 72 61  egment) * nExtra
8090: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
80a0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 4d 6f 76          int nMov
80b0: 65 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 2a  e = pLvl->nSeg *
80c0: 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75   sizeof(Fts5Stru
80d0: 63 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20  ctureSegment);. 
80e0: 20 20 20 20 20 20 20 6d 65 6d 6d 6f 76 65 28 26         memmove(&
80f0: 61 4e 65 77 5b 6e 45 78 74 72 61 5d 2c 20 61 4e  aNew[nExtra], aN
8100: 65 77 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  ew, nMove);.    
8110: 20 20 20 20 6d 65 6d 73 65 74 28 61 4e 65 77 2c      memset(aNew,
8120: 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
8130: 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29  tructureSegment)
8140: 20 2a 20 6e 45 78 74 72 61 29 3b 0a 20 20 20 20   * nExtra);.    
8150: 20 20 7d 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e    }.      pLvl->
8160: 61 53 65 67 20 3d 20 61 4e 65 77 3b 0a 20 20 20  aSeg = aNew;.   
8170: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70   }else{.      *p
8180: 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
8190: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  M;.    }.  }.}..
81a0: 73 74 61 74 69 63 20 46 74 73 35 53 74 72 75 63  static Fts5Struc
81b0: 74 75 72 65 20 2a 66 74 73 35 53 74 72 75 63 74  ture *fts5Struct
81c0: 75 72 65 52 65 61 64 55 6e 63 61 63 68 65 64 28  ureReadUncached(
81d0: 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
81e0: 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
81f0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35  pRet = 0;.  Fts5
8200: 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
8210: 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20  = p->pConfig;.  
8220: 69 6e 74 20 69 43 6f 6f 6b 69 65 3b 20 20 20 20  int iCookie;    
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8240: 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  /* Configuration
8250: 20 63 6f 6f 6b 69 65 20 2a 2f 0a 20 20 46 74 73   cookie */.  Fts
8260: 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
8270: 20 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74   pData = fts5Dat
8280: 61 52 65 61 64 28 70 2c 20 46 54 53 35 5f 53 54  aRead(p, FTS5_ST
8290: 52 55 43 54 55 52 45 5f 52 4f 57 49 44 29 3b 0a  RUCTURE_ROWID);.
82a0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
82b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
82c0: 20 54 4f 44 4f 3a 20 44 6f 20 77 65 20 6e 65 65   TODO: Do we nee
82d0: 64 20 74 68 69 73 20 69 66 20 74 68 65 20 6c 65  d this if the le
82e0: 61 66 2d 69 6e 64 65 78 20 69 73 20 61 70 70 65  af-index is appe
82f0: 6e 64 65 64 3f 20 50 72 6f 62 61 62 6c 79 2e 2e  nded? Probably..
8300: 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  . */.    memset(
8310: 26 70 44 61 74 61 2d 3e 70 5b 70 44 61 74 61 2d  &pData->p[pData-
8320: 3e 6e 6e 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41  >nn], 0, FTS5_DA
8330: 54 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20  TA_PADDING);.   
8340: 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 53 74 72   p->rc = fts5Str
8350: 75 63 74 75 72 65 44 65 63 6f 64 65 28 70 44 61  uctureDecode(pDa
8360: 74 61 2d 3e 70 2c 20 70 44 61 74 61 2d 3e 6e 6e  ta->p, pData->nn
8370: 2c 20 26 69 43 6f 6f 6b 69 65 2c 20 26 70 52 65  , &iCookie, &pRe
8380: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  t);.    if( p->r
8390: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
83a0: 70 43 6f 6e 66 69 67 2d 3e 69 43 6f 6f 6b 69 65  pConfig->iCookie
83b0: 21 3d 69 43 6f 6f 6b 69 65 20 29 7b 0a 20 20 20  !=iCookie ){.   
83c0: 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74     p->rc = sqlit
83d0: 65 33 46 74 73 35 43 6f 6e 66 69 67 4c 6f 61 64  e3Fts5ConfigLoad
83e0: 28 70 43 6f 6e 66 69 67 2c 20 69 43 6f 6f 6b 69  (pConfig, iCooki
83f0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  e);.    }.    ft
8400: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44  s5DataRelease(pD
8410: 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  ata);.    if( p-
8420: 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
8430: 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
8440: 63 74 75 72 65 52 65 6c 65 61 73 65 28 70 52 65  ctureRelease(pRe
8450: 74 29 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d  t);.      pRet =
8460: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
8470: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
8480: 0a 73 74 61 74 69 63 20 69 36 34 20 66 74 73 35  .static i64 fts5
8490: 49 6e 64 65 78 44 61 74 61 56 65 72 73 69 6f 6e  IndexDataVersion
84a0: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
84b0: 20 20 69 36 34 20 69 56 65 72 73 69 6f 6e 20 3d    i64 iVersion =
84c0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
84d0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
84e0: 20 20 20 69 66 28 20 70 2d 3e 70 44 61 74 61 56     if( p->pDataV
84f0: 65 72 73 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  ersion==0 ){.   
8500: 20 20 20 70 2d 3e 72 63 20 3d 20 66 74 73 35 49     p->rc = fts5I
8510: 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
8520: 70 2c 20 26 70 2d 3e 70 44 61 74 61 56 65 72 73  p, &p->pDataVers
8530: 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ion, .          
8540: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8550: 22 50 52 41 47 4d 41 20 25 51 2e 64 61 74 61 5f  "PRAGMA %Q.data_
8560: 76 65 72 73 69 6f 6e 22 2c 20 70 2d 3e 70 43 6f  version", p->pCo
8570: 6e 66 69 67 2d 3e 7a 44 62 29 0a 20 20 20 20 20  nfig->zDb).     
8580: 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
8590: 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e  ( p->rc ) return
85a0: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   0;.    }..    i
85b0: 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
85c0: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e 70  qlite3_step(p->p
85d0: 44 61 74 61 56 65 72 73 69 6f 6e 29 20 29 7b 0a  DataVersion) ){.
85e0: 20 20 20 20 20 20 69 56 65 72 73 69 6f 6e 20 3d        iVersion =
85f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8600: 69 6e 74 36 34 28 70 2d 3e 70 44 61 74 61 56 65  int64(p->pDataVe
8610: 72 73 69 6f 6e 2c 20 30 29 3b 0a 20 20 20 20 7d  rsion, 0);.    }
8620: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c  .    p->rc = sql
8630: 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e 70 44  ite3_reset(p->pD
8640: 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20 7d  ataVersion);.  }
8650: 0a 0a 20 20 72 65 74 75 72 6e 20 69 56 65 72 73  ..  return iVers
8660: 69 6f 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ion;.}../*.** Re
8670: 61 64 2c 20 64 65 73 65 72 69 61 6c 69 7a 65 20  ad, deserialize 
8680: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 73  and return the s
8690: 74 72 75 63 74 75 72 65 20 72 65 63 6f 72 64 2e  tructure record.
86a0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 46 74 73 35 53  .**.** The Fts5S
86b0: 74 72 75 63 74 75 72 65 2e 61 4c 65 76 65 6c 5b  tructure.aLevel[
86c0: 5d 20 61 6e 64 20 65 61 63 68 20 46 74 73 35 53  ] and each Fts5S
86d0: 74 72 75 63 74 75 72 65 4c 65 76 65 6c 2e 61 53  tructureLevel.aS
86e0: 65 67 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  eg[] array.** ar
86f0: 65 20 6f 76 65 72 2d 61 6c 6c 6f 63 61 74 65 64  e over-allocated
8700: 20 61 73 20 64 65 73 63 72 69 62 65 64 20 66 6f   as described fo
8710: 72 20 66 75 6e 63 74 69 6f 6e 20 66 74 73 35 53  r function fts5S
8720: 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28 29  tructureDecode()
8730: 20 0a 2a 2a 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a   .** above..**.*
8740: 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
8750: 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65  curs, NULL is re
8760: 74 75 72 6e 65 64 20 61 6e 64 20 61 6e 20 65 72  turned and an er
8770: 72 6f 72 20 63 6f 64 65 20 6c 65 66 74 20 69 6e  ror code left in
8780: 20 74 68 65 0a 2a 2a 20 46 74 73 35 49 6e 64 65   the.** Fts5Inde
8790: 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 61 6e 20  x handle. If an 
87a0: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
87b0: 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20  y occurred when 
87c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  this function.**
87d0: 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69   is called, it i
87e0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
87f0: 61 74 69 63 20 46 74 73 35 53 74 72 75 63 74 75  atic Fts5Structu
8800: 72 65 20 2a 66 74 73 35 53 74 72 75 63 74 75 72  re *fts5Structur
8810: 65 52 65 61 64 28 46 74 73 35 49 6e 64 65 78 20  eRead(Fts5Index 
8820: 2a 70 29 7b 0a 0a 20 20 69 66 28 20 70 2d 3e 70  *p){..  if( p->p
8830: 53 74 72 75 63 74 3d 3d 30 20 29 7b 0a 20 20 20  Struct==0 ){.   
8840: 20 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69   p->iStructVersi
8850: 6f 6e 20 3d 20 66 74 73 35 49 6e 64 65 78 44 61  on = fts5IndexDa
8860: 74 61 56 65 72 73 69 6f 6e 28 70 29 3b 0a 20 20  taVersion(p);.  
8870: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
8880: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
8890: 70 2d 3e 70 53 74 72 75 63 74 20 3d 20 66 74 73  p->pStruct = fts
88a0: 35 53 74 72 75 63 74 75 72 65 52 65 61 64 55 6e  5StructureReadUn
88b0: 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20 20 7d  cached(p);.    }
88c0: 0a 20 20 7d 0a 0a 23 69 66 20 30 0a 20 20 65 6c  .  }..#if 0.  el
88d0: 73 65 7b 0a 20 20 20 20 46 74 73 35 53 74 72 75  se{.    Fts5Stru
88e0: 63 74 75 72 65 20 2a 70 54 65 73 74 20 3d 20 66  cture *pTest = f
88f0: 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
8900: 55 6e 63 61 63 68 65 64 28 70 29 3b 0a 20 20 20  Uncached(p);.   
8910: 20 69 66 28 20 70 54 65 73 74 20 29 7b 0a 20 20   if( pTest ){.  
8920: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
8930: 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
8940: 2d 3e 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  ->pStruct->nSegm
8950: 65 6e 74 3d 3d 70 54 65 73 74 2d 3e 6e 53 65 67  ent==pTest->nSeg
8960: 6d 65 6e 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ment );.      as
8970: 73 65 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72  sert_nc( p->pStr
8980: 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 70 54 65  uct->nLevel==pTe
8990: 73 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20 20  st->nLevel );.  
89a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
89b0: 54 65 73 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 2b  Test->nLevel; i+
89c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  +){.        asse
89d0: 72 74 5f 6e 63 28 20 70 2d 3e 70 53 74 72 75 63  rt_nc( p->pStruc
89e0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
89f0: 72 67 65 3d 3d 70 54 65 73 74 2d 3e 61 4c 65 76  rge==pTest->aLev
8a00: 65 6c 5b 69 5d 2e 6e 4d 65 72 67 65 20 29 3b 0a  el[i].nMerge );.
8a10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e          assert_n
8a20: 63 28 20 70 2d 3e 70 53 74 72 75 63 74 2d 3e 61  c( p->pStruct->a
8a30: 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3d 3d 70  Level[i].nSeg==p
8a40: 54 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  Test->aLevel[i].
8a50: 6e 53 65 67 20 29 3b 0a 20 20 20 20 20 20 20 20  nSeg );.        
8a60: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 65 73 74  for(j=0; j<pTest
8a70: 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67  ->aLevel[i].nSeg
8a80: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8a90: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8aa0: 65 67 6d 65 6e 74 20 2a 70 31 20 3d 20 26 70 54  egment *p1 = &pT
8ab0: 65 73 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 61  est->aLevel[i].a
8ac0: 53 65 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  Seg[j];.        
8ad0: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53    Fts5StructureS
8ae0: 65 67 6d 65 6e 74 20 2a 70 32 20 3d 20 26 70 2d  egment *p2 = &p-
8af0: 3e 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  >pStruct->aLevel
8b00: 5b 69 5d 2e 61 53 65 67 5b 6a 5d 3b 0a 20 20 20  [i].aSeg[j];.   
8b10: 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
8b20: 28 20 70 31 2d 3e 69 53 65 67 69 64 3d 3d 70 32  ( p1->iSegid==p2
8b30: 2d 3e 69 53 65 67 69 64 20 29 3b 0a 20 20 20 20  ->iSegid );.    
8b40: 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28        assert_nc(
8b50: 20 70 31 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d   p1->pgnoFirst==
8b60: 70 32 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 3b  p2->pgnoFirst );
8b70: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
8b80: 74 5f 6e 63 28 20 70 31 2d 3e 70 67 6e 6f 4c 61  t_nc( p1->pgnoLa
8b90: 73 74 3d 3d 70 32 2d 3e 70 67 6e 6f 4c 61 73 74  st==p2->pgnoLast
8ba0: 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
8bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
8bc0: 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65  StructureRelease
8bd0: 28 70 54 65 73 74 29 3b 0a 20 20 20 20 7d 0a 20  (pTest);.    }. 
8be0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
8bf0: 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
8c00: 4b 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  K ) return 0;.  
8c10: 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 72 75  assert( p->iStru
8c20: 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b 0a  ctVersion!=0 );.
8c30: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74    assert( p->pSt
8c40: 72 75 63 74 21 3d 30 20 29 3b 0a 20 20 66 74 73  ruct!=0 );.  fts
8c50: 35 53 74 72 75 63 74 75 72 65 52 65 66 28 70 2d  5StructureRef(p-
8c60: 3e 70 53 74 72 75 63 74 29 3b 0a 20 20 72 65 74  >pStruct);.  ret
8c70: 75 72 6e 20 70 2d 3e 70 53 74 72 75 63 74 3b 0a  urn p->pStruct;.
8c80: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
8c90: 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
8ca0: 6c 69 64 61 74 65 28 46 74 73 35 49 6e 64 65 78  lidate(Fts5Index
8cb0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70   *p){.  if( p->p
8cc0: 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 66 74  Struct ){.    ft
8cd0: 73 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61  s5StructureRelea
8ce0: 73 65 28 70 2d 3e 70 53 74 72 75 63 74 29 3b 0a  se(p->pStruct);.
8cf0: 20 20 20 20 70 2d 3e 70 53 74 72 75 63 74 20 3d      p->pStruct =
8d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8d10: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
8d20: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 67 6d  l number of segm
8d30: 65 6e 74 73 20 69 6e 20 69 6e 64 65 78 20 73 74  ents in index st
8d40: 72 75 63 74 75 72 65 20 70 53 74 72 75 63 74 2e  ructure pStruct.
8d50: 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
8d60: 6e 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 75  n is only ever u
8d70: 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61  sed as part of a
8d80: 73 73 65 72 74 28 29 20 63 6f 6e 64 69 74 69 6f  ssert() conditio
8d90: 6e 73 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ns..*/.#ifdef SQ
8da0: 4c 49 54 45 5f 44 45 42 55 47 0a 73 74 61 74 69  LITE_DEBUG.stati
8db0: 63 20 69 6e 74 20 66 74 73 35 53 74 72 75 63 74  c int fts5Struct
8dc0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
8dd0: 28 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a  (Fts5Structure *
8de0: 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e 74 20  pStruct){.  int 
8df0: 6e 53 65 67 6d 65 6e 74 20 3d 20 30 3b 20 20 20  nSegment = 0;   
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8e10: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
8e20: 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 69 66 28  egments */.  if(
8e30: 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20   pStruct ){.    
8e40: 69 6e 74 20 69 4c 76 6c 3b 20 20 20 20 20 20 20  int iLvl;       
8e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8e60: 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74 65   Used to iterate
8e70: 20 74 68 72 6f 75 67 68 20 6c 65 76 65 6c 73 20   through levels 
8e80: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  */.    for(iLvl=
8e90: 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
8ea0: 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
8eb0: 7b 0a 20 20 20 20 20 20 6e 53 65 67 6d 65 6e 74  {.      nSegment
8ec0: 20 2b 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65   += pStruct->aLe
8ed0: 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 0a  vel[iLvl].nSeg;.
8ee0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
8ef0: 75 72 6e 20 6e 53 65 67 6d 65 6e 74 3b 0a 7d 0a  urn nSegment;.}.
8f00: 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
8f10: 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
8f20: 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70  pendBlob(pBuf, p
8f30: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 20 7b 20 20  Blob, nBlob) {  
8f40: 20 20 20 5c 0a 20 20 61 73 73 65 72 74 28 20 28     \.  assert( (
8f50: 70 42 75 66 29 2d 3e 6e 53 70 61 63 65 3e 3d 28  pBuf)->nSpace>=(
8f60: 28 70 42 75 66 29 2d 3e 6e 2b 6e 42 6c 6f 62 29  (pBuf)->n+nBlob)
8f70: 20 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   );             
8f80: 5c 0a 20 20 6d 65 6d 63 70 79 28 26 28 70 42 75  \.  memcpy(&(pBu
8f90: 66 29 2d 3e 70 5b 28 70 42 75 66 29 2d 3e 6e 5d  f)->p[(pBuf)->n]
8fa0: 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b  , pBlob, nBlob);
8fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
8fc0: 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20 6e 42   (pBuf)->n += nB
8fd0: 6c 6f 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  lob;            
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ff0: 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 23            \.}..#
9000: 64 65 66 69 6e 65 20 66 74 73 35 42 75 66 66 65  define fts5Buffe
9010: 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
9020: 74 28 70 42 75 66 2c 20 69 56 61 6c 29 20 7b 20  t(pBuf, iVal) { 
9030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
9040: 0a 20 20 28 70 42 75 66 29 2d 3e 6e 20 2b 3d 20  .  (pBuf)->n += 
9050: 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56 61  sqlite3Fts5PutVa
9060: 72 69 6e 74 28 26 28 70 42 75 66 29 2d 3e 70 5b  rint(&(pBuf)->p[
9070: 28 70 42 75 66 29 2d 3e 6e 5d 2c 20 28 69 56 61  (pBuf)->n], (iVa
9080: 6c 29 29 3b 20 20 5c 0a 20 20 61 73 73 65 72 74  l));  \.  assert
9090: 28 20 28 70 42 75 66 29 2d 3e 6e 53 70 61 63 65  ( (pBuf)->nSpace
90a0: 3e 3d 28 70 42 75 66 29 2d 3e 6e 20 29 3b 20 20  >=(pBuf)->n );  
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 20 20 20 20 20 20 5c 0a 7d 0a 0a 0a 2f 2a          \.}.../*
90d0: 0a 2a 2a 20 53 65 72 69 61 6c 69 7a 65 20 61 6e  .** Serialize an
90e0: 64 20 73 74 6f 72 65 20 74 68 65 20 22 73 74 72  d store the "str
90f0: 75 63 74 75 72 65 22 20 72 65 63 6f 72 64 2e 0a  ucture" record..
9100: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
9110: 72 20 6f 63 63 75 72 73 2c 20 6c 65 61 76 65 20  r occurs, leave 
9120: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 6e  an error code in
9130: 20 74 68 65 20 46 74 73 35 49 6e 64 65 78 20 6f   the Fts5Index o
9140: 62 6a 65 63 74 2e 20 49 66 20 61 6e 0a 2a 2a 20  bject. If an.** 
9150: 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64  error has alread
9160: 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
9170: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9180: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
9190: 76 6f 69 64 20 66 74 73 35 53 74 72 75 63 74 75  void fts5Structu
91a0: 72 65 57 72 69 74 65 28 46 74 73 35 49 6e 64 65  reWrite(Fts5Inde
91b0: 78 20 2a 70 2c 20 46 74 73 35 53 74 72 75 63 74  x *p, Fts5Struct
91c0: 75 72 65 20 2a 70 53 74 72 75 63 74 29 7b 0a 20  ure *pStruct){. 
91d0: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
91e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
91f0: 35 42 75 66 66 65 72 20 62 75 66 3b 20 20 20 20  5Buffer buf;    
9200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
9210: 66 66 65 72 20 74 6f 20 73 65 72 69 61 6c 69 7a  ffer to serializ
9220: 65 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 2a 2f  e record into */
9230: 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20  .    int iLvl;  
9240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9250: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
9260: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65  erate through le
9270: 76 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  vels */.    int 
9280: 69 43 6f 6f 6b 69 65 3b 20 20 20 20 20 20 20 20  iCookie;        
9290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6f            /* Coo
92a0: 6b 69 65 20 76 61 6c 75 65 20 74 6f 20 73 74 6f  kie value to sto
92b0: 72 65 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  re */..    asser
92c0: 74 28 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67  t( pStruct->nSeg
92d0: 6d 65 6e 74 3d 3d 66 74 73 35 53 74 72 75 63 74  ment==fts5Struct
92e0: 75 72 65 43 6f 75 6e 74 53 65 67 6d 65 6e 74 73  ureCountSegments
92f0: 28 70 53 74 72 75 63 74 29 20 29 3b 0a 20 20 20  (pStruct) );.   
9300: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9310: 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66   sizeof(Fts5Buff
9320: 65 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 70  er));..    /* Ap
9330: 70 65 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74  pend the current
9340: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 63   configuration c
9350: 6f 6f 6b 69 65 20 2a 2f 0a 20 20 20 20 69 43 6f  ookie */.    iCo
9360: 6f 6b 69 65 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  okie = p->pConfi
9370: 67 2d 3e 69 43 6f 6f 6b 69 65 3b 0a 20 20 20 20  g->iCookie;.    
9380: 69 66 28 20 69 43 6f 6f 6b 69 65 3c 30 20 29 20  if( iCookie<0 ) 
9390: 69 43 6f 6f 6b 69 65 20 3d 20 30 3b 0a 0a 20 20  iCookie = 0;..  
93a0: 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
93b0: 46 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26  Fts5BufferSize(&
93c0: 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 2b 39  p->rc, &buf, 4+9
93d0: 2b 39 2b 39 29 20 29 7b 0a 20 20 20 20 20 20 73  +9+9) ){.      s
93e0: 71 6c 69 74 65 33 46 74 73 35 50 75 74 33 32 28  qlite3Fts5Put32(
93f0: 62 75 66 2e 70 2c 20 69 43 6f 6f 6b 69 65 29 3b  buf.p, iCookie);
9400: 0a 20 20 20 20 20 20 62 75 66 2e 6e 20 3d 20 34  .      buf.n = 4
9410: 3b 0a 20 20 20 20 20 20 66 74 73 35 42 75 66 66  ;.      fts5Buff
9420: 65 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69  erSafeAppendVari
9430: 6e 74 28 26 62 75 66 2c 20 70 53 74 72 75 63 74  nt(&buf, pStruct
9440: 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 20 20 20 20 20  ->nLevel);.     
9450: 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
9460: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 62 75 66  ppendVarint(&buf
9470: 2c 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d  , pStruct->nSegm
9480: 65 6e 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ent);.      fts5
9490: 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
94a0: 56 61 72 69 6e 74 28 26 62 75 66 2c 20 28 69 36  Varint(&buf, (i6
94b0: 34 29 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  4)pStruct->nWrit
94c0: 65 43 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20 7d  eCounter);.    }
94d0: 0a 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30  ..    for(iLvl=0
94e0: 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e  ; iLvl<pStruct->
94f0: 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b  nLevel; iLvl++){
9500: 0a 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 3b  .      int iSeg;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
9530: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
9540: 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  segments */.    
9550: 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
9560: 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
9570: 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
9580: 76 6c 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 42  vl];.      fts5B
9590: 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
95a0: 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  t(&p->rc, &buf, 
95b0: 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 29 3b 0a 20  pLvl->nMerge);. 
95c0: 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41       fts5BufferA
95d0: 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
95e0: 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d 3e  rc, &buf, pLvl->
95f0: 6e 53 65 67 29 3b 0a 20 20 20 20 20 20 61 73 73  nSeg);.      ass
9600: 65 72 74 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ert( pLvl->nMerg
9610: 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b  e<=pLvl->nSeg );
9620: 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ..      for(iSeg
9630: 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d 3e 6e  =0; iSeg<pLvl->n
9640: 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20  Seg; iSeg++){.  
9650: 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
9660: 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
9670: 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c 2d  >rc, &buf, pLvl-
9680: 3e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  >aSeg[iSeg].iSeg
9690: 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  id);.        fts
96a0: 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
96b0: 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
96c0: 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65  , pLvl->aSeg[iSe
96d0: 67 5d 2e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 20  g].pgnoFirst);. 
96e0: 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
96f0: 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
9700: 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 4c 76 6c  ->rc, &buf, pLvl
9710: 2d 3e 61 53 65 67 5b 69 53 65 67 5d 2e 70 67 6e  ->aSeg[iSeg].pgn
9720: 6f 4c 61 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a  oLast);.      }.
9730: 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 44      }..    fts5D
9740: 61 74 61 57 72 69 74 65 28 70 2c 20 46 54 53 35  ataWrite(p, FTS5
9750: 5f 53 54 52 55 43 54 55 52 45 5f 52 4f 57 49 44  _STRUCTURE_ROWID
9760: 2c 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b  , buf.p, buf.n);
9770: 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
9780: 72 65 65 28 26 62 75 66 29 3b 0a 20 20 7d 0a 7d  ree(&buf);.  }.}
9790: 0a 0a 23 69 66 20 30 0a 73 74 61 74 69 63 20 76  ..#if 0.static v
97a0: 6f 69 64 20 66 74 73 35 44 65 62 75 67 53 74 72  oid fts5DebugStr
97b0: 75 63 74 75 72 65 28 69 6e 74 2a 2c 46 74 73 35  ucture(int*,Fts5
97c0: 42 75 66 66 65 72 2a 2c 46 74 73 35 53 74 72 75  Buffer*,Fts5Stru
97d0: 63 74 75 72 65 2a 29 3b 0a 73 74 61 74 69 63 20  cture*);.static 
97e0: 76 6f 69 64 20 66 74 73 35 50 72 69 6e 74 53 74  void fts5PrintSt
97f0: 72 75 63 74 75 72 65 28 63 6f 6e 73 74 20 63 68  ructure(const ch
9800: 61 72 20 2a 7a 43 61 70 74 69 6f 6e 2c 20 46 74  ar *zCaption, Ft
9810: 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74  s5Structure *pSt
9820: 72 75 63 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  ruct){.  int rc 
9830: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
9840: 74 73 35 42 75 66 66 65 72 20 62 75 66 3b 0a 20  ts5Buffer buf;. 
9850: 20 6d 65 6d 73 65 74 28 26 62 75 66 2c 20 30 2c   memset(&buf, 0,
9860: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 3b 0a 20   sizeof(buf));. 
9870: 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
9880: 75 72 65 28 26 72 63 2c 20 26 62 75 66 2c 20 70  ure(&rc, &buf, p
9890: 53 74 72 75 63 74 29 3b 0a 20 20 66 70 72 69 6e  Struct);.  fprin
98a0: 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73 3a 20  tf(stdout, "%s: 
98b0: 25 73 5c 6e 22 2c 20 7a 43 61 70 74 69 6f 6e 2c  %s\n", zCaption,
98c0: 20 62 75 66 2e 70 29 3b 0a 20 20 66 66 6c 75 73   buf.p);.  fflus
98d0: 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 66 74 73  h(stdout);.  fts
98e0: 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66  5BufferFree(&buf
98f0: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  );.}.#else.# def
9900: 69 6e 65 20 66 74 73 35 50 72 69 6e 74 53 74 72  ine fts5PrintStr
9910: 75 63 74 75 72 65 28 78 2c 79 29 0a 23 65 6e 64  ucture(x,y).#end
9920: 69 66 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66  if..static int f
9930: 74 73 35 53 65 67 6d 65 6e 74 53 69 7a 65 28 46  ts5SegmentSize(F
9940: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
9950: 65 6e 74 20 2a 70 53 65 67 29 7b 0a 20 20 72 65  ent *pSeg){.  re
9960: 74 75 72 6e 20 31 20 2b 20 70 53 65 67 2d 3e 70  turn 1 + pSeg->p
9970: 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d 3e  gnoLast - pSeg->
9980: 70 67 6e 6f 46 69 72 73 74 3b 0a 7d 0a 0a 2f 2a  pgnoFirst;.}../*
9990: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 63 6f 70  .** Return a cop
99a0: 79 20 6f 66 20 69 6e 64 65 78 20 73 74 72 75 63  y of index struc
99b0: 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 45 78  ture pStruct. Ex
99c0: 63 65 70 74 2c 20 70 72 6f 6d 6f 74 65 20 61 73  cept, promote as
99d0: 20 6d 61 6e 79 20 0a 2a 2a 20 73 65 67 6d 65 6e   many .** segmen
99e0: 74 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 74  ts as possible t
99f0: 6f 20 6c 65 76 65 6c 20 69 50 72 6f 6d 6f 74 65  o level iPromote
9a00: 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  . If an OOM occu
9a10: 72 73 2c 20 4e 55 4c 4c 20 69 73 20 0a 2a 2a 20  rs, NULL is .** 
9a20: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
9a30: 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 74 72  tic void fts5Str
9a40: 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28  ucturePromoteTo(
9a50: 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
9a60: 0a 20 20 69 6e 74 20 69 50 72 6f 6d 6f 74 65 2c  .  int iPromote,
9a70: 0a 20 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65  .  int szPromote
9a80: 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  ,.  Fts5Structur
9a90: 65 20 2a 70 53 74 72 75 63 74 0a 29 7b 0a 20 20  e *pStruct.){.  
9aa0: 69 6e 74 20 69 6c 2c 20 69 73 3b 0a 20 20 46 74  int il, is;.  Ft
9ab0: 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
9ac0: 20 2a 70 4f 75 74 20 3d 20 26 70 53 74 72 75 63   *pOut = &pStruc
9ad0: 74 2d 3e 61 4c 65 76 65 6c 5b 69 50 72 6f 6d 6f  t->aLevel[iPromo
9ae0: 74 65 5d 3b 0a 0a 20 20 69 66 28 20 70 4f 75 74  te];..  if( pOut
9af0: 2d 3e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20  ->nMerge==0 ){. 
9b00: 20 20 20 66 6f 72 28 69 6c 3d 69 50 72 6f 6d 6f     for(il=iPromo
9b10: 74 65 2b 31 3b 20 69 6c 3c 70 53 74 72 75 63 74  te+1; il<pStruct
9b20: 2d 3e 6e 4c 65 76 65 6c 3b 20 69 6c 2b 2b 29 7b  ->nLevel; il++){
9b30: 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
9b40: 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 20  tureLevel *pLvl 
9b50: 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
9b60: 65 6c 5b 69 6c 5d 3b 0a 20 20 20 20 20 20 69 66  el[il];.      if
9b70: 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29  ( pLvl->nMerge )
9b80: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 66   return;.      f
9b90: 6f 72 28 69 73 3d 70 4c 76 6c 2d 3e 6e 53 65 67  or(is=pLvl->nSeg
9ba0: 2d 31 3b 20 69 73 3e 3d 30 3b 20 69 73 2d 2d 29  -1; is>=0; is--)
9bb0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
9bc0: 20 3d 20 66 74 73 35 53 65 67 6d 65 6e 74 53 69   = fts5SegmentSi
9bd0: 7a 65 28 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  ze(&pLvl->aSeg[i
9be0: 73 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  s]);.        if(
9bf0: 20 73 7a 3e 73 7a 50 72 6f 6d 6f 74 65 20 29 20   sz>szPromote ) 
9c00: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20  return;.        
9c10: 66 74 73 35 53 74 72 75 63 74 75 72 65 45 78 74  fts5StructureExt
9c20: 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e 72 63 2c  endLevel(&p->rc,
9c30: 20 70 53 74 72 75 63 74 2c 20 69 50 72 6f 6d 6f   pStruct, iPromo
9c40: 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  te, 1, 1);.     
9c50: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 72     if( p->rc ) r
9c60: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 6d  eturn;.        m
9c70: 65 6d 63 70 79 28 70 4f 75 74 2d 3e 61 53 65 67  emcpy(pOut->aSeg
9c80: 2c 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 73  , &pLvl->aSeg[is
9c90: 5d 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74  ], sizeof(Fts5St
9ca0: 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 29 29  ructureSegment))
9cb0: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e  ;.        pOut->
9cc0: 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nSeg++;.        
9cd0: 70 4c 76 6c 2d 3e 6e 53 65 67 2d 2d 3b 0a 20 20  pLvl->nSeg--;.  
9ce0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
9cf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 65 77 20 73  }../*.** A new s
9d00: 65 67 6d 65 6e 74 20 68 61 73 20 6a 75 73 74 20  egment has just 
9d10: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
9d20: 6c 65 76 65 6c 20 69 4c 76 6c 20 6f 66 20 69 6e  level iLvl of in
9d30: 64 65 78 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  dex structure.**
9d40: 20 70 53 74 72 75 63 74 2e 20 54 68 69 73 20 66   pStruct. This f
9d50: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
9d60: 65 73 20 69 66 20 61 6e 79 20 73 65 67 6d 65 6e  es if any segmen
9d70: 74 73 20 73 68 6f 75 6c 64 20 62 65 20 70 72 6f  ts should be pro
9d80: 6d 6f 74 65 64 0a 2a 2a 20 61 73 20 61 20 72 65  moted.** as a re
9d90: 73 75 6c 74 2e 20 53 65 67 6d 65 6e 74 73 20 61  sult. Segments a
9da0: 72 65 20 70 72 6f 6d 6f 74 65 64 20 69 6e 20 74  re promoted in t
9db0: 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a 0a 2a 2a  wo scenarios:.**
9dc0: 0a 2a 2a 20 20 20 61 29 20 49 66 20 74 68 65 20  .**   a) If the 
9dd0: 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  segment just wri
9de0: 74 74 65 6e 20 69 73 20 73 6d 61 6c 6c 65 72 20  tten is smaller 
9df0: 74 68 61 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  than one or more
9e00: 20 73 65 67 6d 65 6e 74 73 0a 2a 2a 20 20 20 20   segments.**    
9e10: 20 20 77 69 74 68 69 6e 20 74 68 65 20 70 72 65    within the pre
9e20: 76 69 6f 75 73 20 70 6f 70 75 6c 61 74 65 64 20  vious populated 
9e30: 6c 65 76 65 6c 2c 20 69 74 20 69 73 20 70 72 6f  level, it is pro
9e40: 6d 6f 74 65 64 20 74 6f 20 74 68 65 20 70 72 65  moted to the pre
9e50: 76 69 6f 75 73 0a 2a 2a 20 20 20 20 20 20 70 6f  vious.**      po
9e60: 70 75 6c 61 74 65 64 20 6c 65 76 65 6c 2e 0a 2a  pulated level..*
9e70: 2a 0a 2a 2a 20 20 20 62 29 20 49 66 20 74 68 65  *.**   b) If the
9e80: 20 73 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72   segment just wr
9e90: 69 74 74 65 6e 20 69 73 20 6c 61 72 67 65 72 20  itten is larger 
9ea0: 74 68 61 6e 20 74 68 65 20 6e 65 77 65 73 74 20  than the newest 
9eb0: 73 65 67 6d 65 6e 74 20 6f 6e 0a 2a 2a 20 20 20  segment on.**   
9ec0: 20 20 20 74 68 65 20 6e 65 78 74 20 70 6f 70 75     the next popu
9ed0: 6c 61 74 65 64 20 6c 65 76 65 6c 2c 20 74 68 65  lated level, the
9ee0: 6e 20 74 68 61 74 20 73 65 67 6d 65 6e 74 2c 20  n that segment, 
9ef0: 61 6e 64 20 61 6e 79 20 6f 74 68 65 72 20 61 64  and any other ad
9f00: 6a 61 63 65 6e 74 0a 2a 2a 20 20 20 20 20 20 73  jacent.**      s
9f10: 65 67 6d 65 6e 74 73 20 74 68 61 74 20 61 72 65  egments that are
9f20: 20 61 6c 73 6f 20 73 6d 61 6c 6c 65 72 20 74 68   also smaller th
9f30: 61 6e 20 74 68 65 20 6f 6e 65 20 6a 75 73 74 20  an the one just 
9f40: 77 72 69 74 74 65 6e 2c 20 61 72 65 20 0a 2a 2a  written, are .**
9f50: 20 20 20 20 20 20 70 72 6f 6d 6f 74 65 64 2e 20        promoted. 
9f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 6f 6e 65 20 6f 72  .**.** If one or
9f70: 20 6d 6f 72 65 20 73 65 67 6d 65 6e 74 73 20 61   more segments a
9f80: 72 65 20 70 72 6f 6d 6f 74 65 64 2c 20 74 68 65  re promoted, the
9f90: 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
9fa0: 74 20 69 73 20 75 70 64 61 74 65 64 0a 2a 2a 20  t is updated.** 
9fb0: 74 6f 20 72 65 66 6c 65 63 74 20 74 68 69 73 2e  to reflect this.
9fc0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
9fd0: 66 74 73 35 53 74 72 75 63 74 75 72 65 50 72 6f  fts5StructurePro
9fe0: 6d 6f 74 65 28 0a 20 20 46 74 73 35 49 6e 64 65  mote(.  Fts5Inde
9ff0: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
a000: 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
a010: 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
a020: 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20 20  /.  int iLvl,   
a030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a040: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6c 65 76      /* Index lev
a050: 65 6c 20 6a 75 73 74 20 75 70 64 61 74 65 64 20  el just updated 
a060: 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
a070: 72 65 20 2a 70 53 74 72 75 63 74 20 20 20 20 20  re *pStruct     
a080: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 73 74       /* Index st
a090: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
a0a0: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
a0b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
a0c0: 69 54 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 50  iTst;.    int iP
a0d0: 72 6f 6d 6f 74 65 20 3d 20 2d 31 3b 0a 20 20 20  romote = -1;.   
a0e0: 20 69 6e 74 20 73 7a 50 72 6f 6d 6f 74 65 20 3d   int szPromote =
a0f0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   0;            /
a100: 2a 20 50 72 6f 6d 6f 74 65 20 61 6e 79 74 68 69  * Promote anythi
a110: 6e 67 20 74 68 69 73 20 73 69 7a 65 20 6f 72 20  ng this size or 
a120: 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 46  smaller */.    F
a130: 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
a140: 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f 2a 20  ent *pSeg;   /* 
a150: 53 65 67 6d 65 6e 74 20 6a 75 73 74 20 77 72 69  Segment just wri
a160: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tten */.    int 
a170: 73 7a 53 65 67 3b 20 20 20 20 20 20 20 20 20 20  szSeg;          
a180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a190: 65 20 6f 66 20 73 65 67 6d 65 6e 74 20 6a 75 73  e of segment jus
a1a0: 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  t written */.   
a1b0: 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
a1c0: 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
a1d0: 5d 2e 6e 53 65 67 3b 0a 0a 20 20 20 20 69 66 28  ].nSeg;..    if(
a1e0: 20 6e 53 65 67 3d 3d 30 20 29 20 72 65 74 75 72   nSeg==0 ) retur
a1f0: 6e 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  n;.    pSeg = &p
a200: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a210: 4c 76 6c 5d 2e 61 53 65 67 5b 70 53 74 72 75 63  Lvl].aSeg[pStruc
a220: 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  t->aLevel[iLvl].
a230: 6e 53 65 67 2d 31 5d 3b 0a 20 20 20 20 73 7a 53  nSeg-1];.    szS
a240: 65 67 20 3d 20 28 31 20 2b 20 70 53 65 67 2d 3e  eg = (1 + pSeg->
a250: 70 67 6e 6f 4c 61 73 74 20 2d 20 70 53 65 67 2d  pgnoLast - pSeg-
a260: 3e 70 67 6e 6f 46 69 72 73 74 29 3b 0a 0a 20 20  >pgnoFirst);..  
a270: 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 63    /* Check for c
a280: 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 2a 2f 0a  ondition (a) */.
a290: 20 20 20 20 66 6f 72 28 69 54 73 74 3d 69 4c 76      for(iTst=iLv
a2a0: 6c 2d 31 3b 20 69 54 73 74 3e 3d 30 20 26 26 20  l-1; iTst>=0 && 
a2b0: 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
a2c0: 69 54 73 74 5d 2e 6e 53 65 67 3d 3d 30 3b 20 69  iTst].nSeg==0; i
a2d0: 54 73 74 2d 2d 29 3b 0a 20 20 20 20 69 66 28 20  Tst--);.    if( 
a2e0: 69 54 73 74 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iTst>=0 ){.     
a2f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
a300: 74 20 73 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20  t szMax = 0;.   
a310: 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
a320: 4c 65 76 65 6c 20 2a 70 54 73 74 20 3d 20 26 70  Level *pTst = &p
a330: 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
a340: 54 73 74 5d 3b 0a 20 20 20 20 20 20 61 73 73 65  Tst];.      asse
a350: 72 74 28 20 70 54 73 74 2d 3e 6e 4d 65 72 67 65  rt( pTst->nMerge
a360: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
a370: 28 69 3d 30 3b 20 69 3c 70 54 73 74 2d 3e 6e 53  (i=0; i<pTst->nS
a380: 65 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  eg; i++){.      
a390: 20 20 69 6e 74 20 73 7a 20 3d 20 70 54 73 74 2d    int sz = pTst-
a3a0: 3e 61 53 65 67 5b 69 5d 2e 70 67 6e 6f 4c 61 73  >aSeg[i].pgnoLas
a3b0: 74 20 2d 20 70 54 73 74 2d 3e 61 53 65 67 5b 69  t - pTst->aSeg[i
a3c0: 5d 2e 70 67 6e 6f 46 69 72 73 74 20 2b 20 31 3b  ].pgnoFirst + 1;
a3d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a 3e  .        if( sz>
a3e0: 73 7a 4d 61 78 20 29 20 73 7a 4d 61 78 20 3d 20  szMax ) szMax = 
a3f0: 73 7a 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  sz;.      }.    
a400: 20 20 69 66 28 20 73 7a 4d 61 78 3e 3d 73 7a 53    if( szMax>=szS
a410: 65 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  eg ){.        /*
a420: 20 43 6f 6e 64 69 74 69 6f 6e 20 28 61 29 20 69   Condition (a) i
a430: 73 20 74 72 75 65 2e 20 50 72 6f 6d 6f 74 65 20  s true. Promote 
a440: 74 68 65 20 6e 65 77 65 73 74 20 73 65 67 6d 65  the newest segme
a450: 6e 74 20 6f 6e 20 6c 65 76 65 6c 20 0a 20 20 20  nt on level .   
a460: 20 20 20 20 20 2a 2a 20 69 4c 76 6c 20 74 6f 20       ** iLvl to 
a470: 6c 65 76 65 6c 20 69 54 73 74 2e 20 20 2a 2f 0a  level iTst.  */.
a480: 20 20 20 20 20 20 20 20 69 50 72 6f 6d 6f 74 65          iPromote
a490: 20 3d 20 69 54 73 74 3b 0a 20 20 20 20 20 20 20   = iTst;.       
a4a0: 20 73 7a 50 72 6f 6d 6f 74 65 20 3d 20 73 7a 4d   szPromote = szM
a4b0: 61 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ax;.      }.    
a4c0: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6e  }..    /* If con
a4d0: 64 69 74 69 6f 6e 20 28 61 29 20 69 73 20 6e 6f  dition (a) is no
a4e0: 74 20 6d 65 74 2c 20 61 73 73 75 6d 65 20 28 62  t met, assume (b
a4f0: 29 20 69 73 20 74 72 75 65 2e 20 53 74 72 75 63  ) is true. Struc
a500: 74 75 72 65 50 72 6f 6d 6f 74 65 54 6f 28 29 0a  turePromoteTo().
a510: 20 20 20 20 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f      ** is a no-o
a520: 70 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 20  p if it is not. 
a530: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 72 6f   */.    if( iPro
a540: 6d 6f 74 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  mote<0 ){.      
a550: 69 50 72 6f 6d 6f 74 65 20 3d 20 69 4c 76 6c 3b  iPromote = iLvl;
a560: 0a 20 20 20 20 20 20 73 7a 50 72 6f 6d 6f 74 65  .      szPromote
a570: 20 3d 20 73 7a 53 65 67 3b 0a 20 20 20 20 7d 0a   = szSeg;.    }.
a580: 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
a590: 65 50 72 6f 6d 6f 74 65 54 6f 28 70 2c 20 69 50  ePromoteTo(p, iP
a5a0: 72 6f 6d 6f 74 65 2c 20 73 7a 50 72 6f 6d 6f 74  romote, szPromot
a5b0: 65 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  e, pStruct);.  }
a5c0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  .}.../*.** Advan
a5d0: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a5e0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a5f0: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  ly argument. If 
a600: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 0a  the end of the .
a610: 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
a620: 20 70 61 67 65 20 69 73 20 72 65 61 63 68 65 64   page is reached
a630: 2c 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72  , return non-zer
a640: 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  o..*/.static int
a650: 20 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78   fts5DlidxLvlNex
a660: 74 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a  t(Fts5DlidxLvl *
a670: 70 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44 61 74  pLvl){.  Fts5Dat
a680: 61 20 2a 70 44 61 74 61 20 3d 20 70 4c 76 6c 2d  a *pData = pLvl-
a690: 3e 70 44 61 74 61 3b 0a 0a 20 20 69 66 28 20 70  >pData;..  if( p
a6a0: 4c 76 6c 2d 3e 69 4f 66 66 3d 3d 30 20 29 7b 0a  Lvl->iOff==0 ){.
a6b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 76 6c      assert( pLvl
a6c0: 2d 3e 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 20  ->bEof==0 );.   
a6d0: 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d 20 31 3b   pLvl->iOff = 1;
a6e0: 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20  .    pLvl->iOff 
a6f0: 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
a700: 33 32 28 26 70 44 61 74 61 2d 3e 70 5b 31 5d 2c  32(&pData->p[1],
a710: 20 70 4c 76 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f   pLvl->iLeafPgno
a720: 29 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66  );.    pLvl->iOf
a730: 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69  f += fts5GetVari
a740: 6e 74 28 26 70 44 61 74 61 2d 3e 70 5b 70 4c 76  nt(&pData->p[pLv
a750: 6c 2d 3e 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  l->iOff], (u64*)
a760: 26 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 29 3b 0a  &pLvl->iRowid);.
a770: 20 20 20 20 70 4c 76 6c 2d 3e 69 46 69 72 73 74      pLvl->iFirst
a780: 4f 66 66 20 3d 20 70 4c 76 6c 2d 3e 69 4f 66 66  Off = pLvl->iOff
a790: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
a7a0: 6e 74 20 69 4f 66 66 3b 0a 20 20 20 20 66 6f 72  nt iOff;.    for
a7b0: 28 69 4f 66 66 3d 70 4c 76 6c 2d 3e 69 4f 66 66  (iOff=pLvl->iOff
a7c0: 3b 20 69 4f 66 66 3c 70 44 61 74 61 2d 3e 6e 6e  ; iOff<pData->nn
a7d0: 3b 20 69 4f 66 66 2b 2b 29 7b 0a 20 20 20 20 20  ; iOff++){.     
a7e0: 20 69 66 28 20 70 44 61 74 61 2d 3e 70 5b 69 4f   if( pData->p[iO
a7f0: 66 66 5d 20 29 20 62 72 65 61 6b 3b 20 0a 20 20  ff] ) break; .  
a800: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 4f 66    }..    if( iOf
a810: 66 3c 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20  f<pData->nn ){. 
a820: 20 20 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20       i64 iVal;. 
a830: 20 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61 66       pLvl->iLeaf
a840: 50 67 6e 6f 20 2b 3d 20 28 69 4f 66 66 20 2d 20  Pgno += (iOff - 
a850: 70 4c 76 6c 2d 3e 69 4f 66 66 29 20 2b 20 31 3b  pLvl->iOff) + 1;
a860: 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 66  .      iOff += f
a870: 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 44  ts5GetVarint(&pD
a880: 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75  ata->p[iOff], (u
a890: 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20 20 20 20  64*)&iVal);.    
a8a0: 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20 2b    pLvl->iRowid +
a8b0: 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 70 4c  = iVal;.      pL
a8c0: 76 6c 2d 3e 69 4f 66 66 20 3d 20 69 4f 66 66 3b  vl->iOff = iOff;
a8d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a8e0: 20 20 70 4c 76 6c 2d 3e 62 45 6f 66 20 3d 20 31    pLvl->bEof = 1
a8f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
a900: 65 74 75 72 6e 20 70 4c 76 6c 2d 3e 62 45 6f 66  eturn pLvl->bEof
a910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
a920: 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
a930: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e  passed as the on
a940: 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
a950: 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
a960: 6c 69 64 78 49 74 65 72 4e 65 78 74 52 28 46 74  lidxIterNextR(Ft
a970: 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
a980: 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72  DlidxIter *pIter
a990: 2c 20 69 6e 74 20 69 4c 76 6c 29 7b 0a 20 20 46  , int iLvl){.  F
a9a0: 74 73 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76  ts5DlidxLvl *pLv
a9b0: 6c 20 3d 20 26 70 49 74 65 72 2d 3e 61 4c 76 6c  l = &pIter->aLvl
a9c0: 5b 69 4c 76 6c 5d 3b 0a 0a 20 20 61 73 73 65 72  [iLvl];..  asser
a9d0: 74 28 20 69 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e  t( iLvl<pIter->n
a9e0: 4c 76 6c 20 29 3b 0a 20 20 69 66 28 20 66 74 73  Lvl );.  if( fts
a9f0: 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28 70 4c  5DlidxLvlNext(pL
aa00: 76 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  vl) ){.    if( (
aa10: 69 4c 76 6c 2b 31 29 20 3c 20 70 49 74 65 72 2d  iLvl+1) < pIter-
aa20: 3e 6e 4c 76 6c 20 29 7b 0a 20 20 20 20 20 20 66  >nLvl ){.      f
aa30: 74 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74  ts5DlidxIterNext
aa40: 52 28 70 2c 20 70 49 74 65 72 2c 20 69 4c 76 6c  R(p, pIter, iLvl
aa50: 2b 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  +1);.      if( p
aa60: 4c 76 6c 5b 31 5d 2e 62 45 6f 66 3d 3d 30 20 29  Lvl[1].bEof==0 )
aa70: 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
aa80: 74 61 52 65 6c 65 61 73 65 28 70 4c 76 6c 2d 3e  taRelease(pLvl->
aa90: 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
aaa0: 6d 65 6d 73 65 74 28 70 4c 76 6c 2c 20 30 2c 20  memset(pLvl, 0, 
aab0: 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
aac0: 4c 76 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 70  Lvl));.        p
aad0: 4c 76 6c 2d 3e 70 44 61 74 61 20 3d 20 66 74 73  Lvl->pData = fts
aae0: 35 44 61 74 61 52 65 61 64 28 70 2c 20 0a 20 20  5DataRead(p, .  
aaf0: 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f 44            FTS5_D
ab00: 4c 49 44 58 5f 52 4f 57 49 44 28 70 49 74 65 72  LIDX_ROWID(pIter
ab10: 2d 3e 69 53 65 67 69 64 2c 20 69 4c 76 6c 2c 20  ->iSegid, iLvl, 
ab20: 70 4c 76 6c 5b 31 5d 2e 69 4c 65 61 66 50 67 6e  pLvl[1].iLeafPgn
ab30: 6f 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  o).        );.  
ab40: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
ab50: 70 44 61 74 61 20 29 20 66 74 73 35 44 6c 69 64  pData ) fts5Dlid
ab60: 78 4c 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3b 0a  xLvlNext(pLvl);.
ab70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ab80: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65  }..  return pIte
ab90: 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45 6f 66 3b  r->aLvl[0].bEof;
aba0: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74  .}.static int ft
abb0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28  s5DlidxIterNext(
abc0: 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
abd0: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
abe0: 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 74  er){.  return ft
abf0: 73 35 44 6c 69 64 78 49 74 65 72 4e 65 78 74 52  s5DlidxIterNextR
ac00: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 7d  (p, pIter, 0);.}
ac10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 74 65 72  ../*.** The iter
ac20: 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20 74  ator passed as t
ac30: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
ac40: 74 20 68 61 73 20 74 68 65 20 66 6f 6c 6c 6f 77  t has the follow
ac50: 69 6e 67 20 66 69 65 6c 64 73 20 73 65 74 0a 2a  ing fields set.*
ac60: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 2e 20 54 68  * as follows. Th
ac70: 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  is function sets
ac80: 20 75 70 20 74 68 65 20 72 65 73 74 20 6f 66 20   up the rest of 
ac90: 74 68 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20  the iterator so 
aca0: 74 68 61 74 20 69 74 0a 2a 2a 20 70 6f 69 6e 74  that it.** point
acb0: 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 72  s to the first r
acc0: 6f 77 69 64 20 69 6e 20 74 68 65 20 64 6f 63 6c  owid in the docl
acd0: 69 73 74 2d 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a  ist-index..**.**
ace0: 20 20 20 70 44 61 74 61 3a 0a 2a 2a 20 20 20 20     pData:.**    
acf0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c   pointer to docl
ad00: 69 73 74 2d 69 6e 64 65 78 20 72 65 63 6f 72 64  ist-index record
ad10: 2c 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  , .**.** When th
ad20: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
ad30: 61 6c 6c 65 64 20 70 49 74 65 72 2d 3e 69 4c 65  alled pIter->iLe
ad40: 61 66 50 67 6e 6f 20 69 73 20 74 68 65 20 70 61  afPgno is the pa
ad50: 67 65 20 6e 75 6d 62 65 72 20 74 68 65 0a 2a 2a  ge number the.**
ad60: 20 64 6f 63 6c 69 73 74 20 69 73 20 61 73 73 6f   doclist is asso
ad70: 63 69 61 74 65 64 20 77 69 74 68 20 28 74 68 65  ciated with (the
ad80: 20 6f 6e 65 20 66 65 61 74 75 72 69 6e 67 20 74   one featuring t
ad90: 68 65 20 74 65 72 6d 29 2e 0a 2a 2f 0a 73 74 61  he term)..*/.sta
ada0: 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64  tic int fts5Dlid
adb0: 78 49 74 65 72 46 69 72 73 74 28 46 74 73 35 44  xIterFirst(Fts5D
adc0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
add0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
ade0: 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e  (i=0; i<pIter->n
adf0: 4c 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 66  Lvl; i++){.    f
ae00: 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65 78 74 28  ts5DlidxLvlNext(
ae10: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 29  &pIter->aLvl[i])
ae20: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
ae30: 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e 62 45  Iter->aLvl[0].bE
ae40: 6f 66 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 69  of;.}...static i
ae50: 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74 65 72  nt fts5DlidxIter
ae60: 45 6f 66 28 46 74 73 35 49 6e 64 65 78 20 2a 70  Eof(Fts5Index *p
ae70: 2c 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20  , Fts5DlidxIter 
ae80: 2a 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72  *pIter){.  retur
ae90: 6e 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  n p->rc!=SQLITE_
aea0: 4f 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 61 4c 76  OK || pIter->aLv
aeb0: 6c 5b 30 5d 2e 62 45 6f 66 3b 0a 7d 0a 0a 73 74  l[0].bEof;.}..st
aec0: 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44 6c  atic void fts5Dl
aed0: 69 64 78 49 74 65 72 4c 61 73 74 28 46 74 73 35  idxIterLast(Fts5
aee0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c  Index *p, Fts5Dl
aef0: 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29 7b  idxIter *pIter){
af00: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
af10: 41 64 76 61 6e 63 65 20 65 61 63 68 20 6c 65 76  Advance each lev
af20: 65 6c 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  el to the last e
af30: 6e 74 72 79 20 6f 6e 20 74 68 65 20 6c 61 73 74  ntry on the last
af40: 20 70 61 67 65 20 2a 2f 0a 20 20 66 6f 72 28 69   page */.  for(i
af50: 3d 70 49 74 65 72 2d 3e 6e 4c 76 6c 2d 31 3b 20  =pIter->nLvl-1; 
af60: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
af70: 20 26 26 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a   && i>=0; i--){.
af80: 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
af90: 20 2a 70 4c 76 6c 20 3d 20 26 70 49 74 65 72 2d   *pLvl = &pIter-
afa0: 3e 61 4c 76 6c 5b 69 5d 3b 0a 20 20 20 20 77 68  >aLvl[i];.    wh
afb0: 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c 76  ile( fts5DlidxLv
afc0: 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20 29  lNext(pLvl)==0 )
afd0: 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f 66  ;.    pLvl->bEof
afe0: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 69   = 0;..    if( i
aff0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35  >0 ){.      Fts5
b000: 44 6c 69 64 78 4c 76 6c 20 2a 70 43 68 69 6c 64  DlidxLvl *pChild
b010: 20 3d 20 26 70 4c 76 6c 5b 2d 31 5d 3b 0a 20 20   = &pLvl[-1];.  
b020: 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65      fts5DataRele
b030: 61 73 65 28 70 43 68 69 6c 64 2d 3e 70 44 61 74  ase(pChild->pDat
b040: 61 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  a);.      memset
b050: 28 70 43 68 69 6c 64 2c 20 30 2c 20 73 69 7a 65  (pChild, 0, size
b060: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b070: 29 3b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  );.      pChild-
b080: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b090: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b0a0: 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52      FTS5_DLIDX_R
b0b0: 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53 65 67  OWID(pIter->iSeg
b0c0: 69 64 2c 20 69 2d 31 2c 20 70 4c 76 6c 2d 3e 69  id, i-1, pLvl->i
b0d0: 4c 65 61 66 50 67 6e 6f 29 0a 20 20 20 20 20 20  LeafPgno).      
b0e0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
b0f0: 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
b100: 74 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61  terator passed a
b110: 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d  s the only argum
b120: 65 6e 74 20 74 6f 20 74 68 65 20 70 72 65 76 69  ent to the previ
b130: 6f 75 73 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73 74  ous entry..*/.st
b140: 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69  atic int fts5Dli
b150: 64 78 4c 76 6c 50 72 65 76 28 46 74 73 35 44 6c  dxLvlPrev(Fts5Dl
b160: 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 29 7b 0a 20  idxLvl *pLvl){. 
b170: 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 4c 76 6c   int iOff = pLvl
b180: 2d 3e 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65 72  ->iOff;..  asser
b190: 74 28 20 70 4c 76 6c 2d 3e 62 45 6f 66 3d 3d 30  t( pLvl->bEof==0
b1a0: 20 29 3b 0a 20 20 69 66 28 20 69 4f 66 66 3c 3d   );.  if( iOff<=
b1b0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b1c0: 29 7b 0a 20 20 20 20 70 4c 76 6c 2d 3e 62 45 6f  ){.    pLvl->bEo
b1d0: 66 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f = 1;.  }else{.
b1e0: 20 20 20 20 75 38 20 2a 61 20 3d 20 70 4c 76 6c      u8 *a = pLvl
b1f0: 2d 3e 70 44 61 74 61 2d 3e 70 3b 0a 20 20 20 20  ->pData->p;.    
b200: 69 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69 6e  i64 iVal;.    in
b210: 74 20 69 4c 69 6d 69 74 3b 0a 20 20 20 20 69 6e  t iLimit;.    in
b220: 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 5a  t ii;.    int nZ
b230: 65 72 6f 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ero = 0;..    /*
b240: 20 43 75 72 72 65 6e 74 6c 79 20 69 4f 66 66 20   Currently iOff 
b250: 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
b260: 72 73 74 20 62 79 74 65 20 6f 66 20 61 20 76 61  rst byte of a va
b270: 72 69 6e 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  rint. This block
b280: 20 0a 20 20 20 20 2a 2a 20 64 65 63 72 65 6d 65   .    ** decreme
b290: 6e 74 73 20 69 4f 66 66 20 75 6e 74 69 6c 20 69  nts iOff until i
b2a0: 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
b2b0: 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
b2c0: 65 20 70 72 65 76 69 6f 75 73 20 0a 20 20 20 20  e previous .    
b2d0: 2a 2a 20 76 61 72 69 6e 74 2e 20 54 61 6b 69 6e  ** varint. Takin
b2e0: 67 20 63 61 72 65 20 6e 6f 74 20 74 6f 20 72 65  g care not to re
b2f0: 61 64 20 61 6e 79 20 6d 65 6d 6f 72 79 20 6c 6f  ad any memory lo
b300: 63 61 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63  cations that occ
b310: 75 72 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65  ur.    ** before
b320: 20 74 68 65 20 62 75 66 66 65 72 20 69 6e 20 6d   the buffer in m
b330: 65 6d 6f 72 79 2e 20 20 2a 2f 0a 20 20 20 20 69  emory.  */.    i
b340: 4c 69 6d 69 74 20 3d 20 28 69 4f 66 66 3e 39 20  Limit = (iOff>9 
b350: 3f 20 69 4f 66 66 2d 39 20 3a 20 30 29 3b 0a 20  ? iOff-9 : 0);. 
b360: 20 20 20 66 6f 72 28 69 4f 66 66 2d 2d 3b 20 69     for(iOff--; i
b370: 4f 66 66 3e 69 4c 69 6d 69 74 3b 20 69 4f 66 66  Off>iLimit; iOff
b380: 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  --){.      if( (
b390: 61 5b 69 4f 66 66 2d 31 5d 20 26 20 30 78 38 30  a[iOff-1] & 0x80
b3a0: 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
b3b0: 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 47 65 74    }..    fts5Get
b3c0: 56 61 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c  Varint(&a[iOff],
b3d0: 20 28 75 36 34 2a 29 26 69 56 61 6c 29 3b 0a 20   (u64*)&iVal);. 
b3e0: 20 20 20 70 4c 76 6c 2d 3e 69 52 6f 77 69 64 20     pLvl->iRowid 
b3f0: 2d 3d 20 69 56 61 6c 3b 0a 20 20 20 20 70 4c 76  -= iVal;.    pLv
b400: 6c 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d 2d 3b 0a  l->iLeafPgno--;.
b410: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 62 61 63  .    /* Skip bac
b420: 6b 77 61 72 64 73 20 70 61 73 74 20 61 6e 79 20  kwards past any 
b430: 30 78 30 30 20 76 61 72 69 6e 74 73 2e 20 2a 2f  0x00 varints. */
b440: 0a 20 20 20 20 66 6f 72 28 69 69 3d 69 4f 66 66  .    for(ii=iOff
b450: 2d 31 3b 20 69 69 3e 3d 70 4c 76 6c 2d 3e 69 46  -1; ii>=pLvl->iF
b460: 69 72 73 74 4f 66 66 20 26 26 20 61 5b 69 69 5d  irstOff && a[ii]
b470: 3d 3d 30 78 30 30 3b 20 69 69 2d 2d 29 7b 0a 20  ==0x00; ii--){. 
b480: 20 20 20 20 20 6e 5a 65 72 6f 2b 2b 3b 0a 20 20       nZero++;.  
b490: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 69 3e 3d    }.    if( ii>=
b4a0: 70 4c 76 6c 2d 3e 69 46 69 72 73 74 4f 66 66 20  pLvl->iFirstOff 
b4b0: 26 26 20 28 61 5b 69 69 5d 20 26 20 30 78 38 30  && (a[ii] & 0x80
b4c0: 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ) ){.      /* Th
b4d0: 65 20 62 79 74 65 20 69 6d 6d 65 64 69 61 74 65  e byte immediate
b4e0: 6c 79 20 62 65 66 6f 72 65 20 74 68 65 20 6c 61  ly before the la
b4f0: 73 74 20 30 78 30 30 20 62 79 74 65 20 68 61 73  st 0x00 byte has
b500: 20 74 68 65 20 30 78 38 30 20 62 69 74 0a 20 20   the 0x80 bit.  
b510: 20 20 20 20 2a 2a 20 73 65 74 2e 20 53 6f 20 74      ** set. So t
b520: 68 65 20 6c 61 73 74 20 30 78 30 30 20 69 73 20  he last 0x00 is 
b530: 6f 6e 6c 79 20 61 20 76 61 72 69 6e 74 20 30 20  only a varint 0 
b540: 69 66 20 74 68 65 72 65 20 61 72 65 20 38 20 6d  if there are 8 m
b550: 6f 72 65 20 30 78 38 30 0a 20 20 20 20 20 20 2a  ore 0x80.      *
b560: 2a 20 62 79 74 65 73 20 62 65 66 6f 72 65 20 61  * bytes before a
b570: 5b 69 69 5d 2e 20 2a 2f 0a 20 20 20 20 20 20 69  [ii]. */.      i
b580: 6e 74 20 62 5a 65 72 6f 20 3d 20 30 3b 20 20 20  nt bZero = 0;   
b590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
b5a0: 75 65 20 69 66 20 6c 61 73 74 20 30 78 30 30 20  ue if last 0x00 
b5b0: 63 6f 75 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  counts */.      
b5c0: 69 66 28 20 28 69 69 2d 38 29 3e 3d 70 4c 76 6c  if( (ii-8)>=pLvl
b5d0: 2d 3e 69 46 69 72 73 74 4f 66 66 20 29 7b 0a 20  ->iFirstOff ){. 
b5e0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
b5f0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a        for(j=1; j
b600: 3c 3d 38 20 26 26 20 28 61 5b 69 69 2d 6a 5d 20  <=8 && (a[ii-j] 
b610: 26 20 30 78 38 30 29 3b 20 6a 2b 2b 29 3b 0a 20  & 0x80); j++);. 
b620: 20 20 20 20 20 20 20 62 5a 65 72 6f 20 3d 20 28         bZero = (
b630: 6a 3e 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j>8);.      }.  
b640: 20 20 20 20 69 66 28 20 62 5a 65 72 6f 3d 3d 30      if( bZero==0
b650: 20 29 20 6e 5a 65 72 6f 2d 2d 3b 0a 20 20 20 20   ) nZero--;.    
b660: 7d 0a 20 20 20 20 70 4c 76 6c 2d 3e 69 4c 65 61  }.    pLvl->iLea
b670: 66 50 67 6e 6f 20 2d 3d 20 6e 5a 65 72 6f 3b 0a  fPgno -= nZero;.
b680: 20 20 20 20 70 4c 76 6c 2d 3e 69 4f 66 66 20 3d      pLvl->iOff =
b690: 20 69 4f 66 66 20 2d 20 6e 5a 65 72 6f 3b 0a 20   iOff - nZero;. 
b6a0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4c 76   }..  return pLv
b6b0: 6c 2d 3e 62 45 6f 66 3b 0a 7d 0a 0a 73 74 61 74  l->bEof;.}..stat
b6c0: 69 63 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78  ic int fts5Dlidx
b6d0: 49 74 65 72 50 72 65 76 52 28 46 74 73 35 49 6e  IterPrevR(Fts5In
b6e0: 64 65 78 20 2a 70 2c 20 46 74 73 35 44 6c 69 64  dex *p, Fts5Dlid
b6f0: 78 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e  xIter *pIter, in
b700: 74 20 69 4c 76 6c 29 7b 0a 20 20 46 74 73 35 44  t iLvl){.  Fts5D
b710: 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20 3d 20  lidxLvl *pLvl = 
b720: 26 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 4c 76  &pIter->aLvl[iLv
b730: 6c 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  l];..  assert( i
b740: 4c 76 6c 3c 70 49 74 65 72 2d 3e 6e 4c 76 6c 20  Lvl<pIter->nLvl 
b750: 29 3b 0a 20 20 69 66 28 20 66 74 73 35 44 6c 69  );.  if( fts5Dli
b760: 64 78 4c 76 6c 50 72 65 76 28 70 4c 76 6c 29 20  dxLvlPrev(pLvl) 
b770: 29 7b 0a 20 20 20 20 69 66 28 20 28 69 4c 76 6c  ){.    if( (iLvl
b780: 2b 31 29 20 3c 20 70 49 74 65 72 2d 3e 6e 4c 76  +1) < pIter->nLv
b790: 6c 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  l ){.      fts5D
b7a0: 6c 69 64 78 49 74 65 72 50 72 65 76 52 28 70 2c  lidxIterPrevR(p,
b7b0: 20 70 49 74 65 72 2c 20 69 4c 76 6c 2b 31 29 3b   pIter, iLvl+1);
b7c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 5b  .      if( pLvl[
b7d0: 31 5d 2e 62 45 6f 66 3d 3d 30 20 29 7b 0a 20 20  1].bEof==0 ){.  
b7e0: 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
b7f0: 6c 65 61 73 65 28 70 4c 76 6c 2d 3e 70 44 61 74  lease(pLvl->pDat
b800: 61 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  a);.        mems
b810: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
b820: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
b830: 29 3b 0a 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  );.        pLvl-
b840: 3e 70 44 61 74 61 20 3d 20 66 74 73 35 44 61 74  >pData = fts5Dat
b850: 61 52 65 61 64 28 70 2c 20 0a 20 20 20 20 20 20  aRead(p, .      
b860: 20 20 20 20 20 20 46 54 53 35 5f 44 4c 49 44 58        FTS5_DLIDX
b870: 5f 52 4f 57 49 44 28 70 49 74 65 72 2d 3e 69 53  _ROWID(pIter->iS
b880: 65 67 69 64 2c 20 69 4c 76 6c 2c 20 70 4c 76 6c  egid, iLvl, pLvl
b890: 5b 31 5d 2e 69 4c 65 61 66 50 67 6e 6f 29 0a 20  [1].iLeafPgno). 
b8a0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
b8b0: 20 20 69 66 28 20 70 4c 76 6c 2d 3e 70 44 61 74    if( pLvl->pDat
b8c0: 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  a ){.          w
b8d0: 68 69 6c 65 28 20 66 74 73 35 44 6c 69 64 78 4c  hile( fts5DlidxL
b8e0: 76 6c 4e 65 78 74 28 70 4c 76 6c 29 3d 3d 30 20  vlNext(pLvl)==0 
b8f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76  );.          pLv
b900: 6c 2d 3e 62 45 6f 66 20 3d 20 30 3b 0a 20 20 20  l->bEof = 0;.   
b910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b920: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
b930: 72 6e 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30  rn pIter->aLvl[0
b940: 5d 2e 62 45 6f 66 3b 0a 7d 0a 73 74 61 74 69 63  ].bEof;.}.static
b950: 20 69 6e 74 20 66 74 73 35 44 6c 69 64 78 49 74   int fts5DlidxIt
b960: 65 72 50 72 65 76 28 46 74 73 35 49 6e 64 65 78  erPrev(Fts5Index
b970: 20 2a 70 2c 20 46 74 73 35 44 6c 69 64 78 49 74   *p, Fts5DlidxIt
b980: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 72 65  er *pIter){.  re
b990: 74 75 72 6e 20 66 74 73 35 44 6c 69 64 78 49 74  turn fts5DlidxIt
b9a0: 65 72 50 72 65 76 52 28 70 2c 20 70 49 74 65 72  erPrevR(p, pIter
b9b0: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  , 0);.}../*.** F
b9c0: 72 65 65 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e  ree a doclist-in
b9d0: 64 65 78 20 69 74 65 72 61 74 6f 72 20 6f 62 6a  dex iterator obj
b9e0: 65 63 74 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  ect allocated by
b9f0: 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e   fts5DlidxIterIn
ba00: 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
ba10: 76 6f 69 64 20 66 74 73 35 44 6c 69 64 78 49 74  void fts5DlidxIt
ba20: 65 72 46 72 65 65 28 46 74 73 35 44 6c 69 64 78  erFree(Fts5Dlidx
ba30: 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
ba40: 69 66 28 20 70 49 74 65 72 20 29 7b 0a 20 20 20  if( pIter ){.   
ba50: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
ba60: 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 4c  i=0; i<pIter->nL
ba70: 76 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  vl; i++){.      
ba80: 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
ba90: 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 69 5d 2e 70  pIter->aLvl[i].p
baa0: 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Data);.    }.   
bab0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
bac0: 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61  ter);.  }.}..sta
bad0: 74 69 63 20 46 74 73 35 44 6c 69 64 78 49 74 65  tic Fts5DlidxIte
bae0: 72 20 2a 66 74 73 35 44 6c 69 64 78 49 74 65 72  r *fts5DlidxIter
baf0: 49 6e 69 74 28 0a 20 20 46 74 73 35 49 6e 64 65  Init(.  Fts5Inde
bb00: 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
bb10: 20 20 20 20 20 20 20 20 2f 2a 20 46 74 73 35 20          /* Fts5 
bb20: 42 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72 61  Backend to itera
bb30: 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20 69  te within */.  i
bb40: 6e 74 20 62 52 65 76 2c 20 20 20 20 20 20 20 20  nt bRev,        
bb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb60: 2a 20 54 72 75 65 20 66 6f 72 20 4f 52 44 45 52  * True for ORDER
bb70: 20 42 59 20 41 53 43 20 2a 2f 0a 20 20 69 6e 74   BY ASC */.  int
bb80: 20 69 53 65 67 69 64 2c 20 20 20 20 20 20 20 20   iSegid,        
bb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bba0: 53 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20  Segment id */.  
bbb0: 69 6e 74 20 69 4c 65 61 66 50 67 20 20 20 20 20  int iLeafPg     
bbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbd0: 2f 2a 20 4c 65 61 66 20 70 61 67 65 20 6e 75 6d  /* Leaf page num
bbe0: 62 65 72 20 74 6f 20 6c 6f 61 64 20 64 6c 69 64  ber to load dlid
bbf0: 78 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 46 74  x for */.){.  Ft
bc00: 73 35 44 6c 69 64 78 49 74 65 72 20 2a 70 49 74  s5DlidxIter *pIt
bc10: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  er = 0;.  int i;
bc20: 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30  .  int bDone = 0
bc30: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d  ;..  for(i=0; p-
bc40: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
bc50: 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29  & bDone==0; i++)
bc60: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e  {.    sqlite3_in
bc70: 74 36 34 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  t64 nByte = size
bc80: 6f 66 28 46 74 73 35 44 6c 69 64 78 49 74 65 72  of(Fts5DlidxIter
bc90: 29 20 2b 20 69 20 2a 20 73 69 7a 65 6f 66 28 46  ) + i * sizeof(F
bca0: 74 73 35 44 6c 69 64 78 4c 76 6c 29 3b 0a 20 20  ts5DlidxLvl);.  
bcb0: 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
bcc0: 2a 70 4e 65 77 3b 0a 0a 20 20 20 20 70 4e 65 77  *pNew;..    pNew
bcd0: 20 3d 20 28 46 74 73 35 44 6c 69 64 78 49 74 65   = (Fts5DlidxIte
bce0: 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  r*)sqlite3_reall
bcf0: 6f 63 36 34 28 70 49 74 65 72 2c 20 6e 42 79 74  oc64(pIter, nByt
bd00: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
bd10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
bd20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
bd30: 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
bd40: 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20 3d      i64 iRowid =
bd50: 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
bd60: 44 28 69 53 65 67 69 64 2c 20 69 2c 20 69 4c 65  D(iSegid, i, iLe
bd70: 61 66 50 67 29 3b 0a 20 20 20 20 20 20 46 74 73  afPg);.      Fts
bd80: 35 44 6c 69 64 78 4c 76 6c 20 2a 70 4c 76 6c 20  5DlidxLvl *pLvl 
bd90: 3d 20 26 70 4e 65 77 2d 3e 61 4c 76 6c 5b 69 5d  = &pNew->aLvl[i]
bda0: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 20 3d 20  ;.      pIter = 
bdb0: 70 4e 65 77 3b 0a 20 20 20 20 20 20 6d 65 6d 73  pNew;.      mems
bdc0: 65 74 28 70 4c 76 6c 2c 20 30 2c 20 73 69 7a 65  et(pLvl, 0, size
bdd0: 6f 66 28 46 74 73 35 44 6c 69 64 78 4c 76 6c 29  of(Fts5DlidxLvl)
bde0: 29 3b 0a 20 20 20 20 20 20 70 4c 76 6c 2d 3e 70  );.      pLvl->p
bdf0: 44 61 74 61 20 3d 20 66 74 73 35 44 61 74 61 52  Data = fts5DataR
be00: 65 61 64 28 70 2c 20 69 52 6f 77 69 64 29 3b 0a  ead(p, iRowid);.
be10: 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e        if( pLvl->
be20: 70 44 61 74 61 20 26 26 20 28 70 4c 76 6c 2d 3e  pData && (pLvl->
be30: 70 44 61 74 61 2d 3e 70 5b 30 5d 20 26 20 30 78  pData->p[0] & 0x
be40: 30 30 30 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20  0001)==0 ){.    
be50: 20 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20      bDone = 1;. 
be60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74       }.      pIt
be70: 65 72 2d 3e 6e 4c 76 6c 20 3d 20 69 2b 31 3b 0a  er->nLvl = i+1;.
be80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
be90: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
bea0: 4b 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  K ){.    pIter->
beb0: 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
bec0: 0a 20 20 20 20 69 66 28 20 62 52 65 76 3d 3d 30  .    if( bRev==0
bed0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
bee0: 69 64 78 49 74 65 72 46 69 72 73 74 28 70 49 74  idxIterFirst(pIt
bef0: 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  er);.    }else{.
bf00: 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
bf10: 74 65 72 4c 61 73 74 28 70 2c 20 70 49 74 65 72  terLast(p, pIter
bf20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
bf30: 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54  if( p->rc!=SQLIT
bf40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74 73 35  E_OK ){.    fts5
bf50: 44 6c 69 64 78 49 74 65 72 46 72 65 65 28 70 49  DlidxIterFree(pI
bf60: 74 65 72 29 3b 0a 20 20 20 20 70 49 74 65 72 20  ter);.    pIter 
bf70: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
bf80: 72 6e 20 70 49 74 65 72 3b 0a 7d 0a 0a 73 74 61  rn pIter;.}..sta
bf90: 74 69 63 20 69 36 34 20 66 74 73 35 44 6c 69 64  tic i64 fts5Dlid
bfa0: 78 49 74 65 72 52 6f 77 69 64 28 46 74 73 35 44  xIterRowid(Fts5D
bfb0: 6c 69 64 78 49 74 65 72 20 2a 70 49 74 65 72 29  lidxIter *pIter)
bfc0: 7b 0a 20 20 72 65 74 75 72 6e 20 70 49 74 65 72  {.  return pIter
bfd0: 2d 3e 61 4c 76 6c 5b 30 5d 2e 69 52 6f 77 69 64  ->aLvl[0].iRowid
bfe0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66  ;.}.static int f
bff0: 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f  ts5DlidxIterPgno
c000: 28 46 74 73 35 44 6c 69 64 78 49 74 65 72 20 2a  (Fts5DlidxIter *
c010: 70 49 74 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  pIter){.  return
c020: 20 70 49 74 65 72 2d 3e 61 4c 76 6c 5b 30 5d 2e   pIter->aLvl[0].
c030: 69 4c 65 61 66 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  iLeafPgno;.}../*
c040: 0a 2a 2a 20 4c 6f 61 64 20 74 68 65 20 6e 65 78  .** Load the nex
c050: 74 20 6c 65 61 66 20 70 61 67 65 20 69 6e 74 6f  t leaf page into
c060: 20 74 68 65 20 73 65 67 6d 65 6e 74 20 69 74 65   the segment ite
c070: 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rator..*/.static
c080: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
c090: 72 4e 65 78 74 50 61 67 65 28 0a 20 20 46 74 73  rNextPage(.  Fts
c0a0: 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
c0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0c0: 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
c0d0: 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
c0e0: 49 74 65 72 20 2a 70 49 74 65 72 20 20 20 20 20  Iter *pIter     
c0f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
c100: 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65 20  ator to advance 
c110: 74 6f 20 6e 65 78 74 20 70 61 67 65 20 2a 2f 0a  to next page */.
c120: 29 7b 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70  ){.  Fts5Data *p
c130: 4c 65 61 66 3b 0a 20 20 46 74 73 35 53 74 72 75  Leaf;.  Fts5Stru
c140: 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
c150: 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
c160: 3b 0a 20 20 66 74 73 35 44 61 74 61 52 65 6c 65  ;.  fts5DataRele
c170: 61 73 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  ase(pIter->pLeaf
c180: 29 3b 0a 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  );.  pIter->iLea
c190: 66 50 67 6e 6f 2b 2b 3b 0a 20 20 69 66 28 20 70  fPgno++;.  if( p
c1a0: 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20  Iter->pNextLeaf 
c1b0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c  ){.    pIter->pL
c1c0: 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4e 65  eaf = pIter->pNe
c1d0: 78 74 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65  xtLeaf;.    pIte
c1e0: 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 30  r->pNextLeaf = 0
c1f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ;.  }else if( pI
c200: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3c 3d  ter->iLeafPgno<=
c210: 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29  pSeg->pgnoLast )
c220: 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65  {.    pIter->pLe
c230: 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  af = fts5LeafRea
c240: 64 28 70 2c 20 0a 20 20 20 20 20 20 20 20 46 54  d(p, .        FT
c250: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
c260: 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 70  (pSeg->iSegid, p
c270: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 29  Iter->iLeafPgno)
c280: 0a 20 20 20 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .    );.  }else{
c290: 0a 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61  .    pIter->pLea
c2a0: 66 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4c 65  f = 0;.  }.  pLe
c2b0: 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  af = pIter->pLea
c2c0: 66 3b 0a 0a 20 20 69 66 28 20 70 4c 65 61 66 20  f;..  if( pLeaf 
c2d0: 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 50  ){.    pIter->iP
c2e0: 67 69 64 78 4f 66 66 20 3d 20 70 4c 65 61 66 2d  gidxOff = pLeaf-
c2f0: 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 69 66 28  >szLeaf;.    if(
c300: 20 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c   fts5LeafIsTerml
c310: 65 73 73 28 70 4c 65 61 66 29 20 29 7b 0a 20 20  ess(pLeaf) ){.  
c320: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c330: 66 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66  fDoclist = pLeaf
c340: 2d 3e 6e 6e 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  ->nn+1;.    }els
c350: 65 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  e{.      pIter->
c360: 69 50 67 69 64 78 4f 66 66 20 2b 3d 20 66 74 73  iPgidxOff += fts
c370: 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c  5GetVarint32(&pL
c380: 65 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 50  eaf->p[pIter->iP
c390: 67 69 64 78 4f 66 66 5d 2c 0a 20 20 20 20 20 20  gidxOff],.      
c3a0: 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f      pIter->iEndo
c3b0: 66 44 6f 63 6c 69 73 74 0a 20 20 20 20 20 20 29  fDoclist.      )
c3c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c3d0: 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 20  *.** Argument p 
c3e0: 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
c3f0: 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  er containing a 
c400: 76 61 72 69 6e 74 20 74 6f 20 62 65 20 69 6e 74  varint to be int
c410: 65 72 70 72 65 74 65 64 20 61 73 20 61 0a 2a 2a  erpreted as a.**
c420: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 73   position list s
c430: 69 7a 65 20 66 69 65 6c 64 2e 20 52 65 61 64 20  ize field. Read 
c440: 74 68 65 20 76 61 72 69 6e 74 20 61 6e 64 20 72  the varint and r
c450: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
c460: 20 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61   of bytes.** rea
c470: 64 2e 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e  d. Before return
c480: 69 6e 67 2c 20 73 65 74 20 2a 70 6e 53 7a 20 74  ing, set *pnSz t
c490: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
c4a0: 62 79 74 65 73 20 69 6e 20 74 68 65 20 70 6f 73  bytes in the pos
c4b0: 69 74 69 6f 6e 0a 2a 2a 20 6c 69 73 74 2c 20 61  ition.** list, a
c4c0: 6e 64 20 2a 70 62 44 65 6c 20 74 6f 20 74 72 75  nd *pbDel to tru
c4d0: 65 20 69 66 20 74 68 65 20 64 65 6c 65 74 65 20  e if the delete 
c4e0: 66 6c 61 67 20 69 73 20 73 65 74 2c 20 6f 72 20  flag is set, or 
c4f0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
c500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
c510: 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
c520: 65 28 63 6f 6e 73 74 20 75 38 20 2a 70 2c 20 69  e(const u8 *p, i
c530: 6e 74 20 2a 70 6e 53 7a 2c 20 69 6e 74 20 2a 70  nt *pnSz, int *p
c540: 62 44 65 6c 29 7b 0a 20 20 69 6e 74 20 6e 53 7a  bDel){.  int nSz
c550: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
c560: 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
c570: 6e 74 33 32 28 70 2c 20 6e 2c 20 6e 53 7a 29 3b  nt32(p, n, nSz);
c580: 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 53  .  assert_nc( nS
c590: 7a 3e 3d 30 20 29 3b 0a 20 20 2a 70 6e 53 7a 20  z>=0 );.  *pnSz 
c5a0: 3d 20 6e 53 7a 2f 32 3b 0a 20 20 2a 70 62 44 65  = nSz/2;.  *pbDe
c5b0: 6c 20 3d 20 6e 53 7a 20 26 20 30 78 30 30 30 31  l = nSz & 0x0001
c5c0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c5d0: 0a 2f 2a 0a 2a 2a 20 46 74 73 35 53 65 67 49 74  ./*.** Fts5SegIt
c5e0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 63  er.iLeafOffset c
c5f0: 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20  urrently points 
c600: 74 6f 20 74 68 65 20 66 69 72 73 74 20 62 79 74  to the first byt
c610: 65 20 6f 66 20 61 0a 2a 2a 20 70 6f 73 69 74 69  e of a.** positi
c620: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
c630: 6c 64 2e 20 52 65 61 64 20 74 68 65 20 76 61 6c  ld. Read the val
c640: 75 65 20 6f 66 20 74 68 65 20 66 69 65 6c 64 20  ue of the field 
c650: 61 6e 64 20 73 74 6f 72 65 20 69 74 0a 2a 2a 20  and store it.** 
c660: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
c670: 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
c680: 2a 20 20 20 46 74 73 35 53 65 67 49 74 65 72 2e  *   Fts5SegIter.
c690: 6e 50 6f 73 0a 2a 2a 20 20 20 46 74 73 35 53 65  nPos.**   Fts5Se
c6a0: 67 49 74 65 72 2e 62 44 65 6c 0a 2a 2a 0a 2a 2a  gIter.bDel.**.**
c6b0: 20 4c 65 61 76 65 20 46 74 73 35 53 65 67 49 74   Leave Fts5SegIt
c6c0: 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70  er.iLeafOffset p
c6d0: 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 66  ointing to the f
c6e0: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
c6f0: 20 0a 2a 2a 20 70 6f 73 69 74 69 6f 6e 20 6c 69   .** position li
c700: 73 74 20 63 6f 6e 74 65 6e 74 20 28 69 66 20 61  st content (if a
c710: 6e 79 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ny)..*/.static v
c720: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
c730: 6f 61 64 4e 50 6f 73 28 46 74 73 35 49 6e 64 65  oadNPos(Fts5Inde
c740: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
c750: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
c760: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
c770: 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66  K ){.    int iOf
c780: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
c790: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
c7a0: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
c7b0: 0a 20 20 20 20 41 53 53 45 52 54 5f 53 5a 4c 45  .    ASSERT_SZLE
c7c0: 41 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65  AF_OK(pIter->pLe
c7d0: 61 66 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  af);.    if( p->
c7e0: 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
c7f0: 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f  ==FTS5_DETAIL_NO
c800: 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  NE ){.      int 
c810: 69 45 6f 64 20 3d 20 4d 49 4e 28 70 49 74 65 72  iEod = MIN(pIter
c820: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 2c  ->iEndofDoclist,
c830: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
c840: 7a 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49  zLeaf);.      pI
c850: 74 65 72 2d 3e 62 44 65 6c 20 3d 20 30 3b 0a 20  ter->bDel = 0;. 
c860: 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
c870: 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20   = 1;.      if( 
c880: 69 4f 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74  iOff<iEod && pIt
c890: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  er->pLeaf->p[iOf
c8a0: 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  f]==0 ){.       
c8b0: 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d 20 31   pIter->bDel = 1
c8c0: 3b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b  ;.        iOff++
c8d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
c8e0: 66 66 3c 69 45 6f 64 20 26 26 20 70 49 74 65 72  ff<iEod && pIter
c8f0: 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  ->pLeaf->p[iOff]
c900: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
c910: 20 70 49 74 65 72 2d 3e 6e 50 6f 73 20 3d 20 31   pIter->nPos = 1
c920: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66  ;.          iOff
c930: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ++;.        }els
c940: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  e{.          pIt
c950: 65 72 2d 3e 6e 50 6f 73 20 3d 20 30 3b 0a 20 20  er->nPos = 0;.  
c960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
c970: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c980: 20 69 6e 74 20 6e 53 7a 3b 0a 20 20 20 20 20 20   int nSz;.      
c990: 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e  fts5FastGetVarin
c9a0: 74 33 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66  t32(pIter->pLeaf
c9b0: 2d 3e 70 2c 20 69 4f 66 66 2c 20 6e 53 7a 29 3b  ->p, iOff, nSz);
c9c0: 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 44  .      pIter->bD
c9d0: 65 6c 20 3d 20 28 6e 53 7a 20 26 20 30 78 30 30  el = (nSz & 0x00
c9e0: 30 31 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72  01);.      pIter
c9f0: 2d 3e 6e 50 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b  ->nPos = nSz>>1;
ca00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63  .      assert_nc
ca10: 28 20 70 49 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30  ( pIter->nPos>=0
ca20: 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49   );.    }.    pI
ca30: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
ca40: 20 3d 20 69 4f 66 66 3b 0a 20 20 7d 0a 7d 0a 0a   = iOff;.  }.}..
ca50: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
ca60: 53 65 67 49 74 65 72 4c 6f 61 64 52 6f 77 69 64  SegIterLoadRowid
ca70: 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46  (Fts5Index *p, F
ca80: 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
ca90: 72 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49  r){.  u8 *a = pI
caa0: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 20 20  ter->pLeaf->p;  
cab0: 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20        /* Buffer 
cac0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f  to read data fro
cad0: 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66 66 20  m */.  int iOff 
cae0: 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66  = pIter->iLeafOf
caf0: 66 73 65 74 3b 0a 0a 20 20 41 53 53 45 52 54 5f  fset;..  ASSERT_
cb00: 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74 65 72 2d  SZLEAF_OK(pIter-
cb10: 3e 70 4c 65 61 66 29 3b 0a 20 20 69 66 28 20 69  >pLeaf);.  if( i
cb20: 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61  Off>=pIter->pLea
cb30: 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
cb40: 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74   fts5SegIterNext
cb50: 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
cb60: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
cb70: 4c 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Leaf==0 ){.     
cb80: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
cb90: 54 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20  TE_OK ) p->rc = 
cba0: 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
cbb0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
cbc0: 7d 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a  }.    iOff = 4;.
cbd0: 20 20 20 20 61 20 3d 20 70 49 74 65 72 2d 3e 70      a = pIter->p
cbe0: 4c 65 61 66 2d 3e 70 3b 0a 20 20 7d 0a 20 20 69  Leaf->p;.  }.  i
cbf0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
cc00: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
cc10: 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49 74  Off], (u64*)&pIt
cc20: 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 70  er->iRowid);.  p
cc30: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
cc40: 74 20 3d 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  t = iOff;.}../*.
cc50: 2a 2a 20 46 74 73 35 53 65 67 49 74 65 72 2e 69  ** Fts5SegIter.i
cc60: 4c 65 61 66 4f 66 66 73 65 74 20 63 75 72 72 65  LeafOffset curre
cc70: 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74  ntly points to t
cc80: 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66  he first byte of
cc90: 20 74 68 65 20 0a 2a 2a 20 22 6e 53 75 66 66 69   the .** "nSuffi
cca0: 78 22 20 66 69 65 6c 64 20 6f 66 20 61 20 74 65  x" field of a te
ccb0: 72 6d 2e 20 46 75 6e 63 74 69 6f 6e 20 70 61 72  rm. Function par
ccc0: 61 6d 65 74 65 72 20 6e 4b 65 65 70 20 63 6f 6e  ameter nKeep con
ccd0: 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75 65 0a  tains the value.
cce0: 2a 2a 20 6f 66 20 74 68 65 20 22 6e 50 72 65 66  ** of the "nPref
ccf0: 69 78 22 20 66 69 65 6c 64 20 28 69 66 20 74 68  ix" field (if th
cd00: 65 72 65 20 77 61 73 20 6f 6e 65 20 2d 20 69 74  ere was one - it
cd10: 20 69 73 20 70 61 73 73 65 64 20 30 20 69 66 20   is passed 0 if 
cd20: 74 68 69 73 20 69 73 0a 2a 2a 20 74 68 65 20 66  this is.** the f
cd30: 69 72 73 74 20 74 65 72 6d 20 69 6e 20 74 68 65  irst term in the
cd40: 20 73 65 67 6d 65 6e 74 29 2e 0a 2a 2a 0a 2a 2a   segment)..**.**
cd50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
cd60: 6f 70 75 6c 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  opulates:.**.** 
cd70: 20 20 46 74 73 35 53 65 67 49 74 65 72 2e 74 65    Fts5SegIter.te
cd80: 72 6d 0a 2a 2a 20 20 20 46 74 73 35 53 65 67 49  rm.**   Fts5SegI
cd90: 74 65 72 2e 72 6f 77 69 64 0a 2a 2a 0a 2a 2a 20  ter.rowid.**.** 
cda0: 61 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 20  accordingly and 
cdb0: 6c 65 61 76 65 73 20 28 46 74 73 35 53 65 67 49  leaves (Fts5SegI
cdc0: 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 29  ter.iLeafOffset)
cdd0: 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6e 74   set to the cont
cde0: 65 6e 74 20 6f 66 0a 2a 2a 20 74 68 65 20 66 69  ent of.** the fi
cdf0: 72 73 74 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  rst position lis
ce00: 74 2e 20 54 68 65 20 70 6f 73 69 74 69 6f 6e 20  t. The position 
ce10: 6c 69 73 74 20 62 65 6c 6f 6e 67 69 6e 67 20 74  list belonging t
ce20: 6f 20 64 6f 63 75 6d 65 6e 74 20 0a 2a 2a 20 28  o document .** (
ce30: 46 74 73 35 53 65 67 49 74 65 72 2e 69 52 6f 77  Fts5SegIter.iRow
ce40: 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  id)..*/.static v
ce50: 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4c  oid fts5SegIterL
ce60: 6f 61 64 54 65 72 6d 28 46 74 73 35 49 6e 64 65  oadTerm(Fts5Inde
ce70: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
ce80: 72 20 2a 70 49 74 65 72 2c 20 69 6e 74 20 6e 4b  r *pIter, int nK
ce90: 65 65 70 29 7b 0a 20 20 75 38 20 2a 61 20 3d 20  eep){.  u8 *a = 
cea0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
ceb0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65          /* Buffe
cec0: 72 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66  r to read data f
ced0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 66  rom */.  int iOf
cee0: 66 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66  f = pIter->iLeaf
cef0: 4f 66 66 73 65 74 3b 20 20 2f 2a 20 4f 66 66 73  Offset;  /* Offs
cf00: 65 74 20 74 6f 20 72 65 61 64 20 61 74 20 2a 2f  et to read at */
cf10: 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20  .  int nNew;    
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6e     /* Bytes of n
cf40: 65 77 20 64 61 74 61 20 2a 2f 0a 0a 20 20 69 4f  ew data */..  iO
cf50: 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
cf60: 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
cf70: 6e 4e 65 77 29 3b 0a 20 20 69 66 28 20 69 4f 66  nNew);.  if( iOf
cf80: 66 2b 6e 4e 65 77 3e 70 49 74 65 72 2d 3e 70 4c  f+nNew>pIter->pL
cf90: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 7c 7c 20 6e  eaf->szLeaf || n
cfa0: 4b 65 65 70 3e 70 49 74 65 72 2d 3e 74 65 72 6d  Keep>pIter->term
cfb0: 2e 6e 20 7c 7c 20 6e 4e 65 77 3d 3d 30 20 29 7b  .n || nNew==0 ){
cfc0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53  .    p->rc = FTS
cfd0: 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  5_CORRUPT;.    r
cfe0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 70 49 74  eturn;.  }.  pIt
cff0: 65 72 2d 3e 74 65 72 6d 2e 6e 20 3d 20 6e 4b 65  er->term.n = nKe
d000: 65 70 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  ep;.  fts5Buffer
d010: 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
d020: 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
d030: 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
d040: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
d050: 72 2d 3e 74 65 72 6d 2e 6e 3c 3d 70 49 74 65 72  r->term.n<=pIter
d060: 2d 3e 74 65 72 6d 2e 6e 53 70 61 63 65 20 29 3b  ->term.nSpace );
d070: 0a 20 20 69 4f 66 66 20 2b 3d 20 6e 4e 65 77 3b  .  iOff += nNew;
d080: 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  .  pIter->iTermL
d090: 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66  eafOffset = iOff
d0a0: 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  ;.  pIter->iTerm
d0b0: 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65 72  LeafPgno = pIter
d0c0: 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 70  ->iLeafPgno;.  p
d0d0: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
d0e0: 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 69 66 28  t = iOff;..  if(
d0f0: 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78 4f 66   pIter->iPgidxOf
d100: 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  f>=pIter->pLeaf-
d110: 3e 6e 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72  >nn ){.    pIter
d120: 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20  ->iEndofDoclist 
d130: 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  = pIter->pLeaf->
d140: 6e 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nn+1;.  }else{. 
d150: 20 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20     int nExtra;. 
d160: 20 20 20 70 49 74 65 72 2d 3e 69 50 67 69 64 78     pIter->iPgidx
d170: 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
d180: 72 69 6e 74 33 32 28 26 61 5b 70 49 74 65 72 2d  rint32(&a[pIter-
d190: 3e 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 45 78  >iPgidxOff], nEx
d1a0: 74 72 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  tra);.    pIter-
d1b0: 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 2b  >iEndofDoclist +
d1c0: 3d 20 6e 45 78 74 72 61 3b 0a 20 20 7d 0a 0a 20  = nExtra;.  }.. 
d1d0: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
d1e0: 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72 29 3b  Rowid(p, pIter);
d1f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
d200: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28  fts5SegIterNext(
d210: 46 74 73 35 49 6e 64 65 78 2a 2c 20 46 74 73 35  Fts5Index*, Fts5
d220: 53 65 67 49 74 65 72 2a 2c 20 69 6e 74 2a 29 3b  SegIter*, int*);
d230: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
d240: 35 53 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76  5SegIterNext_Rev
d250: 65 72 73 65 28 46 74 73 35 49 6e 64 65 78 2a 2c  erse(Fts5Index*,
d260: 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c 20 69   Fts5SegIter*, i
d270: 6e 74 2a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  nt*);.static voi
d280: 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65 78  d fts5SegIterNex
d290: 74 5f 4e 6f 6e 65 28 46 74 73 35 49 6e 64 65 78  t_None(Fts5Index
d2a0: 2a 2c 20 46 74 73 35 53 65 67 49 74 65 72 2a 2c  *, Fts5SegIter*,
d2b0: 20 69 6e 74 2a 29 3b 0a 0a 73 74 61 74 69 63 20   int*);..static 
d2c0: 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65 72  void fts5SegIter
d2d0: 53 65 74 4e 65 78 74 28 46 74 73 35 49 6e 64 65  SetNext(Fts5Inde
d2e0: 78 20 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65  x *p, Fts5SegIte
d2f0: 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28  r *pIter){.  if(
d300: 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
d310: 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
d320: 45 52 53 45 20 29 7b 0a 20 20 20 20 70 49 74 65  ERSE ){.    pIte
d330: 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35 53  r->xNext = fts5S
d340: 65 67 49 74 65 72 4e 65 78 74 5f 52 65 76 65 72  egIterNext_Rever
d350: 73 65 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  se;.  }else if( 
d360: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
d370: 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
d380: 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 49 74  _NONE ){.    pIt
d390: 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74 73 35  er->xNext = fts5
d3a0: 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f 6e 65  SegIterNext_None
d3b0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
d3c0: 49 74 65 72 2d 3e 78 4e 65 78 74 20 3d 20 66 74  Iter->xNext = ft
d3d0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 3b 0a 20  s5SegIterNext;. 
d3e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74   }.}../*.** Init
d3f0: 69 61 6c 69 7a 65 20 74 68 65 20 69 74 65 72 61  ialize the itera
d400: 74 6f 72 20 6f 62 6a 65 63 74 20 70 49 74 65 72  tor object pIter
d410: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
d420: 75 67 68 20 74 68 65 20 65 6e 74 72 69 65 73 20  ugh the entries 
d430: 69 6e 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 70 53  in.** segment pS
d440: 65 67 2e 20 54 68 65 20 69 74 65 72 61 74 6f 72  eg. The iterator
d450: 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
d460: 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
d470: 6e 74 72 79 20 77 68 65 6e 20 0a 2a 2a 20 74 68  ntry when .** th
d480: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
d490: 72 6e 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  rns..**.** If an
d4a0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 46   error occurs, F
d4b0: 74 73 35 49 6e 64 65 78 2e 72 63 20 69 73 20 73  ts5Index.rc is s
d4c0: 65 74 20 74 6f 20 61 6e 20 61 70 70 72 6f 70 72  et to an appropr
d4d0: 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
d4e0: 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72   If .** an error
d4f0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 6f 63 63   has already occ
d500: 75 72 72 65 64 20 77 68 65 6e 20 74 68 69 73 20  urred when this 
d510: 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
d520: 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
d530: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
d540: 64 20 66 74 73 35 53 65 67 49 74 65 72 49 6e 69  d fts5SegIterIni
d550: 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  t(.  Fts5Index *
d560: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
d570: 20 20 20 20 20 2f 2a 20 46 54 53 20 69 6e 64 65       /* FTS inde
d580: 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  x object */.  Ft
d590: 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
d5a0: 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
d5b0: 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
d5c0: 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73  segment */.  Fts
d5d0: 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
d5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d5f0: 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70 75 6c 61  Object to popula
d600: 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  te */.){.  if( p
d610: 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 3d 3d  Seg->pgnoFirst==
d620: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
d630: 20 68 61 70 70 65 6e 73 20 69 66 20 74 68 65 20   happens if the 
d640: 73 65 67 6d 65 6e 74 20 69 73 20 62 65 69 6e 67  segment is being
d650: 20 75 73 65 64 20 61 73 20 61 6e 20 69 6e 70 75   used as an inpu
d660: 74 20 74 6f 20 61 6e 20 69 6e 63 72 65 6d 65 6e  t to an incremen
d670: 74 61 6c 0a 20 20 20 20 2a 2a 20 6d 65 72 67 65  tal.    ** merge
d680: 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 68 61   and all data ha
d690: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 22  s already been "
d6a0: 74 72 69 6d 6d 65 64 22 2e 20 53 65 65 20 66 75  trimmed". See fu
d6b0: 6e 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 66 74  nction.    ** ft
d6c0: 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 29  s5TrimSegments()
d6d0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 49 6e   for details. In
d6e0: 20 74 68 69 73 20 63 61 73 65 20 6c 65 61 76 65   this case leave
d6f0: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 65 6d   the iterator em
d700: 70 74 79 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  pty..    ** The 
d710: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 73 65 65 20  caller will see 
d720: 74 68 65 20 28 70 49 74 65 72 2d 3e 70 4c 65 61  the (pIter->pLea
d730: 66 3d 3d 30 29 20 61 6e 64 20 61 73 73 75 6d 65  f==0) and assume
d740: 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73   the iterator is
d750: 0a 20 20 20 20 2a 2a 20 61 74 20 45 4f 46 20 61  .    ** at EOF a
d760: 6c 72 65 61 64 79 2e 20 2a 2f 0a 20 20 20 20 61  lready. */.    a
d770: 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
d780: 65 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  eaf==0 );.    re
d790: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  turn;.  }..  if(
d7a0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
d7b0: 4b 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  K ){.    memset(
d7c0: 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
d7d0: 28 2a 70 49 74 65 72 29 29 3b 0a 20 20 20 20 66  (*pIter));.    f
d7e0: 74 73 35 53 65 67 49 74 65 72 53 65 74 4e 65 78  ts5SegIterSetNex
d7f0: 74 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20  t(p, pIter);.   
d800: 20 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70   pIter->pSeg = p
d810: 53 65 67 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  Seg;.    pIter->
d820: 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 53 65 67  iLeafPgno = pSeg
d830: 2d 3e 70 67 6e 6f 46 69 72 73 74 2d 31 3b 0a 20  ->pgnoFirst-1;. 
d840: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
d850: 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
d860: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
d870: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
d880: 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
d890: 66 4f 66 66 73 65 74 20 3d 20 34 3b 0a 20 20 20  fOffset = 4;.   
d8a0: 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49 74 65   assert_nc( pIte
d8b0: 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3e 34 20 29  r->pLeaf->nn>4 )
d8c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28  ;.    assert_nc(
d8d0: 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 54 65   fts5LeafFirstTe
d8e0: 72 6d 4f 66 66 28 70 49 74 65 72 2d 3e 70 4c 65  rmOff(pIter->pLe
d8f0: 61 66 29 3d 3d 34 20 29 3b 0a 20 20 20 20 70 49  af)==4 );.    pI
d900: 74 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d  ter->iPgidxOff =
d910: 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73   pIter->pLeaf->s
d920: 7a 4c 65 61 66 2b 31 3b 0a 20 20 20 20 66 74 73  zLeaf+1;.    fts
d930: 35 53 65 67 49 74 65 72 4c 6f 61 64 54 65 72 6d  5SegIterLoadTerm
d940: 28 70 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20  (p, pIter, 0);. 
d950: 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f     fts5SegIterLo
d960: 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29  adNPos(p, pIter)
d970: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
d980: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
d990: 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65 64  only ever called
d9a0: 20 6f 6e 20 69 74 65 72 61 74 6f 72 73 20 63 72   on iterators cr
d9b0: 65 61 74 65 64 20 62 79 20 63 61 6c 6c 73 20 74  eated by calls t
d9c0: 6f 0a 2a 2a 20 46 74 73 35 49 6e 64 65 78 51 75  o.** Fts5IndexQu
d9d0: 65 72 79 28 29 20 77 69 74 68 20 74 68 65 20 46  ery() with the F
d9e0: 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44  TS5INDEX_QUERY_D
d9f0: 45 53 43 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a  ESC flag set..**
da00: 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
da10: 20 69 73 20 69 6e 20 61 6e 20 75 6e 75 73 75 61   is in an unusua
da20: 6c 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69  l state when thi
da30: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
da40: 6c 6c 65 64 3a 20 74 68 65 0a 2a 2a 20 46 74 73  lled: the.** Fts
da50: 35 53 65 67 49 74 65 72 2e 69 4c 65 61 66 4f 66  5SegIter.iLeafOf
da60: 66 73 65 74 20 76 61 72 69 61 62 6c 65 20 69 73  fset variable is
da70: 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66 73   set to the offs
da80: 65 74 20 6f 66 20 74 68 65 20 73 74 61 72 74 20  et of the start 
da90: 6f 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74 69  of.** the positi
daa0: 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
dab0: 6c 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74  ld for the first
dac0: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
dad0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  on the page..** 
dae0: 46 74 73 35 53 65 67 49 74 65 72 2e 72 6f 77 69  Fts5SegIter.rowi
daf0: 64 20 69 73 20 73 65 74 2c 20 62 75 74 20 6e 50  d is set, but nP
db00: 6f 73 20 61 6e 64 20 62 44 65 6c 20 61 72 65 20  os and bDel are 
db10: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  not..**.** This 
db20: 66 75 6e 63 74 69 6f 6e 20 61 64 76 61 6e 63 65  function advance
db30: 73 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 73  s the iterator s
db40: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
db50: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 0a 2a 2a   to the last .**
db60: 20 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20   relevant rowid 
db70: 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 2c  on the page and,
db80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 69   if necessary, i
db90: 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 65 20 0a  nitializes the .
dba0: 2a 2a 20 61 52 6f 77 69 64 4f 66 66 73 65 74 5b  ** aRowidOffset[
dbb0: 5d 20 61 6e 64 20 69 52 6f 77 69 64 4f 66 66 73  ] and iRowidOffs
dbc0: 65 74 20 76 61 72 69 61 62 6c 65 73 2e 20 41 74  et variables. At
dbd0: 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
dbe0: 69 74 65 72 61 74 6f 72 0a 2a 2a 20 69 73 20 69  iterator.** is i
dbf0: 6e 20 69 74 73 20 72 65 67 75 6c 61 72 20 73 74  n its regular st
dc00: 61 74 65 20 2d 20 46 74 73 35 53 65 67 49 74 65  ate - Fts5SegIte
dc10: 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20 70 6f  r.iLeafOffset po
dc20: 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73  ints to the firs
dc30: 74 0a 2a 2a 20 62 79 74 65 20 6f 66 20 74 68 65  t.** byte of the
dc40: 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 63   position list c
dc50: 6f 6e 74 65 6e 74 20 61 73 73 6f 63 69 61 74 65  ontent associate
dc60: 64 20 77 69 74 68 20 73 61 69 64 20 72 6f 77 69  d with said rowi
dc70: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
dc80: 64 20 66 74 73 35 53 65 67 49 74 65 72 52 65 76  d fts5SegIterRev
dc90: 65 72 73 65 49 6e 69 74 50 61 67 65 28 46 74 73  erseInitPage(Fts
dca0: 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
dcb0: 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
dcc0: 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d 20    int eDetail = 
dcd0: 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
dce0: 61 69 6c 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 70  ail;.  int n = p
dcf0: 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  Iter->pLeaf->szL
dd00: 65 61 66 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  eaf;.  int i = p
dd10: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
dd20: 74 3b 0a 20 20 75 38 20 2a 61 20 3d 20 70 49 74  t;.  u8 *a = pIt
dd30: 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  er->pLeaf->p;.  
dd40: 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 73 65 74  int iRowidOffset
dd50: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6e 3e 70   = 0;..  if( n>p
dd60: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd70: 69 73 74 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  ist ){.    n = p
dd80: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
dd90: 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 41 53 53 45  ist;.  }..  ASSE
dda0: 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 49 74  RT_SZLEAF_OK(pIt
ddb0: 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 77 68  er->pLeaf);.  wh
ddc0: 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69 36  ile( 1 ){.    i6
ddd0: 34 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 0a 20  4 iDelta = 0;.. 
dde0: 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
ddf0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
de00: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 6f 64   ){.      /* tod
de10: 6f 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  o */.      if( i
de20: 3c 6e 20 26 26 20 61 5b 69 5d 3d 3d 30 20 29 7b  <n && a[i]==0 ){
de30: 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  .        i++;.  
de40: 20 20 20 20 20 20 69 66 28 20 69 3c 6e 20 26 26        if( i<n &&
de50: 20 61 5b 69 5d 3d 3d 30 20 29 20 69 2b 2b 3b 0a   a[i]==0 ) i++;.
de60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
de70: 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f  e{.      int nPo
de80: 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 44 75  s;.      int bDu
de90: 6d 6d 79 3b 0a 20 20 20 20 20 20 69 20 2b 3d 20  mmy;.      i += 
dea0: 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69  fts5GetPoslistSi
deb0: 7a 65 28 26 61 5b 69 5d 2c 20 26 6e 50 6f 73 2c  ze(&a[i], &nPos,
dec0: 20 26 62 44 75 6d 6d 79 29 3b 0a 20 20 20 20 20   &bDummy);.     
ded0: 20 69 20 2b 3d 20 6e 50 6f 73 3b 0a 20 20 20 20   i += nPos;.    
dee0: 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 6e 20 29  }.    if( i>=n )
def0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 20 2b 3d   break;.    i +=
df00: 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
df10: 61 5b 69 5d 2c 20 28 75 36 34 2a 29 26 69 44 65  a[i], (u64*)&iDe
df20: 6c 74 61 29 3b 0a 20 20 20 20 70 49 74 65 72 2d  lta);.    pIter-
df30: 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44 65 6c 74  >iRowid += iDelt
df40: 61 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65  a;..    /* If ne
df50: 63 65 73 73 61 72 79 2c 20 67 72 6f 77 20 74 68  cessary, grow th
df60: 65 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  e pIter->aRowidO
df70: 66 66 73 65 74 5b 5d 20 61 72 72 61 79 2e 20 2a  ffset[] array. *
df80: 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
df90: 4f 66 66 73 65 74 3e 3d 70 49 74 65 72 2d 3e 6e  Offset>=pIter->n
dfa0: 52 6f 77 69 64 4f 66 66 73 65 74 20 29 7b 0a 20  RowidOffset ){. 
dfb0: 20 20 20 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20       int nNew = 
dfc0: 70 49 74 65 72 2d 3e 6e 52 6f 77 69 64 4f 66 66  pIter->nRowidOff
dfd0: 73 65 74 20 2b 20 38 3b 0a 20 20 20 20 20 20 69  set + 8;.      i
dfe0: 6e 74 20 2a 61 4e 65 77 20 3d 20 28 69 6e 74 2a  nt *aNew = (int*
dff0: 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
e000: 36 34 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64  64(pIter->aRowid
e010: 4f 66 66 73 65 74 2c 6e 4e 65 77 2a 73 69 7a 65  Offset,nNew*size
e020: 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
e030: 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( aNew==0 ){. 
e040: 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 53         p->rc = S
e050: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
e060: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e070: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 72 2d    }.      pIter-
e080: 3e 61 52 6f 77 69 64 4f 66 66 73 65 74 20 3d 20  >aRowidOffset = 
e090: 61 4e 65 77 3b 0a 20 20 20 20 20 20 70 49 74 65  aNew;.      pIte
e0a0: 72 2d 3e 6e 52 6f 77 69 64 4f 66 66 73 65 74 20  r->nRowidOffset 
e0b0: 3d 20 6e 4e 65 77 3b 0a 20 20 20 20 7d 0a 0a 20  = nNew;.    }.. 
e0c0: 20 20 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64     pIter->aRowid
e0d0: 4f 66 66 73 65 74 5b 69 52 6f 77 69 64 4f 66 66  Offset[iRowidOff
e0e0: 73 65 74 2b 2b 5d 20 3d 20 70 49 74 65 72 2d 3e  set++] = pIter->
e0f0: 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20 20  iLeafOffset;.   
e100: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66   pIter->iLeafOff
e110: 73 65 74 20 3d 20 69 3b 0a 20 20 7d 0a 20 20 70  set = i;.  }.  p
e120: 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f 66 66 73  Iter->iRowidOffs
e130: 65 74 20 3d 20 69 52 6f 77 69 64 4f 66 66 73 65  et = iRowidOffse
e140: 74 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  t;.  fts5SegIter
e150: 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
e160: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a  r);.}../*.**.*/.
e170: 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
e180: 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e 65  SegIterReverseNe
e190: 77 50 61 67 65 28 46 74 73 35 49 6e 64 65 78 20  wPage(Fts5Index 
e1a0: 2a 70 2c 20 46 74 73 35 53 65 67 49 74 65 72 20  *p, Fts5SegIter 
e1b0: 2a 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72  *pIter){.  asser
e1c0: 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  t( pIter->flags 
e1d0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
e1e0: 45 56 45 52 53 45 20 29 3b 0a 20 20 61 73 73 65  EVERSE );.  asse
e1f0: 72 74 28 20 70 49 74 65 72 2d 3e 66 6c 61 67 73  rt( pIter->flags
e200: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
e210: 4f 4e 45 54 45 52 4d 20 29 3b 0a 0a 20 20 66 74  ONETERM );..  ft
e220: 73 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 49  s5DataRelease(pI
e230: 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 70  ter->pLeaf);.  p
e240: 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b  Iter->pLeaf = 0;
e250: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
e260: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 49  =SQLITE_OK && pI
e270: 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3e 70  ter->iLeafPgno>p
e280: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
e290: 67 6e 6f 20 29 7b 0a 20 20 20 20 46 74 73 35 44  gno ){.    Fts5D
e2a0: 61 74 61 20 2a 70 4e 65 77 3b 0a 20 20 20 20 70  ata *pNew;.    p
e2b0: 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 2d  Iter->iLeafPgno-
e2c0: 2d 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20 66 74  -;.    pNew = ft
e2d0: 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
e2e0: 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
e2f0: 28 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65  (.          pIte
e300: 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69 64 2c  r->pSeg->iSegid,
e310: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e320: 6f 0a 20 20 20 20 29 29 3b 0a 20 20 20 20 69 66  o.    ));.    if
e330: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  ( pNew ){.      
e340: 2f 2a 20 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  /* iTermLeafOffs
e350: 65 74 20 6d 61 79 20 62 65 20 65 71 75 61 6c 20  et may be equal 
e360: 74 6f 20 73 7a 4c 65 61 66 20 69 66 20 74 68 65  to szLeaf if the
e370: 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c 61 73   term is the las
e380: 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 6e 67  t.      ** thing
e390: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2d 20 69   on the page - i
e3a0: 2e 65 2e 20 74 68 65 20 66 69 72 73 74 20 72 6f  .e. the first ro
e3b0: 77 69 64 20 69 73 20 6f 6e 20 74 68 65 20 66 6f  wid is on the fo
e3c0: 6c 6c 6f 77 69 6e 67 20 70 61 67 65 2e 0a 20 20  llowing page..  
e3d0: 20 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63      ** In this c
e3e0: 61 73 65 20 6c 65 61 76 65 20 70 49 74 65 72 2d  ase leave pIter-
e3f0: 3e 70 4c 65 61 66 3d 3d 30 2c 20 74 68 69 73 20  >pLeaf==0, this 
e400: 69 74 65 72 61 74 6f 72 20 69 73 20 61 74 20 45  iterator is at E
e410: 4f 46 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  OF. */.      if(
e420: 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
e430: 6f 3d 3d 70 49 74 65 72 2d 3e 69 54 65 72 6d 4c  o==pIter->iTermL
e440: 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
e450: 20 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72     assert( pIter
e460: 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 3b 0a 20 20  ->pLeaf==0 );.  
e470: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
e480: 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
e490: 3c 70 4e 65 77 2d 3e 73 7a 4c 65 61 66 20 29 7b  <pNew->szLeaf ){
e4a0: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
e4b0: 2d 3e 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a  ->pLeaf = pNew;.
e4c0: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d            pIter-
e4d0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  >iLeafOffset = p
e4e0: 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 4f  Iter->iTermLeafO
e4f0: 66 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 7d  ffset;.        }
e500: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
e510: 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64        int iRowid
e520: 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 69 52 6f  Off;.        iRo
e530: 77 69 64 4f 66 66 20 3d 20 66 74 73 35 4c 65 61  widOff = fts5Lea
e540: 66 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70  fFirstRowidOff(p
e550: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 20 69 66  New);.        if
e560: 28 20 69 52 6f 77 69 64 4f 66 66 20 29 7b 0a 20  ( iRowidOff ){. 
e570: 20 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e           pIter->
e580: 70 4c 65 61 66 20 3d 20 70 4e 65 77 3b 0a 20 20  pLeaf = pNew;.  
e590: 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
e5a0: 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 52 6f  LeafOffset = iRo
e5b0: 77 69 64 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  widOff;.        
e5c0: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
e5d0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e5e0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20  f ){.        u8 
e5f0: 2a 61 20 3d 20 26 70 49 74 65 72 2d 3e 70 4c 65  *a = &pIter->pLe
e600: 61 66 2d 3e 70 5b 70 49 74 65 72 2d 3e 69 4c 65  af->p[pIter->iLe
e610: 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20 20  afOffset];.     
e620: 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f     pIter->iLeafO
e630: 66 66 73 65 74 20 2b 3d 20 66 74 73 35 47 65 74  ffset += fts5Get
e640: 56 61 72 69 6e 74 28 61 2c 20 28 75 36 34 2a 29  Varint(a, (u64*)
e650: 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b  &pIter->iRowid);
e660: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
e670: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e680: 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6c       fts5DataRel
e690: 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  ease(pNew);.    
e6a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e6b0: 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
e6c0: 66 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d 3e  f ){.    pIter->
e6d0: 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
e6e0: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e  pIter->pLeaf->nn
e6f0: 2b 31 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49  +1;.    fts5SegI
e700: 74 65 72 52 65 76 65 72 73 65 49 6e 69 74 50 61  terReverseInitPa
e710: 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  ge(p, pIter);.  
e720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
e730: 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 69 74  n true if the it
e740: 65 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73  erator passed as
e750: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e760: 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 0a 2a  ment currently.*
e770: 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 64 65  * points to a de
e780: 6c 65 74 65 20 6d 61 72 6b 65 72 2e 20 41 20 64  lete marker. A d
e790: 65 6c 65 74 65 20 6d 61 72 6b 65 72 20 69 73 20  elete marker is 
e7a0: 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61 20  an entry with a 
e7b0: 30 20 62 79 74 65 0a 2a 2a 20 70 6f 73 69 74 69  0 byte.** positi
e7c0: 6f 6e 2d 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  on-list..*/.stat
e7d0: 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
e7e0: 49 74 65 72 49 73 45 6d 70 74 79 28 46 74 73 35  IterIsEmpty(Fts5
e7f0: 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74  Index *p, Fts5It
e800: 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46 74  er *pIter){.  Ft
e810: 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
e820: 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
e830: 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
e840: 69 46 69 72 73 74 5d 3b 0a 20 20 72 65 74 75 72  iFirst];.  retur
e850: 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
e860: 5f 4f 4b 20 26 26 20 70 53 65 67 2d 3e 70 4c 65  _OK && pSeg->pLe
e870: 61 66 20 26 26 20 70 53 65 67 2d 3e 6e 50 6f 73  af && pSeg->nPos
e880: 3d 3d 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ==0);.}../*.** A
e890: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
e8a0: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
e8b0: 74 20 65 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  t entry..**.** T
e8c0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 66  his version of f
e8d0: 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 28 29  ts5SegIterNext()
e8e0: 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62 79   is only used by
e8f0: 20 72 65 76 65 72 73 65 20 69 74 65 72 61 74 6f   reverse iterato
e900: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
e910: 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
e920: 78 74 5f 52 65 76 65 72 73 65 28 0a 20 20 46 74  xt_Reverse(.  Ft
e930: 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e950: 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
e960: 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65  ject */.  Fts5Se
e970: 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  gIter *pIter,   
e980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65            /* Ite
e990: 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63 65  rator to advance
e9a0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 62 55 6e 75   */.  int *pbUnu
e9b0: 73 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  sed             
e9c0: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
e9d0: 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  */.){.  assert( 
e9e0: 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20 46  pIter->flags & F
e9f0: 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45  TS5_SEGITER_REVE
ea00: 52 53 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RSE );.  assert(
ea10: 20 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61   pIter->pNextLea
ea20: 66 3d 3d 30 20 29 3b 0a 20 20 55 4e 55 53 45 44  f==0 );.  UNUSED
ea30: 5f 50 41 52 41 4d 28 70 62 55 6e 75 73 65 64 29  _PARAM(pbUnused)
ea40: 3b 0a 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  ;..  if( pIter->
ea50: 69 52 6f 77 69 64 4f 66 66 73 65 74 3e 30 20 29  iRowidOffset>0 )
ea60: 7b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 49  {.    u8 *a = pI
ea70: 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a 20  ter->pLeaf->p;. 
ea80: 20 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20 20     int iOff;.   
ea90: 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20 20   i64 iDelta;..  
eaa0: 20 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 4f    pIter->iRowidO
eab0: 66 66 73 65 74 2d 2d 3b 0a 20 20 20 20 70 49 74  ffset--;.    pIt
eac0: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20  er->iLeafOffset 
ead0: 3d 20 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f  = pIter->aRowidO
eae0: 66 66 73 65 74 5b 70 49 74 65 72 2d 3e 69 52 6f  ffset[pIter->iRo
eaf0: 77 69 64 4f 66 66 73 65 74 5d 3b 0a 20 20 20 20  widOffset];.    
eb00: 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
eb10: 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  Pos(p, pIter);. 
eb20: 20 20 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d     iOff = pIter-
eb30: 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b 0a 20 20  >iLeafOffset;.  
eb40: 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69 67    if( p->pConfig
eb50: 2d 3e 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f  ->eDetail!=FTS5_
eb60: 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
eb70: 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 70 49 74       iOff += pIt
eb80: 65 72 2d 3e 6e 50 6f 73 3b 0a 20 20 20 20 7d 0a  er->nPos;.    }.
eb90: 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
eba0: 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34  t(&a[iOff], (u64
ebb0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
ebc0: 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2d 3d  pIter->iRowid -=
ebd0: 20 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65   iDelta;.  }else
ebe0: 7b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  {.    fts5SegIte
ebf0: 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65 28  rReverseNewPage(
ec00: 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 7d 0a 7d  p, pIter);.  }.}
ec10: 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20  ../*.** Advance 
ec20: 69 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 74  iterator pIter t
ec30: 6f 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79  o the next entry
ec40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  ..**.** This ver
ec50: 73 69 6f 6e 20 6f 66 20 66 74 73 35 53 65 67 49  sion of fts5SegI
ec60: 74 65 72 4e 65 78 74 28 29 20 69 73 20 6f 6e 6c  terNext() is onl
ec70: 79 20 75 73 65 64 20 69 66 20 64 65 74 61 69 6c  y used if detail
ec80: 3d 6e 6f 6e 65 20 61 6e 64 20 74 68 65 0a 2a 2a  =none and the.**
ec90: 20 69 74 65 72 61 74 6f 72 20 69 73 20 6e 6f 74   iterator is not
eca0: 20 61 20 72 65 76 65 72 73 65 20 64 69 72 65 63   a reverse direc
ecb0: 74 69 6f 6e 20 69 74 65 72 61 74 6f 72 2e 0a 2a  tion iterator..*
ecc0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
ecd0: 73 35 53 65 67 49 74 65 72 4e 65 78 74 5f 4e 6f  s5SegIterNext_No
ece0: 6e 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ne(.  Fts5Index 
ecf0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
ed00: 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61        /* FTS5 ba
ed10: 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a  ckend object */.
ed20: 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
ed30: 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  Iter,           
ed40: 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f    /* Iterator to
ed50: 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e   advance */.  in
ed60: 74 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20  t *pbNewTerm    
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
ed80: 20 4f 55 54 3a 20 53 65 74 20 66 6f 72 20 6e 65   OUT: Set for ne
ed90: 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69  w term */.){.  i
eda0: 6e 74 20 69 4f 66 66 3b 0a 0a 20 20 61 73 73 65  nt iOff;..  asse
edb0: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
edc0: 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OK );.  assert
edd0: 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20  ( (pIter->flags 
ede0: 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  & FTS5_SEGITER_R
edf0: 45 56 45 52 53 45 29 3d 3d 30 20 29 3b 0a 20 20  EVERSE)==0 );.  
ee00: 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e 66  assert( p->pConf
ee10: 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
ee20: 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b  5_DETAIL_NONE );
ee30: 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c 45 41  ..  ASSERT_SZLEA
ee40: 46 5f 4f 4b 28 70 49 74 65 72 2d 3e 70 4c 65 61  F_OK(pIter->pLea
ee50: 66 29 3b 0a 20 20 69 4f 66 66 20 3d 20 70 49 74  f);.  iOff = pIt
ee60: 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 3b  er->iLeafOffset;
ee70: 0a 0a 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72  ..  /* Next entr
ee80: 79 20 69 73 20 6f 6e 20 74 68 65 20 6e 65 78 74  y is on the next
ee90: 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70   page */.  if( p
eea0: 49 74 65 72 2d 3e 70 53 65 67 20 26 26 20 69 4f  Iter->pSeg && iO
eeb0: 66 66 3e 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  ff>=pIter->pLeaf
eec0: 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
eed0: 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
eee0: 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 20  age(p, pIter);. 
eef0: 20 20 20 69 66 28 20 70 2d 3e 72 63 20 7c 7c 20     if( p->rc || 
ef00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 3d 3d 30 20  pIter->pLeaf==0 
ef10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70 49  ) return;.    pI
ef20: 74 65 72 2d 3e 69 52 6f 77 69 64 20 3d 20 30 3b  ter->iRowid = 0;
ef30: 0a 20 20 20 20 69 4f 66 66 20 3d 20 34 3b 0a 20  .    iOff = 4;. 
ef40: 20 7d 0a 0a 20 20 69 66 28 20 69 4f 66 66 3c 70   }..  if( iOff<p
ef50: 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
ef60: 69 73 74 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ist ){.    /* Ne
ef70: 78 74 20 65 6e 74 72 79 20 69 73 20 6f 6e 20 74  xt entry is on t
ef80: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
ef90: 2a 2f 0a 20 20 20 20 69 36 34 20 69 44 65 6c 74  */.    i64 iDelt
efa0: 61 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d 20 73  a;.    iOff += s
efb0: 71 6c 69 74 65 33 46 74 73 35 47 65 74 56 61 72  qlite3Fts5GetVar
efc0: 69 6e 74 28 26 70 49 74 65 72 2d 3e 70 4c 65 61  int(&pIter->pLea
efd0: 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28 75 36 34  f->p[iOff], (u64
efe0: 2a 29 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  *)&iDelta);.    
eff0: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f000: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 70  et = iOff;.    p
f010: 49 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20  Iter->iRowid += 
f020: 69 44 65 6c 74 61 3b 0a 20 20 7d 65 6c 73 65 20  iDelta;.  }else 
f030: 69 66 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67  if( (pIter->flag
f040: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
f050: 5f 4f 4e 45 54 45 52 4d 29 3d 3d 30 20 29 7b 0a  _ONETERM)==0 ){.
f060: 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
f070: 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  Seg ){.      int
f080: 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 20 20   nKeep = 0;.    
f090: 20 20 69 66 28 20 69 4f 66 66 21 3d 66 74 73 35    if( iOff!=fts5
f0a0: 4c 65 61 66 46 69 72 73 74 54 65 72 6d 4f 66 66  LeafFirstTermOff
f0b0: 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 20 29  (pIter->pLeaf) )
f0c0: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
f0d0: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
f0e0: 32 28 26 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d  2(&pIter->pLeaf-
f0f0: 3e 70 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65 70 29  >p[iOff], nKeep)
f100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f110: 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
f120: 65 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20  et = iOff;.     
f130: 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
f140: 54 65 72 6d 28 70 2c 20 70 49 74 65 72 2c 20 6e  Term(p, pIter, n
f150: 4b 65 65 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Keep);.    }else
f160: 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38  {.      const u8
f170: 20 2a 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20   *pList = 0;.   
f180: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
f190: 54 65 72 6d 20 3d 20 30 3b 0a 20 20 20 20 20 20  Term = 0;.      
f1a0: 69 6e 74 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  int nList;.     
f1b0: 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
f1c0: 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48 61 73  ScanNext(p->pHas
f1d0: 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  h);.      sqlite
f1e0: 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74  3Fts5HashScanEnt
f1f0: 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26 7a 54  ry(p->pHash, &zT
f200: 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c  erm, &pList, &nL
f210: 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ist);.      if( 
f220: 70 4c 69 73 74 3d 3d 30 20 29 20 67 6f 74 6f 20  pList==0 ) goto 
f230: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
f240: 20 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61       pIter->pLea
f250: 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70 4c 69 73  f->p = (u8*)pLis
f260: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f270: 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20 6e 4c 69 73  pLeaf->nn = nLis
f280: 74 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  t;.      pIter->
f290: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
f2a0: 6e 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 49 74  nList;.      pIt
f2b0: 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
f2c0: 74 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20 20 20  t = nList;.     
f2d0: 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
f2e0: 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 26 70 49  erSet(&p->rc,&pI
f2f0: 74 65 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29  ter->term, (int)
f300: 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 20 28  strlen(zTerm), (
f310: 75 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20  u8*)zTerm);.    
f320: 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
f330: 66 73 65 74 20 3d 20 66 74 73 35 47 65 74 56 61  fset = fts5GetVa
f340: 72 69 6e 74 28 70 4c 69 73 74 2c 20 28 75 36 34  rint(pList, (u64
f350: 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  *)&pIter->iRowid
f360: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
f370: 28 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70  ( pbNewTerm ) *p
f380: 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20  bNewTerm = 1;.  
f390: 7d 65 6c 73 65 7b 0a 20 20 20 20 67 6f 74 6f 20  }else{.    goto 
f3a0: 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3b 0a 20  next_none_eof;. 
f3b0: 20 7d 0a 0a 20 20 66 74 73 35 53 65 67 49 74 65   }..  fts5SegIte
f3c0: 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
f3d0: 65 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 3b 0a  er);..  return;.
f3e0: 20 6e 65 78 74 5f 6e 6f 6e 65 5f 65 6f 66 3a 0a   next_none_eof:.
f3f0: 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
f400: 65 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b  e(pIter->pLeaf);
f410: 0a 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20  .  pIter->pLeaf 
f420: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  = 0;.}.../*.** A
f430: 64 76 61 6e 63 65 20 69 74 65 72 61 74 6f 72 20  dvance iterator 
f440: 70 49 74 65 72 20 74 6f 20 74 68 65 20 6e 65 78  pIter to the nex
f450: 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20  t entry. .**.** 
f460: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
f470: 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72 63  rs, Fts5Index.rc
f480: 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61 70   is set to an ap
f490: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
f4a0: 63 6f 64 65 2e 20 49 74 20 0a 2a 2a 20 69 73 20  code. It .** is 
f4b0: 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 20 61  not considered a
f4c0: 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20 69  n error if the i
f4d0: 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73 20  terator reaches 
f4e0: 45 4f 46 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  EOF. If an error
f4f0: 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79   has .** already
f500: 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74   occurred when t
f510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
f520: 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
f530: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
f540: 20 76 6f 69 64 20 66 74 73 35 53 65 67 49 74 65   void fts5SegIte
f550: 72 4e 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64  rNext(.  Fts5Ind
f560: 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
f570: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
f580: 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
f590: 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
f5a0: 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20   *pIter,        
f5b0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
f5c0: 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a 20   to advance */. 
f5d0: 20 69 6e 74 20 2a 70 62 4e 65 77 54 65 72 6d 20   int *pbNewTerm 
f5e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5f0: 20 2f 2a 20 4f 55 54 3a 20 53 65 74 20 66 6f 72   /* OUT: Set for
f600: 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a   new term */.){.
f610: 20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61    Fts5Data *pLea
f620: 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  f = pIter->pLeaf
f630: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 20 20  ;.  int iOff;.  
f640: 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
f650: 3b 0a 20 20 69 6e 74 20 6e 4b 65 65 70 20 3d 20  ;.  int nKeep = 
f660: 30 3b 0a 20 20 75 38 20 2a 61 3b 0a 20 20 69 6e  0;.  u8 *a;.  in
f670: 74 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t n;..  assert( 
f680: 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 7c 7c 20  pbNewTerm==0 || 
f690: 2a 70 62 4e 65 77 54 65 72 6d 3d 3d 30 20 29 3b  *pbNewTerm==0 );
f6a0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
f6b0: 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
f6c0: 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
f6d0: 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68   );..  /* Search
f6e0: 20 66 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20   for the end of 
f6f0: 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  the position lis
f700: 74 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72  t within the cur
f710: 72 65 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  rent page. */.  
f720: 61 20 3d 20 70 4c 65 61 66 2d 3e 70 3b 0a 20 20  a = pLeaf->p;.  
f730: 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  n = pLeaf->szLea
f740: 66 3b 0a 0a 20 20 41 53 53 45 52 54 5f 53 5a 4c  f;..  ASSERT_SZL
f750: 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a 20  EAF_OK(pLeaf);. 
f760: 20 69 4f 66 66 20 3d 20 70 49 74 65 72 2d 3e 69   iOff = pIter->i
f770: 4c 65 61 66 4f 66 66 73 65 74 20 2b 20 70 49 74  LeafOffset + pIt
f780: 65 72 2d 3e 6e 50 6f 73 3b 0a 0a 20 20 69 66 28  er->nPos;..  if(
f790: 20 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 2f   iOff<n ){.    /
f7a0: 2a 20 54 68 65 20 6e 65 78 74 20 65 6e 74 72 79  * The next entry
f7b0: 20 69 73 20 6f 6e 20 74 68 65 20 63 75 72 72 65   is on the curre
f7c0: 6e 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  nt page. */.    
f7d0: 61 73 73 65 72 74 5f 6e 63 28 20 69 4f 66 66 3c  assert_nc( iOff<
f7e0: 3d 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f  =pIter->iEndofDo
f7f0: 63 6c 69 73 74 20 29 3b 0a 20 20 20 20 69 66 28  clist );.    if(
f800: 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 69 45   iOff>=pIter->iE
f810: 6e 64 6f 66 44 6f 63 6c 69 73 74 20 29 7b 0a 20  ndofDoclist ){. 
f820: 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20 3d 20       bNewTerm = 
f830: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 66  1;.      if( iOf
f840: 66 21 3d 66 74 73 35 4c 65 61 66 46 69 72 73 74  f!=fts5LeafFirst
f850: 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 20 29  TermOff(pLeaf) )
f860: 7b 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  {.        iOff +
f870: 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
f880: 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4b 65 65  2(&a[iOff], nKee
f890: 70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p);.      }.    
f8a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 36 34  }else{.      u64
f8b0: 20 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69   iDelta;.      i
f8c0: 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74  Off += sqlite3Ft
f8d0: 73 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69  s5GetVarint(&a[i
f8e0: 4f 66 66 5d 2c 20 26 69 44 65 6c 74 61 29 3b 0a  Off], &iDelta);.
f8f0: 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 52 6f        pIter->iRo
f900: 77 69 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20  wid += iDelta;. 
f910: 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20       assert_nc( 
f920: 69 44 65 6c 74 61 3e 30 20 29 3b 0a 20 20 20 20  iDelta>0 );.    
f930: 7d 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  }.    pIter->iLe
f940: 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66 66 3b  afOffset = iOff;
f950: 0a 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 49  ..  }else if( pI
f960: 74 65 72 2d 3e 70 53 65 67 3d 3d 30 20 29 7b 0a  ter->pSeg==0 ){.
f970: 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c      const u8 *pL
f980: 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ist = 0;.    con
f990: 73 74 20 63 68 61 72 20 2a 7a 54 65 72 6d 20 3d  st char *zTerm =
f9a0: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4c 69 73   0;.    int nLis
f9b0: 74 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  t = 0;.    asser
f9c0: 74 28 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73  t( (pIter->flags
f9d0: 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f   & FTS5_SEGITER_
f9e0: 4f 4e 45 54 45 52 4d 29 20 7c 7c 20 70 62 4e 65  ONETERM) || pbNe
f9f0: 77 54 65 72 6d 20 29 3b 0a 20 20 20 20 69 66 28  wTerm );.    if(
fa00: 20 30 3d 3d 28 70 49 74 65 72 2d 3e 66 6c 61 67   0==(pIter->flag
fa10: 73 20 26 20 46 54 53 35 5f 53 45 47 49 54 45 52  s & FTS5_SEGITER
fa20: 5f 4f 4e 45 54 45 52 4d 29 20 29 7b 0a 20 20 20  _ONETERM) ){.   
fa30: 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
fa40: 73 68 53 63 61 6e 4e 65 78 74 28 70 2d 3e 70 48  shScanNext(p->pH
fa50: 61 73 68 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ash);.      sqli
fa60: 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
fa70: 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 26  ntry(p->pHash, &
fa80: 7a 54 65 72 6d 2c 20 26 70 4c 69 73 74 2c 20 26  zTerm, &pList, &
fa90: 6e 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  nList);.    }.  
faa0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
fab0: 7b 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61  {.      fts5Data
fac0: 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70  Release(pIter->p
fad0: 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 70 49 74  Leaf);.      pIt
fae0: 65 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20  er->pLeaf = 0;. 
faf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fb00: 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 20  pIter->pLeaf->p 
fb10: 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a 20 20  = (u8*)pList;.  
fb20: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fb30: 2d 3e 6e 6e 20 3d 20 6e 4c 69 73 74 3b 0a 20 20  ->nn = nList;.  
fb40: 20 20 20 20 70 49 74 65 72 2d 3e 70 4c 65 61 66      pIter->pLeaf
fb50: 2d 3e 73 7a 4c 65 61 66 20 3d 20 6e 4c 69 73 74  ->szLeaf = nList
fb60: 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69  ;.      pIter->i
fb70: 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20 6e  EndofDoclist = n
fb80: 4c 69 73 74 2b 31 3b 0a 20 20 20 20 20 20 73 71  List+1;.      sq
fb90: 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
fba0: 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
fbb0: 72 2d 3e 74 65 72 6d 2c 20 28 69 6e 74 29 73 74  r->term, (int)st
fbc0: 72 6c 65 6e 28 7a 54 65 72 6d 29 2c 0a 20 20 20  rlen(zTerm),.   
fbd0: 20 20 20 20 20 20 20 28 75 38 2a 29 7a 54 65 72         (u8*)zTer
fbe0: 6d 29 3b 0a 20 20 20 20 20 20 70 49 74 65 72 2d  m);.      pIter-
fbf0: 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 66  >iLeafOffset = f
fc00: 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c 69  ts5GetVarint(pLi
fc10: 73 74 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72  st, (u64*)&pIter
fc20: 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  ->iRowid);.     
fc30: 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20 31 3b   *pbNewTerm = 1;
fc40: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
fc50: 20 20 20 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20      iOff = 0;.  
fc60: 20 20 2f 2a 20 4e 65 78 74 20 65 6e 74 72 79 20    /* Next entry 
fc70: 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
fc80: 72 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  rrent page */.  
fc90: 20 20 77 68 69 6c 65 28 20 69 4f 66 66 3d 3d 30    while( iOff==0
fca0: 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
fcb0: 67 49 74 65 72 4e 65 78 74 50 61 67 65 28 70 2c  gIterNextPage(p,
fcc0: 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 70   pIter);.      p
fcd0: 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
fce0: 65 61 66 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eaf;.      if( p
fcf0: 4c 65 61 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b  Leaf==0 ) break;
fd00: 0a 20 20 20 20 20 20 41 53 53 45 52 54 5f 53 5a  .      ASSERT_SZ
fd10: 4c 45 41 46 5f 4f 4b 28 70 4c 65 61 66 29 3b 0a  LEAF_OK(pLeaf);.
fd20: 20 20 20 20 20 20 69 66 28 20 28 69 4f 66 66 20        if( (iOff 
fd30: 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
fd40: 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 29 20  owidOff(pLeaf)) 
fd50: 26 26 20 69 4f 66 66 3c 70 4c 65 61 66 2d 3e 73  && iOff<pLeaf->s
fd60: 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  zLeaf ){.       
fd70: 20 69 4f 66 66 20 2b 3d 20 73 71 6c 69 74 65 33   iOff += sqlite3
fd80: 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 26 70  Fts5GetVarint(&p
fd90: 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 28  Leaf->p[iOff], (
fda0: 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
fdb0: 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
fdc0: 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
fdd0: 20 3d 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20   = iOff;..      
fde0: 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 6e 6e 3e    if( pLeaf->nn>
fdf0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
fe00: 0a 20 20 20 20 20 20 20 20 20 20 70 49 74 65 72  .          pIter
fe10: 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20 70 4c  ->iPgidxOff = pL
fe20: 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20 66 74  eaf->szLeaf + ft
fe30: 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 0a 20  s5GetVarint32(. 
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c               &pL
fe50: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
fe60: 4c 65 61 66 5d 2c 20 70 49 74 65 72 2d 3e 69 45  Leaf], pIter->iE
fe70: 6e 64 6f 66 44 6f 63 6c 69 73 74 0a 20 20 20 20  ndofDoclist.    
fe80: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
fe90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
fea0: 20 65 6c 73 65 20 69 66 28 20 70 4c 65 61 66 2d   else if( pLeaf-
feb0: 3e 6e 6e 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  >nn>pLeaf->szLea
fec0: 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74  f ){.        pIt
fed0: 65 72 2d 3e 69 50 67 69 64 78 4f 66 66 20 3d 20  er->iPgidxOff = 
fee0: 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2b 20  pLeaf->szLeaf + 
fef0: 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
ff00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 70 4c  .            &pL
ff10: 65 61 66 2d 3e 70 5b 70 4c 65 61 66 2d 3e 73 7a  eaf->p[pLeaf->sz
ff20: 4c 65 61 66 5d 2c 20 69 4f 66 66 0a 20 20 20 20  Leaf], iOff.    
ff30: 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 70      );.        p
ff40: 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
ff50: 74 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20  t = iOff;.      
ff60: 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44    pIter->iEndofD
ff70: 6f 63 6c 69 73 74 20 3d 20 69 4f 66 66 3b 0a 20  oclist = iOff;. 
ff80: 20 20 20 20 20 20 20 62 4e 65 77 54 65 72 6d 20         bNewTerm 
ff90: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
ffa0: 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 4f     assert_nc( iO
ffb0: 66 66 3c 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff<pLeaf->szLeaf
ffc0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   );.      if( iO
ffd0: 66 66 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  ff>pLeaf->szLeaf
ffe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72   ){.        p->r
fff0: 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
10000 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
10010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10020 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
10030 69 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  if the iterator 
10040 69 73 20 6e 6f 77 20 61 74 20 45 4f 46 2e 20 49  is now at EOF. I
10050 66 20 73 6f 2c 20 72 65 74 75 72 6e 20 65 61 72  f so, return ear
10060 6c 79 2e 20 2a 2f 0a 20 20 69 66 28 20 70 49 74  ly. */.  if( pIt
10070 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a 20 20 20  er->pLeaf ){.   
10080 20 69 66 28 20 62 4e 65 77 54 65 72 6d 20 29 7b   if( bNewTerm ){
10090 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72  .      if( pIter
100a0 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
100b0 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
100c0 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61  {.        fts5Da
100d0 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
100e0 3e 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20  >pLeaf);.       
100f0 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
10100 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  0;.      }else{.
10110 20 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49          fts5SegI
10120 74 65 72 4c 6f 61 64 54 65 72 6d 28 70 2c 20 70  terLoadTerm(p, p
10130 49 74 65 72 2c 20 6e 4b 65 65 70 29 3b 0a 20 20  Iter, nKeep);.  
10140 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
10150 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74  rLoadNPos(p, pIt
10160 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
10170 20 70 62 4e 65 77 54 65 72 6d 20 29 20 2a 70 62   pbNewTerm ) *pb
10180 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
10190 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
101a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c        /* The fol
101b0 6c 6f 77 69 6e 67 20 63 6f 75 6c 64 20 62 65 20  lowing could be 
101c0 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
101d0 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e  fts5SegIterLoadN
101e0 50 6f 73 28 29 2e 20 42 75 74 0a 20 20 20 20 20  Pos(). But.     
101f0 20 2a 2a 20 74 68 69 73 20 62 6c 6f 63 6b 20 69   ** this block i
10200 73 20 70 61 72 74 69 63 75 6c 61 72 6c 79 20 70  s particularly p
10210 65 72 66 6f 72 6d 61 6e 63 65 20 63 72 69 74 69  erformance criti
10220 63 61 6c 2c 20 73 6f 20 65 71 75 69 76 61 6c 65  cal, so equivale
10230 6e 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  nt.      ** code
10240 20 69 73 20 69 6e 6c 69 6e 65 64 2e 20 0a 20 20   is inlined. .  
10250 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
10260 4c 61 74 65 72 3a 20 53 77 69 74 63 68 65 64 20  Later: Switched 
10270 62 61 63 6b 20 74 6f 20 66 74 73 35 53 65 67 49  back to fts5SegI
10280 74 65 72 4c 6f 61 64 4e 50 6f 73 28 29 20 62 65  terLoadNPos() be
10290 63 61 75 73 65 20 69 74 20 73 75 70 70 6f 72 74  cause it support
102a0 73 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69  s.      ** detai
102b0 6c 3d 6e 6f 6e 65 20 6d 6f 64 65 2e 20 4e 6f 74  l=none mode. Not
102c0 20 69 64 65 61 6c 2e 0a 20 20 20 20 20 20 2a 2f   ideal..      */
102d0 0a 20 20 20 20 20 20 69 6e 74 20 6e 53 7a 3b 0a  .      int nSz;.
102e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
102f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
10300 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10310 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
10320 65 74 3c 3d 70 49 74 65 72 2d 3e 70 4c 65 61 66  et<=pIter->pLeaf
10330 2d 3e 6e 6e 20 29 3b 0a 20 20 20 20 20 20 66 74  ->nn );.      ft
10340 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74 33  s5FastGetVarint3
10350 32 28 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e  2(pIter->pLeaf->
10360 70 2c 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f  p, pIter->iLeafO
10370 66 66 73 65 74 2c 20 6e 53 7a 29 3b 0a 20 20 20  ffset, nSz);.   
10380 20 20 20 70 49 74 65 72 2d 3e 62 44 65 6c 20 3d     pIter->bDel =
10390 20 28 6e 53 7a 20 26 20 30 78 30 30 30 31 29 3b   (nSz & 0x0001);
103a0 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50  .      pIter->nP
103b0 6f 73 20 3d 20 6e 53 7a 3e 3e 31 3b 0a 20 20 20  os = nSz>>1;.   
103c0 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70 49     assert_nc( pI
103d0 74 65 72 2d 3e 6e 50 6f 73 3e 3d 30 20 29 3b 0a  ter->nPos>=0 );.
103e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 64 65      }.  }.}..#de
103f0 66 69 6e 65 20 53 57 41 50 56 41 4c 28 54 2c 20  fine SWAPVAL(T, 
10400 61 2c 20 62 29 20 7b 20 54 20 74 6d 70 3b 20 74  a, b) { T tmp; t
10410 6d 70 3d 61 3b 20 61 3d 62 3b 20 62 3d 74 6d 70  mp=a; a=b; b=tmp
10420 3b 20 7d 0a 0a 23 64 65 66 69 6e 65 20 66 74 73  ; }..#define fts
10430 35 49 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74  5IndexSkipVarint
10440 28 61 2c 20 69 4f 66 66 29 20 7b 20 20 20 20 20  (a, iOff) {     
10450 20 20 20 20 20 20 20 5c 0a 20 20 69 6e 74 20 69         \.  int i
10460 45 6e 64 20 3d 20 69 4f 66 66 2b 39 3b 20 20 20  End = iOff+9;   
10470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10480 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 77             \.  w
10490 68 69 6c 65 28 20 28 61 5b 69 4f 66 66 2b 2b 5d  hile( (a[iOff++]
104a0 20 26 20 30 78 38 30 29 20 26 26 20 69 4f 66 66   & 0x80) && iOff
104b0 3c 69 45 6e 64 20 29 3b 20 20 20 20 20 20 20 5c  <iEnd );       \
104c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74  .}../*.** Iterat
104d0 6f 72 20 70 49 74 65 72 20 63 75 72 72 65 6e 74  or pIter current
104e0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  ly points to the
104f0 20 66 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20   first rowid in 
10500 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 69 73 0a  a doclist. This.
10510 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73 65 74 73  ** function sets
10520 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 75 70   the iterator up
10530 20 73 6f 20 74 68 61 74 20 69 74 65 72 61 74 65   so that iterate
10540 73 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64  s in reverse ord
10550 65 72 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  er through.** th
10560 65 20 64 6f 63 6c 69 73 74 2e 0a 2a 2f 0a 73 74  e doclist..*/.st
10570 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65  atic void fts5Se
10580 67 49 74 65 72 52 65 76 65 72 73 65 28 46 74 73  gIterReverse(Fts
10590 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53  5Index *p, Fts5S
105a0 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  egIter *pIter){.
105b0 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72 20    Fts5DlidxIter 
105c0 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65 72 2d  *pDlidx = pIter-
105d0 3e 70 44 6c 69 64 78 3b 0a 20 20 46 74 73 35 44  >pDlidx;.  Fts5D
105e0 61 74 61 20 2a 70 4c 61 73 74 20 3d 20 30 3b 0a  ata *pLast = 0;.
105f0 20 20 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d    int pgnoLast =
10600 20 30 3b 0a 0a 20 20 69 66 28 20 70 44 6c 69 64   0;..  if( pDlid
10610 78 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  x ){.    int iSe
10620 67 69 64 20 3d 20 70 49 74 65 72 2d 3e 70 53 65  gid = pIter->pSe
10630 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20 20 70  g->iSegid;.    p
10640 67 6e 6f 4c 61 73 74 20 3d 20 66 74 73 35 44 6c  gnoLast = fts5Dl
10650 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
10660 64 78 29 3b 0a 20 20 20 20 70 4c 61 73 74 20 3d  dx);.    pLast =
10670 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
10680 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
10690 57 49 44 28 69 53 65 67 69 64 2c 20 70 67 6e 6f  WID(iSegid, pgno
106a0 4c 61 73 74 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  Last));.  }else{
106b0 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
106c0 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
106d0 65 61 66 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  eaf;         /* 
106e0 43 75 72 72 65 6e 74 20 6c 65 61 66 20 64 61 74  Current leaf dat
106f0 61 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 75 72  a */..    /* Cur
10700 72 65 6e 74 6c 79 2c 20 46 74 73 35 53 65 67 49  rently, Fts5SegI
10710 74 65 72 2e 69 4c 65 61 66 4f 66 66 73 65 74 20  ter.iLeafOffset 
10720 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69  points to the fi
10730 72 73 74 20 62 79 74 65 20 6f 66 0a 20 20 20 20  rst byte of.    
10740 2a 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74  ** position-list
10750 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 74 68 65   content for the
10760 20 63 75 72 72 65 6e 74 20 72 6f 77 69 64 2e 20   current rowid. 
10770 42 61 63 6b 20 69 74 20 75 70 20 73 6f 20 74 68  Back it up so th
10780 61 74 20 69 74 0a 20 20 20 20 2a 2a 20 70 6f 69  at it.    ** poi
10790 6e 74 73 20 74 6f 20 74 68 65 20 73 74 61 72 74  nts to the start
107a0 20 6f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   of the position
107b0 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65 6c 64  -list size field
107c0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 50 6f  . */.    int iPo
107d0 73 6c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70  slist;.    if( p
107e0 49 74 65 72 2d 3e 69 54 65 72 6d 4c 65 61 66 50  Iter->iTermLeafP
107f0 67 6e 6f 3d 3d 70 49 74 65 72 2d 3e 69 4c 65 61  gno==pIter->iLea
10800 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 69  fPgno ){.      i
10810 50 6f 73 6c 69 73 74 20 3d 20 70 49 74 65 72 2d  Poslist = pIter-
10820 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73 65 74  >iTermLeafOffset
10830 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10840 20 20 20 69 50 6f 73 6c 69 73 74 20 3d 20 34 3b     iPoslist = 4;
10850 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 49  .    }.    fts5I
10860 6e 64 65 78 53 6b 69 70 56 61 72 69 6e 74 28 70  ndexSkipVarint(p
10870 4c 65 61 66 2d 3e 70 2c 20 69 50 6f 73 6c 69 73  Leaf->p, iPoslis
10880 74 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69  t);.    pIter->i
10890 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 50 6f  LeafOffset = iPo
108a0 73 6c 69 73 74 3b 0a 0a 20 20 20 20 2f 2a 20 49  slist;..    /* I
108b0 66 20 74 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  f this condition
108c0 20 69 73 20 74 72 75 65 20 74 68 65 6e 20 74 68   is true then th
108d0 65 20 6c 61 72 67 65 73 74 20 72 6f 77 69 64 20  e largest rowid 
108e0 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
108f0 20 20 20 20 2a 2a 20 74 65 72 6d 20 6d 61 79 20      ** term may 
10900 6e 6f 74 20 62 65 20 73 74 6f 72 65 64 20 6f 6e  not be stored on
10910 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
10920 65 2e 20 53 6f 20 73 65 61 72 63 68 20 66 6f 72  e. So search for
10930 77 61 72 64 20 74 6f 0a 20 20 20 20 2a 2a 20 73  ward to.    ** s
10940 65 65 20 77 68 65 72 65 20 73 61 69 64 20 72 6f  ee where said ro
10950 77 69 64 20 72 65 61 6c 6c 79 20 69 73 2e 20 20  wid really is.  
10960 2a 2f 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  */.    if( pIter
10970 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3e  ->iEndofDoclist>
10980 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  =pLeaf->szLeaf )
10990 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 67 6e 6f  {.      int pgno
109a0 3b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75  ;.      Fts5Stru
109b0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
109c0 65 67 20 3d 20 70 49 74 65 72 2d 3e 70 53 65 67  eg = pIter->pSeg
109d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;..      /* The 
109e0 6c 61 73 74 20 72 6f 77 69 64 20 69 6e 20 74 68  last rowid in th
109f0 65 20 64 6f 63 6c 69 73 74 20 6d 61 79 20 6e 6f  e doclist may no
10a00 74 20 62 65 20 6f 6e 20 74 68 65 20 63 75 72 72  t be on the curr
10a10 65 6e 74 20 70 61 67 65 2e 20 53 65 61 72 63 68  ent page. Search
10a20 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 77 61 72  .      ** forwar
10a30 64 20 74 6f 20 66 69 6e 64 20 74 68 65 20 70 61  d to find the pa
10a40 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
10a50 65 20 6c 61 73 74 20 72 6f 77 69 64 2e 20 20 2a  e last rowid.  *
10a60 2f 0a 20 20 20 20 20 20 66 6f 72 28 70 67 6e 6f  /.      for(pgno
10a70 3d 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e  =pIter->iLeafPgn
10a80 6f 2b 31 3b 20 21 70 2d 3e 72 63 20 26 26 20 70  o+1; !p->rc && p
10a90 67 6e 6f 3c 3d 70 53 65 67 2d 3e 70 67 6e 6f 4c  gno<=pSeg->pgnoL
10aa0 61 73 74 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20  ast; pgno++){.  
10ab0 20 20 20 20 20 20 69 36 34 20 69 41 62 73 20 3d        i64 iAbs =
10ac0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
10ad0 57 49 44 28 70 53 65 67 2d 3e 69 53 65 67 69 64  WID(pSeg->iSegid
10ae0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
10af0 20 46 74 73 35 44 61 74 61 20 2a 70 4e 65 77 20   Fts5Data *pNew 
10b00 3d 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70  = fts5DataRead(p
10b10 2c 20 69 41 62 73 29 3b 0a 20 20 20 20 20 20 20  , iAbs);.       
10b20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
10b30 20 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69         int iRowi
10b40 64 2c 20 62 54 65 72 6d 6c 65 73 73 3b 0a 20 20  d, bTermless;.  
10b50 20 20 20 20 20 20 20 20 69 52 6f 77 69 64 20 3d          iRowid =
10b60 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f   fts5LeafFirstRo
10b70 77 69 64 4f 66 66 28 70 4e 65 77 29 3b 0a 20 20  widOff(pNew);.  
10b80 20 20 20 20 20 20 20 20 62 54 65 72 6d 6c 65 73          bTermles
10b90 73 20 3d 20 66 74 73 35 4c 65 61 66 49 73 54 65  s = fts5LeafIsTe
10ba0 72 6d 6c 65 73 73 28 70 4e 65 77 29 3b 0a 20 20  rmless(pNew);.  
10bb0 20 20 20 20 20 20 20 20 69 66 28 20 69 52 6f 77          if( iRow
10bc0 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
10bd0 20 20 53 57 41 50 56 41 4c 28 46 74 73 35 44 61    SWAPVAL(Fts5Da
10be0 74 61 2a 2c 20 70 4e 65 77 2c 20 70 4c 61 73 74  ta*, pNew, pLast
10bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
10c00 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 3b 0a  gnoLast = pgno;.
10c10 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10c20 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
10c30 6c 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 20  lease(pNew);.   
10c40 20 20 20 20 20 20 20 69 66 28 20 62 54 65 72 6d         if( bTerm
10c50 6c 65 73 73 3d 3d 30 20 29 20 62 72 65 61 6b 3b  less==0 ) break;
10c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
10c70 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
10c80 2f 2a 20 49 66 20 70 4c 61 73 74 20 69 73 20 4e  /* If pLast is N
10c90 55 4c 4c 20 61 74 20 74 68 69 73 20 70 6f 69 6e  ULL at this poin
10ca0 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74  t, then the last
10cb0 20 72 6f 77 69 64 20 66 6f 72 20 74 68 69 73 20   rowid for this 
10cc0 64 6f 63 6c 69 73 74 0a 20 20 2a 2a 20 6c 69 65  doclist.  ** lie
10cd0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 63 75  s on the page cu
10ce0 72 72 65 6e 74 6c 79 20 69 6e 64 69 63 61 74 65  rrently indicate
10cf0 64 20 62 79 20 74 68 65 20 69 74 65 72 61 74 6f  d by the iterato
10d00 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
10d10 0a 20 20 2a 2a 20 70 49 74 65 72 2d 3e 69 4c 65  .  ** pIter->iLe
10d20 61 66 4f 66 66 73 65 74 20 69 73 20 61 6c 72 65  afOffset is alre
10d30 61 64 79 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  ady set to point
10d40 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   to the position
10d50 2d 6c 69 73 74 20 73 69 7a 65 0a 20 20 2a 2a 20  -list size.  ** 
10d60 66 69 65 6c 64 20 61 73 73 6f 63 69 61 74 65 64  field associated
10d70 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74 20   with the first 
10d80 72 65 6c 65 76 61 6e 74 20 72 6f 77 69 64 20 6f  relevant rowid o
10d90 6e 20 74 68 65 20 70 61 67 65 2e 0a 20 20 2a 2a  n the page..  **
10da0 0a 20 20 2a 2a 20 4f 72 2c 20 69 66 20 70 4c 61  .  ** Or, if pLa
10db0 73 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20  st is non-NULL, 
10dc0 74 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 70  then it is the p
10dd0 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
10de0 73 20 74 68 65 20 6c 61 73 74 0a 20 20 2a 2a 20  s the last.  ** 
10df0 72 6f 77 69 64 2e 20 49 6e 20 74 68 69 73 20 63  rowid. In this c
10e00 61 73 65 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ase configure th
10e10 65 20 69 74 65 72 61 74 6f 72 20 73 6f 20 74 68  e iterator so th
10e20 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  at it points to 
10e30 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74 20 72  the.  ** first r
10e40 6f 77 69 64 20 6f 6e 20 74 68 69 73 20 70 61 67  owid on this pag
10e50 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 4c  e..  */.  if( pL
10e60 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ast ){.    int i
10e70 4f 66 66 3b 0a 20 20 20 20 66 74 73 35 44 61 74  Off;.    fts5Dat
10e80 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
10e90 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
10ea0 72 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 61 73 74  r->pLeaf = pLast
10eb0 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65  ;.    pIter->iLe
10ec0 61 66 50 67 6e 6f 20 3d 20 70 67 6e 6f 4c 61 73  afPgno = pgnoLas
10ed0 74 3b 0a 20 20 20 20 69 4f 66 66 20 3d 20 66 74  t;.    iOff = ft
10ee0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
10ef0 4f 66 66 28 70 4c 61 73 74 29 3b 0a 20 20 20 20  Off(pLast);.    
10f00 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56  iOff += fts5GetV
10f10 61 72 69 6e 74 28 26 70 4c 61 73 74 2d 3e 70 5b  arint(&pLast->p[
10f20 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 70 49  iOff], (u64*)&pI
10f30 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20 20  ter->iRowid);.  
10f40 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66    pIter->iLeafOf
10f50 66 73 65 74 20 3d 20 69 4f 66 66 3b 0a 0a 20 20  fset = iOff;..  
10f60 20 20 69 66 28 20 66 74 73 35 4c 65 61 66 49 73    if( fts5LeafIs
10f70 54 65 72 6d 6c 65 73 73 28 70 4c 61 73 74 29 20  Termless(pLast) 
10f80 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
10f90 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d 20  iEndofDoclist = 
10fa0 70 4c 61 73 74 2d 3e 6e 6e 2b 31 3b 0a 20 20 20  pLast->nn+1;.   
10fb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49   }else{.      pI
10fc0 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  ter->iEndofDocli
10fd0 73 74 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  st = fts5LeafFir
10fe0 73 74 54 65 72 6d 4f 66 66 28 70 4c 61 73 74 29  stTermOff(pLast)
10ff0 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 0a 20 20  ;.    }..  }..  
11000 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
11010 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
11020 74 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ter);.}../*.** I
11030 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 63 75  terator pIter cu
11040 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
11050 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
11060 64 20 6f 66 20 61 20 64 6f 63 6c 69 73 74 2e 0a  d of a doclist..
11070 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 64 6f  ** There is a do
11080 63 6c 69 73 74 2d 69 6e 64 65 78 20 61 73 73 6f  clist-index asso
11090 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
110a0 66 69 6e 61 6c 20 74 65 72 6d 20 6f 6e 20 74 68  final term on th
110b0 65 20 63 75 72 72 65 6e 74 20 0a 2a 2a 20 70 61  e current .** pa
110c0 67 65 2e 20 49 66 20 74 68 65 20 63 75 72 72 65  ge. If the curre
110d0 6e 74 20 74 65 72 6d 20 69 73 20 74 68 65 20 6c  nt term is the l
110e0 61 73 74 20 74 65 72 6d 20 6f 6e 20 74 68 65 20  ast term on the 
110f0 70 61 67 65 2c 20 6c 6f 61 64 20 74 68 65 20 0a  page, load the .
11100 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78  ** doclist-index
11110 20 66 72 6f 6d 20 64 69 73 6b 20 61 6e 64 20 69   from disk and i
11120 6e 69 74 69 61 6c 69 7a 65 20 61 6e 20 69 74 65  nitialize an ite
11130 72 61 74 6f 72 20 61 74 20 28 70 49 74 65 72 2d  rator at (pIter-
11140 3e 70 44 6c 69 64 78 29 2e 0a 2a 2f 0a 73 74 61  >pDlidx)..*/.sta
11150 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
11160 49 74 65 72 4c 6f 61 64 44 6c 69 64 78 28 46 74  IterLoadDlidx(Ft
11170 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
11180 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 29 7b  SegIter *pIter){
11190 0a 20 20 69 6e 74 20 69 53 65 67 20 3d 20 70 49  .  int iSeg = pI
111a0 74 65 72 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  ter->pSeg->iSegi
111b0 64 3b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d 20  d;.  int bRev = 
111c0 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20  (pIter->flags & 
111d0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
111e0 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 61 74  ERSE);.  Fts5Dat
111f0 61 20 2a 70 4c 65 61 66 20 3d 20 70 49 74 65 72  a *pLeaf = pIter
11200 2d 3e 70 4c 65 61 66 3b 20 2f 2a 20 43 75 72 72  ->pLeaf; /* Curr
11210 65 6e 74 20 6c 65 61 66 20 64 61 74 61 20 2a 2f  ent leaf data */
11220 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ..  assert( pIte
11230 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
11240 53 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20  SEGITER_ONETERM 
11250 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
11260 65 72 2d 3e 70 44 6c 69 64 78 3d 3d 30 20 29 3b  er->pDlidx==0 );
11270 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
11280 74 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c  the current docl
11290 69 73 74 20 65 6e 64 73 20 6f 6e 20 74 68 69 73  ist ends on this
112a0 20 70 61 67 65 2e 20 49 66 20 69 74 20 64 6f 65   page. If it doe
112b0 73 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 65  s, return.  ** e
112c0 61 72 6c 79 20 77 69 74 68 6f 75 74 20 6c 6f 61  arly without loa
112d0 64 69 6e 67 20 74 68 65 20 64 6f 63 6c 69 73 74  ding the doclist
112e0 2d 69 6e 64 65 78 20 28 61 73 20 69 74 20 62 65  -index (as it be
112f0 6c 6f 6e 67 73 20 74 6f 20 61 20 64 69 66 66 65  longs to a diffe
11300 72 65 6e 74 0a 20 20 2a 2a 20 74 65 72 6d 2e 20  rent.  ** term. 
11310 2a 2f 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e  */.  if( pIter->
11320 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 3d 3d 70  iTermLeafPgno==p
11330 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
11340 0a 20 20 20 26 26 20 70 49 74 65 72 2d 3e 69 45  .   && pIter->iE
11350 6e 64 6f 66 44 6f 63 6c 69 73 74 3c 70 4c 65 61  ndofDoclist<pLea
11360 66 2d 3e 73 7a 4c 65 61 66 20 0a 20 20 29 7b 0a  f->szLeaf .  ){.
11370 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
11380 0a 20 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78  .  pIter->pDlidx
11390 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65 72   = fts5DlidxIter
113a0 49 6e 69 74 28 70 2c 20 62 52 65 76 2c 20 69 53  Init(p, bRev, iS
113b0 65 67 2c 20 70 49 74 65 72 2d 3e 69 54 65 72 6d  eg, pIter->iTerm
113c0 4c 65 61 66 50 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  LeafPgno);.}../*
113d0 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
113e0 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
113f0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
11400 75 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79 20  ument currently 
11410 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 6e 6f 20 76  contains.** no v
11420 61 6c 69 64 20 76 61 6c 75 65 73 20 65 78 63 65  alid values exce
11430 70 74 20 66 6f 72 20 74 68 65 20 46 74 73 35 53  pt for the Fts5S
11440 65 67 49 74 65 72 2e 70 4c 65 61 66 20 6d 65 6d  egIter.pLeaf mem
11450 62 65 72 20 76 61 72 69 61 62 6c 65 2e 20 54 68  ber variable. Th
11460 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 73  is.** function s
11470 65 61 72 63 68 65 73 20 74 68 65 20 6c 65 61 66  earches the leaf
11480 20 70 61 67 65 20 66 6f 72 20 61 20 74 65 72 6d   page for a term
11490 20 6d 61 74 63 68 69 6e 67 20 28 70 54 65 72 6d   matching (pTerm
114a0 2f 6e 54 65 72 6d 29 2e 0a 2a 2a 0a 2a 2a 20 49  /nTerm)..**.** I
114b0 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
114c0 74 65 72 6d 20 69 73 20 66 6f 75 6e 64 20 6f 6e  term is found on
114d0 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e 20   the page, then 
114e0 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
114f0 6c 65 66 74 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  left.** pointing
11500 20 74 6f 20 69 74 2e 20 49 66 20 61 72 67 75 6d   to it. If argum
11510 65 6e 74 20 62 47 65 20 69 73 20 7a 65 72 6f 20  ent bGe is zero 
11520 61 6e 64 20 74 68 65 20 74 65 72 6d 20 69 73 20  and the term is 
11530 6e 6f 74 20 66 6f 75 6e 64 2c 0a 2a 2a 20 74 68  not found,.** th
11540 65 20 69 74 65 72 61 74 6f 72 20 69 73 20 6c 65  e iterator is le
11550 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 45  ft pointing at E
11560 4f 46 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 62 47 65  OF..**.** If bGe
11570 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64   is non-zero and
11580 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 74   the specified t
11590 65 72 6d 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  erm is not found
115a0 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 69 74  , then the.** it
115b0 65 72 61 74 6f 72 20 69 73 20 6c 65 66 74 20 70  erator is left p
115c0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 73  ointing to the s
115d0 6d 61 6c 6c 65 73 74 20 74 65 72 6d 20 69 6e 20  mallest term in 
115e0 74 68 65 20 73 65 67 6d 65 6e 74 20 74 68 61 74  the segment that
115f0 0a 2a 2a 20 69 73 20 6c 61 72 67 65 72 20 74 68  .** is larger th
11600 61 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  an the specified
11610 20 74 65 72 6d 2c 20 65 76 65 6e 20 69 66 20 74   term, even if t
11620 68 69 73 20 74 65 72 6d 20 69 73 20 6e 6f 74 20  his term is not 
11630 6f 6e 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  on the.** curren
11640 74 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  t page..*/.stati
11650 63 20 76 6f 69 64 20 66 74 73 35 4c 65 61 66 53  c void fts5LeafS
11660 65 65 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  eek(.  Fts5Index
11670 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
11680 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20         /* Leave 
11690 61 6e 79 20 65 72 72 6f 72 20 63 6f 64 65 20 68  any error code h
116a0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 62 47 65  ere */.  int bGe
116b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
116c0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
116d0 20 66 6f 72 20 61 20 3e 3d 20 73 65 61 72 63 68   for a >= search
116e0 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
116f0 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
11700 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
11710 72 20 74 6f 20 73 65 65 6b 20 2a 2f 0a 20 20 63  r to seek */.  c
11720 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c 20  onst u8 *pTerm, 
11730 69 6e 74 20 6e 54 65 72 6d 20 20 20 20 20 20 2f  int nTerm      /
11740 2a 20 54 65 72 6d 20 74 6f 20 73 65 61 72 63 68  * Term to search
11750 20 66 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   for */.){.  int
11760 20 69 4f 66 66 3b 0a 20 20 63 6f 6e 73 74 20 75   iOff;.  const u
11770 38 20 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c  8 *a = pIter->pL
11780 65 61 66 2d 3e 70 3b 0a 20 20 69 6e 74 20 73 7a  eaf->p;.  int sz
11790 4c 65 61 66 20 3d 20 70 49 74 65 72 2d 3e 70 4c  Leaf = pIter->pL
117a0 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20 20 69  eaf->szLeaf;.  i
117b0 6e 74 20 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c  nt n = pIter->pL
117c0 65 61 66 2d 3e 6e 6e 3b 0a 0a 20 20 75 33 32 20  eaf->nn;..  u32 
117d0 6e 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 75 33  nMatch = 0;.  u3
117e0 32 20 6e 4b 65 65 70 20 3d 20 30 3b 0a 20 20 75  2 nKeep = 0;.  u
117f0 33 32 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 75  32 nNew = 0;.  u
11800 33 32 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69  32 iTermOff;.  i
11810 6e 74 20 69 50 67 69 64 78 3b 20 20 20 20 20 20  nt iPgidx;      
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11830 2a 20 43 75 72 72 65 6e 74 20 6f 66 66 73 65 74  * Current offset
11840 20 69 6e 20 70 67 69 64 78 20 2a 2f 0a 20 20 69   in pgidx */.  i
11850 6e 74 20 62 45 6e 64 4f 66 50 61 67 65 20 3d 20  nt bEndOfPage = 
11860 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
11870 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
11880 3b 0a 0a 20 20 69 50 67 69 64 78 20 3d 20 73 7a  ;..  iPgidx = sz
11890 4c 65 61 66 3b 0a 20 20 69 50 67 69 64 78 20 2b  Leaf;.  iPgidx +
118a0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
118b0 32 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 69 54  2(&a[iPgidx], iT
118c0 65 72 6d 4f 66 66 29 3b 0a 20 20 69 4f 66 66 20  ermOff);.  iOff 
118d0 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 69 66  = iTermOff;.  if
118e0 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20 20  ( iOff>n ){.    
118f0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
11900 52 55 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e  RUPT;.    return
11910 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
11920 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 46 69 67  1 ){..    /* Fig
11930 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
11940 20 6e 65 77 20 62 79 74 65 73 20 61 72 65 20 69   new bytes are i
11950 6e 20 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20  n this term */. 
11960 20 20 20 66 74 73 35 46 61 73 74 47 65 74 56 61     fts5FastGetVa
11970 72 69 6e 74 33 32 28 61 2c 20 69 4f 66 66 2c 20  rint32(a, iOff, 
11980 6e 4e 65 77 29 3b 0a 20 20 20 20 69 66 28 20 6e  nNew);.    if( n
11990 4b 65 65 70 3c 6e 4d 61 74 63 68 20 29 7b 0a 20  Keep<nMatch ){. 
119a0 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63 68       goto search
119b0 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a  _failed;.    }..
119c0 20 20 20 20 61 73 73 65 72 74 28 20 6e 4b 65 65      assert( nKee
119d0 70 3e 3d 6e 4d 61 74 63 68 20 29 3b 0a 20 20 20  p>=nMatch );.   
119e0 20 69 66 28 20 6e 4b 65 65 70 3d 3d 6e 4d 61 74   if( nKeep==nMat
119f0 63 68 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  ch ){.      u32 
11a00 6e 43 6d 70 3b 0a 20 20 20 20 20 20 75 33 32 20  nCmp;.      u32 
11a10 69 3b 0a 20 20 20 20 20 20 6e 43 6d 70 20 3d 20  i;.      nCmp = 
11a20 28 75 33 32 29 4d 49 4e 28 6e 4e 65 77 2c 20 6e  (u32)MIN(nNew, n
11a30 54 65 72 6d 2d 6e 4d 61 74 63 68 29 3b 0a 20 20  Term-nMatch);.  
11a40 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11a50 43 6d 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cmp; i++){.     
11a60 20 20 20 69 66 28 20 61 5b 69 4f 66 66 2b 69 5d     if( a[iOff+i]
11a70 21 3d 70 54 65 72 6d 5b 6e 4d 61 74 63 68 2b 69  !=pTerm[nMatch+i
11a80 5d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ] ) break;.     
11a90 20 7d 0a 20 20 20 20 20 20 6e 4d 61 74 63 68 20   }.      nMatch 
11aa0 2b 3d 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28  += i;..      if(
11ab0 20 28 75 33 32 29 6e 54 65 72 6d 3d 3d 6e 4d 61   (u32)nTerm==nMa
11ac0 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69  tch ){.        i
11ad0 66 28 20 69 3d 3d 6e 4e 65 77 20 29 7b 0a 20 20  f( i==nNew ){.  
11ae0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61          goto sea
11af0 72 63 68 5f 73 75 63 63 65 73 73 3b 0a 20 20 20  rch_success;.   
11b00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11b10 20 20 20 20 20 20 67 6f 74 6f 20 73 65 61 72 63        goto searc
11b20 68 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  h_failed;.      
11b30 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
11b40 69 66 28 20 69 3c 6e 4e 65 77 20 26 26 20 61 5b  if( i<nNew && a[
11b50 69 4f 66 66 2b 69 5d 3e 70 54 65 72 6d 5b 6e 4d  iOff+i]>pTerm[nM
11b60 61 74 63 68 5d 20 29 7b 0a 20 20 20 20 20 20 20  atch] ){.       
11b70 20 67 6f 74 6f 20 73 65 61 72 63 68 5f 66 61 69   goto search_fai
11b80 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  led;.      }.   
11b90 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 50 67 69   }..    if( iPgi
11ba0 64 78 3e 3d 6e 20 29 7b 0a 20 20 20 20 20 20 62  dx>=n ){.      b
11bb0 45 6e 64 4f 66 50 61 67 65 20 3d 20 31 3b 0a 20  EndOfPage = 1;. 
11bc0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11bd0 7d 0a 0a 20 20 20 20 69 50 67 69 64 78 20 2b 3d  }..    iPgidx +=
11be0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
11bf0 28 26 61 5b 69 50 67 69 64 78 5d 2c 20 6e 4b 65  (&a[iPgidx], nKe
11c00 65 70 29 3b 0a 20 20 20 20 69 54 65 72 6d 4f 66  ep);.    iTermOf
11c10 66 20 2b 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  f += nKeep;.    
11c20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b  iOff = iTermOff;
11c30 0a 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3e 3d  ..    if( iOff>=
11c40 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  n ){.      p->rc
11c50 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
11c60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  .      return;. 
11c70 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 61     }..    /* Rea
11c80 64 20 74 68 65 20 6e 4b 65 65 70 20 66 69 65 6c  d the nKeep fiel
11c90 64 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 65  d of the next te
11ca0 72 6d 2e 20 2a 2f 0a 20 20 20 20 66 74 73 35 46  rm. */.    fts5F
11cb0 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 61  astGetVarint32(a
11cc0 2c 20 69 4f 66 66 2c 20 6e 4b 65 65 70 29 3b 0a  , iOff, nKeep);.
11cd0 20 20 7d 0a 0a 20 73 65 61 72 63 68 5f 66 61 69    }.. search_fai
11ce0 6c 65 64 3a 0a 20 20 69 66 28 20 62 47 65 3d 3d  led:.  if( bGe==
11cf0 30 20 29 7b 0a 20 20 20 20 66 74 73 35 44 61 74  0 ){.    fts5Dat
11d00 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e  aRelease(pIter->
11d10 70 4c 65 61 66 29 3b 0a 20 20 20 20 70 49 74 65  pLeaf);.    pIte
11d20 72 2d 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20  r->pLeaf = 0;.  
11d30 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c 73    return;.  }els
11d40 65 20 69 66 28 20 62 45 6e 64 4f 66 50 61 67 65  e if( bEndOfPage
11d50 20 29 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   ){.    do {.   
11d60 20 20 20 66 74 73 35 53 65 67 49 74 65 72 4e 65     fts5SegIterNe
11d70 78 74 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  xtPage(p, pIter)
11d80 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
11d90 72 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  r->pLeaf==0 ) re
11da0 74 75 72 6e 3b 0a 20 20 20 20 20 20 61 20 3d 20  turn;.      a = 
11db0 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b  pIter->pLeaf->p;
11dc0 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35 4c  .      if( fts5L
11dd0 65 61 66 49 73 54 65 72 6d 6c 65 73 73 28 70 49  eafIsTermless(pI
11de0 74 65 72 2d 3e 70 4c 65 61 66 29 3d 3d 30 20 29  ter->pLeaf)==0 )
11df0 7b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78  {.        iPgidx
11e00 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d   = pIter->pLeaf-
11e10 3e 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20 20 20  >szLeaf;.       
11e20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35 47   iPgidx += fts5G
11e30 65 74 56 61 72 69 6e 74 33 32 28 26 70 49 74 65  etVarint32(&pIte
11e40 72 2d 3e 70 4c 65 61 66 2d 3e 70 5b 69 50 67 69  r->pLeaf->p[iPgi
11e50 64 78 5d 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  dx], iOff);.    
11e60 20 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c      if( iOff<4 |
11e70 7c 20 69 4f 66 66 3e 3d 70 49 74 65 72 2d 3e 70  | iOff>=pIter->p
11e80 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a  Leaf->szLeaf ){.
11e90 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
11ea0 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
11eb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
11ec0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11ed0 0a 20 20 20 20 20 20 20 20 20 20 6e 4b 65 65 70  .          nKeep
11ee0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
11ef0 69 54 65 72 6d 4f 66 66 20 3d 20 69 4f 66 66 3b  iTermOff = iOff;
11f00 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70  .          n = p
11f10 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e 6e 3b  Iter->pLeaf->nn;
11f20 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20  .          iOff 
11f30 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
11f40 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 4e 65  32(&a[iOff], nNe
11f50 77 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  w);.          br
11f60 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
11f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c       }.    }whil
11f80 65 28 20 31 20 29 3b 0a 20 20 7d 0a 0a 20 73 65  e( 1 );.  }.. se
11f90 61 72 63 68 5f 73 75 63 63 65 73 73 3a 0a 20 20  arch_success:.  
11fa0 70 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73  pIter->iLeafOffs
11fb0 65 74 20 3d 20 69 4f 66 66 20 2b 20 6e 4e 65 77  et = iOff + nNew
11fc0 3b 0a 20 20 69 66 28 20 70 49 74 65 72 2d 3e 69  ;.  if( pIter->i
11fd0 4c 65 61 66 4f 66 66 73 65 74 3e 6e 20 7c 7c 20  LeafOffset>n || 
11fe0 6e 4e 65 77 3c 31 20 29 7b 0a 20 20 20 20 70 2d  nNew<1 ){.    p-
11ff0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
12000 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  PT;.    return;.
12010 20 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 54 65    }.  pIter->iTe
12020 72 6d 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 70  rmLeafOffset = p
12030 49 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65  Iter->iLeafOffse
12040 74 3b 0a 20 20 70 49 74 65 72 2d 3e 69 54 65 72  t;.  pIter->iTer
12050 6d 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74 65  mLeafPgno = pIte
12060 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 0a 20  r->iLeafPgno;.. 
12070 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
12080 70 2d 3e 72 63 2c 20 26 70 49 74 65 72 2d 3e 74  p->rc, &pIter->t
12090 65 72 6d 2c 20 6e 4b 65 65 70 2c 20 70 54 65 72  erm, nKeep, pTer
120a0 6d 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72  m);.  fts5Buffer
120b0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
120c0 63 2c 20 26 70 49 74 65 72 2d 3e 74 65 72 6d 2c  c, &pIter->term,
120d0 20 6e 4e 65 77 2c 20 26 61 5b 69 4f 66 66 5d 29   nNew, &a[iOff])
120e0 3b 0a 0a 20 20 69 66 28 20 69 50 67 69 64 78 3e  ;..  if( iPgidx>
120f0 3d 6e 20 29 7b 0a 20 20 20 20 70 49 74 65 72 2d  =n ){.    pIter-
12100 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 20 3d  >iEndofDoclist =
12110 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 6e   pIter->pLeaf->n
12120 6e 2b 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n+1;.  }else{.  
12130 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 0a 20 20    int nExtra;.  
12140 20 20 69 50 67 69 64 78 20 2b 3d 20 66 74 73 35    iPgidx += fts5
12150 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69  GetVarint32(&a[i
12160 50 67 69 64 78 5d 2c 20 6e 45 78 74 72 61 29 3b  Pgidx], nExtra);
12170 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64  .    pIter->iEnd
12180 6f 66 44 6f 63 6c 69 73 74 20 3d 20 69 54 65 72  ofDoclist = iTer
12190 6d 4f 66 66 20 2b 20 6e 45 78 74 72 61 3b 0a 20  mOff + nExtra;. 
121a0 20 7d 0a 20 20 70 49 74 65 72 2d 3e 69 50 67 69   }.  pIter->iPgi
121b0 64 78 4f 66 66 20 3d 20 69 50 67 69 64 78 3b 0a  dxOff = iPgidx;.
121c0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f  .  fts5SegIterLo
121d0 61 64 52 6f 77 69 64 28 70 2c 20 70 49 74 65 72  adRowid(p, pIter
121e0 29 3b 0a 20 20 66 74 73 35 53 65 67 49 74 65 72  );.  fts5SegIter
121f0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
12200 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 73 71  r);.}..static sq
12210 6c 69 74 65 33 5f 73 74 6d 74 20 2a 66 74 73 35  lite3_stmt *fts5
12220 49 64 78 53 65 6c 65 63 74 53 74 6d 74 28 46 74  IdxSelectStmt(Ft
12230 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69  s5Index *p){.  i
12240 66 28 20 70 2d 3e 70 49 64 78 53 65 6c 65 63 74  f( p->pIdxSelect
12250 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
12260 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
12270 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
12280 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
12290 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
122a0 78 53 65 6c 65 63 74 2c 20 73 71 6c 69 74 65 33  xSelect, sqlite3
122b0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
122c0 20 20 20 20 22 53 45 4c 45 43 54 20 70 67 6e 6f      "SELECT pgno
122d0 20 46 52 4f 4d 20 27 25 71 27 2e 27 25 71 5f 69   FROM '%q'.'%q_i
122e0 64 78 27 20 57 48 45 52 45 20 22 0a 20 20 20 20  dx' WHERE ".    
122f0 20 20 20 20 20 20 22 73 65 67 69 64 3d 3f 20 41        "segid=? A
12300 4e 44 20 74 65 72 6d 3c 3d 3f 20 4f 52 44 45 52  ND term<=? ORDER
12310 20 42 59 20 74 65 72 6d 20 44 45 53 43 20 4c 49   BY term DESC LI
12320 4d 49 54 20 31 22 2c 0a 20 20 20 20 20 20 20 20  MIT 1",.        
12330 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20    pConfig->zDb, 
12340 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 0a 20  pConfig->zName. 
12350 20 20 20 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74     ));.  }.  ret
12360 75 72 6e 20 70 2d 3e 70 49 64 78 53 65 6c 65 63  urn p->pIdxSelec
12370 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74  t;.}../*.** Init
12380 69 61 6c 69 7a 65 20 74 68 65 20 6f 62 6a 65 63  ialize the objec
12390 74 20 70 49 74 65 72 20 74 6f 20 70 6f 69 6e 74  t pIter to point
123a0 20 74 6f 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e   to term pTerm/n
123b0 54 65 72 6d 20 77 69 74 68 69 6e 20 73 65 67 6d  Term within segm
123c0 65 6e 74 0a 2a 2a 20 70 53 65 67 2e 20 49 66 20  ent.** pSeg. If 
123d0 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 63 68  there is no such
123e0 20 74 65 72 6d 20 69 6e 20 74 68 65 20 69 6e 64   term in the ind
123f0 65 78 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72  ex, the iterator
12400 20 69 73 20 73 65 74 20 74 6f 20 45 4f 46 2e 0a   is set to EOF..
12410 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
12420 72 20 6f 63 63 75 72 73 2c 20 46 74 73 35 49 6e  r occurs, Fts5In
12430 64 65 78 2e 72 63 20 69 73 20 73 65 74 20 74 6f  dex.rc is set to
12440 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
12450 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 0a  error code. If .
12460 2a 2a 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  ** an error has 
12470 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64  already occurred
12480 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
12490 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 69  ion is called, i
124a0 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  t is a no-op..*/
124b0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
124c0 35 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74  5SegIterSeekInit
124d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
124e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
124f0 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
12500 65 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  end */.  const u
12510 38 20 2a 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54  8 *pTerm, int nT
12520 65 72 6d 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d  erm,     /* Term
12530 20 74 6f 20 73 65 65 6b 20 74 6f 20 2a 2f 0a 20   to seek to */. 
12540 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
12550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12560 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
12570 49 4e 44 45 58 5f 58 58 58 20 66 6c 61 67 73 20  INDEX_XXX flags 
12580 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
12590 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 2c  reSegment *pSeg,
125a0 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
125b0 69 6f 6e 20 6f 66 20 73 65 67 6d 65 6e 74 20 2a  ion of segment *
125c0 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20  /.  Fts5SegIter 
125d0 2a 70 49 74 65 72 20 20 20 20 20 20 20 20 20 20  *pIter          
125e0 20 20 20 20 2f 2a 20 4f 62 6a 65 63 74 20 74 6f      /* Object to
125f0 20 70 6f 70 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a   populate */.){.
12600 20 20 69 6e 74 20 69 50 67 20 3d 20 31 3b 0a 20    int iPg = 1;. 
12610 20 69 6e 74 20 62 47 65 20 3d 20 28 66 6c 61 67   int bGe = (flag
12620 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
12630 45 52 59 5f 53 43 41 4e 29 3b 0a 20 20 69 6e 74  ERY_SCAN);.  int
12640 20 62 44 6c 69 64 78 20 3d 20 30 3b 20 20 20 20   bDlidx = 0;    
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12660 54 72 75 65 20 69 66 20 74 68 65 72 65 20 69 73  True if there is
12670 20 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78   a doclist-index
12680 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
12690 6d 74 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d  mt *pIdxSelect =
126a0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 62   0;..  assert( b
126b0 47 65 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73 20  Ge==0 || (flags 
126c0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
126d0 59 5f 44 45 53 43 29 3d 3d 30 20 29 3b 0a 20 20  Y_DESC)==0 );.  
126e0 61 73 73 65 72 74 28 20 70 54 65 72 6d 20 26 26  assert( pTerm &&
126f0 20 6e 54 65 72 6d 20 29 3b 0a 20 20 6d 65 6d 73   nTerm );.  mems
12700 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
12710 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
12720 70 49 74 65 72 2d 3e 70 53 65 67 20 3d 20 70 53  pIter->pSeg = pS
12730 65 67 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 62  eg;..  /* This b
12740 6c 6f 63 6b 20 73 65 74 73 20 73 74 61 63 6b 20  lock sets stack 
12750 76 61 72 69 61 62 6c 65 20 69 50 67 20 74 6f 20  variable iPg to 
12760 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 6e 75  the leaf page nu
12770 6d 62 65 72 20 74 68 61 74 20 6d 61 79 0a 20 20  mber that may.  
12780 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 65 72 6d 20  ** contain term 
12790 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2c 20 69  (pTerm/nTerm), i
127a0 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 20  f it is present 
127b0 69 6e 20 74 68 65 20 73 65 67 6d 65 6e 74 2e 20  in the segment. 
127c0 2a 2f 0a 20 20 70 49 64 78 53 65 6c 65 63 74 20  */.  pIdxSelect 
127d0 3d 20 66 74 73 35 49 64 78 53 65 6c 65 63 74 53  = fts5IdxSelectS
127e0 74 6d 74 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  tmt(p);.  if( p-
127f0 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  >rc ) return;.  
12800 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
12810 28 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20  (pIdxSelect, 1, 
12820 70 53 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20  pSeg->iSegid);. 
12830 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
12840 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32  ob(pIdxSelect, 2
12850 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , pTerm, nTerm, 
12860 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
12870 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
12880 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
12890 49 64 78 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  IdxSelect) ){.  
128a0 20 20 69 36 34 20 76 61 6c 20 3d 20 73 71 6c 69    i64 val = sqli
128b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
128c0 49 64 78 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  IdxSelect, 0);. 
128d0 20 20 20 69 50 67 20 3d 20 28 69 6e 74 29 28 76     iPg = (int)(v
128e0 61 6c 3e 3e 31 29 3b 0a 20 20 20 20 62 44 6c 69  al>>1);.    bDli
128f0 64 78 20 3d 20 28 76 61 6c 20 26 20 30 78 30 30  dx = (val & 0x00
12900 30 31 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 72 63  01);.  }.  p->rc
12910 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
12920 28 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20  (pIdxSelect);.  
12930 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
12940 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32 29  l(pIdxSelect, 2)
12950 3b 0a 0a 20 20 69 66 28 20 69 50 67 3c 70 53 65  ;..  if( iPg<pSe
12960 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 29 7b 0a  g->pgnoFirst ){.
12970 20 20 20 20 69 50 67 20 3d 20 70 53 65 67 2d 3e      iPg = pSeg->
12980 70 67 6e 6f 46 69 72 73 74 3b 0a 20 20 20 20 62  pgnoFirst;.    b
12990 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20 7d 0a 0a  Dlidx = 0;.  }..
129a0 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
129b0 6e 6f 20 3d 20 69 50 67 20 2d 20 31 3b 0a 20 20  no = iPg - 1;.  
129c0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 50  fts5SegIterNextP
129d0 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  age(p, pIter);..
129e0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65    if( pIter->pLe
129f0 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 4c 65  af ){.    fts5Le
12a00 61 66 53 65 65 6b 28 70 2c 20 62 47 65 2c 20 70  afSeek(p, bGe, p
12a10 49 74 65 72 2c 20 70 54 65 72 6d 2c 20 6e 54 65  Iter, pTerm, nTe
12a20 72 6d 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rm);.  }..  if( 
12a30 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
12a40 20 26 26 20 62 47 65 3d 3d 30 20 29 7b 0a 20 20   && bGe==0 ){.  
12a50 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12a60 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
12a70 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
12a80 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 29 7b 0a  pIter->pLeaf ){.
12a90 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 73 20        if( flags 
12aa0 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  & FTS5INDEX_QUER
12ab0 59 5f 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20  Y_DESC ){.      
12ac0 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c    pIter->flags |
12ad0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52  = FTS5_SEGITER_R
12ae0 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20 7d 0a  EVERSE;.      }.
12af0 20 20 20 20 20 20 69 66 28 20 62 44 6c 69 64 78        if( bDlidx
12b00 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
12b10 53 65 67 49 74 65 72 4c 6f 61 64 44 6c 69 64 78  SegIterLoadDlidx
12b20 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
12b30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 66 6c    }.      if( fl
12b40 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
12b50 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
12b60 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
12b70 72 52 65 76 65 72 73 65 28 70 2c 20 70 49 74 65  rReverse(p, pIte
12b80 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
12b90 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 53 65 67  }.  }..  fts5Seg
12ba0 49 74 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70  IterSetNext(p, p
12bb0 49 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 45 69 74  Iter);..  /* Eit
12bc0 68 65 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  her:.  **.  **  
12bd0 20 31 29 20 61 6e 20 65 72 72 6f 72 20 68 61 73   1) an error has
12be0 20 6f 63 63 75 72 72 65 64 2c 20 6f 72 0a 20 20   occurred, or.  
12bf0 2a 2a 20 20 20 32 29 20 74 68 65 20 69 74 65 72  **   2) the iter
12c00 61 74 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45  ator points to E
12c10 4f 46 2c 20 6f 72 0a 20 20 2a 2a 20 20 20 33 29  OF, or.  **   3)
12c20 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12c30 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79  ints to an entry
12c40 20 77 69 74 68 20 74 65 72 6d 20 28 70 54 65 72   with term (pTer
12c50 6d 2f 6e 54 65 72 6d 29 2c 20 6f 72 0a 20 20 2a  m/nTerm), or.  *
12c60 2a 20 20 20 34 29 20 74 68 65 20 46 54 53 35 49  *   4) the FTS5I
12c70 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41 4e 20  NDEX_QUERY_SCAN 
12c80 66 6c 61 67 20 77 61 73 20 73 65 74 20 61 6e 64  flag was set and
12c90 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 6f   the iterator po
12ca0 69 6e 74 73 0a 20 20 2a 2a 20 20 20 20 20 20 74  ints.  **      t
12cb0 6f 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  o an entry with 
12cc0 61 20 74 65 72 6d 20 67 72 65 61 74 65 72 20 74  a term greater t
12cd0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
12ce0 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 2e 0a 20  (pTerm/nTerm).. 
12cf0 20 2a 2f 0a 20 20 61 73 73 65 72 74 5f 6e 63 28   */.  assert_nc(
12d00 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
12d10 4b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K               
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d30 20 20 20 20 20 20 20 20 2f 2a 20 31 20 2a 2f 0a          /* 1 */.
12d40 20 20 20 7c 7c 20 70 49 74 65 72 2d 3e 70 4c 65     || pIter->pLe
12d50 61 66 3d 3d 30 20 20 20 20 20 20 20 20 20 20 20  af==0           
12d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d80 20 20 20 20 2f 2a 20 32 20 2a 2f 0a 20 20 20 7c      /* 2 */.   |
12d90 7c 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70  | fts5BufferComp
12da0 61 72 65 42 6c 6f 62 28 26 70 49 74 65 72 2d 3e  areBlob(&pIter->
12db0 74 65 72 6d 2c 20 70 54 65 72 6d 2c 20 6e 54 65  term, pTerm, nTe
12dc0 72 6d 29 3d 3d 30 20 20 20 20 20 20 20 20 20 20  rm)==0          
12dd0 2f 2a 20 33 20 2a 2f 0a 20 20 20 7c 7c 20 28 62  /* 3 */.   || (b
12de0 47 65 20 26 26 20 66 74 73 35 42 75 66 66 65 72  Ge && fts5Buffer
12df0 43 6f 6d 70 61 72 65 42 6c 6f 62 28 26 70 49 74  CompareBlob(&pIt
12e00 65 72 2d 3e 74 65 72 6d 2c 20 70 54 65 72 6d 2c  er->term, pTerm,
12e10 20 6e 54 65 72 6d 29 3e 30 29 20 20 2f 2a 20 34   nTerm)>0)  /* 4
12e20 20 2a 2f 0a 20 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   */.  );.}../*.*
12e30 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
12e40 20 6f 62 6a 65 63 74 20 70 49 74 65 72 20 74 6f   object pIter to
12e50 20 70 6f 69 6e 74 20 74 6f 20 74 65 72 6d 20 70   point to term p
12e60 54 65 72 6d 2f 6e 54 65 72 6d 20 77 69 74 68 69  Term/nTerm withi
12e70 6e 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n the.** in-memo
12e80 72 79 20 68 61 73 68 20 74 61 62 6c 65 2e 20 49  ry hash table. I
12e90 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75  f there is no su
12ea0 63 68 20 74 65 72 6d 20 69 6e 20 74 68 65 20 68  ch term in the h
12eb0 61 73 68 2d 74 61 62 6c 65 2c 20 74 68 65 20 0a  ash-table, the .
12ec0 2a 2a 20 69 74 65 72 61 74 6f 72 20 69 73 20 73  ** iterator is s
12ed0 65 74 20 74 6f 20 45 4f 46 2e 0a 2a 2a 0a 2a 2a  et to EOF..**.**
12ee0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
12ef0 75 72 73 2c 20 46 74 73 35 49 6e 64 65 78 2e 72  urs, Fts5Index.r
12f00 63 20 69 73 20 73 65 74 20 74 6f 20 61 6e 20 61  c is set to an a
12f10 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
12f20 20 63 6f 64 65 2e 20 49 66 20 0a 2a 2a 20 61 6e   code. If .** an
12f30 20 65 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61   error has alrea
12f40 64 79 20 6f 63 63 75 72 72 65 64 20 77 68 65 6e  dy occurred when
12f50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
12f60 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
12f70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
12f80 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
12f90 74 65 72 48 61 73 68 49 6e 69 74 28 0a 20 20 46  terHashInit(.  F
12fa0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
12fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12fc0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 2a  * FTS5 backend *
12fd0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54  /.  const u8 *pT
12fe0 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d 2c 20  erm, int nTerm, 
12ff0 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f 20 73      /* Term to s
13000 65 65 6b 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  eek to */.  int 
13010 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
13020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
13030 61 73 6b 20 6f 66 20 46 54 53 35 49 4e 44 45 58  ask of FTS5INDEX
13040 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
13050 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74  Fts5SegIter *pIt
13060 65 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  er              
13070 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 70 6f 70  /* Object to pop
13080 75 6c 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ulate */.){.  in
13090 74 20 6e 4c 69 73 74 20 3d 20 30 3b 0a 20 20 63  t nList = 0;.  c
130a0 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 30 3b 0a  onst u8 *z = 0;.
130b0 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 46    int n = 0;.  F
130c0 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 20 3d  ts5Data *pLeaf =
130d0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
130e0 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 61 73 73  ->pHash );.  ass
130f0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
13100 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 69 66 28 20  TE_OK );..  if( 
13110 70 54 65 72 6d 3d 3d 30 20 7c 7c 20 28 66 6c 61  pTerm==0 || (fla
13120 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
13130 55 45 52 59 5f 53 43 41 4e 29 20 29 7b 0a 20 20  UERY_SCAN) ){.  
13140 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 4c 69 73    const u8 *pLis
13150 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 2d 3e 72  t = 0;..    p->r
13160 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
13170 61 73 68 53 63 61 6e 49 6e 69 74 28 70 2d 3e 70  ashScanInit(p->p
13180 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68 61  Hash, (const cha
13190 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d 29  r*)pTerm, nTerm)
131a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  ;.    sqlite3Fts
131b0 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79 28 70  5HashScanEntry(p
131c0 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20  ->pHash, (const 
131d0 63 68 61 72 2a 2a 29 26 7a 2c 20 26 70 4c 69 73  char**)&z, &pLis
131e0 74 2c 20 26 6e 4c 69 73 74 29 3b 0a 20 20 20 20  t, &nList);.    
131f0 6e 20 3d 20 28 7a 20 3f 20 28 69 6e 74 29 73 74  n = (z ? (int)st
13200 72 6c 65 6e 28 28 63 6f 6e 73 74 20 63 68 61 72  rlen((const char
13210 2a 29 7a 29 20 3a 20 30 29 3b 0a 20 20 20 20 69  *)z) : 0);.    i
13220 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  f( pList ){.    
13230 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35 49 64    pLeaf = fts5Id
13240 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f  xMalloc(p, sizeo
13250 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a 20 20  f(Fts5Data));.  
13260 20 20 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b      if( pLeaf ){
13270 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 2d 3e  .        pLeaf->
13280 70 20 3d 20 28 75 38 2a 29 70 4c 69 73 74 3b 0a  p = (u8*)pList;.
13290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
132a0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 72 63  }else{.    p->rc
132b0 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48 61   = sqlite3Fts5Ha
132c0 73 68 51 75 65 72 79 28 70 2d 3e 70 48 61 73 68  shQuery(p->pHash
132d0 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 44 61 74  , sizeof(Fts5Dat
132e0 61 29 2c 20 0a 20 20 20 20 20 20 20 20 28 63 6f  a), .        (co
132f0 6e 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c  nst char*)pTerm,
13300 20 6e 54 65 72 6d 2c 20 28 76 6f 69 64 2a 2a 29   nTerm, (void**)
13310 26 70 4c 65 61 66 2c 20 26 6e 4c 69 73 74 0a 20  &pLeaf, &nList. 
13320 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c     );.    if( pL
13330 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 4c 65  eaf ){.      pLe
13340 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 26 70 4c  af->p = (u8*)&pL
13350 65 61 66 5b 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  eaf[1];.    }.  
13360 20 20 7a 20 3d 20 70 54 65 72 6d 3b 0a 20 20 20    z = pTerm;.   
13370 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20 20 20 20   n = nTerm;.    
13380 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  pIter->flags |= 
13390 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
133a0 54 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  TERM;.  }..  if(
133b0 20 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 73 71   pLeaf ){.    sq
133c0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
133d0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
133e0 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a  r->term, n, z);.
133f0 20 20 20 20 70 4c 65 61 66 2d 3e 6e 6e 20 3d 20      pLeaf->nn = 
13400 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 3d 20  pLeaf->szLeaf = 
13410 6e 4c 69 73 74 3b 0a 20 20 20 20 70 49 74 65 72  nList;.    pIter
13420 2d 3e 70 4c 65 61 66 20 3d 20 70 4c 65 61 66 3b  ->pLeaf = pLeaf;
13430 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61  .    pIter->iLea
13440 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
13450 74 56 61 72 69 6e 74 28 70 4c 65 61 66 2d 3e 70  tVarint(pLeaf->p
13460 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
13470 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 70 49 74  iRowid);.    pIt
13480 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73  er->iEndofDoclis
13490 74 20 3d 20 70 4c 65 61 66 2d 3e 6e 6e 3b 0a 0a  t = pLeaf->nn;..
134a0 20 20 20 20 69 66 28 20 66 6c 61 67 73 20 26 20      if( flags & 
134b0 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
134c0 44 45 53 43 20 29 7b 0a 20 20 20 20 20 20 70 49  DESC ){.      pI
134d0 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
134e0 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52  S5_SEGITER_REVER
134f0 53 45 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65  SE;.      fts5Se
13500 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
13510 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
13520 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13530 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
13540 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
13550 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73      }.  }..  fts
13560 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
13570 70 2c 20 70 49 74 65 72 29 3b 0a 7d 0a 0a 2f 2a  p, pIter);.}../*
13580 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 69 74 65  .** Zero the ite
13590 72 61 74 6f 72 20 70 61 73 73 65 64 20 61 73 20  rator passed as 
135a0 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e  the only argumen
135b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
135c0 64 20 66 74 73 35 53 65 67 49 74 65 72 43 6c 65  d fts5SegIterCle
135d0 61 72 28 46 74 73 35 53 65 67 49 74 65 72 20 2a  ar(Fts5SegIter *
135e0 70 49 74 65 72 29 7b 0a 20 20 66 74 73 35 42 75  pIter){.  fts5Bu
135f0 66 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d  fferFree(&pIter-
13600 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 44 61  >term);.  fts5Da
13610 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72 2d  taRelease(pIter-
13620 3e 70 4c 65 61 66 29 3b 0a 20 20 66 74 73 35 44  >pLeaf);.  fts5D
13630 61 74 61 52 65 6c 65 61 73 65 28 70 49 74 65 72  ataRelease(pIter
13640 2d 3e 70 4e 65 78 74 4c 65 61 66 29 3b 0a 20 20  ->pNextLeaf);.  
13650 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
13660 65 28 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 29  e(pIter->pDlidx)
13670 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
13680 28 70 49 74 65 72 2d 3e 61 52 6f 77 69 64 4f 66  (pIter->aRowidOf
13690 66 73 65 74 29 3b 0a 20 20 6d 65 6d 73 65 74 28  fset);.  memset(
136a0 70 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  pIter, 0, sizeof
136b0 28 46 74 73 35 53 65 67 49 74 65 72 29 29 3b 0a  (Fts5SegIter));.
136c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
136d0 5f 44 45 42 55 47 0a 0a 2f 2a 0a 2a 2a 20 54 68  _DEBUG../*.** Th
136e0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
136f0 73 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74  sed as part of t
13700 68 65 20 62 69 67 20 61 73 73 65 72 74 28 29 20  he big assert() 
13710 70 72 6f 63 65 64 75 72 65 20 69 6d 70 6c 65 6d  procedure implem
13720 65 6e 74 65 64 20 62 79 0a 2a 2a 20 66 74 73 35  ented by.** fts5
13730 41 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53  AssertMultiIterS
13740 65 74 75 70 28 29 2e 20 49 74 20 65 6e 73 75 72  etup(). It ensur
13750 65 73 20 74 68 61 74 20 74 68 65 20 72 65 73 75  es that the resu
13760 6c 74 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f  lt currently sto
13770 72 65 64 0a 2a 2a 20 69 6e 20 2a 70 52 65 73 20  red.** in *pRes 
13780 69 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  is the correct r
13790 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
137a0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  ng the current p
137b0 6f 73 69 74 69 6f 6e 73 20 6f 66 20 74 68 65 0a  ositions of the.
137c0 2a 2a 20 74 77 6f 20 69 74 65 72 61 74 6f 72 73  ** two iterators
137d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
137e0 20 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61   fts5AssertCompa
137f0 72 69 73 6f 6e 52 65 73 75 6c 74 28 0a 20 20 46  risonResult(.  F
13800 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
13810 0a 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  .  Fts5SegIter *
13820 70 31 2c 0a 20 20 46 74 73 35 53 65 67 49 74 65  p1,.  Fts5SegIte
13830 72 20 2a 70 32 2c 0a 20 20 46 74 73 35 43 52 65  r *p2,.  Fts5CRe
13840 73 75 6c 74 20 2a 70 52 65 73 0a 29 7b 0a 20 20  sult *pRes.){.  
13850 69 6e 74 20 69 31 20 3d 20 70 31 20 2d 20 70 49  int i1 = p1 - pI
13860 74 65 72 2d 3e 61 53 65 67 3b 0a 20 20 69 6e 74  ter->aSeg;.  int
13870 20 69 32 20 3d 20 70 32 20 2d 20 70 49 74 65 72   i2 = p2 - pIter
13880 2d 3e 61 53 65 67 3b 0a 0a 20 20 69 66 28 20 70  ->aSeg;..  if( p
13890 31 2d 3e 70 4c 65 61 66 20 7c 7c 20 70 32 2d 3e  1->pLeaf || p2->
138a0 70 4c 65 61 66 20 29 7b 0a 20 20 20 20 69 66 28  pLeaf ){.    if(
138b0 20 70 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p1->pLeaf==0 ){
138c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
138d0 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32 20  Res->iFirst==i2 
138e0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
138f0 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p2->pLeaf==0 ){
13900 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13910 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
13920 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
13930 20 20 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20 4d      int nMin = M
13940 49 4e 28 70 31 2d 3e 74 65 72 6d 2e 6e 2c 20 70  IN(p1->term.n, p
13950 32 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  2->term.n);.    
13960 20 20 69 6e 74 20 72 65 73 20 3d 20 66 74 73 35    int res = fts5
13970 4d 65 6d 63 6d 70 28 70 31 2d 3e 74 65 72 6d 2e  Memcmp(p1->term.
13980 70 2c 20 70 32 2d 3e 74 65 72 6d 2e 70 2c 20 6e  p, p2->term.p, n
13990 4d 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Min);.      if( 
139a0 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 70  res==0 ) res = p
139b0 31 2d 3e 74 65 72 6d 2e 6e 20 2d 20 70 32 2d 3e  1->term.n - p2->
139c0 74 65 72 6d 2e 6e 3b 0a 0a 20 20 20 20 20 20 69  term.n;..      i
139d0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
139e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 65       assert( pRe
139f0 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 31 20 29 3b  s->bTermEq==1 );
13a00 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13a10 20 70 31 2d 3e 69 52 6f 77 69 64 21 3d 70 32 2d   p1->iRowid!=p2-
13a20 3e 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 20  >iRowid );.     
13a30 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d 3e 69     res = ((p1->i
13a40 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52 6f 77  Rowid > p2->iRow
13a50 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76  id)==pIter->bRev
13a60 29 20 3f 20 2d 31 20 3a 20 31 3b 0a 20 20 20 20  ) ? -1 : 1;.    
13a70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13a80 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62   assert( pRes->b
13a90 54 65 72 6d 45 71 3d 3d 30 20 29 3b 0a 20 20 20  TermEq==0 );.   
13aa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
13ab0 72 65 73 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  res<0 ){.       
13ac0 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 69   assert( pRes->i
13ad0 46 69 72 73 74 3d 3d 69 31 20 29 3b 0a 20 20 20  First==i1 );.   
13ae0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13af0 20 20 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e    assert( pRes->
13b00 69 46 69 72 73 74 3d 3d 69 32 20 29 3b 0a 20 20  iFirst==i2 );.  
13b10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
13b20 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
13b30 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
13b40 70 20 75 6e 6c 65 73 73 20 53 51 4c 49 54 45 5f  p unless SQLITE_
13b50 44 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64  DEBUG is defined
13b60 20 77 68 65 6e 20 74 68 69 73 20 6d 6f 64 75 6c   when this modul
13b70 65 0a 2a 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64  e.** is compiled
13b80 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c 20  . In that case, 
13b90 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
13ba0 20 65 73 73 65 6e 74 69 61 6c 6c 79 20 61 6e 20   essentially an 
13bb0 61 73 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61  assert() .** sta
13bc0 74 65 6d 65 6e 74 20 75 73 65 64 20 74 6f 20 76  tement used to v
13bd0 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
13be0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
13bf0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 5d 20 61  Iter->aFirst[] a
13c00 72 72 61 79 0a 2a 2a 20 61 72 65 20 63 6f 72 72  rray.** are corr
13c10 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ect..*/.static v
13c20 6f 69 64 20 66 74 73 35 41 73 73 65 72 74 4d 75  oid fts5AssertMu
13c30 6c 74 69 49 74 65 72 53 65 74 75 70 28 46 74 73  ltiIterSetup(Fts
13c40 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 49  5Index *p, Fts5I
13c50 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 69  ter *pIter){.  i
13c60 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
13c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 53  _OK ){.    Fts5S
13c80 65 67 49 74 65 72 20 2a 70 46 69 72 73 74 20 3d  egIter *pFirst =
13c90 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70   &pIter->aSeg[ p
13ca0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
13cb0 69 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e  iFirst ];.    in
13cc0 74 20 69 3b 0a 0a 20 20 20 20 61 73 73 65 72 74  t i;..    assert
13cd0 28 20 28 70 46 69 72 73 74 2d 3e 70 4c 65 61 66  ( (pFirst->pLeaf
13ce0 3d 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73  ==0)==pIter->bas
13cf0 65 2e 62 45 6f 66 20 29 3b 0a 0a 20 20 20 20 2f  e.bEof );..    /
13d00 2a 20 43 68 65 63 6b 20 74 68 61 74 20 70 49 74  * Check that pIt
13d10 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
13d20 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c   is set correctl
13d30 79 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d  y. */.    for(i=
13d40 30 3b 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67  0; i<pIter->nSeg
13d50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 46 74  ; i++){.      Ft
13d60 73 35 53 65 67 49 74 65 72 20 2a 70 31 20 3d 20  s5SegIter *p1 = 
13d70 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b  &pIter->aSeg[i];
13d80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
13d90 31 3d 3d 70 46 69 72 73 74 20 0a 20 20 20 20 20  1==pFirst .     
13da0 20 20 20 20 20 20 7c 7c 20 70 31 2d 3e 70 4c 65        || p1->pLe
13db0 61 66 3d 3d 30 20 0a 20 20 20 20 20 20 20 20 20  af==0 .         
13dc0 20 20 7c 7c 20 66 74 73 35 42 75 66 66 65 72 43    || fts5BufferC
13dd0 6f 6d 70 61 72 65 28 26 70 46 69 72 73 74 2d 3e  ompare(&pFirst->
13de0 74 65 72 6d 2c 20 26 70 31 2d 3e 74 65 72 6d 29  term, &p1->term)
13df0 20 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20   .           || 
13e00 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74 65  p1->iRowid==pIte
13e10 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 0a  r->iSwitchRowid.
13e20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70             || (p
13e30 31 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72 2d  1->iRowid<pIter-
13e40 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d 3d  >iSwitchRowid)==
13e50 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 20 20  pIter->bRev.    
13e60 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20    );.    }..    
13e70 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
13e80 2d 3e 6e 53 65 67 3b 20 69 2b 3d 32 29 7b 0a 20  ->nSeg; i+=2){. 
13e90 20 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72       Fts5SegIter
13ea0 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61   *p1 = &pIter->a
13eb0 53 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 46 74  Seg[i];.      Ft
13ec0 73 35 53 65 67 49 74 65 72 20 2a 70 32 20 3d 20  s5SegIter *p2 = 
13ed0 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 2b 31  &pIter->aSeg[i+1
13ee0 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
13ef0 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
13f00 74 65 72 2d 3e 61 46 69 72 73 74 5b 28 70 49 74  ter->aFirst[(pIt
13f10 65 72 2d 3e 6e 53 65 67 20 2b 20 69 29 20 2f 20  er->nSeg + i) / 
13f20 32 5d 3b 0a 20 20 20 20 20 20 66 74 73 35 41 73  2];.      fts5As
13f30 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65  sertComparisonRe
13f40 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31 2c 20  sult(pIter, p1, 
13f50 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  p2, pRes);.    }
13f60 0a 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ..    for(i=1; i
13f70 3c 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2f 20  <(pIter->nSeg / 
13f80 32 29 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 20  2); i+=2){.     
13f90 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 31   Fts5SegIter *p1
13fa0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
13fb0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
13fc0 2a 32 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  *2].iFirst ];.  
13fd0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13fe0 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
13ff0 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72 73  eg[ pIter->aFirs
14000 74 5b 69 2a 32 2b 31 5d 2e 69 46 69 72 73 74 20  t[i*2+1].iFirst 
14010 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 43 52 65  ];.      Fts5CRe
14020 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70 49  sult *pRes = &pI
14030 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 5d 3b 0a  ter->aFirst[i];.
14040 20 20 20 20 20 20 66 74 73 35 41 73 73 65 72 74        fts5Assert
14050 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c 74  ComparisonResult
14060 28 70 49 74 65 72 2c 20 70 31 2c 20 70 32 2c 20  (pIter, p1, p2, 
14070 70 52 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pRes);.    }.  }
14080 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
14090 65 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  e fts5AssertMult
140a0 69 49 74 65 72 53 65 74 75 70 28 78 2c 79 29 0a  iIterSetup(x,y).
140b0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f  #endif../*.** Do
140c0 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
140d0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 70 6f 70  necessary to pop
140e0 75 6c 61 74 65 20 70 49 74 65 72 2d 3e 61 46 69  ulate pIter->aFi
140f0 72 73 74 5b 69 4f 75 74 5d 2e 0a 2a 2a 0a 2a 2a  rst[iOut]..**.**
14100 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   If the returned
14110 20 76 61 6c 75 65 20 69 73 20 6e 6f 6e 2d 7a 65   value is non-ze
14120 72 6f 2c 20 74 68 65 6e 20 69 74 20 69 73 20 74  ro, then it is t
14130 68 65 20 69 6e 64 65 78 20 6f 66 20 61 6e 20 65  he index of an e
14140 6e 74 72 79 0a 2a 2a 20 69 6e 20 74 68 65 20 70  ntry.** in the p
14150 49 74 65 72 2d 3e 61 53 65 67 5b 5d 20 61 72 72  Iter->aSeg[] arr
14160 61 79 20 74 68 61 74 20 69 73 20 28 61 29 20 6e  ay that is (a) n
14170 6f 74 20 61 74 20 45 4f 46 2c 20 61 6e 64 20 28  ot at EOF, and (
14180 62 29 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74  b) pointing.** t
14190 6f 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  o a key that is 
141a0 61 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 61  a duplicate of a
141b0 6e 6f 74 68 65 72 2c 20 68 69 67 68 65 72 20 70  nother, higher p
141c0 72 69 6f 72 69 74 79 2c 20 0a 2a 2a 20 73 65 67  riority, .** seg
141d0 6d 65 6e 74 2d 69 74 65 72 61 74 6f 72 20 69 6e  ment-iterator in
141e0 20 74 68 65 20 70 53 65 67 2d 3e 61 53 65 67 5b   the pSeg->aSeg[
141f0 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  ] array..*/.stat
14200 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
14210 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 46 74  IterDoCompare(Ft
14220 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69  s5Iter *pIter, i
14230 6e 74 20 69 4f 75 74 29 7b 0a 20 20 69 6e 74 20  nt iOut){.  int 
14240 69 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  i1;             
14250 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14260 6e 64 65 78 20 6f 66 20 6c 65 66 74 2d 68 61 6e  ndex of left-han
14270 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f  d Fts5SegIter */
14280 0a 20 20 69 6e 74 20 69 32 3b 20 20 20 20 20 20  .  int i2;      
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72     /* Index of r
142b0 69 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65  ight-hand Fts5Se
142c0 67 49 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69  gIter */.  int i
142d0 52 65 73 3b 0a 20 20 46 74 73 35 53 65 67 49 74  Res;.  Fts5SegIt
142e0 65 72 20 2a 70 31 3b 20 20 20 20 20 20 20 20 20  er *p1;         
142f0 20 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 68         /* Left-h
14300 61 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20  and Fts5SegIter 
14310 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  */.  Fts5SegIter
14320 20 2a 70 32 3b 20 20 20 20 20 20 20 20 20 20 20   *p2;           
14330 20 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 68 61       /* Right-ha
14340 6e 64 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  nd Fts5SegIter *
14350 2f 0a 20 20 46 74 73 35 43 52 65 73 75 6c 74 20  /.  Fts5CResult 
14360 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d 3e  *pRes = &pIter->
14370 61 46 69 72 73 74 5b 69 4f 75 74 5d 3b 0a 0a 20  aFirst[iOut];.. 
14380 20 61 73 73 65 72 74 28 20 69 4f 75 74 3c 70 49   assert( iOut<pI
14390 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 69 4f 75  ter->nSeg && iOu
143a0 74 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  t>0 );.  assert(
143b0 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d 30 20   pIter->bRev==0 
143c0 7c 7c 20 70 49 74 65 72 2d 3e 62 52 65 76 3d 3d  || pIter->bRev==
143d0 31 20 29 3b 0a 0a 20 20 69 66 28 20 69 4f 75 74  1 );..  if( iOut
143e0 3e 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67 2f 32  >=(pIter->nSeg/2
143f0 29 20 29 7b 0a 20 20 20 20 69 31 20 3d 20 28 69  ) ){.    i1 = (i
14400 4f 75 74 20 2d 20 70 49 74 65 72 2d 3e 6e 53 65  Out - pIter->nSe
14410 67 2f 32 29 20 2a 20 32 3b 0a 20 20 20 20 69 32  g/2) * 2;.    i2
14420 20 3d 20 69 31 20 2b 20 31 3b 0a 20 20 7d 65 6c   = i1 + 1;.  }el
14430 73 65 7b 0a 20 20 20 20 69 31 20 3d 20 70 49 74  se{.    i1 = pIt
14440 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a  er->aFirst[iOut*
14450 32 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20 69  2].iFirst;.    i
14460 32 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73  2 = pIter->aFirs
14470 74 5b 69 4f 75 74 2a 32 2b 31 5d 2e 69 46 69 72  t[iOut*2+1].iFir
14480 73 74 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 26  st;.  }.  p1 = &
14490 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 31 5d 3b  pIter->aSeg[i1];
144a0 0a 20 20 70 32 20 3d 20 26 70 49 74 65 72 2d 3e  .  p2 = &pIter->
144b0 61 53 65 67 5b 69 32 5d 3b 0a 0a 20 20 70 52 65  aSeg[i2];..  pRe
144c0 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20 30 3b 0a  s->bTermEq = 0;.
144d0 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 3d    if( p1->pLeaf=
144e0 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
144f0 2f 2a 20 49 66 20 70 31 20 69 73 20 61 74 20 45  /* If p1 is at E
14500 4f 46 20 2a 2f 0a 20 20 20 20 69 52 65 73 20 3d  OF */.    iRes =
14510 20 69 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   i2;.  }else if(
14520 20 70 32 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 7b   p2->pLeaf==0 ){
14530 20 20 20 20 20 2f 2a 20 49 66 20 70 32 20 69 73       /* If p2 is
14540 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20 69   at EOF */.    i
14550 52 65 73 20 3d 20 69 31 3b 0a 20 20 7d 65 6c 73  Res = i1;.  }els
14560 65 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d  e{.    int res =
14570 20 66 74 73 35 42 75 66 66 65 72 43 6f 6d 70 61   fts5BufferCompa
14580 72 65 28 26 70 31 2d 3e 74 65 72 6d 2c 20 26 70  re(&p1->term, &p
14590 32 2d 3e 74 65 72 6d 29 3b 0a 20 20 20 20 69 66  2->term);.    if
145a0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
145b0 20 20 61 73 73 65 72 74 28 20 69 32 3e 69 31 20    assert( i2>i1 
145c0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
145d0 20 69 32 21 3d 30 20 29 3b 0a 20 20 20 20 20 20   i2!=0 );.      
145e0 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20 3d 20  pRes->bTermEq = 
145f0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  1;.      if( p1-
14600 3e 69 52 6f 77 69 64 3d 3d 70 32 2d 3e 69 52 6f  >iRowid==p2->iRo
14610 77 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70  wid ){.        p
14620 31 2d 3e 62 44 65 6c 20 3d 20 70 32 2d 3e 62 44  1->bDel = p2->bD
14630 65 6c 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  el;.        retu
14640 72 6e 20 69 32 3b 0a 20 20 20 20 20 20 7d 0a 20  rn i2;.      }. 
14650 20 20 20 20 20 72 65 73 20 3d 20 28 28 70 31 2d       res = ((p1-
14660 3e 69 52 6f 77 69 64 20 3e 20 70 32 2d 3e 69 52  >iRowid > p2->iR
14670 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52  owid)==pIter->bR
14680 65 76 29 20 3f 20 2d 31 20 3a 20 2b 31 3b 0a 20  ev) ? -1 : +1;. 
14690 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
146a0 20 72 65 73 21 3d 30 20 29 3b 0a 20 20 20 20 69   res!=0 );.    i
146b0 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
146c0 20 20 69 52 65 73 20 3d 20 69 31 3b 0a 20 20 20    iRes = i1;.   
146d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 52   }else{.      iR
146e0 65 73 20 3d 20 69 32 3b 0a 20 20 20 20 7d 0a 20  es = i2;.    }. 
146f0 20 7d 0a 0a 20 20 70 52 65 73 2d 3e 69 46 69 72   }..  pRes->iFir
14700 73 74 20 3d 20 28 75 31 36 29 69 52 65 73 3b 0a  st = (u16)iRes;.
14710 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
14720 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 73 65  *.** Move the se
14730 67 2d 69 74 65 72 20 73 6f 20 74 68 61 74 20 69  g-iter so that i
14740 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
14750 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 70  first rowid on p
14760 61 67 65 20 69 4c 65 61 66 50 67 6e 6f 2e 0a 2a  age iLeafPgno..*
14770 2a 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72  * It is an error
14780 20 69 66 20 6c 65 61 66 20 69 4c 65 61 66 50 67   if leaf iLeafPg
14790 6e 6f 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  no does not exis
147a0 74 20 6f 72 20 63 6f 6e 74 61 69 6e 73 20 6e 6f  t or contains no
147b0 20 72 6f 77 69 64 73 2e 0a 2a 2f 0a 73 74 61 74   rowids..*/.stat
147c0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
147d0 74 65 72 47 6f 74 6f 50 61 67 65 28 0a 20 20 46  terGotoPage(.  F
147e0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
147f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14800 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
14810 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
14820 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20  egIter *pIter,  
14830 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
14840 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e 63  erator to advanc
14850 65 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  e */.  int iLeaf
14860 50 67 6e 6f 0a 29 7b 0a 20 20 61 73 73 65 72 74  Pgno.){.  assert
14870 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65  ( iLeafPgno>pIte
14880 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 3b 0a  r->iLeafPgno );.
14890 0a 20 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f  .  if( iLeafPgno
148a0 3e 70 49 74 65 72 2d 3e 70 53 65 67 2d 3e 70 67  >pIter->pSeg->pg
148b0 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
148c0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
148d0 50 54 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  PT;.  }else{.   
148e0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
148f0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
14900 66 29 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 70  f);.    pIter->p
14910 4e 65 78 74 4c 65 61 66 20 3d 20 30 3b 0a 20 20  NextLeaf = 0;.  
14920 20 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67    pIter->iLeafPg
14930 6e 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2d 31  no = iLeafPgno-1
14940 3b 0a 20 20 20 20 66 74 73 35 53 65 67 49 74 65  ;.    fts5SegIte
14950 72 4e 65 78 74 50 61 67 65 28 70 2c 20 70 49 74  rNextPage(p, pIt
14960 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
14970 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
14980 4b 20 7c 7c 20 70 49 74 65 72 2d 3e 69 4c 65 61  K || pIter->iLea
14990 66 50 67 6e 6f 3d 3d 69 4c 65 61 66 50 67 6e 6f  fPgno==iLeafPgno
149a0 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e   );..    if( p->
149b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
149c0 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 3b  .      int iOff;
149d0 0a 20 20 20 20 20 20 75 38 20 2a 61 20 3d 20 70  .      u8 *a = p
149e0 49 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 70 3b 0a  Iter->pLeaf->p;.
149f0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 49        int n = pI
14a00 74 65 72 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65  ter->pLeaf->szLe
14a10 61 66 3b 0a 0a 20 20 20 20 20 20 69 4f 66 66 20  af;..      iOff 
14a20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74 52  = fts5LeafFirstR
14a30 6f 77 69 64 4f 66 66 28 70 49 74 65 72 2d 3e 70  owidOff(pIter->p
14a40 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 69 66 28  Leaf);.      if(
14a50 20 69 4f 66 66 3c 34 20 7c 7c 20 69 4f 66 66 3e   iOff<4 || iOff>
14a60 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =n ){.        p-
14a70 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
14a80 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
14a90 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
14aa0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
14ab0 61 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26  a[iOff], (u64*)&
14ac0 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a  pIter->iRowid);.
14ad0 20 20 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69          pIter->i
14ae0 4c 65 61 66 4f 66 66 73 65 74 20 3d 20 69 4f 66  LeafOffset = iOf
14af0 66 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53  f;.        fts5S
14b00 65 67 49 74 65 72 4c 6f 61 64 4e 50 6f 73 28 70  egIterLoadNPos(p
14b10 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
14b20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
14b30 2a 0a 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65  *.** Advance the
14b40 20 69 74 65 72 61 74 6f 72 20 70 61 73 73 65 64   iterator passed
14b50 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
14b60 72 67 75 6d 65 6e 74 20 75 6e 74 69 6c 20 69 74  rgument until it
14b70 20 69 73 20 61 74 20 6f 72 20 0a 2a 2a 20 70 61   is at or .** pa
14b80 73 74 20 72 6f 77 69 64 20 69 46 72 6f 6d 2e 20  st rowid iFrom. 
14b90 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
14ba0 65 20 76 61 6c 75 65 20 6f 66 20 69 46 72 6f 6d  e value of iFrom
14bb0 2c 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69  , the iterator i
14bc0 73 0a 2a 2a 20 61 6c 77 61 79 73 20 61 64 76 61  s.** always adva
14bd0 6e 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e  nced at least on
14be0 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ce..*/.static vo
14bf0 69 64 20 66 74 73 35 53 65 67 49 74 65 72 4e 65  id fts5SegIterNe
14c00 78 74 46 72 6f 6d 28 0a 20 20 46 74 73 35 49 6e  xtFrom(.  Fts5In
14c10 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
14c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
14c30 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
14c40 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74 65   */.  Fts5SegIte
14c50 72 20 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20  r *pIter,       
14c60 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
14c70 72 20 74 6f 20 61 64 76 61 6e 63 65 20 2a 2f 0a  r to advance */.
14c80 20 20 69 36 34 20 69 4d 61 74 63 68 20 20 20 20    i64 iMatch    
14c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ca0 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 69 74 65    /* Advance ite
14cb0 72 61 74 6f 72 20 61 74 20 6c 65 61 73 74 20 74  rator at least t
14cc0 68 69 73 20 66 61 72 20 2a 2f 0a 29 7b 0a 20 20  his far */.){.  
14cd0 69 6e 74 20 62 52 65 76 20 3d 20 28 70 49 74 65  int bRev = (pIte
14ce0 72 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f  r->flags & FTS5_
14cf0 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29  SEGITER_REVERSE)
14d00 3b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  ;.  Fts5DlidxIte
14d10 72 20 2a 70 44 6c 69 64 78 20 3d 20 70 49 74 65  r *pDlidx = pIte
14d20 72 2d 3e 70 44 6c 69 64 78 3b 0a 20 20 69 6e 74  r->pDlidx;.  int
14d30 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 70 49 74   iLeafPgno = pIt
14d40 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20  er->iLeafPgno;. 
14d50 20 69 6e 74 20 62 4d 6f 76 65 20 3d 20 31 3b 0a   int bMove = 1;.
14d60 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
14d70 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
14d80 45 47 49 54 45 52 5f 4f 4e 45 54 45 52 4d 20 29  EGITER_ONETERM )
14d90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
14da0 72 2d 3e 70 44 6c 69 64 78 20 29 3b 0a 20 20 61  r->pDlidx );.  a
14db0 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 4c  ssert( pIter->pL
14dc0 65 61 66 20 29 3b 0a 0a 20 20 69 66 28 20 62 52  eaf );..  if( bR
14dd0 65 76 3d 3d 30 20 29 7b 0a 20 20 20 20 77 68 69  ev==0 ){.    whi
14de0 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49 74  le( !fts5DlidxIt
14df0 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78 29  erEof(p, pDlidx)
14e00 20 26 26 20 69 4d 61 74 63 68 3e 66 74 73 35 44   && iMatch>fts5D
14e10 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44  lidxIterRowid(pD
14e20 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20 69  lidx) ){.      i
14e30 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74 73 35 44  LeafPgno = fts5D
14e40 6c 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c  lidxIterPgno(pDl
14e50 69 64 78 29 3b 0a 20 20 20 20 20 20 66 74 73 35  idx);.      fts5
14e60 44 6c 69 64 78 49 74 65 72 4e 65 78 74 28 70 2c  DlidxIterNext(p,
14e70 20 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a   pDlidx);.    }.
14e80 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
14e90 4c 65 61 66 50 67 6e 6f 3e 3d 70 49 74 65 72 2d  LeafPgno>=pIter-
14ea0 3e 69 4c 65 61 66 50 67 6e 6f 20 7c 7c 20 70 2d  >iLeafPgno || p-
14eb0 3e 72 63 20 29 3b 0a 20 20 20 20 69 66 28 20 69  >rc );.    if( i
14ec0 4c 65 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e  LeafPgno>pIter->
14ed0 69 4c 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20  iLeafPgno ){.   
14ee0 20 20 20 66 74 73 35 53 65 67 49 74 65 72 47 6f     fts5SegIterGo
14ef0 74 6f 50 61 67 65 28 70 2c 20 70 49 74 65 72 2c  toPage(p, pIter,
14f00 20 69 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20   iLeafPgno);.   
14f10 20 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20     bMove = 0;.  
14f20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
14f30 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
14f40 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20 29 3b 0a  pNextLeaf==0 );.
14f50 20 20 20 20 61 73 73 65 72 74 28 20 69 4d 61 74      assert( iMat
14f60 63 68 3c 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  ch<pIter->iRowid
14f70 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 21   );.    while( !
14f80 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
14f90 28 70 2c 20 70 44 6c 69 64 78 29 20 26 26 20 69  (p, pDlidx) && i
14fa0 4d 61 74 63 68 3c 66 74 73 35 44 6c 69 64 78 49  Match<fts5DlidxI
14fb0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
14fc0 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44 6c   ){.      fts5Dl
14fd0 69 64 78 49 74 65 72 50 72 65 76 28 70 2c 20 70  idxIterPrev(p, p
14fe0 44 6c 69 64 78 29 3b 0a 20 20 20 20 7d 0a 20 20  Dlidx);.    }.  
14ff0 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d 20 66 74    iLeafPgno = ft
15000 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e 6f 28  s5DlidxIterPgno(
15010 70 44 6c 69 64 78 29 3b 0a 0a 20 20 20 20 61 73  pDlidx);..    as
15020 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78 49  sert( fts5DlidxI
15030 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
15040 29 20 7c 7c 20 69 4c 65 61 66 50 67 6e 6f 3c 3d  ) || iLeafPgno<=
15050 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
15060 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 4c 65   );..    if( iLe
15070 61 66 50 67 6e 6f 3c 70 49 74 65 72 2d 3e 69 4c  afPgno<pIter->iL
15080 65 61 66 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20  eafPgno ){.     
15090 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e   pIter->iLeafPgn
150a0 6f 20 3d 20 69 4c 65 61 66 50 67 6e 6f 2b 31 3b  o = iLeafPgno+1;
150b0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
150c0 65 72 52 65 76 65 72 73 65 4e 65 77 50 61 67 65  erReverseNewPage
150d0 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  (p, pIter);.    
150e0 20 20 62 4d 6f 76 65 20 3d 20 30 3b 0a 20 20 20    bMove = 0;.   
150f0 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20   }.  }..  do{.  
15100 20 20 69 66 28 20 62 4d 6f 76 65 20 26 26 20 70    if( bMove && p
15110 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
15120 29 20 70 49 74 65 72 2d 3e 78 4e 65 78 74 28 70  ) pIter->xNext(p
15130 2c 20 70 49 74 65 72 2c 20 30 29 3b 0a 20 20 20  , pIter, 0);.   
15140 20 69 66 28 20 70 49 74 65 72 2d 3e 70 4c 65 61   if( pIter->pLea
15150 66 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  f==0 ) break;.  
15160 20 20 69 66 28 20 62 52 65 76 3d 3d 30 20 26 26    if( bRev==0 &&
15170 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64 3e 3d   pIter->iRowid>=
15180 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b 0a  iMatch ) break;.
15190 20 20 20 20 69 66 28 20 62 52 65 76 21 3d 30 20      if( bRev!=0 
151a0 26 26 20 70 49 74 65 72 2d 3e 69 52 6f 77 69 64  && pIter->iRowid
151b0 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b  <=iMatch ) break
151c0 3b 0a 20 20 20 20 62 4d 6f 76 65 20 3d 20 31 3b  ;.    bMove = 1;
151d0 0a 20 20 7d 77 68 69 6c 65 28 20 70 2d 3e 72 63  .  }while( p->rc
151e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 7d  ==SQLITE_OK );.}
151f0 0a 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  .../*.** Free th
15200 65 20 69 74 65 72 61 74 6f 72 20 6f 62 6a 65 63  e iterator objec
15210 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
15220 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
15230 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15240 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65  fts5MultiIterFre
15250 65 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  e(Fts5Iter *pIte
15260 72 29 7b 0a 20 20 69 66 28 20 70 49 74 65 72 20  r){.  if( pIter 
15270 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
15280 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74    for(i=0; i<pIt
15290 65 72 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a  er->nSeg; i++){.
152a0 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65        fts5SegIte
152b0 72 43 6c 65 61 72 28 26 70 49 74 65 72 2d 3e 61  rClear(&pIter->a
152c0 53 65 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Seg[i]);.    }. 
152d0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
152e0 65 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73  e(&pIter->poslis
152f0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
15300 66 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 7d  free(pIter);.  }
15310 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
15320 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
15330 61 6e 63 65 64 28 0a 20 20 46 74 73 35 49 6e 64  anced(.  Fts5Ind
15340 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
15350 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
15360 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65 72   backend to iter
15370 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20 20  ate within */.  
15380 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20 75  /* Iterator to u
153b0 70 64 61 74 65 20 61 46 69 72 73 74 5b 5d 20 61  pdate aFirst[] a
153c0 72 72 61 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e  rray for */.  in
153d0 74 20 69 43 68 61 6e 67 65 64 2c 20 20 20 20 20  t iChanged,     
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
153f0 20 49 6e 64 65 78 20 6f 66 20 73 75 62 2d 69 74   Index of sub-it
15400 65 72 61 74 6f 72 20 6a 75 73 74 20 61 64 76 61  erator just adva
15410 6e 63 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4d  nced */.  int iM
15420 69 6e 73 65 74 20 20 20 20 20 20 20 20 20 20 20  inset           
15430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e            /* Min
15440 69 6d 75 6d 20 65 6e 74 72 79 20 69 6e 20 61 46  imum entry in aF
15450 69 72 73 74 5b 5d 20 74 6f 20 73 65 74 20 2a 2f  irst[] to set */
15460 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  .){.  int i;.  f
15470 6f 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65  or(i=(pIter->nSe
15480 67 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 69  g+iChanged)/2; i
15490 3e 3d 69 4d 69 6e 73 65 74 20 26 26 20 70 2d 3e  >=iMinset && p->
154a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
154b0 3d 69 2f 32 29 7b 0a 20 20 20 20 69 6e 74 20 69  =i/2){.    int i
154c0 45 71 3b 0a 20 20 20 20 69 66 28 20 28 69 45 71  Eq;.    if( (iEq
154d0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
154e0 44 6f 43 6f 6d 70 61 72 65 28 70 49 74 65 72 2c  DoCompare(pIter,
154f0 20 69 29 29 20 29 7b 0a 20 20 20 20 20 20 46 74   i)) ){.      Ft
15500 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
15510 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
15520 45 71 5d 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Eq];.      asser
15530 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
15540 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 70 53 65  _OK );.      pSe
15550 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67  g->xNext(p, pSeg
15560 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 20 3d 20  , 0);.      i = 
15570 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b 20 69 45  pIter->nSeg + iE
15580 71 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  q;.    }.  }.}..
15590 2f 2a 0a 2a 2a 20 53 75 62 2d 69 74 65 72 61 74  /*.** Sub-iterat
155a0 6f 72 20 69 43 68 61 6e 67 65 64 20 6f 66 20 69  or iChanged of i
155b0 74 65 72 61 74 6f 72 20 70 49 74 65 72 20 68 61  terator pIter ha
155c0 73 20 6a 75 73 74 20 62 65 65 6e 20 61 64 76 61  s just been adva
155d0 6e 63 65 64 2e 20 49 74 20 73 74 69 6c 6c 0a 2a  nced. It still.*
155e0 2a 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  * points to the 
155f0 73 61 6d 65 20 74 65 72 6d 20 74 68 6f 75 67 68  same term though
15600 20 2d 20 6a 75 73 74 20 61 20 64 69 66 66 65 72   - just a differ
15610 65 6e 74 20 72 6f 77 69 64 2e 20 54 68 69 73 20  ent rowid. This 
15620 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 74 74 65  function.** atte
15630 6d 70 74 73 20 74 6f 20 75 70 64 61 74 65 20 74  mpts to update t
15640 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15650 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74  he pIter->aFirst
15660 5b 5d 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a  [] accordingly..
15670 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20 73 6f  ** If it does so
15680 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 30   successfully, 0
15690 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
156a0 68 65 72 77 69 73 65 20 31 2e 0a 2a 2a 0a 2a 2a  herwise 1..**.**
156b0 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20 69 73 20   If non-zero is 
156c0 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63 61  returned, the ca
156d0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 63 61 6c 6c  ller should call
156e0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
156f0 76 61 6e 63 65 64 28 29 0a 2a 2a 20 6f 6e 20 74  vanced().** on t
15700 68 65 20 69 74 65 72 61 74 6f 72 20 69 6e 73 74  he iterator inst
15710 65 61 64 2e 20 54 68 61 74 20 66 75 6e 63 74 69  ead. That functi
15720 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d 65  on does the same
15730 20 61 73 20 74 68 69 73 20 6f 6e 65 2c 20 65 78   as this one, ex
15740 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
15750 64 65 61 6c 73 20 77 69 74 68 20 6d 6f 72 65 20  deals with more 
15760 63 6f 6d 70 6c 69 63 61 74 65 64 20 63 61 73 65  complicated case
15770 73 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 20 0a 73  s as well..*/ .s
15780 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 4d 75  tatic int fts5Mu
15790 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
157a0 77 69 64 28 0a 20 20 46 74 73 35 49 74 65 72 20  wid(.  Fts5Iter 
157b0 2a 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20  *pIter,         
157c0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
157d0 6f 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69  or to update aFi
157e0 72 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20  rst[] array for 
157f0 2a 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65  */.  int iChange
15800 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
15810 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
15820 20 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75   sub-iterator ju
15830 73 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20  st advanced */. 
15840 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 2a 70   Fts5SegIter **p
15850 70 46 69 72 73 74 0a 29 7b 0a 20 20 46 74 73 35  pFirst.){.  Fts5
15860 53 65 67 49 74 65 72 20 2a 70 4e 65 77 20 3d 20  SegIter *pNew = 
15870 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43 68  &pIter->aSeg[iCh
15880 61 6e 67 65 64 5d 3b 0a 0a 20 20 69 66 28 20 70  anged];..  if( p
15890 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 49 74  New->iRowid==pIt
158a0 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
158b0 0a 20 20 20 7c 7c 20 28 70 4e 65 77 2d 3e 69 52  .   || (pNew->iR
158c0 6f 77 69 64 3c 70 49 74 65 72 2d 3e 69 53 77 69  owid<pIter->iSwi
158d0 74 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  tchRowid)==pIter
158e0 2d 3e 62 52 65 76 0a 20 20 29 7b 0a 20 20 20 20  ->bRev.  ){.    
158f0 69 6e 74 20 69 3b 0a 20 20 20 20 46 74 73 35 53  int i;.    Fts5S
15900 65 67 49 74 65 72 20 2a 70 4f 74 68 65 72 20 3d  egIter *pOther =
15910 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 43   &pIter->aSeg[iC
15920 68 61 6e 67 65 64 20 5e 20 30 78 30 30 30 31 5d  hanged ^ 0x0001]
15930 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69 53 77  ;.    pIter->iSw
15940 69 74 63 68 52 6f 77 69 64 20 3d 20 70 49 74 65  itchRowid = pIte
15950 72 2d 3e 62 52 65 76 20 3f 20 53 4d 41 4c 4c 45  r->bRev ? SMALLE
15960 53 54 5f 49 4e 54 36 34 20 3a 20 4c 41 52 47 45  ST_INT64 : LARGE
15970 53 54 5f 49 4e 54 36 34 3b 0a 20 20 20 20 66 6f  ST_INT64;.    fo
15980 72 28 69 3d 28 70 49 74 65 72 2d 3e 6e 53 65 67  r(i=(pIter->nSeg
15990 2b 69 43 68 61 6e 67 65 64 29 2f 32 3b 20 31 3b  +iChanged)/2; 1;
159a0 20 69 3d 69 2f 32 29 7b 0a 20 20 20 20 20 20 46   i=i/2){.      F
159b0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
159c0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
159d0 74 5b 69 5d 3b 0a 0a 20 20 20 20 20 20 61 73 73  t[i];..      ass
159e0 65 72 74 28 20 70 4e 65 77 2d 3e 70 4c 65 61 66  ert( pNew->pLeaf
159f0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
15a00 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d  ( pRes->bTermEq=
15a10 3d 30 20 7c 7c 20 70 4f 74 68 65 72 2d 3e 70 4c  =0 || pOther->pL
15a20 65 61 66 20 29 3b 0a 0a 20 20 20 20 20 20 69 66  eaf );..      if
15a30 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71 20  ( pRes->bTermEq 
15a40 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
15a50 4e 65 77 2d 3e 69 52 6f 77 69 64 3d 3d 70 4f 74  New->iRowid==pOt
15a60 68 65 72 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20  her->iRowid ){. 
15a70 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15a80 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
15a90 20 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52   if( (pOther->iR
15aa0 6f 77 69 64 3e 70 4e 65 77 2d 3e 69 52 6f 77 69  owid>pNew->iRowi
15ab0 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20  d)==pIter->bRev 
15ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
15ad0 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
15ae0 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69   = pOther->iRowi
15af0 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65  d;.          pNe
15b00 77 20 3d 20 70 4f 74 68 65 72 3b 0a 20 20 20 20  w = pOther;.    
15b10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
15b20 4f 74 68 65 72 2d 3e 69 52 6f 77 69 64 3e 70 49  Other->iRowid>pI
15b30 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69  ter->iSwitchRowi
15b40 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65 76 20  d)==pIter->bRev 
15b50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49 74  ){.          pIt
15b60 65 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64  er->iSwitchRowid
15b70 20 3d 20 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69   = pOther->iRowi
15b80 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
15b90 20 20 20 7d 0a 20 20 20 20 20 20 70 52 65 73 2d     }.      pRes-
15ba0 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29 28  >iFirst = (u16)(
15bb0 70 4e 65 77 20 2d 20 70 49 74 65 72 2d 3e 61 53  pNew - pIter->aS
15bc0 65 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  eg);.      if( i
15bd0 3d 3d 31 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  ==1 ) break;..  
15be0 20 20 20 20 70 4f 74 68 65 72 20 3d 20 26 70 49      pOther = &pI
15bf0 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72  ter->aSeg[ pIter
15c00 2d 3e 61 46 69 72 73 74 5b 69 20 5e 20 30 78 30  ->aFirst[i ^ 0x0
15c10 30 30 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  001].iFirst ];. 
15c20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2a 70 70 46     }.  }..  *ppF
15c30 69 72 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 72  irst = pNew;.  r
15c40 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
15c50 2a 20 53 65 74 20 74 68 65 20 70 49 74 65 72 2d  * Set the pIter-
15c60 3e 62 45 6f 66 20 76 61 72 69 61 62 6c 65 20 62  >bEof variable b
15c70 61 73 65 64 20 6f 6e 20 74 68 65 20 73 74 61 74  ased on the stat
15c80 65 20 6f 66 20 74 68 65 20 73 75 62 2d 69 74 65  e of the sub-ite
15c90 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
15ca0 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
15cb0 49 74 65 72 53 65 74 45 6f 66 28 46 74 73 35 49  IterSetEof(Fts5I
15cc0 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 46  ter *pIter){.  F
15cd0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
15ce0 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15cf0 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31   pIter->aFirst[1
15d00 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20 70 49  ].iFirst ];.  pI
15d10 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d  ter->base.bEof =
15d20 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 3b   pSeg->pLeaf==0;
15d30 0a 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  .  pIter->iSwitc
15d40 68 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69  hRowid = pSeg->i
15d50 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
15d60 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
15d70 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
15d80 74 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61  try. .**.** If a
15d90 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
15da0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
15db0 20 6c 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64   left in Fts5Ind
15dc0 65 78 2e 72 63 2e 20 49 74 20 69 73 20 6e 6f 74  ex.rc. It is not
15dd0 20 0a 2a 2a 20 63 6f 6e 73 69 64 65 72 65 64 20   .** considered 
15de0 61 6e 20 65 72 72 6f 72 20 69 66 20 74 68 65 20  an error if the 
15df0 69 74 65 72 61 74 6f 72 20 72 65 61 63 68 65 73  iterator reaches
15e00 20 45 4f 46 2c 20 6f 72 20 69 66 20 69 74 20 69   EOF, or if it i
15e10 73 20 61 6c 72 65 61 64 79 20 61 74 20 0a 2a 2a  s already at .**
15e20 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73 20 66   EOF when this f
15e30 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15e40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
15e50 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e  d fts5MultiIterN
15e60 65 78 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ext(.  Fts5Index
15e70 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74 65 72   *p, .  Fts5Iter
15e80 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74 20 62   *pIter,.  int b
15e90 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20  From,           
15ea0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
15eb0 75 65 20 69 66 20 61 72 67 75 6d 65 6e 74 20 69  ue if argument i
15ec0 46 72 6f 6d 20 69 73 20 76 61 6c 69 64 20 2a 2f  From is valid */
15ed0 0a 20 20 69 36 34 20 69 46 72 6f 6d 20 20 20 20  .  i64 iFrom    
15ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ef0 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 61 74     /* Advance at
15f00 20 6c 65 61 73 74 20 61 73 20 66 61 72 20 61 73   least as far as
15f10 20 74 68 69 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e   this */.){.  in
15f20 74 20 62 55 73 65 46 72 6f 6d 20 3d 20 62 46 72  t bUseFrom = bFr
15f30 6f 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  om;.  assert( pI
15f40 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 3d 3d  ter->base.bEof==
15f50 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
15f60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
15f70 7b 0a 20 20 20 20 69 6e 74 20 69 46 69 72 73 74  {.    int iFirst
15f80 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
15f90 5b 31 5d 2e 69 46 69 72 73 74 3b 0a 20 20 20 20  [1].iFirst;.    
15fa0 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30  int bNewTerm = 0
15fb0 3b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74 65  ;.    Fts5SegIte
15fc0 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72  r *pSeg = &pIter
15fd0 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d 3b 0a  ->aSeg[iFirst];.
15fe0 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
15ff0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
16000 20 20 20 20 69 66 28 20 62 55 73 65 46 72 6f 6d      if( bUseFrom
16010 20 26 26 20 70 53 65 67 2d 3e 70 44 6c 69 64 78   && pSeg->pDlidx
16020 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65   ){.      fts5Se
16030 67 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 70 2c  gIterNextFrom(p,
16040 20 70 53 65 67 2c 20 69 46 72 6f 6d 29 3b 0a 20   pSeg, iFrom);. 
16050 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16060 70 53 65 67 2d 3e 78 4e 65 78 74 28 70 2c 20 70  pSeg->xNext(p, p
16070 53 65 67 2c 20 26 62 4e 65 77 54 65 72 6d 29 3b  Seg, &bNewTerm);
16080 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
16090 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c  pSeg->pLeaf==0 |
160a0 7c 20 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20  | bNewTerm .    
160b0 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
160c0 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49  rAdvanceRowid(pI
160d0 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53  ter, iFirst, &pS
160e0 65 67 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  eg).    ){.     
160f0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64   fts5MultiIterAd
16100 76 61 6e 63 65 64 28 70 2c 20 70 49 74 65 72 2c  vanced(p, pIter,
16110 20 69 46 69 72 73 74 2c 20 31 29 3b 0a 20 20 20   iFirst, 1);.   
16120 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
16130 53 65 74 45 6f 66 28 70 49 74 65 72 29 3b 0a 20  SetEof(pIter);. 
16140 20 20 20 20 20 70 53 65 67 20 3d 20 26 70 49 74       pSeg = &pIt
16150 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
16160 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
16170 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65  ];.      if( pSe
16180 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 72 65  g->pLeaf==0 ) re
16190 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  turn;.    }..   
161a0 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
161b0 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
161c0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
161d0 20 70 53 65 67 3d 3d 26 70 49 74 65 72 2d 3e 61   pSeg==&pIter->a
161e0 53 65 67 5b 70 49 74 65 72 2d 3e 61 46 69 72 73  Seg[pIter->aFirs
161f0 74 5b 31 5d 2e 69 46 69 72 73 74 5d 20 26 26 20  t[1].iFirst] && 
16200 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 3b 0a 20  pSeg->pLeaf );. 
16210 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 53     if( pIter->bS
16220 6b 69 70 45 6d 70 74 79 3d 3d 30 20 7c 7c 20 70  kipEmpty==0 || p
16230 53 65 67 2d 3e 6e 50 6f 73 20 29 7b 0a 20 20 20  Seg->nPos ){.   
16240 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
16250 74 70 75 74 73 28 70 49 74 65 72 2c 20 70 53 65  tputs(pIter, pSe
16260 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
16270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 55 73 65  ;.    }.    bUse
16280 46 72 6f 6d 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  From = 0;.  }.}.
16290 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
162a0 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 32 28  5MultiIterNext2(
162b0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
162c0 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 49   .  Fts5Iter *pI
162d0 74 65 72 2c 0a 20 20 69 6e 74 20 2a 70 62 4e 65  ter,.  int *pbNe
162e0 77 54 65 72 6d 20 20 20 20 20 20 20 20 20 20 20  wTerm           
162f0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54         /* OUT: T
16300 72 75 65 20 69 66 20 2a 6d 69 67 68 74 2a 20 62  rue if *might* b
16310 65 20 6e 65 77 20 74 65 72 6d 20 2a 2f 0a 29 7b  e new term */.){
16320 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
16330 2d 3e 62 53 6b 69 70 45 6d 70 74 79 20 29 3b 0a  ->bSkipEmpty );.
16340 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
16350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70  ITE_OK ){.    *p
16360 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a 20 20  bNewTerm = 0;.  
16370 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e 74 20    do{.      int 
16380 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
16390 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
163a0 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  ;.      Fts5SegI
163b0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
163c0 65 72 2d 3e 61 53 65 67 5b 69 46 69 72 73 74 5d  er->aSeg[iFirst]
163d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 62 4e 65 77  ;.      int bNew
163e0 54 65 72 6d 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Term = 0;..     
163f0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
16400 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
16410 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70     pSeg->xNext(p
16420 2c 20 70 53 65 67 2c 20 26 62 4e 65 77 54 65 72  , pSeg, &bNewTer
16430 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  m);.      if( pS
16440 65 67 2d 3e 70 4c 65 61 66 3d 3d 30 20 7c 7c 20  eg->pLeaf==0 || 
16450 62 4e 65 77 54 65 72 6d 20 0a 20 20 20 20 20 20  bNewTerm .      
16460 20 7c 7c 20 66 74 73 35 4d 75 6c 74 69 49 74 65   || fts5MultiIte
16470 72 41 64 76 61 6e 63 65 52 6f 77 69 64 28 70 49  rAdvanceRowid(pI
16480 74 65 72 2c 20 69 46 69 72 73 74 2c 20 26 70 53  ter, iFirst, &pS
16490 65 67 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  eg).      ){.   
164a0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
164b0 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20 70 49  erAdvanced(p, pI
164c0 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31 29 3b  ter, iFirst, 1);
164d0 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c  .        fts5Mul
164e0 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74  tiIterSetEof(pIt
164f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 62  er);.        *pb
16500 4e 65 77 54 65 72 6d 20 3d 20 31 3b 0a 20 20 20  NewTerm = 1;.   
16510 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35 41     }.      fts5A
16520 73 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65  ssertMultiIterSe
16530 74 75 70 28 70 2c 20 70 49 74 65 72 29 3b 0a 0a  tup(p, pIter);..
16540 20 20 20 20 7d 77 68 69 6c 65 28 20 66 74 73 35      }while( fts5
16550 4d 75 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79  MultiIterIsEmpty
16560 28 70 2c 20 70 49 74 65 72 29 20 29 3b 0a 20 20  (p, pIter) );.  
16570 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
16580 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
16590 75 74 73 5f 4e 6f 6f 70 28 46 74 73 35 49 74 65  uts_Noop(Fts5Ite
165a0 72 20 2a 70 55 6e 75 73 65 64 31 2c 20 46 74 73  r *pUnused1, Fts
165b0 35 53 65 67 49 74 65 72 20 2a 70 55 6e 75 73 65  5SegIter *pUnuse
165c0 64 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  d2){.  UNUSED_PA
165d0 52 41 4d 32 28 70 55 6e 75 73 65 64 31 2c 20 70  RAM2(pUnused1, p
165e0 55 6e 75 73 65 64 32 29 3b 0a 7d 0a 0a 73 74 61  Unused2);.}..sta
165f0 74 69 63 20 46 74 73 35 49 74 65 72 20 2a 66 74  tic Fts5Iter *ft
16600 73 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63  s5MultiIterAlloc
16610 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16630 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b      /* FTS5 back
16640 65 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77  end to iterate w
16650 69 74 68 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ithin */.  int n
16660 53 65 67 0a 29 7b 0a 20 20 46 74 73 35 49 74 65  Seg.){.  Fts5Ite
16670 72 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 6e  r *pNew;.  int n
16680 53 6c 6f 74 3b 20 20 20 20 20 20 20 20 20 20 20  Slot;           
16690 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
166a0 77 65 72 20 6f 66 20 74 77 6f 20 3e 3d 20 6e 53  wer of two >= nS
166b0 65 67 20 2a 2f 0a 0a 20 20 66 6f 72 28 6e 53 6c  eg */..  for(nSl
166c0 6f 74 3d 32 3b 20 6e 53 6c 6f 74 3c 6e 53 65 67  ot=2; nSlot<nSeg
166d0 3b 20 6e 53 6c 6f 74 3d 6e 53 6c 6f 74 2a 32 29  ; nSlot=nSlot*2)
166e0 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49  ;.  pNew = fts5I
166f0 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 0a 20 20 20  dxMalloc(p, .   
16700 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35 49 74     sizeof(Fts5It
16710 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  er) +           
16720 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77 20 2a         /* pNew *
16730 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28 46  /.      sizeof(F
16740 74 73 35 53 65 67 49 74 65 72 29 20 2a 20 28 6e  ts5SegIter) * (n
16750 53 6c 6f 74 2d 31 29 20 2b 20 20 20 2f 2a 20 70  Slot-1) +   /* p
16760 4e 65 77 2d 3e 61 53 65 67 5b 5d 20 2a 2f 0a 20  New->aSeg[] */. 
16770 20 20 20 20 20 73 69 7a 65 6f 66 28 46 74 73 35       sizeof(Fts5
16780 43 52 65 73 75 6c 74 29 20 2a 20 6e 53 6c 6f 74  CResult) * nSlot
16790 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 77           /* pNew
167a0 2d 3e 61 46 69 72 73 74 5b 5d 20 2a 2f 0a 20 20  ->aFirst[] */.  
167b0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b  );.  if( pNew ){
167c0 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 20  .    pNew->nSeg 
167d0 3d 20 6e 53 6c 6f 74 3b 0a 20 20 20 20 70 4e 65  = nSlot;.    pNe
167e0 77 2d 3e 61 46 69 72 73 74 20 3d 20 28 46 74 73  w->aFirst = (Fts
167f0 35 43 52 65 73 75 6c 74 2a 29 26 70 4e 65 77 2d  5CResult*)&pNew-
16800 3e 61 53 65 67 5b 6e 53 6c 6f 74 5d 3b 0a 20 20  >aSeg[nSlot];.  
16810 20 20 70 4e 65 77 2d 3e 70 49 6e 64 65 78 20 3d    pNew->pIndex =
16820 20 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 78 53   p;.    pNew->xS
16830 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
16840 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e  IterSetOutputs_N
16850 6f 6f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  oop;.  }.  retur
16860 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 73 74 61 74 69  n pNew;.}..stati
16870 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73 6c 69  c void fts5Posli
16880 73 74 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74  stCallback(.  Ft
16890 73 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64  s5Index *pUnused
168a0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74  , .  void *pCont
168b0 65 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38  ext, .  const u8
168c0 20 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43   *pChunk, int nC
168d0 68 75 6e 6b 0a 29 7b 0a 20 20 55 4e 55 53 45 44  hunk.){.  UNUSED
168e0 5f 50 41 52 41 4d 28 70 55 6e 75 73 65 64 29 3b  _PARAM(pUnused);
168f0 0a 20 20 61 73 73 65 72 74 5f 6e 63 28 20 6e 43  .  assert_nc( nC
16900 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20 69 66 28  hunk>=0 );.  if(
16910 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20   nChunk>0 ){.   
16920 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16930 70 70 65 6e 64 42 6c 6f 62 28 28 46 74 73 35 42  ppendBlob((Fts5B
16940 75 66 66 65 72 2a 29 70 43 6f 6e 74 65 78 74 2c  uffer*)pContext,
16950 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29   pChunk, nChunk)
16960 3b 0a 20 20 7d 0a 7d 0a 0a 74 79 70 65 64 65 66  ;.  }.}..typedef
16970 20 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43   struct PoslistC
16980 61 6c 6c 62 61 63 6b 43 74 78 20 50 6f 73 6c 69  allbackCtx Posli
16990 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 3b 0a 73  stCallbackCtx;.s
169a0 74 72 75 63 74 20 50 6f 73 6c 69 73 74 43 61 6c  truct PoslistCal
169b0 6c 62 61 63 6b 43 74 78 20 7b 0a 20 20 46 74 73  lbackCtx {.  Fts
169c0 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169e0 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20 62  Append to this b
169f0 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35 43  uffer */.  Fts5C
16a00 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b 20  olset *pColset; 
16a10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
16a20 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20 74  strict matches t
16a30 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a 2f  o this column */
16a40 0a 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20  .  int eState;  
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76 65 20     /* See above 
16a70 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73  */.};..typedef s
16a80 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f 66 66  truct PoslistOff
16a90 73 65 74 73 43 74 78 20 50 6f 73 6c 69 73 74 4f  setsCtx PoslistO
16aa0 66 66 73 65 74 73 43 74 78 3b 0a 73 74 72 75 63  ffsetsCtx;.struc
16ab0 74 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74 73  t PoslistOffsets
16ac0 43 74 78 20 7b 0a 20 20 46 74 73 35 42 75 66 66  Ctx {.  Fts5Buff
16ad0 65 72 20 2a 70 42 75 66 3b 20 20 20 20 20 20 20  er *pBuf;       
16ae0 20 20 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e          /* Appen
16af0 64 20 74 6f 20 74 68 69 73 20 62 75 66 66 65 72  d to this buffer
16b00 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73 65 74   */.  Fts5Colset
16b10 20 2a 70 43 6f 6c 73 65 74 3b 20 20 20 20 20 20   *pColset;      
16b20 20 20 20 20 20 20 2f 2a 20 52 65 73 74 72 69 63        /* Restric
16b30 74 20 6d 61 74 63 68 65 73 20 74 6f 20 74 68 69  t matches to thi
16b40 73 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e  s column */.  in
16b50 74 20 69 52 65 61 64 3b 0a 20 20 69 6e 74 20 69  t iRead;.  int i
16b60 57 72 69 74 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Write;.};../*.**
16b70 20 54 4f 44 4f 3a 20 4d 61 6b 65 20 74 68 69 73   TODO: Make this
16b80 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 21   more efficient!
16b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
16ba0 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
16bb0 73 74 28 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  st(Fts5Colset *p
16bc0 43 6f 6c 73 65 74 2c 20 69 6e 74 20 69 43 6f 6c  Colset, int iCol
16bd0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
16be0 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74  r(i=0; i<pColset
16bf0 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  ->nCol; i++){.  
16c00 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 61    if( pColset->a
16c10 69 43 6f 6c 5b 69 5d 3d 3d 69 43 6f 6c 20 29 20  iCol[i]==iCol ) 
16c20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
16c30 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
16c40 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f 73  tic void fts5Pos
16c50 6c 69 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62  listOffsetsCallb
16c60 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
16c70 20 2a 70 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f   *pUnused, .  vo
16c80 69 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20  id *pContext, . 
16c90 20 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e   const u8 *pChun
16ca0 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b  k, int nChunk.){
16cb0 0a 20 20 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  .  PoslistOffset
16cc0 73 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f  sCtx *pCtx = (Po
16cd0 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 2a  slistOffsetsCtx*
16ce0 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e 55  )pContext;.  UNU
16cf0 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73 65  SED_PARAM(pUnuse
16d00 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63 28  d);.  assert_nc(
16d10 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20 20   nChunk>=0 );.  
16d20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b 0a  if( nChunk>0 ){.
16d30 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20      int i = 0;. 
16d40 20 20 20 77 68 69 6c 65 28 20 69 3c 6e 43 68 75     while( i<nChu
16d50 6e 6b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  nk ){.      int 
16d60 69 56 61 6c 3b 0a 20 20 20 20 20 20 69 20 2b 3d  iVal;.      i +=
16d70 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
16d80 28 26 70 43 68 75 6e 6b 5b 69 5d 2c 20 69 56 61  (&pChunk[i], iVa
16d90 6c 29 3b 0a 20 20 20 20 20 20 69 56 61 6c 20 2b  l);.      iVal +
16da0 3d 20 70 43 74 78 2d 3e 69 52 65 61 64 20 2d 20  = pCtx->iRead - 
16db0 32 3b 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 69  2;.      pCtx->i
16dc0 52 65 61 64 20 3d 20 69 56 61 6c 3b 0a 20 20 20  Read = iVal;.   
16dd0 20 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78     if( fts5Index
16de0 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74 78 2d  ColsetTest(pCtx-
16df0 3e 70 43 6f 6c 73 65 74 2c 20 69 56 61 6c 29 20  >pColset, iVal) 
16e00 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
16e10 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
16e20 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42 75 66  arint(pCtx->pBuf
16e30 2c 20 69 56 61 6c 20 2b 20 32 20 2d 20 70 43 74  , iVal + 2 - pCt
16e40 78 2d 3e 69 57 72 69 74 65 29 3b 0a 20 20 20 20  x->iWrite);.    
16e50 20 20 20 20 70 43 74 78 2d 3e 69 57 72 69 74 65      pCtx->iWrite
16e60 20 3d 20 69 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = iVal;.      }
16e70 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
16e80 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 50 6f  atic void fts5Po
16e90 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c 6c 62  slistFilterCallb
16ea0 61 63 6b 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ack(.  Fts5Index
16eb0 20 2a 70 55 6e 75 73 65 64 2c 0a 20 20 76 6f 69   *pUnused,.  voi
16ec0 64 20 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20  d *pContext, .  
16ed0 63 6f 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b  const u8 *pChunk
16ee0 2c 20 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a  , int nChunk.){.
16ef0 20 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63    PoslistCallbac
16f00 6b 43 74 78 20 2a 70 43 74 78 20 3d 20 28 50 6f  kCtx *pCtx = (Po
16f10 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16f20 2a 29 70 43 6f 6e 74 65 78 74 3b 0a 20 20 55 4e  *)pContext;.  UN
16f30 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
16f40 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f 6e 63  ed);.  assert_nc
16f50 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b 0a 20  ( nChunk>=0 );. 
16f60 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20 29 7b   if( nChunk>0 ){
16f70 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74  .    /* Search t
16f80 68 72 6f 75 67 68 20 74 6f 20 66 69 6e 64 20 74  hrough to find t
16f90 68 65 20 66 69 72 73 74 20 76 61 72 69 6e 74 20  he first varint 
16fa0 77 69 74 68 20 76 61 6c 75 65 20 31 2e 20 54 68  with value 1. Th
16fb0 69 73 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  is is the.    **
16fc0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65   start of the ne
16fd0 78 74 20 63 6f 6c 75 6d 6e 73 20 68 69 74 73 2e  xt columns hits.
16fe0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 20 3d 20   */.    int i = 
16ff0 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 74 61 72  0;.    int iStar
17000 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
17010 70 43 74 78 2d 3e 65 53 74 61 74 65 3d 3d 32 20  pCtx->eState==2 
17020 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 43 6f  ){.      int iCo
17030 6c 3b 0a 20 20 20 20 20 20 66 74 73 35 46 61 73  l;.      fts5Fas
17040 74 47 65 74 56 61 72 69 6e 74 33 32 28 70 43 68  tGetVarint32(pCh
17050 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b 0a 20  unk, i, iCol);. 
17060 20 20 20 20 20 69 66 28 20 66 74 73 35 49 6e 64       if( fts5Ind
17070 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43 74  exColsetTest(pCt
17080 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f 6c  x->pColset, iCol
17090 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 74  ) ){.        pCt
170a0 78 2d 3e 65 53 74 61 74 65 20 3d 20 31 3b 0a 20  x->eState = 1;. 
170b0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
170c0 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
170d0 74 28 70 43 74 78 2d 3e 70 42 75 66 2c 20 31 29  t(pCtx->pBuf, 1)
170e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
170f0 20 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74         pCtx->eSt
17100 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ate = 0;.      }
17110 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 20 7b  .    }..    do {
17120 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
17130 6e 43 68 75 6e 6b 20 26 26 20 70 43 68 75 6e 6b  nChunk && pChunk
17140 5b 69 5d 21 3d 30 78 30 31 20 29 7b 0a 20 20 20  [i]!=0x01 ){.   
17150 20 20 20 20 20 77 68 69 6c 65 28 20 70 43 68 75       while( pChu
17160 6e 6b 5b 69 5d 20 26 20 30 78 38 30 20 29 20 69  nk[i] & 0x80 ) i
17170 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 3b  ++;.        i++;
17180 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17190 66 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20  f( pCtx->eState 
171a0 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42  ){.        fts5B
171b0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 42  ufferSafeAppendB
171c0 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75 66 2c 20  lob(pCtx->pBuf, 
171d0 26 70 43 68 75 6e 6b 5b 69 53 74 61 72 74 5d 2c  &pChunk[iStart],
171e0 20 69 2d 69 53 74 61 72 74 29 3b 0a 20 20 20 20   i-iStart);.    
171f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3c    }.      if( i<
17200 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  nChunk ){.      
17210 20 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20    int iCol;.    
17220 20 20 20 20 69 53 74 61 72 74 20 3d 20 69 3b 0a      iStart = i;.
17230 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
17240 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 68 75       if( i>=nChu
17250 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nk ){.          
17260 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20 32  pCtx->eState = 2
17270 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
17280 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 46  .          fts5F
17290 61 73 74 47 65 74 56 61 72 69 6e 74 33 32 28 70  astGetVarint32(p
172a0 43 68 75 6e 6b 2c 20 69 2c 20 69 43 6f 6c 29 3b  Chunk, i, iCol);
172b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 74 78 2d  .          pCtx-
172c0 3e 65 53 74 61 74 65 20 3d 20 66 74 73 35 49 6e  >eState = fts5In
172d0 64 65 78 43 6f 6c 73 65 74 54 65 73 74 28 70 43  dexColsetTest(pC
172e0 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20 69 43 6f  tx->pColset, iCo
172f0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  l);.          if
17300 28 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 29  ( pCtx->eState )
17310 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
17320 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
17330 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e 70 42 75  ndBlob(pCtx->pBu
17340 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53 74 61 72  f, &pChunk[iStar
17350 74 5d 2c 20 69 2d 69 53 74 61 72 74 29 3b 0a 20  t], i-iStart);. 
17360 20 20 20 20 20 20 20 20 20 20 20 69 53 74 61 72             iStar
17370 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20  t = i;.         
17380 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17390 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
173a0 20 69 3c 6e 43 68 75 6e 6b 20 29 3b 0a 20 20 7d   i<nChunk );.  }
173b0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
173c0 66 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65  fts5ChunkIterate
173d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
173e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
173f0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 62 6a      /* Index obj
17400 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67  ect */.  Fts5Seg
17410 49 74 65 72 20 2a 70 53 65 67 2c 20 20 20 20 20  Iter *pSeg,     
17420 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 6c           /* Posl
17430 69 73 74 20 6f 66 20 74 68 69 73 20 69 74 65 72  ist of this iter
17440 61 74 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  ator */.  void *
17450 70 43 74 78 2c 20 20 20 20 20 20 20 20 20 20 20  pCtx,           
17460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
17470 74 65 78 74 20 70 6f 69 6e 74 65 72 20 66 6f 72  text pointer for
17480 20 78 43 68 75 6e 6b 20 63 61 6c 6c 62 61 63 6b   xChunk callback
17490 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 68   */.  void (*xCh
174a0 75 6e 6b 29 28 46 74 73 35 49 6e 64 65 78 2a 2c  unk)(Fts5Index*,
174b0 20 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 75 38   void*, const u8
174c0 2a 2c 20 69 6e 74 29 0a 29 7b 0a 20 20 69 6e 74  *, int).){.  int
174d0 20 6e 52 65 6d 20 3d 20 70 53 65 67 2d 3e 6e 50   nRem = pSeg->nP
174e0 6f 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  os;          /* 
174f0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
17500 73 74 69 6c 6c 20 74 6f 20 63 6f 6d 65 20 2a 2f  still to come */
17510 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
17520 74 61 20 3d 20 30 3b 0a 20 20 75 38 20 2a 70 43  ta = 0;.  u8 *pC
17530 68 75 6e 6b 20 3d 20 26 70 53 65 67 2d 3e 70 4c  hunk = &pSeg->pL
17540 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69 4c 65  eaf->p[pSeg->iLe
17550 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 69 6e 74  afOffset];.  int
17560 20 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52   nChunk = MIN(nR
17570 65 6d 2c 20 70 53 65 67 2d 3e 70 4c 65 61 66 2d  em, pSeg->pLeaf-
17580 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67 2d 3e  >szLeaf - pSeg->
17590 69 4c 65 61 66 4f 66 66 73 65 74 29 3b 0a 20 20  iLeafOffset);.  
175a0 69 6e 74 20 70 67 6e 6f 20 3d 20 70 53 65 67 2d  int pgno = pSeg-
175b0 3e 69 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 69 6e  >iLeafPgno;.  in
175c0 74 20 70 67 6e 6f 53 61 76 65 20 3d 20 30 3b 0a  t pgnoSave = 0;.
175d0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
175e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 6d 77 6f 72  ion does notmwor
175f0 6b 20 77 69 74 68 20 64 65 74 61 69 6c 3d 6e 6f  k with detail=no
17600 6e 65 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f  ne databases. */
17610 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43  .  assert( p->pC
17620 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d  onfig->eDetail!=
17630 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
17640 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 53 65 67   );..  if( (pSeg
17650 2d 3e 66 6c 61 67 73 20 26 20 46 54 53 35 5f 53  ->flags & FTS5_S
17660 45 47 49 54 45 52 5f 52 45 56 45 52 53 45 29 3d  EGITER_REVERSE)=
17670 3d 30 20 29 7b 0a 20 20 20 20 70 67 6e 6f 53 61  =0 ){.    pgnoSa
17680 76 65 20 3d 20 70 67 6e 6f 2b 31 3b 0a 20 20 7d  ve = pgno+1;.  }
17690 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
176a0 20 20 20 20 78 43 68 75 6e 6b 28 70 2c 20 70 43      xChunk(p, pC
176b0 74 78 2c 20 70 43 68 75 6e 6b 2c 20 6e 43 68 75  tx, pChunk, nChu
176c0 6e 6b 29 3b 0a 20 20 20 20 6e 52 65 6d 20 2d 3d  nk);.    nRem -=
176d0 20 6e 43 68 75 6e 6b 3b 0a 20 20 20 20 66 74 73   nChunk;.    fts
176e0 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 44 61  5DataRelease(pDa
176f0 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 52 65  ta);.    if( nRe
17700 6d 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 72  m<=0 ){.      br
17710 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eak;.    }else{.
17720 20 20 20 20 20 20 70 67 6e 6f 2b 2b 3b 0a 20 20        pgno++;.  
17730 20 20 20 20 70 44 61 74 61 20 3d 20 66 74 73 35      pData = fts5
17740 4c 65 61 66 52 65 61 64 28 70 2c 20 46 54 53 35  LeafRead(p, FTS5
17750 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70  _SEGMENT_ROWID(p
17760 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
17770 64 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d, pgno));.     
17780 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 20   if( pData==0 ) 
17790 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70 43 68  break;.      pCh
177a0 75 6e 6b 20 3d 20 26 70 44 61 74 61 2d 3e 70 5b  unk = &pData->p[
177b0 34 5d 3b 0a 20 20 20 20 20 20 6e 43 68 75 6e 6b  4];.      nChunk
177c0 20 3d 20 4d 49 4e 28 6e 52 65 6d 2c 20 70 44 61   = MIN(nRem, pDa
177d0 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 34 29 3b  ta->szLeaf - 4);
177e0 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
177f0 3d 70 67 6e 6f 53 61 76 65 20 29 7b 0a 20 20 20  =pgnoSave ){.   
17800 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65       assert( pSe
17810 67 2d 3e 70 4e 65 78 74 4c 65 61 66 3d 3d 30 20  g->pNextLeaf==0 
17820 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65 67 2d  );.        pSeg-
17830 3e 70 4e 65 78 74 4c 65 61 66 20 3d 20 70 44 61  >pNextLeaf = pDa
17840 74 61 3b 0a 20 20 20 20 20 20 20 20 70 44 61 74  ta;.        pDat
17850 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  a = 0;.      }. 
17860 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
17870 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
17880 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
17890 73 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74  s to a valid ent
178a0 72 79 20 28 6e 6f 74 20 45 4f 46 29 2e 20 54 68  ry (not EOF). Th
178b0 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  is.** function a
178c0 70 70 65 6e 64 73 20 74 68 65 20 70 6f 73 69 74  ppends the posit
178d0 69 6f 6e 20 6c 69 73 74 20 64 61 74 61 20 66 6f  ion list data fo
178e0 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e  r the current en
178f0 74 72 79 20 74 6f 0a 2a 2a 20 62 75 66 66 65 72  try to.** buffer
17900 20 70 42 75 66 2e 20 49 74 20 64 6f 65 73 20 6e   pBuf. It does n
17910 6f 74 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  ot make a copy o
17920 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c  f the position-l
17930 69 73 74 20 73 69 7a 65 0a 2a 2a 20 66 69 65 6c  ist size.** fiel
17940 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
17950 64 20 66 74 73 35 53 65 67 69 74 65 72 50 6f 73  d fts5SegiterPos
17960 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64 65  list(.  Fts5Inde
17970 78 20 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 49  x *p,.  Fts5SegI
17980 74 65 72 20 2a 70 53 65 67 2c 0a 20 20 46 74 73  ter *pSeg,.  Fts
17990 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74  5Colset *pColset
179a0 2c 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  ,.  Fts5Buffer *
179b0 70 42 75 66 0a 29 7b 0a 20 20 69 66 28 20 30 3d  pBuf.){.  if( 0=
179c0 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f 77 28  =fts5BufferGrow(
179d0 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 70 53  &p->rc, pBuf, pS
179e0 65 67 2d 3e 6e 50 6f 73 2b 46 54 53 35 5f 44 41  eg->nPos+FTS5_DA
179f0 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e 47 29  TA_ZERO_PADDING)
17a00 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   ){.    memset(&
17a10 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b  pBuf->p[pBuf->n+
17a20 70 53 65 67 2d 3e 6e 50 6f 73 5d 2c 20 30 2c 20  pSeg->nPos], 0, 
17a30 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
17a40 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 69 66 28  ADDING);.    if(
17a50 20 70 43 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20   pColset==0 ){. 
17a60 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74       fts5ChunkIt
17a70 65 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28  erate(p, pSeg, (
17a80 76 6f 69 64 2a 29 70 42 75 66 2c 20 66 74 73 35  void*)pBuf, fts5
17a90 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 29  PoslistCallback)
17aa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17ab0 20 20 20 69 66 28 20 70 2d 3e 70 43 6f 6e 66 69     if( p->pConfi
17ac0 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
17ad0 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b 0a  _DETAIL_FULL ){.
17ae0 20 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 43          PoslistC
17af0 61 6c 6c 62 61 63 6b 43 74 78 20 73 43 74 78 3b  allbackCtx sCtx;
17b00 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 42  .        sCtx.pB
17b10 75 66 20 3d 20 70 42 75 66 3b 0a 20 20 20 20 20  uf = pBuf;.     
17b20 20 20 20 73 43 74 78 2e 70 43 6f 6c 73 65 74 20     sCtx.pColset 
17b30 3d 20 70 43 6f 6c 73 65 74 3b 0a 20 20 20 20 20  = pColset;.     
17b40 20 20 20 73 43 74 78 2e 65 53 74 61 74 65 20 3d     sCtx.eState =
17b50 20 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74   fts5IndexColset
17b60 54 65 73 74 28 70 43 6f 6c 73 65 74 2c 20 30 29  Test(pColset, 0)
17b70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17b80 28 20 73 43 74 78 2e 65 53 74 61 74 65 3d 3d 30  ( sCtx.eState==0
17b90 20 7c 7c 20 73 43 74 78 2e 65 53 74 61 74 65 3d   || sCtx.eState=
17ba0 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 66 74  =1 );.        ft
17bb0 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28 70  s5ChunkIterate(p
17bc0 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29 26  , pSeg, (void*)&
17bd0 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69 73  sCtx, fts5Poslis
17be0 74 46 69 6c 74 65 72 43 61 6c 6c 62 61 63 6b 29  tFilterCallback)
17bf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
17c00 20 20 20 20 20 20 20 50 6f 73 6c 69 73 74 4f 66         PoslistOf
17c10 66 73 65 74 73 43 74 78 20 73 43 74 78 3b 0a 20  fsetsCtx sCtx;. 
17c20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
17c30 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  Ctx, 0, sizeof(s
17c40 43 74 78 29 29 3b 0a 20 20 20 20 20 20 20 20 73  Ctx));.        s
17c50 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b  Ctx.pBuf = pBuf;
17c60 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43  .        sCtx.pC
17c70 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b  olset = pColset;
17c80 0a 20 20 20 20 20 20 20 20 66 74 73 35 43 68 75  .        fts5Chu
17c90 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70 53 65  nkIterate(p, pSe
17ca0 67 2c 20 28 76 6f 69 64 2a 29 26 73 43 74 78 2c  g, (void*)&sCtx,
17cb0 20 66 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73   fts5PoslistOffs
17cc0 65 74 73 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  etsCallback);.  
17cd0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
17ce0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 4e 2f 4f 55 54 20  }../*.** IN/OUT 
17cf0 70 61 72 61 6d 65 74 65 72 20 28 2a 70 61 29 20  parameter (*pa) 
17d00 70 6f 69 6e 74 73 20 74 6f 20 61 20 70 6f 73 69  points to a posi
17d10 74 69 6f 6e 20 6c 69 73 74 20 6e 20 62 79 74 65  tion list n byte
17d20 73 20 69 6e 20 73 69 7a 65 2e 20 49 66 0a 2a 2a  s in size. If.**
17d30 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69   the position li
17d40 73 74 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  st contains entr
17d50 69 65 73 20 66 6f 72 20 63 6f 6c 75 6d 6e 20 69  ies for column i
17d60 43 6f 6c 2c 20 74 68 65 6e 20 28 2a 70 61 29 20  Col, then (*pa) 
17d70 69 73 20 73 65 74 0a 2a 2a 20 74 6f 20 70 6f 69  is set.** to poi
17d80 6e 74 20 74 6f 20 74 68 65 20 73 75 62 2d 70 6f  nt to the sub-po
17d90 73 69 74 69 6f 6e 2d 6c 69 73 74 20 66 6f 72 20  sition-list for 
17da0 74 68 61 74 20 63 6f 6c 75 6d 6e 20 61 6e 64 20  that column and 
17db0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
17dc0 20 62 79 74 65 73 20 69 6e 20 69 74 20 72 65 74   bytes in it ret
17dd0 75 72 6e 65 64 2e 20 4f 72 2c 20 69 66 20 74 68  urned. Or, if th
17de0 65 20 61 72 67 75 6d 65 6e 74 20 70 6f 73 69 74  e argument posit
17df0 69 6f 6e 20 6c 69 73 74 20 64 6f 65 73 20 6e 6f  ion list does no
17e00 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 79  t.** contain any
17e10 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f 6c   entries for col
17e20 75 6d 6e 20 69 43 6f 6c 2c 20 72 65 74 75 72 6e  umn iCol, return
17e30 20 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   0..*/.static in
17e40 74 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  t fts5IndexExtra
17e50 63 74 43 6f 6c 28 0a 20 20 63 6f 6e 73 74 20 75  ctCol(.  const u
17e60 38 20 2a 2a 70 61 2c 20 20 20 20 20 20 20 20 20  8 **pa,         
17e70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
17e80 55 54 3a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70  UT: Pointer to p
17e90 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  oslist */.  int 
17ea0 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
17eb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17ec0 4e 3a 20 53 69 7a 65 20 6f 66 20 70 6f 73 6c 69  N: Size of posli
17ed0 73 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  st in bytes */. 
17ee0 20 69 6e 74 20 69 43 6f 6c 20 20 20 20 20 20 20   int iCol       
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f 20 65 78   /* Column to ex
17f10 74 72 61 63 74 20 66 72 6f 6d 20 70 6f 73 6c 69  tract from posli
17f20 73 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  st */.){.  int i
17f30 43 75 72 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  Current = 0;    
17f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
17f50 79 74 68 69 6e 67 20 62 65 66 6f 72 65 20 74 68  ything before th
17f60 65 20 66 69 72 73 74 20 30 78 30 31 20 69 73 20  e first 0x01 is 
17f70 63 6f 6c 20 30 20 2a 2f 0a 20 20 63 6f 6e 73 74  col 0 */.  const
17f80 20 75 38 20 2a 70 20 3d 20 2a 70 61 3b 0a 20 20   u8 *p = *pa;.  
17f90 63 6f 6e 73 74 20 75 38 20 2a 70 45 6e 64 20 3d  const u8 *pEnd =
17fa0 20 26 70 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20   &p[n];         
17fb0 2f 2a 20 4f 6e 65 20 62 79 74 65 20 70 61 73 74  /* One byte past
17fc0 20 65 6e 64 20 6f 66 20 70 6f 73 69 74 69 6f 6e   end of position
17fd0 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 77 68 69 6c   list */..  whil
17fe0 65 28 20 69 43 6f 6c 3e 69 43 75 72 72 65 6e 74  e( iCol>iCurrent
17ff0 20 29 7b 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e   ){.    /* Advan
18000 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e 74  ce pointer p unt
18010 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20  il it points to 
18020 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31 20  pEnd or an 0x01 
18030 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20 20  byte that is.   
18040 20 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   ** not part of 
18050 61 20 76 61 72 69 6e 74 2e 20 4e 6f 74 65 20 74  a varint. Note t
18060 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 70 6f  hat it is not po
18070 73 73 69 62 6c 65 20 66 6f 72 20 61 20 6e 65 67  ssible for a neg
18080 61 74 69 76 65 0a 20 20 20 20 2a 2a 20 6f 72 20  ative.    ** or 
18090 65 78 74 72 65 6d 65 6c 79 20 6c 61 72 67 65 20  extremely large 
180a0 76 61 72 69 6e 74 20 74 6f 20 6f 63 63 75 72 20  varint to occur 
180b0 77 69 74 68 69 6e 20 61 6e 20 75 6e 63 6f 72 72  within an uncorr
180c0 75 70 74 65 64 20 70 6f 73 69 74 69 6f 6e 20 0a  upted position .
180d0 20 20 20 20 2a 2a 20 6c 69 73 74 2e 20 53 6f 20      ** list. So 
180e0 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66  the last byte of
180f0 20 65 61 63 68 20 76 61 72 69 6e 74 20 6d 61 79   each varint may
18100 20 62 65 20 61 73 73 75 6d 65 64 20 74 6f 20 68   be assumed to h
18110 61 76 65 20 61 20 63 6c 65 61 72 0a 20 20 20 20  ave a clear.    
18120 2a 2a 20 30 78 38 30 20 62 69 74 2e 20 20 2a 2f  ** 0x80 bit.  */
18130 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 70 21 3d  .    while( *p!=
18140 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 77 68  0x01 ){.      wh
18150 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30  ile( *p++ & 0x80
18160 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 3e   );.      if( p>
18170 3d 70 45 6e 64 20 29 20 72 65 74 75 72 6e 20 30  =pEnd ) return 0
18180 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 61 20  ;.    }.    *pa 
18190 3d 20 70 2b 2b 3b 0a 20 20 20 20 69 43 75 72 72  = p++;.    iCurr
181a0 65 6e 74 20 3d 20 2a 70 2b 2b 3b 0a 20 20 20 20  ent = *p++;.    
181b0 69 66 28 20 69 43 75 72 72 65 6e 74 20 26 20 30  if( iCurrent & 0
181c0 78 38 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 2d  x80 ){.      p--
181d0 3b 0a 20 20 20 20 20 20 70 20 2b 3d 20 66 74 73  ;.      p += fts
181e0 35 47 65 74 56 61 72 69 6e 74 33 32 28 70 2c 20  5GetVarint32(p, 
181f0 69 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d  iCurrent);.    }
18200 0a 20 20 7d 0a 20 20 69 66 28 20 69 43 6f 6c 21  .  }.  if( iCol!
18210 3d 69 43 75 72 72 65 6e 74 20 29 20 72 65 74 75  =iCurrent ) retu
18220 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 41 64 76 61  rn 0;..  /* Adva
18230 6e 63 65 20 70 6f 69 6e 74 65 72 20 70 20 75 6e  nce pointer p un
18240 74 69 6c 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  til it points to
18250 20 70 45 6e 64 20 6f 72 20 61 6e 20 30 78 30 31   pEnd or an 0x01
18260 20 62 79 74 65 20 74 68 61 74 20 69 73 0a 20 20   byte that is.  
18270 2a 2a 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61  ** not part of a
18280 20 76 61 72 69 6e 74 20 2a 2f 0a 20 20 77 68 69   varint */.  whi
18290 6c 65 28 20 70 3c 70 45 6e 64 20 26 26 20 2a 70  le( p<pEnd && *p
182a0 21 3d 30 78 30 31 20 29 7b 0a 20 20 20 20 77 68  !=0x01 ){.    wh
182b0 69 6c 65 28 20 2a 70 2b 2b 20 26 20 30 78 38 30  ile( *p++ & 0x80
182c0 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72   );.  }..  retur
182d0 6e 20 70 20 2d 20 28 2a 70 61 29 3b 0a 7d 0a 0a  n p - (*pa);.}..
182e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
182f0 49 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73  IndexExtractCols
18300 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 0a  et(.  int *pRc,.
18310 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43    Fts5Colset *pC
18320 6f 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20  olset,          
18330 20 20 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66    /* Colset to f
18340 69 6c 74 65 72 20 6f 6e 20 2a 2f 0a 20 20 63 6f  ilter on */.  co
18350 6e 73 74 20 75 38 20 2a 70 50 6f 73 2c 20 69 6e  nst u8 *pPos, in
18360 74 20 6e 50 6f 73 2c 20 20 20 20 20 20 20 2f 2a  t nPos,       /*
18370 20 50 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a   Position list *
18380 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
18390 70 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20  pBuf            
183a0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 62 75      /* Output bu
183b0 66 66 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ffer */.){.  if(
183c0 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
183d0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
183e0 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
183f0 6f 28 70 42 75 66 29 3b 0a 20 20 20 20 66 6f 72  o(pBuf);.    for
18400 28 69 3d 30 3b 20 69 3c 70 43 6f 6c 73 65 74 2d  (i=0; i<pColset-
18410 3e 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nCol; i++){.   
18420 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53 75     const u8 *pSu
18430 62 20 3d 20 70 50 6f 73 3b 0a 20 20 20 20 20 20  b = pPos;.      
18440 69 6e 74 20 6e 53 75 62 20 3d 20 66 74 73 35 49  int nSub = fts5I
18450 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26  ndexExtractCol(&
18460 70 53 75 62 2c 20 6e 50 6f 73 2c 20 70 43 6f 6c  pSub, nPos, pCol
18470 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 29 3b 0a  set->aiCol[i]);.
18480 20 20 20 20 20 20 69 66 28 20 6e 53 75 62 20 29        if( nSub )
18490 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 42 75  {.        fts5Bu
184a0 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 70  fferAppendBlob(p
184b0 52 63 2c 20 70 42 75 66 2c 20 6e 53 75 62 2c 20  Rc, pBuf, nSub, 
184c0 70 53 75 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pSub);.      }. 
184d0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
184e0 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63 61  * xSetOutputs ca
184f0 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20 64  llback used by d
18500 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c 65  etail=none table
18510 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
18520 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  d fts5IterSetOut
18530 70 75 74 73 5f 4e 6f 6e 65 28 46 74 73 35 49 74  puts_None(Fts5It
18540 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
18550 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
18560 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
18570 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d  pIndex->pConfig-
18580 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44  >eDetail==FTS5_D
18590 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20  ETAIL_NONE );.  
185a0 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77  pIter->base.iRow
185b0 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
185c0 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  d;.  pIter->base
185d0 2e 6e 44 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e  .nData = pSeg->n
185e0 50 6f 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  Pos;.}../*.** xS
185f0 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
18600 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61 69  ck used by detai
18610 6c 3d 66 75 6c 6c 20 61 6e 64 20 64 65 74 61 69  l=full and detai
18620 6c 3d 63 6f 6c 20 74 61 62 6c 65 73 20 77 68 65  l=col tables whe
18630 6e 20 6e 6f 0a 2a 2a 20 63 6f 6c 75 6d 6e 20 66  n no.** column f
18640 69 6c 74 65 72 73 20 61 72 65 20 73 70 65 63 69  ilters are speci
18650 66 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  fied..*/.static 
18660 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74  void fts5IterSet
18670 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73 65 74  Outputs_Nocolset
18680 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
18690 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70  , Fts5SegIter *p
186a0 53 65 67 29 7b 0a 20 20 70 49 74 65 72 2d 3e 62  Seg){.  pIter->b
186b0 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65  ase.iRowid = pSe
186c0 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74  g->iRowid;.  pIt
186d0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
186e0 20 70 53 65 67 2d 3e 6e 50 6f 73 3b 0a 0a 20 20   pSeg->nPos;..  
186f0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18700 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
18710 65 44 65 74 61 69 6c 21 3d 46 54 53 35 5f 44 45  eDetail!=FTS5_DE
18720 54 41 49 4c 5f 4e 4f 4e 45 20 29 3b 0a 20 20 61  TAIL_NONE );.  a
18730 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70 43  ssert( pIter->pC
18740 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 0a 20 20 69  olset==0 );..  i
18750 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
18760 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c  fset+pSeg->nPos<
18770 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a  =pSeg->pLeaf->sz
18780 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41  Leaf ){.    /* A
18790 6c 6c 20 64 61 74 61 20 69 73 20 73 74 6f 72 65  ll data is store
187a0 64 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74  d on the current
187b0 20 70 61 67 65 2e 20 50 6f 70 75 6c 61 74 65 20   page. Populate 
187c0 74 68 65 20 6f 75 74 70 75 74 20 0a 20 20 20 20  the output .    
187d0 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20  ** variables to 
187e0 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68 65 20 62  point into the b
187f0 6f 64 79 20 6f 66 20 74 68 65 20 70 61 67 65 20  ody of the page 
18800 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 20 20 70  object. */.    p
18810 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18820 20 3d 20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d   = &pSeg->pLeaf-
18830 3e 70 5b 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  >p[pSeg->iLeafOf
18840 66 73 65 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fset];.  }else{.
18850 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20      /* The data 
18860 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f  is distributed o
18870 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20  ver two or more 
18880 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74 20 69  pages. Copy it i
18890 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 46  nto the.    ** F
188a0 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73 74 20  ts5Iter.poslist 
188b0 62 75 66 66 65 72 20 61 6e 64 20 74 68 65 6e 20  buffer and then 
188c0 73 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70  set the output p
188d0 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e 74 0a  ointer to point.
188e0 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 62      ** to this b
188f0 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20 20 66  uffer.  */.    f
18900 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
18910 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a  Iter->poslist);.
18920 20 20 20 20 66 74 73 35 53 65 67 69 74 65 72 50      fts5SegiterP
18930 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49  oslist(pIter->pI
18940 6e 64 65 78 2c 20 70 53 65 67 2c 20 30 2c 20 26  ndex, pSeg, 0, &
18950 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
18960 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
18970 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
18980 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a 7d  poslist.p;.  }.}
18990 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
189a0 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
189b0 64 20 77 68 65 6e 20 74 68 65 20 46 74 73 35 43  d when the Fts5C
189c0 6f 6c 73 65 74 20 6f 62 6a 65 63 74 20 68 61 73  olset object has
189d0 20 6e 43 6f 6c 3d 3d 30 20 28 6d 61 74 63 68 0a   nCol==0 (match.
189e0 2a 2a 20 61 67 61 69 6e 73 74 20 6e 6f 20 63 6f  ** against no co
189f0 6c 75 6d 6e 73 20 61 74 20 61 6c 6c 29 2e 0a 2a  lumns at all)..*
18a00 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18a10 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18a20 5f 5a 65 72 6f 43 6f 6c 73 65 74 28 46 74 73 35  _ZeroColset(Fts5
18a30 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73  Iter *pIter, Fts
18a40 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b  5SegIter *pSeg){
18a50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
18a60 70 53 65 67 29 3b 0a 20 20 70 49 74 65 72 2d 3e  pSeg);.  pIter->
18a70 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 30 3b 0a  base.nData = 0;.
18a80 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
18a90 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
18aa0 65 64 20 62 79 20 64 65 74 61 69 6c 3d 63 6f 6c  ed by detail=col
18ab0 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
18ac0 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 0a 2a   column filter.*
18ad0 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
18ae0 31 30 30 20 6f 72 20 6d 6f 72 65 20 63 6f 6c 75  100 or more colu
18af0 6d 6e 73 2e 20 41 6c 73 6f 20 63 61 6c 6c 65 64  mns. Also called
18b00 20 61 73 20 61 20 66 61 6c 6c 62 61 63 6b 20 66   as a fallback f
18b10 72 6f 6d 0a 2a 2a 20 66 74 73 35 49 74 65 72 53  rom.** fts5IterS
18b20 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 31 30 30  etOutputs_Col100
18b30 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2d 6c   if the column-l
18b40 69 73 74 20 73 70 61 6e 73 20 6d 6f 72 65 20 74  ist spans more t
18b50 68 61 6e 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  han one page..*/
18b60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
18b70 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18b80 43 6f 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49  Col(Fts5Iter *pI
18b90 74 65 72 2c 20 46 74 73 35 53 65 67 49 74 65 72  ter, Fts5SegIter
18ba0 20 2a 70 53 65 67 29 7b 0a 20 20 66 74 73 35 42   *pSeg){.  fts5B
18bb0 75 66 66 65 72 5a 65 72 6f 28 26 70 49 74 65 72  ufferZero(&pIter
18bc0 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 66 74  ->poslist);.  ft
18bd0 73 35 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74  s5SegiterPoslist
18be0 28 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20  (pIter->pIndex, 
18bf0 70 53 65 67 2c 20 70 49 74 65 72 2d 3e 70 43 6f  pSeg, pIter->pCo
18c00 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70 6f  lset, &pIter->po
18c10 73 6c 69 73 74 29 3b 0a 20 20 70 49 74 65 72 2d  slist);.  pIter-
18c20 3e 62 61 73 65 2e 69 52 6f 77 69 64 20 3d 20 70  >base.iRowid = p
18c30 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 20 20 70  Seg->iRowid;.  p
18c40 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
18c50 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
18c60 74 2e 70 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  t.p;.  pIter->ba
18c70 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
18c80 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 7d 0a 0a  ->poslist.n;.}..
18c90 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74  /*.** xSetOutput
18ca0 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20  s callback used 
18cb0 77 68 65 6e 3a 20 0a 2a 2a 0a 2a 2a 20 20 20 2a  when: .**.**   *
18cc0 20 64 65 74 61 69 6c 3d 63 6f 6c 2c 0a 2a 2a 20   detail=col,.** 
18cd0 20 20 2a 20 74 68 65 72 65 20 69 73 20 61 20 63    * there is a c
18ce0 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2c 20 61 6e  olumn filter, an
18cf0 64 0a 2a 2a 20 20 20 2a 20 74 68 65 20 74 61 62  d.**   * the tab
18d00 6c 65 20 63 6f 6e 74 61 69 6e 73 20 31 30 30 20  le contains 100 
18d10 6f 72 20 66 65 77 65 72 20 63 6f 6c 75 6d 6e 73  or fewer columns
18d20 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 61 73  . .**.** The las
18d30 74 20 70 6f 69 6e 74 20 69 73 20 74 6f 20 65 6e  t point is to en
18d40 73 75 72 65 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20  sure all column 
18d50 6e 75 6d 62 65 72 73 20 61 72 65 20 73 74 6f 72  numbers are stor
18d60 65 64 20 61 73 20 0a 2a 2a 20 73 69 6e 67 6c 65  ed as .** single
18d70 2d 62 79 74 65 20 76 61 72 69 6e 74 73 2e 0a 2a  -byte varints..*
18d80 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
18d90 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
18da0 5f 43 6f 6c 31 30 30 28 46 74 73 35 49 74 65 72  _Col100(Fts5Iter
18db0 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
18dc0 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 0a 20 20  Iter *pSeg){..  
18dd0 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 70  assert( pIter->p
18de0 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e  Index->pConfig->
18df0 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45  eDetail==FTS5_DE
18e00 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a  TAIL_COLUMNS );.
18e10 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d    assert( pIter-
18e20 3e 70 43 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69  >pColset );..  i
18e30 66 28 20 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66  f( pSeg->iLeafOf
18e40 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3e  fset+pSeg->nPos>
18e50 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c  pSeg->pLeaf->szL
18e60 65 61 66 20 29 7b 0a 20 20 20 20 66 74 73 35 49  eaf ){.    fts5I
18e70 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f  terSetOutputs_Co
18e80 6c 28 70 49 74 65 72 2c 20 70 53 65 67 29 3b 0a  l(pIter, pSeg);.
18e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20    }else{.    u8 
18ea0 2a 61 20 3d 20 28 75 38 2a 29 26 70 53 65 67 2d  *a = (u8*)&pSeg-
18eb0 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
18ec0 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
18ed0 20 20 75 38 20 2a 70 45 6e 64 20 3d 20 28 75 38    u8 *pEnd = (u8
18ee0 2a 29 26 61 5b 70 53 65 67 2d 3e 6e 50 6f 73 5d  *)&a[pSeg->nPos]
18ef0 3b 20 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76  ; .    int iPrev
18f00 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 2a 61   = 0;.    int *a
18f10 69 43 6f 6c 20 3d 20 70 49 74 65 72 2d 3e 70 43  iCol = pIter->pC
18f20 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c 3b 0a 20 20  olset->aiCol;.  
18f30 20 20 69 6e 74 20 2a 61 69 43 6f 6c 45 6e 64 20    int *aiColEnd 
18f40 3d 20 26 61 69 43 6f 6c 5b 70 49 74 65 72 2d 3e  = &aiCol[pIter->
18f50 70 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 5d 3b 0a  pColset->nCol];.
18f60 0a 20 20 20 20 75 38 20 2a 61 4f 75 74 20 3d 20  .    u8 *aOut = 
18f70 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70  pIter->poslist.p
18f80 3b 0a 20 20 20 20 69 6e 74 20 69 50 72 65 76 4f  ;.    int iPrevO
18f90 75 74 20 3d 20 30 3b 0a 0a 20 20 20 20 70 49 74  ut = 0;..    pIt
18fa0 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64 20  er->base.iRowid 
18fb0 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a  = pSeg->iRowid;.
18fc0 0a 20 20 20 20 77 68 69 6c 65 28 20 61 3c 70 45  .    while( a<pE
18fd0 6e 64 20 29 7b 0a 20 20 20 20 20 20 69 50 72 65  nd ){.      iPre
18fe0 76 20 2b 3d 20 28 69 6e 74 29 61 2b 2b 5b 30 5d  v += (int)a++[0]
18ff0 20 2d 20 32 3b 0a 20 20 20 20 20 20 77 68 69 6c   - 2;.      whil
19000 65 28 20 2a 61 69 43 6f 6c 3c 69 50 72 65 76 20  e( *aiCol<iPrev 
19010 29 7b 0a 20 20 20 20 20 20 20 20 61 69 43 6f 6c  ){.        aiCol
19020 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
19030 61 69 43 6f 6c 3d 3d 61 69 43 6f 6c 45 6e 64 20  aiCol==aiColEnd 
19040 29 20 67 6f 74 6f 20 73 65 74 6f 75 74 70 75 74  ) goto setoutput
19050 73 5f 63 6f 6c 5f 6f 75 74 3b 0a 20 20 20 20 20  s_col_out;.     
19060 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 61 69   }.      if( *ai
19070 43 6f 6c 3d 3d 69 50 72 65 76 20 29 7b 0a 20 20  Col==iPrev ){.  
19080 20 20 20 20 20 20 2a 61 4f 75 74 2b 2b 20 3d 20        *aOut++ = 
19090 28 75 38 29 28 28 69 50 72 65 76 20 2d 20 69 50  (u8)((iPrev - iP
190a0 72 65 76 4f 75 74 29 20 2b 20 32 29 3b 0a 20 20  revOut) + 2);.  
190b0 20 20 20 20 20 20 69 50 72 65 76 4f 75 74 20 3d        iPrevOut =
190c0 20 69 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a   iPrev;.      }.
190d0 20 20 20 20 7d 0a 0a 73 65 74 6f 75 74 70 75 74      }..setoutput
190e0 73 5f 63 6f 6c 5f 6f 75 74 3a 0a 20 20 20 20 70  s_col_out:.    p
190f0 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61  Iter->base.pData
19100 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73   = pIter->poslis
19110 74 2e 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e  t.p;.    pIter->
19120 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 61 4f 75  base.nData = aOu
19130 74 20 2d 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69  t - pIter->posli
19140 73 74 2e 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  st.p;.  }.}../*.
19150 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20 63  ** xSetOutputs c
19160 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79 20  allback used by 
19170 64 65 74 61 69 6c 3d 66 75 6c 6c 20 77 68 65 6e  detail=full when
19180 20 74 68 65 72 65 20 69 73 20 61 20 63 6f 6c 75   there is a colu
19190 6d 6e 20 66 69 6c 74 65 72 2e 0a 2a 2f 0a 73 74  mn filter..*/.st
191a0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 74  atic void fts5It
191b0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46 75 6c  erSetOutputs_Ful
191c0 6c 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  l(Fts5Iter *pIte
191d0 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
191e0 70 53 65 67 29 7b 0a 20 20 46 74 73 35 43 6f 6c  pSeg){.  Fts5Col
191f0 73 65 74 20 2a 70 43 6f 6c 73 65 74 20 3d 20 70  set *pColset = p
19200 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3b 0a 20  Iter->pColset;. 
19210 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f   pIter->base.iRo
19220 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77  wid = pSeg->iRow
19230 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  id;..  assert( p
19240 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43  Iter->pIndex->pC
19250 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
19260 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c  FTS5_DETAIL_FULL
19270 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
19280 6f 6c 73 65 74 20 29 3b 0a 0a 20 20 69 66 28 20  olset );..  if( 
19290 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
192a0 74 2b 70 53 65 67 2d 3e 6e 50 6f 73 3c 3d 70 53  t+pSeg->nPos<=pS
192b0 65 67 2d 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  eg->pLeaf->szLea
192c0 66 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c 20  f ){.    /* All 
192d0 64 61 74 61 20 69 73 20 73 74 6f 72 65 64 20 6f  data is stored o
192e0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  n the current pa
192f0 67 65 2e 20 50 6f 70 75 6c 61 74 65 20 74 68 65  ge. Populate the
19300 20 6f 75 74 70 75 74 20 0a 20 20 20 20 2a 2a 20   output .    ** 
19310 76 61 72 69 61 62 6c 65 73 20 74 6f 20 70 6f 69  variables to poi
19320 6e 74 20 69 6e 74 6f 20 74 68 65 20 62 6f 64 79  nt into the body
19330 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 62 6a   of the page obj
19340 65 63 74 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73  ect. */.    cons
19350 74 20 75 38 20 2a 61 20 3d 20 26 70 53 65 67 2d  t u8 *a = &pSeg-
19360 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e  >pLeaf->p[pSeg->
19370 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20  iLeafOffset];.  
19380 20 20 69 66 28 20 70 43 6f 6c 73 65 74 2d 3e 6e    if( pColset->n
19390 43 6f 6c 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Col==1 ){.      
193a0 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74  pIter->base.nDat
193b0 61 20 3d 20 66 74 73 35 49 6e 64 65 78 45 78 74  a = fts5IndexExt
193c0 72 61 63 74 43 6f 6c 28 26 61 2c 20 70 53 65 67  ractCol(&a, pSeg
193d0 2d 3e 6e 50 6f 73 2c 70 43 6f 6c 73 65 74 2d 3e  ->nPos,pColset->
193e0 61 69 43 6f 6c 5b 30 5d 29 3b 0a 20 20 20 20 20  aiCol[0]);.     
193f0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
19400 74 61 20 3d 20 61 3b 0a 20 20 20 20 7d 65 6c 73  ta = a;.    }els
19410 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 2a 70 52  e{.      int *pR
19420 63 20 3d 20 26 70 49 74 65 72 2d 3e 70 49 6e 64  c = &pIter->pInd
19430 65 78 2d 3e 72 63 3b 0a 20 20 20 20 20 20 66 74  ex->rc;.      ft
19440 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70 49  s5BufferZero(&pI
19450 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
19460 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 45 78       fts5IndexEx
19470 74 72 61 63 74 43 6f 6c 73 65 74 28 70 52 63 2c  tractColset(pRc,
19480 20 70 43 6f 6c 73 65 74 2c 20 61 2c 20 70 53 65   pColset, a, pSe
19490 67 2d 3e 6e 50 6f 73 2c 20 26 70 49 74 65 72 2d  g->nPos, &pIter-
194a0 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 20  >poslist);.     
194b0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70 44 61   pIter->base.pDa
194c0 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73 6c  ta = pIter->posl
194d0 69 73 74 2e 70 3b 0a 20 20 20 20 20 20 70 49 74  ist.p;.      pIt
194e0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
194f0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
19500 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  n;.    }.  }else
19510 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74  {.    /* The dat
19520 61 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  a is distributed
19530 20 6f 76 65 72 20 74 77 6f 20 6f 72 20 6d 6f 72   over two or mor
19540 65 20 70 61 67 65 73 2e 20 43 6f 70 79 20 69 74  e pages. Copy it
19550 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a   into the.    **
19560 20 46 74 73 35 49 74 65 72 2e 70 6f 73 6c 69 73   Fts5Iter.poslis
19570 74 20 62 75 66 66 65 72 20 61 6e 64 20 74 68 65  t buffer and the
19580 6e 20 73 65 74 20 74 68 65 20 6f 75 74 70 75 74  n set the output
19590 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 6f 69 6e   pointer to poin
195a0 74 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 69 73  t.    ** to this
195b0 20 62 75 66 66 65 72 2e 20 20 2a 2f 0a 20 20 20   buffer.  */.   
195c0 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
195d0 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
195e0 3b 0a 20 20 20 20 66 74 73 35 53 65 67 69 74 65  ;.    fts5Segite
195f0 72 50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e  rPoslist(pIter->
19600 70 49 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 43  pIndex, pSeg, pC
19610 6f 6c 73 65 74 2c 20 26 70 49 74 65 72 2d 3e 70  olset, &pIter->p
19620 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74  oslist);.    pIt
19630 65 72 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d  er->base.pData =
19640 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
19650 70 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61  p;.    pIter->ba
19660 73 65 2e 6e 44 61 74 61 20 3d 20 70 49 74 65 72  se.nData = pIter
19670 2d 3e 70 6f 73 6c 69 73 74 2e 6e 3b 0a 20 20 7d  ->poslist.n;.  }
19680 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
19690 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
196a0 74 43 62 28 69 6e 74 20 2a 70 52 63 2c 20 46 74  tCb(int *pRc, Ft
196b0 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
196c0 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
196d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46 74 73  TE_OK ){.    Fts
196e0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
196f0 20 3d 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78   = pIter->pIndex
19700 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 69  ->pConfig;.    i
19710 66 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  f( pConfig->eDet
19720 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
19730 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70  _NONE ){.      p
19740 49 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74  Iter->xSetOutput
19750 73 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f  s = fts5IterSetO
19760 75 74 70 75 74 73 5f 4e 6f 6e 65 3b 0a 20 20 20  utputs_None;.   
19770 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
19780 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 3d   pIter->pColset=
19790 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 74 65  =0 ){.      pIte
197a0 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d  r->xSetOutputs =
197b0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
197c0 75 74 73 5f 4e 6f 63 6f 6c 73 65 74 3b 0a 20 20  uts_Nocolset;.  
197d0 20 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66    }..    else if
197e0 28 20 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74  ( pIter->pColset
197f0 2d 3e 6e 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ->nCol==0 ){.   
19800 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75     pIter->xSetOu
19810 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72  tputs = fts5Iter
19820 53 65 74 4f 75 74 70 75 74 73 5f 5a 65 72 6f 43  SetOutputs_ZeroC
19830 6f 6c 73 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  olset;.    }..  
19840 20 20 65 6c 73 65 20 69 66 28 20 70 43 6f 6e 66    else if( pConf
19850 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53  ig->eDetail==FTS
19860 35 5f 44 45 54 41 49 4c 5f 46 55 4c 4c 20 29 7b  5_DETAIL_FULL ){
19870 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53  .      pIter->xS
19880 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35  etOutputs = fts5
19890 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 46  IterSetOutputs_F
198a0 75 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ull;.    }..    
198b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
198c0 72 74 28 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65  rt( pConfig->eDe
198d0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
198e0 4c 5f 43 4f 4c 55 4d 4e 53 20 29 3b 0a 20 20 20  L_COLUMNS );.   
198f0 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67 2d 3e     if( pConfig->
19900 6e 43 6f 6c 3c 3d 31 30 30 20 29 7b 0a 20 20 20  nCol<=100 ){.   
19910 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
19920 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
19930 65 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c  erSetOutputs_Col
19940 31 30 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  100;.        sql
19950 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69  ite3Fts5BufferSi
19960 7a 65 28 70 52 63 2c 20 26 70 49 74 65 72 2d 3e  ze(pRc, &pIter->
19970 70 6f 73 6c 69 73 74 2c 20 70 43 6f 6e 66 69 67  poslist, pConfig
19980 2d 3e 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  ->nCol);.      }
19990 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 49  else{.        pI
199a0 74 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73  ter->xSetOutputs
199b0 20 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75   = fts5IterSetOu
199c0 74 70 75 74 73 5f 43 6f 6c 3b 0a 20 20 20 20 20  tputs_Col;.     
199d0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a   }.    }.  }.}..
199e0 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
199f0 61 20 6e 65 77 20 46 74 73 35 49 74 65 72 20 6f  a new Fts5Iter o
19a00 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  bject..**.** The
19a10 20 6e 65 77 20 6f 62 6a 65 63 74 20 77 69 6c 6c   new object will
19a20 20 62 65 20 75 73 65 64 20 74 6f 20 69 74 65 72   be used to iter
19a30 61 74 65 20 74 68 72 6f 75 67 68 20 64 61 74 61  ate through data
19a40 20 69 6e 20 73 74 72 75 63 74 75 72 65 20 70 53   in structure pS
19a50 74 72 75 63 74 2e 0a 2a 2a 20 49 66 20 69 4c 65  truct..** If iLe
19a60 76 65 6c 20 69 73 20 2d 76 65 2c 20 74 68 65 6e  vel is -ve, then
19a70 20 61 6c 6c 20 64 61 74 61 20 69 6e 20 61 6c 6c   all data in all
19a80 20 73 65 67 6d 65 6e 74 73 20 69 73 20 6d 65 72   segments is mer
19a90 67 65 64 2e 20 4f 72 2c 20 69 66 20 69 4c 65 76  ged. Or, if iLev
19aa0 65 6c 0a 2a 2a 20 69 73 20 7a 65 72 6f 20 6f 72  el.** is zero or
19ab0 20 67 72 65 61 74 65 72 2c 20 64 61 74 61 20 66   greater, data f
19ac0 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20 6e 53  rom the first nS
19ad0 65 67 6d 65 6e 74 20 73 65 67 6d 65 6e 74 73 20  egment segments 
19ae0 6f 6e 20 6c 65 76 65 6c 20 69 4c 65 76 65 6c 0a  on level iLevel.
19af0 2a 2a 20 69 73 20 6d 65 72 67 65 64 2e 0a 2a 2a  ** is merged..**
19b00 0a 2a 2a 20 54 68 65 20 69 74 65 72 61 74 6f 72  .** The iterator
19b10 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e 74   initially point
19b20 73 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 74  s to the first t
19b30 65 72 6d 2f 72 6f 77 69 64 20 65 6e 74 72 79 20  erm/rowid entry 
19b40 69 6e 20 74 68 65 20 0a 2a 2a 20 69 74 65 72 61  in the .** itera
19b50 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  ted data..*/.sta
19b60 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c  tic void fts5Mul
19b70 74 69 49 74 65 72 4e 65 77 28 0a 20 20 46 74 73  tiIterNew(.  Fts
19b80 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19ba0 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20  FTS5 backend to 
19bb0 69 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a  iterate within *
19bc0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
19bd0 65 20 2a 70 53 74 72 75 63 74 2c 20 20 20 20 20  e *pStruct,     
19be0 20 20 20 20 2f 2a 20 53 74 72 75 63 74 75 72 65      /* Structure
19bf0 20 6f 66 20 73 70 65 63 69 66 69 63 20 69 6e 64   of specific ind
19c00 65 78 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ex */.  int flag
19c10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
19c20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 49          /* FTS5I
19c30 4e 44 45 58 5f 51 55 45 52 59 5f 58 58 58 20 66  NDEX_QUERY_XXX f
19c40 6c 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f  lags */.  Fts5Co
19c50 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20  lset *pColset,  
19c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
19c70 73 65 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e  set to filter on
19c80 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20   (or NULL) */.  
19c90 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72 6d 2c  const u8 *pTerm,
19ca0 20 69 6e 74 20 6e 54 65 72 6d 2c 20 20 20 20 20   int nTerm,     
19cb0 2f 2a 20 54 65 72 6d 20 74 6f 20 73 65 65 6b 20  /* Term to seek 
19cc0 74 6f 20 28 6f 72 20 4e 55 4c 4c 2f 30 29 20 2a  to (or NULL/0) *
19cd0 2f 0a 20 20 69 6e 74 20 69 4c 65 76 65 6c 2c 20  /.  int iLevel, 
19ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cf0 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f 20      /* Level to 
19d00 69 74 65 72 61 74 65 20 28 2d 31 20 66 6f 72 20  iterate (-1 for 
19d10 61 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  all) */.  int nS
19d20 65 67 6d 65 6e 74 2c 20 20 20 20 20 20 20 20 20  egment,         
19d30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
19d40 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74 73 20  ber of segments 
19d50 74 6f 20 6d 65 72 67 65 20 28 69 4c 65 76 65 6c  to merge (iLevel
19d60 3e 3d 30 29 20 2a 2f 0a 20 20 46 74 73 35 49 74  >=0) */.  Fts5It
19d70 65 72 20 2a 2a 70 70 4f 75 74 20 20 20 20 20 20  er **ppOut      
19d80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
19d90 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
19da0 69 6e 74 20 6e 53 65 67 20 3d 20 30 3b 20 20 20  int nSeg = 0;   
19db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19dc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
19dd0 6d 65 6e 74 2d 69 74 65 72 73 20 69 6e 20 75 73  ment-iters in us
19de0 65 20 2a 2f 0a 20 20 69 6e 74 20 69 49 74 65 72  e */.  int iIter
19df0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
19e00 20 20 20 20 20 20 20 2f 2a 20 2a 2f 0a 20 20 69         /* */.  i
19e10 6e 74 20 69 53 65 67 3b 20 20 20 20 20 20 20 20  nt iSeg;        
19e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19e30 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
19e40 65 20 74 68 72 6f 75 67 68 20 73 65 67 6d 65 6e  e through segmen
19e50 74 73 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ts */.  Fts5Stru
19e60 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c  ctureLevel *pLvl
19e70 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e  ;.  Fts5Iter *pN
19e80 65 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 28  ew;..  assert( (
19e90 70 54 65 72 6d 3d 3d 30 20 26 26 20 6e 54 65 72  pTerm==0 && nTer
19ea0 6d 3d 3d 30 29 20 7c 7c 20 69 4c 65 76 65 6c 3c  m==0) || iLevel<
19eb0 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  0 );..  /* Alloc
19ec0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74 68  ate space for th
19ed0 65 20 6e 65 77 20 6d 75 6c 74 69 2d 73 65 67 2d  e new multi-seg-
19ee0 69 74 65 72 61 74 6f 72 2e 20 2a 2f 0a 20 20 69  iterator. */.  i
19ef0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
19f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 69  _OK ){.    if( i
19f10 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20 20 20 20  Level<0 ){.     
19f20 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
19f30 2d 3e 6e 53 65 67 6d 65 6e 74 3d 3d 66 74 73 35  ->nSegment==fts5
19f40 53 74 72 75 63 74 75 72 65 43 6f 75 6e 74 53 65  StructureCountSe
19f50 67 6d 65 6e 74 73 28 70 53 74 72 75 63 74 29 20  gments(pStruct) 
19f60 29 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 3d 20  );.      nSeg = 
19f70 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e  pStruct->nSegmen
19f80 74 3b 0a 20 20 20 20 20 20 6e 53 65 67 20 2b 3d  t;.      nSeg +=
19f90 20 28 70 2d 3e 70 48 61 73 68 20 3f 20 31 20 3a   (p->pHash ? 1 :
19fa0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
19fb0 20 20 20 20 20 20 6e 53 65 67 20 3d 20 4d 49 4e        nSeg = MIN
19fc0 28 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c  (pStruct->aLevel
19fd0 5b 69 4c 65 76 65 6c 5d 2e 6e 53 65 67 2c 20 6e  [iLevel].nSeg, n
19fe0 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  Segment);.    }.
19ff0 20 20 7d 0a 20 20 2a 70 70 4f 75 74 20 3d 20 70    }.  *ppOut = p
1a000 4e 65 77 20 3d 20 66 74 73 35 4d 75 6c 74 69 49  New = fts5MultiI
1a010 74 65 72 41 6c 6c 6f 63 28 70 2c 20 6e 53 65 67  terAlloc(p, nSeg
1a020 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
1a030 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4e 65   ) return;.  pNe
1a040 77 2d 3e 62 52 65 76 20 3d 20 28 30 21 3d 28 66  w->bRev = (0!=(f
1a050 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
1a060 5f 51 55 45 52 59 5f 44 45 53 43 29 29 3b 0a 20  _QUERY_DESC));. 
1a070 20 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74   pNew->bSkipEmpt
1a080 79 20 3d 20 28 30 21 3d 28 66 6c 61 67 73 20 26  y = (0!=(flags &
1a090 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
1a0a0 5f 53 4b 49 50 45 4d 50 54 59 29 29 3b 0a 20 20  _SKIPEMPTY));.  
1a0b0 70 4e 65 77 2d 3e 70 43 6f 6c 73 65 74 20 3d 20  pNew->pColset = 
1a0c0 70 43 6f 6c 73 65 74 3b 0a 20 20 69 66 28 20 28  pColset;.  if( (
1a0d0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
1a0e0 58 5f 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54  X_QUERY_NOOUTPUT
1a0f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 74 73 35  )==0 ){.    fts5
1a100 49 74 65 72 53 65 74 4f 75 74 70 75 74 43 62 28  IterSetOutputCb(
1a110 26 70 2d 3e 72 63 2c 20 70 4e 65 77 29 3b 0a 20  &p->rc, pNew);. 
1a120 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c   }..  /* Initial
1a130 69 7a 65 20 65 61 63 68 20 6f 66 20 74 68 65 20  ize each of the 
1a140 63 6f 6d 70 6f 6e 65 6e 74 20 73 65 67 6d 65 6e  component segmen
1a150 74 20 69 74 65 72 61 74 6f 72 73 2e 20 2a 2f 0a  t iterators. */.
1a160 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1a170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1a180 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b 0a 20 20  ( iLevel<0 ){.  
1a190 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
1a1a0 65 4c 65 76 65 6c 20 2a 70 45 6e 64 20 3d 20 26  eLevel *pEnd = &
1a1b0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1a1c0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
1a1d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
1a1e0 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20  Hash ){.        
1a1f0 2f 2a 20 41 64 64 20 61 20 73 65 67 6d 65 6e 74  /* Add a segment
1a200 20 69 74 65 72 61 74 6f 72 20 66 6f 72 20 74 68   iterator for th
1a210 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
1a220 74 73 20 6f 66 20 74 68 65 20 68 61 73 68 20 74  ts of the hash t
1a230 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  able. */.       
1a240 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
1a250 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65  ter = &pNew->aSe
1a260 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20 20 20  g[iIter++];.    
1a270 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 48      fts5SegIterH
1a280 61 73 68 49 6e 69 74 28 70 2c 20 70 54 65 72 6d  ashInit(p, pTerm
1a290 2c 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20  , nTerm, flags, 
1a2a0 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pIter);.      }.
1a2b0 20 20 20 20 20 20 66 6f 72 28 70 4c 76 6c 3d 26        for(pLvl=&
1a2c0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
1a2d0 30 5d 3b 20 70 4c 76 6c 3c 70 45 6e 64 3b 20 70  0]; pLvl<pEnd; p
1a2e0 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Lvl++){.        
1a2f0 66 6f 72 28 69 53 65 67 3d 70 4c 76 6c 2d 3e 6e  for(iSeg=pLvl->n
1a300 53 65 67 2d 31 3b 20 69 53 65 67 3e 3d 30 3b 20  Seg-1; iSeg>=0; 
1a310 69 53 65 67 2d 2d 29 7b 0a 20 20 20 20 20 20 20  iSeg--){.       
1a320 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
1a330 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 20 3d 20  Segment *pSeg = 
1a340 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
1a350 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 46 74 73  ];.          Fts
1a360 35 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 20  5SegIter *pIter 
1a370 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69 49  = &pNew->aSeg[iI
1a380 74 65 72 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  ter++];.        
1a390 20 20 69 66 28 20 70 54 65 72 6d 3d 3d 30 20 29    if( pTerm==0 )
1a3a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
1a3b0 73 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c  s5SegIterInit(p,
1a3c0 20 70 53 65 67 2c 20 70 49 74 65 72 29 3b 0a 20   pSeg, pIter);. 
1a3d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1a3e0 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73 35              fts5
1a3f0 53 65 67 49 74 65 72 53 65 65 6b 49 6e 69 74 28  SegIterSeekInit(
1a400 70 2c 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c  p, pTerm, nTerm,
1a410 20 66 6c 61 67 73 2c 20 70 53 65 67 2c 20 70 49   flags, pSeg, pI
1a420 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
1a430 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
1a440 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1a450 20 20 20 20 20 70 4c 76 6c 20 3d 20 26 70 53 74       pLvl = &pSt
1a460 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 65  ruct->aLevel[iLe
1a470 76 65 6c 5d 3b 0a 20 20 20 20 20 20 66 6f 72 28  vel];.      for(
1a480 69 53 65 67 3d 6e 53 65 67 2d 31 3b 20 69 53 65  iSeg=nSeg-1; iSe
1a490 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
1a4a0 20 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74         fts5SegIt
1a4b0 65 72 49 6e 69 74 28 70 2c 20 26 70 4c 76 6c 2d  erInit(p, &pLvl-
1a4c0 3e 61 53 65 67 5b 69 53 65 67 5d 2c 20 26 70 4e  >aSeg[iSeg], &pN
1a4d0 65 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b  ew->aSeg[iIter++
1a4e0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1a4f0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 49  }.    assert( iI
1a500 74 65 72 3d 3d 6e 53 65 67 20 29 3b 0a 20 20 7d  ter==nSeg );.  }
1a510 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 62  ..  /* If the ab
1a520 6f 76 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ove was successf
1a530 75 6c 2c 20 65 61 63 68 20 63 6f 6d 70 6f 6e 65  ul, each compone
1a540 6e 74 20 69 74 65 72 61 74 6f 72 73 20 6e 6f 77  nt iterators now
1a550 20 70 6f 69 6e 74 73 20 0a 20 20 2a 2a 20 74 6f   points .  ** to
1a560 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
1a570 20 69 6e 20 69 74 73 20 73 65 67 6d 65 6e 74 2e   in its segment.
1a580 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 6e   In this case in
1a590 69 74 69 61 6c 69 7a 65 20 74 68 65 20 0a 20 20  itialize the .  
1a5a0 2a 2a 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  ** aFirst[] arra
1a5b0 79 2e 20 4f 72 2c 20 69 66 20 61 6e 20 65 72 72  y. Or, if an err
1a5c0 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2c  or has occurred,
1a5d0 20 66 72 65 65 20 74 68 65 20 69 74 65 72 61 74   free the iterat
1a5e0 6f 72 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 20 61  or.  ** object a
1a5f0 6e 64 20 73 65 74 20 74 68 65 20 6f 75 74 70 75  nd set the outpu
1a600 74 20 76 61 72 69 61 62 6c 65 20 74 6f 20 4e 55  t variable to NU
1a610 4c 4c 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LL.  */.  if( p-
1a620 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
1a630 7b 0a 20 20 20 20 66 6f 72 28 69 49 74 65 72 3d  {.    for(iIter=
1a640 70 4e 65 77 2d 3e 6e 53 65 67 2d 31 3b 20 69 49  pNew->nSeg-1; iI
1a650 74 65 72 3e 30 3b 20 69 49 74 65 72 2d 2d 29 7b  ter>0; iIter--){
1a660 0a 20 20 20 20 20 20 69 6e 74 20 69 45 71 3b 0a  .      int iEq;.
1a670 20 20 20 20 20 20 69 66 28 20 28 69 45 71 20 3d        if( (iEq =
1a680 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 44 6f   fts5MultiIterDo
1a690 43 6f 6d 70 61 72 65 28 70 4e 65 77 2c 20 69 49  Compare(pNew, iI
1a6a0 74 65 72 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ter)) ){.       
1a6b0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
1a6c0 65 67 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67  eg = &pNew->aSeg
1a6d0 5b 69 45 71 5d 3b 0a 20 20 20 20 20 20 20 20 69  [iEq];.        i
1a6e0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1a6f0 5f 4f 4b 20 29 20 70 53 65 67 2d 3e 78 4e 65 78  _OK ) pSeg->xNex
1a700 74 28 70 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20  t(p, pSeg, 0);. 
1a710 20 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69         fts5Multi
1a720 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
1a730 70 4e 65 77 2c 20 69 45 71 2c 20 69 49 74 65 72  pNew, iEq, iIter
1a740 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1a750 0a 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74  .    fts5MultiIt
1a760 65 72 53 65 74 45 6f 66 28 70 4e 65 77 29 3b 0a  erSetEof(pNew);.
1a770 20 20 20 20 66 74 73 35 41 73 73 65 72 74 4d 75      fts5AssertMu
1a780 6c 74 69 49 74 65 72 53 65 74 75 70 28 70 2c 20  ltiIterSetup(p, 
1a790 70 4e 65 77 29 3b 0a 0a 20 20 20 20 69 66 28 20  pNew);..    if( 
1a7a0 70 4e 65 77 2d 3e 62 53 6b 69 70 45 6d 70 74 79  pNew->bSkipEmpty
1a7b0 20 26 26 20 66 74 73 35 4d 75 6c 74 69 49 74 65   && fts5MultiIte
1a7c0 72 49 73 45 6d 70 74 79 28 70 2c 20 70 4e 65 77  rIsEmpty(p, pNew
1a7d0 29 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d  ) ){.      fts5M
1a7e0 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
1a7f0 70 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 20  pNew, 0, 0);.   
1a800 20 7d 65 6c 73 65 20 69 66 28 20 70 4e 65 77 2d   }else if( pNew-
1a810 3e 62 61 73 65 2e 62 45 6f 66 3d 3d 30 20 29 7b  >base.bEof==0 ){
1a820 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
1a830 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77  er *pSeg = &pNew
1a840 2d 3e 61 53 65 67 5b 70 4e 65 77 2d 3e 61 46 69  ->aSeg[pNew->aFi
1a850 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 5d 3b 0a  rst[1].iFirst];.
1a860 20 20 20 20 20 20 70 4e 65 77 2d 3e 78 53 65 74        pNew->xSet
1a870 4f 75 74 70 75 74 73 28 70 4e 65 77 2c 20 70 53  Outputs(pNew, pS
1a880 65 67 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65  eg);.    }..  }e
1a890 6c 73 65 7b 0a 20 20 20 20 66 74 73 35 4d 75 6c  lse{.    fts5Mul
1a8a0 74 69 49 74 65 72 46 72 65 65 28 70 4e 65 77 29  tiIterFree(pNew)
1a8b0 3b 0a 20 20 20 20 2a 70 70 4f 75 74 20 3d 20 30  ;.    *ppOut = 0
1a8c0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1a8d0 72 65 61 74 65 20 61 6e 20 46 74 73 35 49 74 65  reate an Fts5Ite
1a8e0 72 20 74 68 61 74 20 69 74 65 72 61 74 65 73 20  r that iterates 
1a8f0 74 68 72 6f 75 67 68 20 74 68 65 20 64 6f 63 6c  through the docl
1a900 69 73 74 20 70 72 6f 76 69 64 65 64 0a 2a 2a 20  ist provided.** 
1a910 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1a920 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
1a930 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69  c void fts5Multi
1a940 49 74 65 72 4e 65 77 32 28 0a 20 20 46 74 73 35  IterNew2(.  Fts5
1a950 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1a960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1a970 54 53 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69  TS5 backend to i
1a980 74 65 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f  terate within */
1a990 0a 20 20 46 74 73 35 44 61 74 61 20 2a 70 44 61  .  Fts5Data *pDa
1a9a0 74 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ta,             
1a9b0 20 20 20 2f 2a 20 44 6f 63 6c 69 73 74 20 74 6f     /* Doclist to
1a9c0 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
1a9d0 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73 63 2c   */.  int bDesc,
1a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
1aa00 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72 6f 77  r descending row
1aa10 69 64 20 6f 72 64 65 72 20 2a 2f 0a 20 20 46 74  id order */.  Ft
1aa20 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74 20 20  s5Iter **ppOut  
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa40 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a 29   New object */.)
1aa50 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 4e  {.  Fts5Iter *pN
1aa60 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 66 74 73  ew;.  pNew = fts
1aa70 35 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28  5MultiIterAlloc(
1aa80 70 2c 20 32 29 3b 0a 20 20 69 66 28 20 70 4e 65  p, 2);.  if( pNe
1aa90 77 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67  w ){.    Fts5Seg
1aaa0 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70  Iter *pIter = &p
1aab0 4e 65 77 2d 3e 61 53 65 67 5b 31 5d 3b 0a 0a 20  New->aSeg[1];.. 
1aac0 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20     pIter->flags 
1aad0 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f  = FTS5_SEGITER_O
1aae0 4e 45 54 45 52 4d 3b 0a 20 20 20 20 69 66 28 20  NETERM;.    if( 
1aaf0 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 3e 30 20  pData->szLeaf>0 
1ab00 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
1ab10 70 4c 65 61 66 20 3d 20 70 44 61 74 61 3b 0a 20  pLeaf = pData;. 
1ab20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c 65 61       pIter->iLea
1ab30 66 4f 66 66 73 65 74 20 3d 20 66 74 73 35 47 65  fOffset = fts5Ge
1ab40 74 56 61 72 69 6e 74 28 70 44 61 74 61 2d 3e 70  tVarint(pData->p
1ab50 2c 20 28 75 36 34 2a 29 26 70 49 74 65 72 2d 3e  , (u64*)&pIter->
1ab60 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 70  iRowid);.      p
1ab70 49 74 65 72 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c  Iter->iEndofDocl
1ab80 69 73 74 20 3d 20 70 44 61 74 61 2d 3e 6e 6e 3b  ist = pData->nn;
1ab90 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 61 46 69  .      pNew->aFi
1aba0 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 3d 20  rst[1].iFirst = 
1abb0 31 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44 65  1;.      if( bDe
1abc0 73 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e  sc ){.        pN
1abd0 65 77 2d 3e 62 52 65 76 20 3d 20 31 3b 0a 20 20  ew->bRev = 1;.  
1abe0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61        pIter->fla
1abf0 67 73 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54  gs |= FTS5_SEGIT
1ac00 45 52 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20  ER_REVERSE;.    
1ac10 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 52      fts5SegIterR
1ac20 65 76 65 72 73 65 49 6e 69 74 50 61 67 65 28 70  everseInitPage(p
1ac30 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20  , pIter);.      
1ac40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
1ac50 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64 4e 50  ts5SegIterLoadNP
1ac60 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a 20 20  os(p, pIter);.  
1ac70 20 20 20 20 7d 0a 20 20 20 20 20 20 70 44 61 74      }.      pDat
1ac80 61 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  a = 0;.    }else
1ac90 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 62 61  {.      pNew->ba
1aca0 73 65 2e 62 45 6f 66 20 3d 20 31 3b 0a 20 20 20  se.bEof = 1;.   
1acb0 20 7d 0a 20 20 20 20 66 74 73 35 53 65 67 49 74   }.    fts5SegIt
1acc0 65 72 53 65 74 4e 65 78 74 28 70 2c 20 70 49 74  erSetNext(p, pIt
1acd0 65 72 29 3b 0a 0a 20 20 20 20 2a 70 70 4f 75 74  er);..    *ppOut
1ace0 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 0a 20 20   = pNew;.  }..  
1acf0 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
1ad00 70 44 61 74 61 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pData);.}../*.**
1ad10 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1ad20 74 68 65 20 69 74 65 72 61 74 6f 72 20 69 73 20  the iterator is 
1ad30 61 74 20 45 4f 46 20 6f 72 20 69 66 20 61 6e 20  at EOF or if an 
1ad40 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72  error has occurr
1ad50 65 64 2e 20 0a 2a 2a 20 46 61 6c 73 65 20 6f 74  ed. .** False ot
1ad60 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1ad70 69 63 20 69 6e 74 20 66 74 73 35 4d 75 6c 74 69  ic int fts5Multi
1ad80 49 74 65 72 45 6f 66 28 46 74 73 35 49 6e 64 65  IterEof(Fts5Inde
1ad90 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72 20 2a  x *p, Fts5Iter *
1ada0 70 49 74 65 72 29 7b 0a 20 20 61 73 73 65 72 74  pIter){.  assert
1adb0 28 20 70 2d 3e 72 63 20 0a 20 20 20 20 20 20 7c  ( p->rc .      |
1adc0 7c 20 28 70 49 74 65 72 2d 3e 61 53 65 67 5b 20  | (pIter->aSeg[ 
1add0 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d  pIter->aFirst[1]
1ade0 2e 69 46 69 72 73 74 20 5d 2e 70 4c 65 61 66 3d  .iFirst ].pLeaf=
1adf0 3d 30 29 3d 3d 70 49 74 65 72 2d 3e 62 61 73 65  =0)==pIter->base
1ae00 2e 62 45 6f 66 20 0a 20 20 29 3b 0a 20 20 72 65  .bEof .  );.  re
1ae10 74 75 72 6e 20 28 70 2d 3e 72 63 20 7c 7c 20 70  turn (p->rc || p
1ae20 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f 66 29  Iter->base.bEof)
1ae30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1ae40 6e 20 74 68 65 20 72 6f 77 69 64 20 6f 66 20 74  n the rowid of t
1ae50 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68  he entry that th
1ae60 65 20 69 74 65 72 61 74 6f 72 20 63 75 72 72 65  e iterator curre
1ae70 6e 74 6c 79 20 70 6f 69 6e 74 73 0a 2a 2a 20 74  ntly points.** t
1ae80 6f 2e 20 49 66 20 74 68 65 20 69 74 65 72 61 74  o. If the iterat
1ae90 6f 72 20 70 6f 69 6e 74 73 20 74 6f 20 45 4f 46  or points to EOF
1aea0 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1aeb0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
1aec0 65 0a 2a 2a 20 72 65 73 75 6c 74 73 20 61 72 65  e.** results are
1aed0 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
1aee0 74 61 74 69 63 20 69 36 34 20 66 74 73 35 4d 75  tatic i64 fts5Mu
1aef0 6c 74 69 49 74 65 72 52 6f 77 69 64 28 46 74 73  ltiIterRowid(Fts
1af00 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20  5Iter *pIter){. 
1af10 20 61 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e   assert( pIter->
1af20 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1af30 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
1af40 70 4c 65 61 66 20 29 3b 0a 20 20 72 65 74 75 72  pLeaf );.  retur
1af50 6e 20 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70  n pIter->aSeg[ p
1af60 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
1af70 69 46 69 72 73 74 20 5d 2e 69 52 6f 77 69 64 3b  iFirst ].iRowid;
1af80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1af90 68 65 20 69 74 65 72 61 74 6f 72 20 74 6f 20 74  he iterator to t
1afa0 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20 61 74  he next entry at
1afb0 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 4d   or following iM
1afc0 61 74 63 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  atch..*/.static 
1afd0 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74  void fts5MultiIt
1afe0 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20 46 74  erNextFrom(.  Ft
1aff0 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
1b000 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20  ts5Iter *pIter, 
1b010 0a 20 20 69 36 34 20 69 4d 61 74 63 68 0a 29 7b  .  i64 iMatch.){
1b020 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20  .  while( 1 ){. 
1b030 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 20     i64 iRowid;. 
1b040 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
1b050 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 31  Next(p, pIter, 1
1b060 2c 20 69 4d 61 74 63 68 29 3b 0a 20 20 20 20 69  , iMatch);.    i
1b070 66 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  f( fts5MultiIter
1b080 45 6f 66 28 70 2c 20 70 49 74 65 72 29 20 29 20  Eof(p, pIter) ) 
1b090 62 72 65 61 6b 3b 0a 20 20 20 20 69 52 6f 77 69  break;.    iRowi
1b0a0 64 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65  d = fts5MultiIte
1b0b0 72 52 6f 77 69 64 28 70 49 74 65 72 29 3b 0a 20  rRowid(pIter);. 
1b0c0 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 62 52     if( pIter->bR
1b0d0 65 76 3d 3d 30 20 26 26 20 69 52 6f 77 69 64 3e  ev==0 && iRowid>
1b0e0 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61 6b 3b  =iMatch ) break;
1b0f0 0a 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e  .    if( pIter->
1b100 62 52 65 76 21 3d 30 20 26 26 20 69 52 6f 77 69  bRev!=0 && iRowi
1b110 64 3c 3d 69 4d 61 74 63 68 20 29 20 62 72 65 61  d<=iMatch ) brea
1b120 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
1b130 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1b140 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
1b150 74 61 69 6e 69 6e 67 20 74 68 65 20 74 65 72 6d  taining the term
1b160 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1b170 20 74 68 65 20 0a 2a 2a 20 65 6e 74 72 79 20 74   the .** entry t
1b180 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
1b190 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1b1a0 73 20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  s to..*/.static 
1b1b0 63 6f 6e 73 74 20 75 38 20 2a 66 74 73 35 4d 75  const u8 *fts5Mu
1b1c0 6c 74 69 49 74 65 72 54 65 72 6d 28 46 74 73 35  ltiIterTerm(Fts5
1b1d0 49 74 65 72 20 2a 70 49 74 65 72 2c 20 69 6e 74  Iter *pIter, int
1b1e0 20 2a 70 6e 29 7b 0a 20 20 46 74 73 35 53 65 67   *pn){.  Fts5Seg
1b1f0 49 74 65 72 20 2a 70 20 3d 20 26 70 49 74 65 72  Iter *p = &pIter
1b200 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61  ->aSeg[ pIter->a
1b210 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20  First[1].iFirst 
1b220 5d 3b 0a 20 20 2a 70 6e 20 3d 20 70 2d 3e 74 65  ];.  *pn = p->te
1b230 72 6d 2e 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70  rm.n;.  return p
1b240 2d 3e 74 65 72 6d 2e 70 3b 0a 7d 0a 0a 2f 2a 0a  ->term.p;.}../*.
1b250 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65  ** Allocate a ne
1b260 77 20 73 65 67 6d 65 6e 74 2d 69 64 20 66 6f 72  w segment-id for
1b270 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20 70   the structure p
1b280 53 74 72 75 63 74 2e 20 54 68 65 20 6e 65 77 20  Struct. The new 
1b290 73 65 67 6d 65 6e 74 0a 2a 2a 20 69 64 20 6d 75  segment.** id mu
1b2a0 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 31 20  st be between 1 
1b2b0 61 6e 64 20 36 35 33 33 35 20 69 6e 63 6c 75 73  and 65335 inclus
1b2c0 69 76 65 2c 20 61 6e 64 20 6d 75 73 74 20 6e 6f  ive, and must no
1b2d0 74 20 62 65 20 75 73 65 64 20 62 79 20 0a 2a 2a  t be used by .**
1b2e0 20 61 6e 79 20 63 75 72 72 65 6e 74 6c 79 20 65   any currently e
1b2f0 78 69 73 74 69 6e 67 20 73 65 67 6d 65 6e 74 2e  xisting segment.
1b300 20 49 66 20 61 20 66 72 65 65 20 73 65 67 6d 65   If a free segme
1b310 6e 74 20 69 64 20 63 61 6e 6e 6f 74 20 62 65 20  nt id cannot be 
1b320 66 6f 75 6e 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  found,.** SQLITE
1b330 5f 46 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  _FULL is returne
1b340 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  d..**.** If an e
1b350 72 72 6f 72 20 68 61 73 20 61 6c 72 65 61 64 79  rror has already
1b360 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73 20   occurred, this 
1b370 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
1b380 2d 6f 70 2e 20 30 20 69 73 20 0a 2a 2a 20 72 65  -op. 0 is .** re
1b390 74 75 72 6e 65 64 20 69 6e 20 74 68 69 73 20 63  turned in this c
1b3a0 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
1b3b0 6e 74 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53  nt fts5AllocateS
1b3c0 65 67 69 64 28 46 74 73 35 49 6e 64 65 78 20 2a  egid(Fts5Index *
1b3d0 70 2c 20 46 74 73 35 53 74 72 75 63 74 75 72 65  p, Fts5Structure
1b3e0 20 2a 70 53 74 72 75 63 74 29 7b 0a 20 20 69 6e   *pStruct){.  in
1b3f0 74 20 69 53 65 67 69 64 20 3d 20 30 3b 0a 0a 20  t iSegid = 0;.. 
1b400 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1b410 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
1b420 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
1b430 6e 74 3e 3d 46 54 53 35 5f 4d 41 58 5f 53 45 47  nt>=FTS5_MAX_SEG
1b440 4d 45 4e 54 20 29 7b 0a 20 20 20 20 20 20 70 2d  MENT ){.      p-
1b450 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c  >rc = SQLITE_FUL
1b460 4c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  L;.    }else{.  
1b470 20 20 20 20 2f 2a 20 46 54 53 35 5f 4d 41 58 5f      /* FTS5_MAX_
1b480 53 45 47 4d 45 4e 54 20 69 73 20 63 75 72 72 65  SEGMENT is curre
1b490 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 61 73 20  ntly defined as 
1b4a0 32 30 30 30 2e 20 53 6f 20 74 68 65 20 66 6f 6c  2000. So the fol
1b4b0 6c 6f 77 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  lowing.      ** 
1b4c0 61 72 72 61 79 20 69 73 20 36 33 20 65 6c 65 6d  array is 63 elem
1b4d0 65 6e 74 73 2c 20 6f 72 20 32 35 32 20 62 79 74  ents, or 252 byt
1b4e0 65 73 2c 20 69 6e 20 73 69 7a 65 2e 20 20 2a 2f  es, in size.  */
1b4f0 0a 20 20 20 20 20 20 75 33 32 20 61 55 73 65 64  .      u32 aUsed
1b500 5b 28 46 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45  [(FTS5_MAX_SEGME
1b510 4e 54 2b 33 31 29 20 2f 20 33 32 5d 3b 0a 20 20  NT+31) / 32];.  
1b520 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69 53      int iLvl, iS
1b530 65 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  eg;.      int i;
1b540 0a 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b  .      u32 mask;
1b550 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61 55  .      memset(aU
1b560 73 65 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  sed, 0, sizeof(a
1b570 55 73 65 64 29 29 3b 0a 20 20 20 20 20 20 66 6f  Used));.      fo
1b580 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70  r(iLvl=0; iLvl<p
1b590 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20  Struct->nLevel; 
1b5a0 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  iLvl++){.       
1b5b0 20 66 6f 72 28 69 53 65 67 3d 30 3b 20 69 53 65   for(iSeg=0; iSe
1b5c0 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  g<pStruct->aLeve
1b5d0 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53  l[iLvl].nSeg; iS
1b5e0 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  eg++){.         
1b5f0 20 69 6e 74 20 69 49 64 20 3d 20 70 53 74 72 75   int iId = pStru
1b600 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b610 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53 65 67  .aSeg[iSeg].iSeg
1b620 69 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  id;.          if
1b630 28 20 69 49 64 3c 3d 46 54 53 35 5f 4d 41 58 5f  ( iId<=FTS5_MAX_
1b640 53 45 47 4d 45 4e 54 20 26 26 20 69 49 64 3e 30  SEGMENT && iId>0
1b650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1b660 61 55 73 65 64 5b 28 69 49 64 2d 31 29 20 2f 20  aUsed[(iId-1) / 
1b670 33 32 5d 20 7c 3d 20 28 75 33 32 29 31 20 3c 3c  32] |= (u32)1 <<
1b680 20 28 28 69 49 64 2d 31 29 20 25 20 33 32 29 3b   ((iId-1) % 32);
1b690 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
1b6b0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
1b6c0 55 73 65 64 5b 69 5d 3d 3d 30 78 46 46 46 46 46  Used[i]==0xFFFFF
1b6d0 46 46 46 3b 20 69 2b 2b 29 3b 0a 20 20 20 20 20  FFF; i++);.     
1b6e0 20 6d 61 73 6b 20 3d 20 61 55 73 65 64 5b 69 5d   mask = aUsed[i]
1b6f0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 53 65 67  ;.      for(iSeg
1b700 69 64 3d 30 3b 20 6d 61 73 6b 20 26 20 28 28 75  id=0; mask & ((u
1b710 33 32 29 31 20 3c 3c 20 69 53 65 67 69 64 29 3b  32)1 << iSegid);
1b720 20 69 53 65 67 69 64 2b 2b 29 3b 0a 20 20 20 20   iSegid++);.    
1b730 20 20 69 53 65 67 69 64 20 2b 3d 20 31 20 2b 20    iSegid += 1 + 
1b740 69 2a 33 32 3b 0a 0a 23 69 66 64 65 66 20 53 51  i*32;..#ifdef SQ
1b750 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20  LITE_DEBUG.     
1b760 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
1b770 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
1b780 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
1b790 20 20 20 20 66 6f 72 28 69 53 65 67 3d 30 3b 20      for(iSeg=0; 
1b7a0 69 53 65 67 3c 70 53 74 72 75 63 74 2d 3e 61 4c  iSeg<pStruct->aL
1b7b0 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3b  evel[iLvl].nSeg;
1b7c0 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iSeg++){.      
1b7d0 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
1b7e0 53 65 67 69 64 21 3d 70 53 74 72 75 63 74 2d 3e  Segid!=pStruct->
1b7f0 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
1b800 67 5b 69 53 65 67 5d 2e 69 53 65 67 69 64 20 29  g[iSeg].iSegid )
1b810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1b820 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1b830 5f 6e 63 28 20 69 53 65 67 69 64 3e 30 20 26 26  _nc( iSegid>0 &&
1b840 20 69 53 65 67 69 64 3c 3d 46 54 53 35 5f 4d 41   iSegid<=FTS5_MA
1b850 58 5f 53 45 47 4d 45 4e 54 20 29 3b 0a 0a 20 20  X_SEGMENT );..  
1b860 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 73 71      {.        sq
1b870 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 64 78  lite3_stmt *pIdx
1b880 53 65 6c 65 63 74 20 3d 20 66 74 73 35 49 64 78  Select = fts5Idx
1b890 53 65 6c 65 63 74 53 74 6d 74 28 70 29 3b 0a 20  SelectStmt(p);. 
1b8a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63         if( p->rc
1b8b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b8c0 20 20 20 20 20 20 20 20 20 75 38 20 61 42 6c 6f           u8 aBlo
1b8d0 62 5b 32 5d 20 3d 20 7b 30 78 66 66 2c 20 30 78  b[2] = {0xff, 0x
1b8e0 66 66 7d 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ff};.          s
1b8f0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
1b900 70 49 64 78 53 65 6c 65 63 74 2c 20 31 2c 20 69  pIdxSelect, 1, i
1b910 53 65 67 69 64 29 3b 0a 20 20 20 20 20 20 20 20  Segid);.        
1b920 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
1b930 6c 6f 62 28 70 49 64 78 53 65 6c 65 63 74 2c 20  lob(pIdxSelect, 
1b940 32 2c 20 61 42 6c 6f 62 2c 20 32 2c 20 53 51 4c  2, aBlob, 2, SQL
1b950 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1b960 20 20 20 20 20 20 20 61 73 73 65 72 74 5f 6e 63         assert_nc
1b970 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1b980 49 64 78 53 65 6c 65 63 74 29 21 3d 53 51 4c 49  IdxSelect)!=SQLI
1b990 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 20 20  TE_ROW );.      
1b9a0 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69      p->rc = sqli
1b9b0 74 65 33 5f 72 65 73 65 74 28 70 49 64 78 53 65  te3_reset(pIdxSe
1b9c0 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 20  lect);.         
1b9d0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
1b9e0 6c 6c 28 70 49 64 78 53 65 6c 65 63 74 2c 20 32  ll(pIdxSelect, 2
1b9f0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1ba00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1ba10 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1ba20 69 53 65 67 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iSegid;.}../*.**
1ba30 20 44 69 73 63 61 72 64 20 61 6c 6c 20 64 61 74   Discard all dat
1ba40 61 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  a currently cach
1ba50 65 64 20 69 6e 20 74 68 65 20 68 61 73 68 2d 74  ed in the hash-t
1ba60 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1ba70 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 44   void fts5IndexD
1ba80 69 73 63 61 72 64 44 61 74 61 28 46 74 73 35 49  iscardData(Fts5I
1ba90 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65  ndex *p){.  asse
1baa0 72 74 28 20 70 2d 3e 70 48 61 73 68 20 7c 7c 20  rt( p->pHash || 
1bab0 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 3d  p->nPendingData=
1bac0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
1bad0 48 61 73 68 20 29 7b 0a 20 20 20 20 73 71 6c 69  Hash ){.    sqli
1bae0 74 65 33 46 74 73 35 48 61 73 68 43 6c 65 61 72  te3Fts5HashClear
1baf0 28 70 2d 3e 70 48 61 73 68 29 3b 0a 20 20 20 20  (p->pHash);.    
1bb00 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61 20  p->nPendingData 
1bb10 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 0;.  }.}../*.*
1bb20 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  * Return the siz
1bb30 65 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 2c  e of the prefix,
1bb40 20 69 6e 20 62 79 74 65 73 2c 20 74 68 61 74 20   in bytes, that 
1bb50 62 75 66 66 65 72 20 0a 2a 2a 20 28 70 4e 65 77  buffer .** (pNew
1bb60 2f 3c 6c 65 6e 67 74 68 2d 75 6e 6b 6e 6f 77 6e  /<length-unknown
1bb70 3e 29 20 73 68 61 72 65 73 20 77 69 74 68 20 62  >) shares with b
1bb80 75 66 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64  uffer (pOld/nOld
1bb90 29 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72 20  )..**.** Buffer 
1bba0 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75 6e  (pNew/<length-un
1bbb0 6b 6e 6f 77 6e 3e 29 20 69 73 20 67 75 61 72 61  known>) is guara
1bbc0 6e 74 65 65 64 20 74 6f 20 62 65 20 67 72 65 61  nteed to be grea
1bbd0 74 65 72 20 0a 2a 2a 20 74 68 61 6e 20 62 75 66  ter .** than buf
1bbe0 66 65 72 20 28 70 4f 6c 64 2f 6e 4f 6c 64 29 2e  fer (pOld/nOld).
1bbf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1bc00 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65 73  ts5PrefixCompres
1bc10 73 28 69 6e 74 20 6e 4f 6c 64 2c 20 63 6f 6e 73  s(int nOld, cons
1bc20 74 20 75 38 20 2a 70 4f 6c 64 2c 20 63 6f 6e 73  t u8 *pOld, cons
1bc30 74 20 75 38 20 2a 70 4e 65 77 29 7b 0a 20 20 69  t u8 *pNew){.  i
1bc40 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
1bc50 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
1bc60 20 20 20 69 66 28 20 70 4f 6c 64 5b 69 5d 21 3d     if( pOld[i]!=
1bc70 70 4e 65 77 5b 69 5d 20 29 20 62 72 65 61 6b 3b  pNew[i] ) break;
1bc80 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
1bc90 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1bca0 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 43 6c  fts5WriteDlidxCl
1bcb0 65 61 72 28 0a 20 20 46 74 73 35 49 6e 64 65 78  ear(.  Fts5Index
1bcc0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1bcd0 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
1bce0 20 20 69 6e 74 20 62 46 6c 75 73 68 20 20 20 20    int bFlush    
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd00 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 77 72    /* If true, wr
1bd10 69 74 65 20 64 6c 69 64 78 20 74 6f 20 64 69 73  ite dlidx to dis
1bd20 6b 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  k */.){.  int i;
1bd30 0a 20 20 61 73 73 65 72 74 28 20 62 46 6c 75 73  .  assert( bFlus
1bd40 68 3d 3d 30 20 7c 7c 20 28 70 57 72 69 74 65 72  h==0 || (pWriter
1bd50 2d 3e 6e 44 6c 69 64 78 3e 30 20 26 26 20 70 57  ->nDlidx>0 && pW
1bd60 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d  riter->aDlidx[0]
1bd70 2e 62 75 66 2e 6e 3e 30 29 20 29 3b 0a 20 20 66  .buf.n>0) );.  f
1bd80 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74 65  or(i=0; i<pWrite
1bd90 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29 7b  r->nDlidx; i++){
1bda0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72  .    Fts5DlidxWr
1bdb0 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26  iter *pDlidx = &
1bdc0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1bdd0 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 6c 69  i];.    if( pDli
1bde0 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29 20 62  dx->buf.n==0 ) b
1bdf0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 46  reak;.    if( bF
1be00 6c 75 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  lush ){.      as
1be10 73 65 72 74 28 20 70 44 6c 69 64 78 2d 3e 70 67  sert( pDlidx->pg
1be20 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66  no!=0 );.      f
1be30 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1be40 0a 20 20 20 20 20 20 20 20 20 20 46 54 53 35 5f  .          FTS5_
1be50 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57 72 69  DLIDX_ROWID(pWri
1be60 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69 2c 20  ter->iSegid, i, 
1be70 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c 0a 20  pDlidx->pgno),. 
1be80 20 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 2d           pDlidx-
1be90 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78 2d 3e  >buf.p, pDlidx->
1bea0 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b 0a 20  buf.n.      );. 
1beb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1bec0 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
1bed0 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
1bee0 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65 76 56    pDlidx->bPrevV
1bef0 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  alid = 0;.  }.}.
1bf00 0a 2f 2a 0a 2a 2a 20 47 72 6f 77 20 74 68 65 20  ./*.** Grow the 
1bf10 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1bf20 5d 20 61 72 72 61 79 20 74 6f 20 61 74 20 6c 65  ] array to at le
1bf30 61 73 74 20 6e 4c 76 6c 20 65 6c 65 6d 65 6e 74  ast nLvl element
1bf40 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 20 41 6e  s in size..** An
1bf50 79 20 6e 65 77 20 61 72 72 61 79 20 65 6c 65 6d  y new array elem
1bf60 65 6e 74 73 20 61 72 65 20 7a 65 72 6f 65 64 20  ents are zeroed 
1bf70 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1bf80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bf90 66 74 73 35 57 72 69 74 65 44 6c 69 64 78 47 72  fts5WriteDlidxGr
1bfa0 6f 77 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  ow(.  Fts5Index 
1bfb0 2a 70 2c 0a 20 20 46 74 73 35 53 65 67 57 72 69  *p,.  Fts5SegWri
1bfc0 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a 20 20  ter *pWriter,.  
1bfd0 69 6e 74 20 6e 4c 76 6c 0a 29 7b 0a 20 20 69 66  int nLvl.){.  if
1bfe0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
1bff0 4f 4b 20 26 26 20 6e 4c 76 6c 3e 3d 70 57 72 69  OK && nLvl>=pWri
1c000 74 65 72 2d 3e 6e 44 6c 69 64 78 20 29 7b 0a 20  ter->nDlidx ){. 
1c010 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69 74     Fts5DlidxWrit
1c020 65 72 20 2a 61 44 6c 69 64 78 20 3d 20 28 46 74  er *aDlidx = (Ft
1c030 73 35 44 6c 69 64 78 57 72 69 74 65 72 2a 29 73  s5DlidxWriter*)s
1c040 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34  qlite3_realloc64
1c050 28 0a 20 20 20 20 20 20 20 20 70 57 72 69 74 65  (.        pWrite
1c060 72 2d 3e 61 44 6c 69 64 78 2c 20 73 69 7a 65 6f  r->aDlidx, sizeo
1c070 66 28 46 74 73 35 44 6c 69 64 78 57 72 69 74 65  f(Fts5DlidxWrite
1c080 72 29 20 2a 20 6e 4c 76 6c 0a 20 20 20 20 29 3b  r) * nLvl.    );
1c090 0a 20 20 20 20 69 66 28 20 61 44 6c 69 64 78 3d  .    if( aDlidx=
1c0a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  =0 ){.      p->r
1c0b0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c0c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1c0d0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
1c0e0 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 57  izeof(Fts5DlidxW
1c0f0 72 69 74 65 72 29 20 2a 20 28 6e 4c 76 6c 20 2d  riter) * (nLvl -
1c100 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
1c110 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
1c120 26 61 44 6c 69 64 78 5b 70 57 72 69 74 65 72 2d  &aDlidx[pWriter-
1c130 3e 6e 44 6c 69 64 78 5d 2c 20 30 2c 20 6e 42 79  >nDlidx], 0, nBy
1c140 74 65 29 3b 0a 20 20 20 20 20 20 70 57 72 69 74  te);.      pWrit
1c150 65 72 2d 3e 61 44 6c 69 64 78 20 3d 20 61 44 6c  er->aDlidx = aDl
1c160 69 64 78 3b 0a 20 20 20 20 20 20 70 57 72 69 74  idx;.      pWrit
1c170 65 72 2d 3e 6e 44 6c 69 64 78 20 3d 20 6e 4c 76  er->nDlidx = nLv
1c180 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  l;.    }.  }.  r
1c190 65 74 75 72 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a  eturn p->rc;.}..
1c1a0 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  /*.** If the cur
1c1b0 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69 6e 64  rent doclist-ind
1c1c0 65 78 20 61 63 63 75 6d 75 6c 61 74 69 6e 67 20  ex accumulating 
1c1d0 69 6e 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  in pWriter->aDli
1c1e0 64 78 5b 5d 20 69 73 20 6c 61 72 67 65 0a 2a 2a  dx[] is large.**
1c1f0 20 65 6e 6f 75 67 68 2c 20 66 6c 75 73 68 20 69   enough, flush i
1c200 74 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 72 65  t to disk and re
1c210 74 75 72 6e 20 31 2e 20 4f 74 68 65 72 77 69 73  turn 1. Otherwis
1c220 65 20 64 69 73 63 61 72 64 20 69 74 20 61 6e 64  e discard it and
1c230 20 72 65 74 75 72 6e 0a 2a 2a 20 7a 65 72 6f 2e   return.** zero.
1c240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1c250 74 73 35 57 72 69 74 65 46 6c 75 73 68 44 6c 69  ts5WriteFlushDli
1c260 64 78 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  dx(Fts5Index *p,
1c270 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1c280 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74 20  pWriter){.  int 
1c290 62 46 6c 61 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a  bFlag = 0;..  /*
1c2a0 20 49 66 20 74 68 65 72 65 20 77 65 72 65 20 46   If there were F
1c2b0 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
1c2c0 5a 45 20 6f 72 20 6d 6f 72 65 20 65 6d 70 74 79  ZE or more empty
1c2d0 20 6c 65 61 66 20 70 61 67 65 73 20 77 72 69 74   leaf pages writ
1c2e0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
1c2f0 64 61 74 61 62 61 73 65 2c 20 61 6c 73 6f 20 77  database, also w
1c300 72 69 74 65 20 74 68 65 20 64 6f 63 6c 69 73 74  rite the doclist
1c310 2d 69 6e 64 65 78 20 74 6f 20 64 69 73 6b 2e 20  -index to disk. 
1c320 20 2a 2f 0a 20 20 69 66 28 20 70 57 72 69 74 65   */.  if( pWrite
1c330 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75 66  r->aDlidx[0].buf
1c340 2e 6e 3e 30 20 26 26 20 70 57 72 69 74 65 72 2d  .n>0 && pWriter-
1c350 3e 6e 45 6d 70 74 79 3e 3d 46 54 53 35 5f 4d 49  >nEmpty>=FTS5_MI
1c360 4e 5f 44 4c 49 44 58 5f 53 49 5a 45 20 29 7b 0a  N_DLIDX_SIZE ){.
1c370 20 20 20 20 62 46 6c 61 67 20 3d 20 31 3b 0a 20      bFlag = 1;. 
1c380 20 7d 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c   }.  fts5WriteDl
1c390 69 64 78 43 6c 65 61 72 28 70 2c 20 70 57 72 69  idxClear(p, pWri
1c3a0 74 65 72 2c 20 62 46 6c 61 67 29 3b 0a 20 20 70  ter, bFlag);.  p
1c3b0 57 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 20 3d  Writer->nEmpty =
1c3c0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 62 46 6c   0;.  return bFl
1c3d0 61 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ag;.}../*.** Thi
1c3e0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1c3f0 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 70 72  lled whenever pr
1c400 6f 63 65 73 73 69 6e 67 20 6f 66 20 74 68 65 20  ocessing of the 
1c410 64 6f 63 6c 69 73 74 20 66 6f 72 20 74 68 65 20  doclist for the 
1c420 0a 2a 2a 20 6c 61 73 74 20 74 65 72 6d 20 6f 6e  .** last term on
1c430 20 6c 65 61 66 20 70 61 67 65 20 28 70 57 72 69   leaf page (pWri
1c440 74 65 72 2d 3e 69 42 74 50 61 67 65 29 20 69 73  ter->iBtPage) is
1c450 20 63 6f 6d 70 6c 65 74 65 64 2e 20 0a 2a 2a 0a   completed. .**.
1c460 2a 2a 20 54 68 65 20 64 6f 63 6c 69 73 74 2d 69  ** The doclist-i
1c470 6e 64 65 78 20 66 6f 72 20 74 68 61 74 20 74 65  ndex for that te
1c480 72 6d 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  rm is currently 
1c490 73 74 6f 72 65 64 20 69 6e 2d 6d 65 6d 6f 72 79  stored in-memory
1c4a0 20 77 69 74 68 69 6e 20 74 68 65 0a 2a 2a 20 46   within the.** F
1c4b0 74 73 35 53 65 67 57 72 69 74 65 72 2e 61 44 6c  ts5SegWriter.aDl
1c4c0 69 64 78 5b 5d 20 61 72 72 61 79 2e 20 49 66 20  idx[] array. If 
1c4d0 69 74 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  it is large enou
1c4e0 67 68 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  gh, this functio
1c4f0 6e 0a 2a 2a 20 77 72 69 74 65 73 20 69 74 20 6f  n.** writes it o
1c500 75 74 20 74 6f 20 64 69 73 6b 2e 20 4f 72 2c 20  ut to disk. Or, 
1c510 69 66 20 69 74 20 69 73 20 74 6f 6f 20 73 6d 61  if it is too sma
1c520 6c 6c 20 74 6f 20 62 6f 74 68 65 72 20 77 69 74  ll to bother wit
1c530 68 2c 20 64 69 73 63 61 72 64 73 0a 2a 2a 20 69  h, discards.** i
1c540 74 2e 0a 2a 2a 0a 2a 2a 20 46 74 73 35 53 65 67  t..**.** Fts5Seg
1c550 57 72 69 74 65 72 2e 62 74 74 65 72 6d 20 63 75  Writer.btterm cu
1c560 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1c570 20 74 68 65 20 66 69 72 73 74 20 74 65 72 6d 20   the first term 
1c580 6f 6e 20 70 61 67 65 20 69 42 74 50 61 67 65 2e  on page iBtPage.
1c590 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c5a0 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74  fts5WriteFlushBt
1c5b0 72 65 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ree(Fts5Index *p
1c5c0 2c 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20  , Fts5SegWriter 
1c5d0 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 69 6e 74  *pWriter){.  int
1c5e0 20 62 46 6c 61 67 3b 0a 0a 20 20 61 73 73 65 72   bFlag;..  asser
1c5f0 74 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  t( pWriter->iBtP
1c600 61 67 65 20 7c 7c 20 70 57 72 69 74 65 72 2d 3e  age || pWriter->
1c610 6e 45 6d 70 74 79 3d 3d 30 20 29 3b 0a 20 20 69  nEmpty==0 );.  i
1c620 66 28 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50  f( pWriter->iBtP
1c630 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  age==0 ) return;
1c640 0a 20 20 62 46 6c 61 67 20 3d 20 66 74 73 35 57  .  bFlag = fts5W
1c650 72 69 74 65 46 6c 75 73 68 44 6c 69 64 78 28 70  riteFlushDlidx(p
1c660 2c 20 70 57 72 69 74 65 72 29 3b 0a 0a 20 20 69  , pWriter);..  i
1c670 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
1c680 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
1c690 20 63 68 61 72 20 2a 7a 20 3d 20 28 70 57 72 69   char *z = (pWri
1c6a0 74 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 3e 30 3f  ter->btterm.n>0?
1c6b0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 57 72  (const char*)pWr
1c6c0 69 74 65 72 2d 3e 62 74 74 65 72 6d 2e 70 3a 22  iter->btterm.p:"
1c6d0 22 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  ");.    /* The f
1c6e0 6f 6c 6c 6f 77 69 6e 67 20 77 61 73 20 61 6c 72  ollowing was alr
1c6f0 65 61 64 79 20 64 6f 6e 65 20 69 6e 20 66 74 73  eady done in fts
1c700 35 57 72 69 74 65 49 6e 69 74 28 29 3a 20 2a 2f  5WriteInit(): */
1c710 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
1c720 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49 64 78  bind_int(p->pIdx
1c730 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72 69 74  Writer, 1, pWrit
1c740 65 72 2d 3e 69 53 65 67 69 64 29 3b 20 2a 2f 0a  er->iSegid); */.
1c750 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1c760 5f 62 6c 6f 62 28 70 2d 3e 70 49 64 78 57 72 69  _blob(p->pIdxWri
1c770 74 65 72 2c 20 32 2c 20 7a 2c 20 70 57 72 69 74  ter, 2, z, pWrit
1c780 65 72 2d 3e 62 74 74 65 72 6d 2e 6e 2c 20 53 51  er->btterm.n, SQ
1c790 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1c7a0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1c7b0 6e 74 36 34 28 70 2d 3e 70 49 64 78 57 72 69 74  nt64(p->pIdxWrit
1c7c0 65 72 2c 20 33 2c 20 62 46 6c 61 67 20 2b 20 28  er, 3, bFlag + (
1c7d0 28 69 36 34 29 70 57 72 69 74 65 72 2d 3e 69 42  (i64)pWriter->iB
1c7e0 74 50 61 67 65 3c 3c 31 29 29 3b 0a 20 20 20 20  tPage<<1));.    
1c7f0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 2d 3e  sqlite3_step(p->
1c800 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
1c810 20 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65 33   p->rc = sqlite3
1c820 5f 72 65 73 65 74 28 70 2d 3e 70 49 64 78 57 72  _reset(p->pIdxWr
1c830 69 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  iter);.    sqlit
1c840 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 2d 3e  e3_bind_null(p->
1c850 70 49 64 78 57 72 69 74 65 72 2c 20 32 29 3b 0a  pIdxWriter, 2);.
1c860 20 20 7d 0a 20 20 70 57 72 69 74 65 72 2d 3e 69    }.  pWriter->i
1c870 42 74 50 61 67 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  BtPage = 0;.}../
1c880 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
1c890 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
1c8a0 68 20 6c 65 61 66 20 70 61 67 65 20 65 78 63 65  h leaf page exce
1c8b0 70 74 20 74 68 65 20 66 69 72 73 74 20 74 68 61  pt the first tha
1c8c0 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 74  t contains.** at
1c8d0 20 6c 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2e   least one term.
1c8e0 20 41 72 67 75 6d 65 6e 74 20 28 6e 54 65 72 6d   Argument (nTerm
1c8f0 2f 70 54 65 72 6d 29 20 69 73 20 74 68 65 20 73  /pTerm) is the s
1c900 70 6c 69 74 2d 6b 65 79 20 2d 20 61 20 74 65 72  plit-key - a ter
1c910 6d 20 74 68 61 74 0a 2a 2a 20 69 73 20 6c 61 72  m that.** is lar
1c920 67 65 72 20 74 68 61 6e 20 61 6c 6c 20 74 65 72  ger than all ter
1c930 6d 73 20 77 72 69 74 74 65 6e 20 74 6f 20 65 61  ms written to ea
1c940 72 6c 69 65 72 20 6c 65 61 76 65 73 2c 20 61 6e  rlier leaves, an
1c950 64 20 65 71 75 61 6c 20 74 6f 20 6f 72 0a 2a 2a  d equal to or.**
1c960 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1c970 65 20 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20  e first term on 
1c980 74 68 65 20 6e 65 77 20 6c 65 61 66 2e 0a 2a 2a  the new leaf..**
1c990 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
1c9a0 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72  occurs, an error
1c9b0 20 63 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e   code is left in
1c9c0 20 46 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49   Fts5Index.rc. I
1c9d0 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 68 61  f an error.** ha
1c9e0 73 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72  s already occurr
1c9f0 65 64 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ed when this fun
1ca00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1ca10 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
1ca20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1ca30 74 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72  ts5WriteBtreeTer
1ca40 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  m(.  Fts5Index *
1ca50 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
1ca60 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
1ca70 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
1ca80 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20 2a   Fts5SegWriter *
1ca90 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20 20  pWriter,        
1caa0 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65 63   /* Writer objec
1cab0 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 72 6d  t */.  int nTerm
1cac0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65 72  , const u8 *pTer
1cad0 6d 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  m      /* First 
1cae0 74 65 72 6d 20 6f 6e 20 6e 65 77 20 70 61 67 65  term on new page
1caf0 20 2a 2f 0a 29 7b 0a 20 20 66 74 73 35 57 72 69   */.){.  fts5Wri
1cb00 74 65 46 6c 75 73 68 42 74 72 65 65 28 70 2c 20  teFlushBtree(p, 
1cb10 70 57 72 69 74 65 72 29 3b 0a 20 20 69 66 28 20  pWriter);.  if( 
1cb20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1cb30 20 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66   ){.    fts5Buff
1cb40 65 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 70  erSet(&p->rc, &p
1cb50 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d 2c 20  Writer->btterm, 
1cb60 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
1cb70 20 20 20 70 57 72 69 74 65 72 2d 3e 69 42 74 50     pWriter->iBtP
1cb80 61 67 65 20 3d 20 70 57 72 69 74 65 72 2d 3e 77  age = pWriter->w
1cb90 72 69 74 65 72 2e 70 67 6e 6f 3b 0a 20 20 7d 0a  riter.pgno;.  }.
1cba0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1cbb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1cbc0 20 77 68 65 6e 20 66 6c 75 73 68 69 6e 67 20 61   when flushing a
1cbd0 20 6c 65 61 66 20 70 61 67 65 20 74 68 61 74 20   leaf page that 
1cbe0 63 6f 6e 74 61 69 6e 73 20 6e 6f 0a 2a 2a 20 74  contains no.** t
1cbf0 65 72 6d 73 20 61 74 20 61 6c 6c 20 74 6f 20 64  erms at all to d
1cc00 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  isk..*/.static v
1cc10 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74 72  oid fts5WriteBtr
1cc20 65 65 4e 6f 54 65 72 6d 28 0a 20 20 46 74 73 35  eeNoTerm(.  Fts5
1cc30 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
1cc40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1cc50 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
1cc60 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57  ct */.  Fts5SegW
1cc70 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 20 20  riter *pWriter  
1cc80 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
1cc90 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
1cca0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 65 72   /* If there wer
1ccb0 65 20 6e 6f 20 72 6f 77 69 64 73 20 6f 6e 20 74  e no rowids on t
1ccc0 68 65 20 6c 65 61 66 20 70 61 67 65 20 65 69 74  he leaf page eit
1ccd0 68 65 72 20 61 6e 64 20 74 68 65 20 64 6f 63 6c  her and the docl
1cce0 69 73 74 2d 69 6e 64 65 78 0a 20 20 2a 2a 20 68  ist-index.  ** h
1ccf0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1cd00 73 74 61 72 74 65 64 2c 20 61 70 70 65 6e 64 20  started, append 
1cd10 61 6e 20 30 78 30 30 20 62 79 74 65 20 74 6f 20  an 0x00 byte to 
1cd20 69 74 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 57  it.  */.  if( pW
1cd30 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1cd40 69 64 49 6e 50 61 67 65 20 26 26 20 70 57 72 69  idInPage && pWri
1cd50 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62  ter->aDlidx[0].b
1cd60 75 66 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 46 74  uf.n>0 ){.    Ft
1cd70 73 35 44 6c 69 64 78 57 72 69 74 65 72 20 2a 70  s5DlidxWriter *p
1cd80 44 6c 69 64 78 20 3d 20 26 70 57 72 69 74 65 72  Dlidx = &pWriter
1cd90 2d 3e 61 44 6c 69 64 78 5b 30 5d 3b 0a 20 20 20  ->aDlidx[0];.   
1cda0 20 61 73 73 65 72 74 28 20 70 44 6c 69 64 78 2d   assert( pDlidx-
1cdb0 3e 62 50 72 65 76 56 61 6c 69 64 20 29 3b 0a 20  >bPrevValid );. 
1cdc0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1cdd0 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
1cde0 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78  (&p->rc, &pDlidx
1cdf0 2d 3e 62 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 0a  ->buf, 0);.  }..
1ce00 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1ce10 68 65 20 22 6e 75 6d 62 65 72 20 6f 66 20 73 65  he "number of se
1ce20 71 75 65 6e 74 69 61 6c 20 6c 65 61 76 65 73 20  quential leaves 
1ce30 77 69 74 68 6f 75 74 20 61 20 74 65 72 6d 22 20  without a term" 
1ce40 63 6f 75 6e 74 65 72 2e 20 2a 2f 0a 20 20 70 57  counter. */.  pW
1ce50 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 2b 2b 3b  riter->nEmpty++;
1ce60 0a 7d 0a 0a 73 74 61 74 69 63 20 69 36 34 20 66  .}..static i64 f
1ce70 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
1ce80 69 72 73 74 52 6f 77 69 64 28 46 74 73 35 42 75  irstRowid(Fts5Bu
1ce90 66 66 65 72 20 2a 70 42 75 66 29 7b 0a 20 20 69  ffer *pBuf){.  i
1cea0 36 34 20 69 52 6f 77 69 64 3b 0a 20 20 69 6e 74  64 iRowid;.  int
1ceb0 20 69 4f 66 66 3b 0a 0a 20 20 69 4f 66 66 20 3d   iOff;..  iOff =
1cec0 20 31 20 2b 20 66 74 73 35 47 65 74 56 61 72 69   1 + fts5GetVari
1ced0 6e 74 28 26 70 42 75 66 2d 3e 70 5b 31 5d 2c 20  nt(&pBuf->p[1], 
1cee0 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1cef0 20 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28    fts5GetVarint(
1cf00 26 70 42 75 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20  &pBuf->p[iOff], 
1cf10 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b 0a  (u64*)&iRowid);.
1cf20 20 20 72 65 74 75 72 6e 20 69 52 6f 77 69 64 3b    return iRowid;
1cf30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 77 69 64 20  .}../*.** Rowid 
1cf40 69 52 6f 77 69 64 20 68 61 73 20 6a 75 73 74 20  iRowid has just 
1cf50 62 65 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f  been appended to
1cf60 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61   the current lea
1cf70 66 20 70 61 67 65 2e 20 49 74 20 69 73 20 74 68  f page. It is th
1cf80 65 0a 2a 2a 20 66 69 72 73 74 20 6f 6e 20 74 68  e.** first on th
1cf90 65 20 70 61 67 65 2e 20 54 68 69 73 20 66 75 6e  e page. This fun
1cfa0 63 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 61 6e  ction appends an
1cfb0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 6e 74   appropriate ent
1cfc0 72 79 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  ry to the curren
1cfd0 74 0a 2a 2a 20 64 6f 63 6c 69 73 74 2d 69 6e 64  t.** doclist-ind
1cfe0 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ex..*/.static vo
1cff0 69 64 20 66 74 73 35 57 72 69 74 65 44 6c 69 64  id fts5WriteDlid
1d000 78 41 70 70 65 6e 64 28 0a 20 20 46 74 73 35 49  xAppend(.  Fts5I
1d010 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1d020 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1d030 65 72 2c 20 0a 20 20 69 36 34 20 69 52 6f 77 69  er, .  i64 iRowi
1d040 64 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  d.){.  int i;.  
1d050 69 6e 74 20 62 44 6f 6e 65 20 3d 20 30 3b 0a 0a  int bDone = 0;..
1d060 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
1d070 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62  ==SQLITE_OK && b
1d080 44 6f 6e 65 3d 3d 30 3b 20 69 2b 2b 29 7b 0a 20  Done==0; i++){. 
1d090 20 20 20 69 36 34 20 69 56 61 6c 3b 0a 20 20 20     i64 iVal;.   
1d0a0 20 46 74 73 35 44 6c 69 64 78 57 72 69 74 65 72   Fts5DlidxWriter
1d0b0 20 2a 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69   *pDlidx = &pWri
1d0c0 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1d0d0 0a 20 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d  .    if( pDlidx-
1d0e0 3e 62 75 66 2e 6e 3e 3d 70 2d 3e 70 43 6f 6e 66  >buf.n>=p->pConf
1d0f0 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20 20 20 20  ig->pgsz ){.    
1d100 20 20 2f 2a 20 54 68 65 20 63 75 72 72 65 6e 74    /* The current
1d110 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 70   doclist-index p
1d120 61 67 65 20 69 73 20 66 75 6c 6c 2e 20 57 72 69  age is full. Wri
1d130 74 65 20 69 74 20 74 6f 20 64 69 73 6b 20 61 6e  te it to disk an
1d140 64 20 70 75 73 68 0a 20 20 20 20 20 20 2a 2a 20  d push.      ** 
1d150 61 20 63 6f 70 79 20 6f 66 20 69 52 6f 77 69 64  a copy of iRowid
1d160 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62 65 63   (which will bec
1d170 6f 6d 65 20 74 68 65 20 66 69 72 73 74 20 72 6f  ome the first ro
1d180 77 69 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 0a  wid on the next.
1d190 20 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74        ** doclist
1d1a0 2d 69 6e 64 65 78 20 6c 65 61 66 20 70 61 67 65  -index leaf page
1d1b0 29 20 75 70 20 69 6e 74 6f 20 74 68 65 20 6e 65  ) up into the ne
1d1c0 78 74 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  xt level of the 
1d1d0 62 2d 74 72 65 65 20 0a 20 20 20 20 20 20 2a 2a  b-tree .      **
1d1e0 20 68 69 65 72 61 72 63 68 79 2e 20 49 66 20 74   hierarchy. If t
1d1f0 68 65 20 6e 6f 64 65 20 62 65 69 6e 67 20 66 6c  he node being fl
1d200 75 73 68 65 64 20 69 73 20 63 75 72 72 65 6e 74  ushed is current
1d210 6c 79 20 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65  ly the root node
1d220 2c 0a 20 20 20 20 20 20 2a 2a 20 61 6c 73 6f 20  ,.      ** also 
1d230 70 75 73 68 20 69 74 73 20 66 69 72 73 74 20 72  push its first r
1d240 6f 77 69 64 20 75 70 77 61 72 64 73 2e 20 2a 2f  owid upwards. */
1d250 0a 20 20 20 20 20 20 70 44 6c 69 64 78 2d 3e 62  .      pDlidx->b
1d260 75 66 2e 70 5b 30 5d 20 3d 20 30 78 30 31 3b 20  uf.p[0] = 0x01; 
1d270 20 20 20 2f 2a 20 4e 6f 74 20 74 68 65 20 72 6f     /* Not the ro
1d280 6f 74 20 6e 6f 64 65 20 2a 2f 0a 20 20 20 20 20  ot node */.     
1d290 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
1d2a0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 46 54 53  , .          FTS
1d2b0 35 5f 44 4c 49 44 58 5f 52 4f 57 49 44 28 70 57  5_DLIDX_ROWID(pW
1d2c0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 69  riter->iSegid, i
1d2d0 2c 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 2c  , pDlidx->pgno),
1d2e0 0a 20 20 20 20 20 20 20 20 20 20 70 44 6c 69 64  .          pDlid
1d2f0 78 2d 3e 62 75 66 2e 70 2c 20 70 44 6c 69 64 78  x->buf.p, pDlidx
1d300 2d 3e 62 75 66 2e 6e 0a 20 20 20 20 20 20 29 3b  ->buf.n.      );
1d310 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1d320 44 6c 69 64 78 47 72 6f 77 28 70 2c 20 70 57 72  DlidxGrow(p, pWr
1d330 69 74 65 72 2c 20 69 2b 32 29 3b 0a 20 20 20 20  iter, i+2);.    
1d340 20 20 70 44 6c 69 64 78 20 3d 20 26 70 57 72 69    pDlidx = &pWri
1d350 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 3b 0a  ter->aDlidx[i];.
1d360 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
1d370 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 44  =SQLITE_OK && pD
1d380 6c 69 64 78 5b 31 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[1].buf.n==0
1d390 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
1d3a0 69 46 69 72 73 74 20 3d 20 66 74 73 35 44 6c 69  iFirst = fts5Dli
1d3b0 64 78 45 78 74 72 61 63 74 46 69 72 73 74 52 6f  dxExtractFirstRo
1d3c0 77 69 64 28 26 70 44 6c 69 64 78 2d 3e 62 75 66  wid(&pDlidx->buf
1d3d0 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  );..        /* T
1d3e0 68 69 73 20 77 61 73 20 74 68 65 20 72 6f 6f 74  his was the root
1d3f0 20 6e 6f 64 65 2e 20 50 75 73 68 20 69 74 73 20   node. Push its 
1d400 66 69 72 73 74 20 72 6f 77 69 64 20 75 70 20 74  first rowid up t
1d410 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2e 20  o the new root. 
1d420 2a 2f 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64  */.        pDlid
1d430 78 5b 31 5d 2e 70 67 6e 6f 20 3d 20 70 44 6c 69  x[1].pgno = pDli
1d440 64 78 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 20 20  dx->pgno;.      
1d450 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
1d460 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28  ferAppendVarint(
1d470 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b  &p->rc, &pDlidx[
1d480 31 5d 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20  1].buf, 0);.    
1d490 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
1d4a0 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e  ufferAppendVarin
1d4b0 74 28 26 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64  t(&p->rc, &pDlid
1d4c0 78 5b 31 5d 2e 62 75 66 2c 20 70 44 6c 69 64 78  x[1].buf, pDlidx
1d4d0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1d4e0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d4f0 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d500 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 5b 31  p->rc, &pDlidx[1
1d510 5d 2e 62 75 66 2c 20 69 46 69 72 73 74 29 3b 0a  ].buf, iFirst);.
1d520 20 20 20 20 20 20 20 20 70 44 6c 69 64 78 5b 31          pDlidx[1
1d530 5d 2e 62 50 72 65 76 56 61 6c 69 64 20 3d 20 31  ].bPrevValid = 1
1d540 3b 0a 20 20 20 20 20 20 20 20 70 44 6c 69 64 78  ;.        pDlidx
1d550 5b 31 5d 2e 69 50 72 65 76 20 3d 20 69 46 69 72  [1].iPrev = iFir
1d560 73 74 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  st;.      }..   
1d570 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
1d580 66 66 65 72 5a 65 72 6f 28 26 70 44 6c 69 64 78  fferZero(&pDlidx
1d590 2d 3e 62 75 66 29 3b 0a 20 20 20 20 20 20 70 44  ->buf);.      pD
1d5a0 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64  lidx->bPrevValid
1d5b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 44 6c 69   = 0;.      pDli
1d5c0 64 78 2d 3e 70 67 6e 6f 2b 2b 3b 0a 20 20 20 20  dx->pgno++;.    
1d5d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 44 6f  }else{.      bDo
1d5e0 6e 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  ne = 1;.    }.. 
1d5f0 20 20 20 69 66 28 20 70 44 6c 69 64 78 2d 3e 62     if( pDlidx->b
1d600 50 72 65 76 56 61 6c 69 64 20 29 7b 0a 20 20 20  PrevValid ){.   
1d610 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
1d620 20 2d 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76   - pDlidx->iPrev
1d630 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d640 20 20 20 69 36 34 20 69 50 67 6e 6f 20 3d 20 28     i64 iPgno = (
1d650 69 3d 3d 30 20 3f 20 70 57 72 69 74 65 72 2d 3e  i==0 ? pWriter->
1d660 77 72 69 74 65 72 2e 70 67 6e 6f 20 3a 20 70 44  writer.pgno : pD
1d670 6c 69 64 78 5b 2d 31 5d 2e 70 67 6e 6f 29 3b 0a  lidx[-1].pgno);.
1d680 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
1d690 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d 3d 30 20 29  lidx->buf.n==0 )
1d6a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
1d6b0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d6c0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d6d0 44 6c 69 64 78 2d 3e 62 75 66 2c 20 21 62 44 6f  Dlidx->buf, !bDo
1d6e0 6e 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ne);.      sqlit
1d6f0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
1d700 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1d710 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 69   &pDlidx->buf, i
1d720 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 56 61  Pgno);.      iVa
1d730 6c 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 20 20  l = iRowid;.    
1d740 7d 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74  }..    sqlite3Ft
1d750 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d760 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1d770 6c 69 64 78 2d 3e 62 75 66 2c 20 69 56 61 6c 29  lidx->buf, iVal)
1d780 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50  ;.    pDlidx->bP
1d790 72 65 76 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  revValid = 1;.  
1d7a0 20 20 70 44 6c 69 64 78 2d 3e 69 50 72 65 76 20    pDlidx->iPrev 
1d7b0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a 7d 0a  = iRowid;.  }.}.
1d7c0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1d7d0 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1d7e0 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1d7f0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1d800 69 74 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  iter){.  static 
1d810 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 5b 5d 20  const u8 zero[] 
1d820 3d 20 7b 20 30 78 30 30 2c 20 30 78 30 30 2c 20  = { 0x00, 0x00, 
1d830 30 78 30 30 2c 20 30 78 30 30 20 7d 3b 0a 20 20  0x00, 0x00 };.  
1d840 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1d850 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1d860 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 36 34 20  ->writer;.  i64 
1d870 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73 65 72  iRowid;..  asser
1d880 74 28 20 28 70 50 61 67 65 2d 3e 70 67 69 64 78  t( (pPage->pgidx
1d890 2e 6e 3d 3d 30 29 3d 3d 28 70 57 72 69 74 65 72  .n==0)==(pWriter
1d8a0 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1d8b0 67 65 29 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  ge) );..  /* Set
1d8c0 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65 61 64   the szLeaf head
1d8d0 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 61  er field. */.  a
1d8e0 73 73 65 72 74 28 20 30 3d 3d 66 74 73 35 47 65  ssert( 0==fts5Ge
1d8f0 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62 75 66  tU16(&pPage->buf
1d900 2e 70 5b 32 5d 29 20 29 3b 0a 20 20 66 74 73 35  .p[2]) );.  fts5
1d910 50 75 74 55 31 36 28 26 70 50 61 67 65 2d 3e 62  PutU16(&pPage->b
1d920 75 66 2e 70 5b 32 5d 2c 20 28 75 31 36 29 70 50  uf.p[2], (u16)pP
1d930 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20  age->buf.n);..  
1d940 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1d950 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b  rstTermInPage ){
1d960 0a 20 20 20 20 2f 2a 20 4e 6f 20 74 65 72 6d 20  .    /* No term 
1d970 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74  was written to t
1d980 68 69 73 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20  his page. */.   
1d990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1d9a0 70 67 69 64 78 2e 6e 3d 3d 30 20 29 3b 0a 20 20  pgidx.n==0 );.  
1d9b0 20 20 66 74 73 35 57 72 69 74 65 42 74 72 65 65    fts5WriteBtree
1d9c0 4e 6f 54 65 72 6d 28 70 2c 20 70 57 72 69 74 65  NoTerm(p, pWrite
1d9d0 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
1d9e0 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 70   /* Append the p
1d9f0 67 69 64 78 20 74 6f 20 74 68 65 20 70 61 67 65  gidx to the page
1da00 20 62 75 66 66 65 72 2e 20 53 65 74 20 74 68 65   buffer. Set the
1da10 20 73 7a 4c 65 61 66 20 68 65 61 64 65 72 20 66   szLeaf header f
1da20 69 65 6c 64 2e 20 2a 2f 0a 20 20 20 20 66 74 73  ield. */.    fts
1da30 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1da40 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1da50 2d 3e 62 75 66 2c 20 70 50 61 67 65 2d 3e 70 67  ->buf, pPage->pg
1da60 69 64 78 2e 6e 2c 20 70 50 61 67 65 2d 3e 70 67  idx.n, pPage->pg
1da70 69 64 78 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  idx.p);.  }..  /
1da80 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65  * Write the page
1da90 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 2a 2f 0a   out to disk */.
1daa0 20 20 69 52 6f 77 69 64 20 3d 20 46 54 53 35 5f    iRowid = FTS5_
1dab0 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28 70 57  SEGMENT_ROWID(pW
1dac0 72 69 74 65 72 2d 3e 69 53 65 67 69 64 2c 20 70  riter->iSegid, p
1dad0 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 66  Page->pgno);.  f
1dae0 74 73 35 44 61 74 61 57 72 69 74 65 28 70 2c 20  ts5DataWrite(p, 
1daf0 69 52 6f 77 69 64 2c 20 70 50 61 67 65 2d 3e 62  iRowid, pPage->b
1db00 75 66 2e 70 2c 20 70 50 61 67 65 2d 3e 62 75 66  uf.p, pPage->buf
1db10 2e 6e 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69  .n);..  /* Initi
1db20 61 6c 69 7a 65 20 74 68 65 20 6e 65 78 74 20 70  alize the next p
1db30 61 67 65 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75  age. */.  fts5Bu
1db40 66 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d  fferZero(&pPage-
1db50 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75 66  >buf);.  fts5Buf
1db60 66 65 72 5a 65 72 6f 28 26 70 50 61 67 65 2d 3e  ferZero(&pPage->
1db70 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42 75  pgidx);.  fts5Bu
1db80 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1db90 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1dba0 75 66 2c 20 34 2c 20 7a 65 72 6f 29 3b 0a 20 20  uf, 4, zero);.  
1dbb0 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64  pPage->iPrevPgid
1dbc0 78 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e  x = 0;.  pPage->
1dbd0 70 67 6e 6f 2b 2b 3b 0a 0a 20 20 2f 2a 20 49 6e  pgno++;..  /* In
1dbe0 63 72 65 61 73 65 20 74 68 65 20 6c 65 61 76 65  crease the leave
1dbf0 73 20 77 72 69 74 74 65 6e 20 63 6f 75 6e 74 65  s written counte
1dc00 72 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  r */.  pWriter->
1dc10 6e 4c 65 61 66 57 72 69 74 74 65 6e 2b 2b 3b 0a  nLeafWritten++;.
1dc20 0a 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6c 65  .  /* The new le
1dc30 61 66 20 68 6f 6c 64 73 20 6e 6f 20 74 65 72 6d  af holds no term
1dc40 73 20 6f 72 20 72 6f 77 69 64 73 20 2a 2f 0a 20  s or rowids */. 
1dc50 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74   pWriter->bFirst
1dc60 54 65 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a  TermInPage = 1;.
1dc70 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73    pWriter->bFirs
1dc80 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 31  tRowidInPage = 1
1dc90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1dca0 64 20 74 65 72 6d 20 70 54 65 72 6d 2f 6e 54 65  d term pTerm/nTe
1dcb0 72 6d 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e  rm to the segmen
1dcc0 74 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20  t being written 
1dcd0 62 79 20 74 68 65 20 77 72 69 74 65 72 20 70 61  by the writer pa
1dce0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73  ssed.** as the s
1dcf0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a  econd argument..
1dd00 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
1dd10 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68  r occurs, set th
1dd20 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65  e Fts5Index.rc e
1dd30 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e  rror code. If an
1dd40 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61   error has .** a
1dd50 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1dd60 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1dd70 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
1dd80 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1dd90 69 74 65 41 70 70 65 6e 64 54 65 72 6d 28 0a 20  iteAppendTerm(. 
1dda0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1ddb0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1ddc0 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 6e 74 20  *pWriter,.  int 
1ddd0 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38 20  nTerm, const u8 
1dde0 2a 70 54 65 72 6d 20 0a 29 7b 0a 20 20 69 6e 74  *pTerm .){.  int
1ddf0 20 6e 50 72 65 66 69 78 3b 20 20 20 20 20 20 20   nPrefix;       
1de00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1de10 42 79 74 65 73 20 6f 66 20 70 72 65 66 69 78 20  Bytes of prefix 
1de20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 66 6f 72 20  compression for 
1de30 74 65 72 6d 20 2a 2f 0a 20 20 46 74 73 35 50 61  term */.  Fts5Pa
1de40 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1de50 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1de60 65 72 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72  er;.  Fts5Buffer
1de70 20 2a 70 50 67 69 64 78 20 3d 20 26 70 57 72 69   *pPgidx = &pWri
1de80 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64  ter->writer.pgid
1de90 78 3b 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 3d 20  x;.  int nMin = 
1dea0 4d 49 4e 28 70 50 61 67 65 2d 3e 74 65 72 6d 2e  MIN(pPage->term.
1deb0 6e 2c 20 6e 54 65 72 6d 29 3b 0a 0a 20 20 61 73  n, nTerm);..  as
1dec0 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c  sert( p->rc==SQL
1ded0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73 73 65  ITE_OK );.  asse
1dee0 72 74 28 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e  rt( pPage->buf.n
1def0 3e 3d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=4 );.  assert(
1df00 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 3e 34 20   pPage->buf.n>4 
1df10 7c 7c 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72  || pWriter->bFir
1df20 73 74 54 65 72 6d 49 6e 50 61 67 65 20 29 3b 0a  stTermInPage );.
1df30 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72  .  /* If the cur
1df40 72 65 6e 74 20 6c 65 61 66 20 70 61 67 65 20 69  rent leaf page i
1df50 73 20 66 75 6c 6c 2c 20 66 6c 75 73 68 20 69 74  s full, flush it
1df60 20 74 6f 20 64 69 73 6b 2e 20 2a 2f 0a 20 20 69   to disk. */.  i
1df70 66 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e  f( (pPage->buf.n
1df80 20 2b 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e   + pPgidx->n + n
1df90 54 65 72 6d 20 2b 20 32 29 3e 3d 70 2d 3e 70 43  Term + 2)>=p->pC
1dfa0 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b 0a 20  onfig->pgsz ){. 
1dfb0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 62 75     if( pPage->bu
1dfc0 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20 20 20 66  f.n>4 ){.      f
1dfd0 74 73 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61  ts5WriteFlushLea
1dfe0 66 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  f(p, pWriter);. 
1dff0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d       if( p->rc!=
1e000 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1e010 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  rn;.    }.    ft
1e020 73 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d  s5BufferGrow(&p-
1e030 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66  >rc, &pPage->buf
1e040 2c 20 6e 54 65 72 6d 2b 46 54 53 35 5f 44 41 54  , nTerm+FTS5_DAT
1e050 41 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a  A_PADDING);.  }.
1e060 20 20 0a 20 20 2f 2a 20 54 4f 44 4f 31 3a 20 55    .  /* TODO1: U
1e070 70 64 61 74 69 6e 67 20 70 67 69 64 78 20 68 65  pdating pgidx he
1e080 72 65 2e 20 2a 2f 0a 20 20 70 50 67 69 64 78 2d  re. */.  pPgidx-
1e090 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  >n += sqlite3Fts
1e0a0 35 50 75 74 56 61 72 69 6e 74 28 0a 20 20 20 20  5PutVarint(.    
1e0b0 20 20 26 70 50 67 69 64 78 2d 3e 70 5b 70 50 67    &pPgidx->p[pPg
1e0c0 69 64 78 2d 3e 6e 5d 2c 20 70 50 61 67 65 2d 3e  idx->n], pPage->
1e0d0 62 75 66 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 69  buf.n - pPage->i
1e0e0 50 72 65 76 50 67 69 64 78 0a 20 20 29 3b 0a 20  PrevPgidx.  );. 
1e0f0 20 70 50 61 67 65 2d 3e 69 50 72 65 76 50 67 69   pPage->iPrevPgi
1e100 64 78 20 3d 20 70 50 61 67 65 2d 3e 62 75 66 2e  dx = pPage->buf.
1e110 6e 3b 0a 23 69 66 20 30 0a 20 20 66 74 73 35 50  n;.#if 0.  fts5P
1e120 75 74 55 31 36 28 26 70 50 67 69 64 78 2d 3e 70  utU16(&pPgidx->p
1e130 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70 50 61  [pPgidx->n], pPa
1e140 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20 20 70 50  ge->buf.n);.  pP
1e150 67 69 64 78 2d 3e 6e 20 2b 3d 20 32 3b 0a 23 65  gidx->n += 2;.#e
1e160 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 57 72 69  ndif..  if( pWri
1e170 74 65 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49  ter->bFirstTermI
1e180 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 6e 50 72  nPage ){.    nPr
1e190 65 66 69 78 20 3d 20 30 3b 0a 20 20 20 20 69 66  efix = 0;.    if
1e1a0 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 21 3d 31  ( pPage->pgno!=1
1e1b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
1e1c0 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 74  s is the first t
1e1d0 65 72 6d 20 6f 6e 20 61 20 6c 65 61 66 20 74 68  erm on a leaf th
1e1e0 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 65  at is not the le
1e1f0 66 74 6d 6f 73 74 20 6c 65 61 66 20 69 6e 0a 20  ftmost leaf in. 
1e200 20 20 20 20 20 2a 2a 20 74 68 65 20 73 65 67 6d       ** the segm
1e210 65 6e 74 20 62 2d 74 72 65 65 2e 20 49 6e 20 74  ent b-tree. In t
1e220 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e  his case it is n
1e230 65 63 65 73 73 61 72 79 20 74 6f 20 61 64 64 20  ecessary to add 
1e240 61 20 74 65 72 6d 20 74 6f 0a 20 20 20 20 20 20  a term to.      
1e250 2a 2a 20 74 68 65 20 62 2d 74 72 65 65 20 68 69  ** the b-tree hi
1e260 65 72 61 72 63 68 79 20 74 68 61 74 20 69 73 20  erarchy that is 
1e270 28 61 29 20 6c 61 72 67 65 72 20 74 68 61 6e 20  (a) larger than 
1e280 74 68 65 20 6c 61 72 67 65 73 74 20 74 65 72 6d  the largest term
1e290 20 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61   .      ** alrea
1e2a0 64 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  dy written to th
1e2b0 65 20 73 65 67 6d 65 6e 74 20 61 6e 64 20 28 62  e segment and (b
1e2c0 29 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6f  ) smaller than o
1e2d0 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20 20 20  r equal to.     
1e2e0 20 2a 2a 20 74 68 69 73 20 74 65 72 6d 2e 20 49   ** this term. I
1e2f0 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 61  n other words, a
1e300 20 70 72 65 66 69 78 20 6f 66 20 28 70 54 65 72   prefix of (pTer
1e310 6d 2f 6e 54 65 72 6d 29 20 74 68 61 74 20 69 73  m/nTerm) that is
1e320 20 6f 6e 65 0a 20 20 20 20 20 20 2a 2a 20 62 79   one.      ** by
1e330 74 65 20 6c 6f 6e 67 65 72 20 74 68 61 6e 20 74  te longer than t
1e340 68 65 20 6c 6f 6e 67 65 73 74 20 70 72 65 66 69  he longest prefi
1e350 78 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20  x (pTerm/nTerm) 
1e360 73 68 61 72 65 73 20 77 69 74 68 20 74 68 65 0a  shares with the.
1e370 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75        ** previou
1e380 73 20 74 65 72 6d 2e 20 0a 20 20 20 20 20 20 2a  s term. .      *
1e390 2a 0a 20 20 20 20 20 20 2a 2a 20 55 73 75 61 6c  *.      ** Usual
1e3a0 6c 79 2c 20 74 68 65 20 70 72 65 76 69 6f 75 73  ly, the previous
1e3b0 20 74 65 72 6d 20 69 73 20 61 76 61 69 6c 61 62   term is availab
1e3c0 6c 65 20 69 6e 20 70 50 61 67 65 2d 3e 74 65 72  le in pPage->ter
1e3d0 6d 2e 20 54 68 65 20 65 78 63 65 70 74 69 6f 6e  m. The exception
1e3e0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 69 66 20  .      ** is if 
1e3f0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1e400 74 20 74 65 72 6d 20 77 72 69 74 74 65 6e 20 69  t term written i
1e410 6e 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  n an incremental
1e420 2d 6d 65 72 67 65 20 73 74 65 70 2e 0a 20 20 20  -merge step..   
1e430 20 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61     ** In this ca
1e440 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  se the previous 
1e450 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 76 61 69  term is not avai
1e460 6c 61 62 6c 65 2c 20 73 6f 20 6a 75 73 74 20 77  lable, so just w
1e470 72 69 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  rite a.      ** 
1e480 63 6f 70 79 20 6f 66 20 28 70 54 65 72 6d 2f 6e  copy of (pTerm/n
1e490 54 65 72 6d 29 20 69 6e 74 6f 20 74 68 65 20 70  Term) into the p
1e4a0 61 72 65 6e 74 20 6e 6f 64 65 2e 20 54 68 69 73  arent node. This
1e4b0 20 69 73 20 73 6c 69 67 68 74 6c 79 0a 20 20 20   is slightly.   
1e4c0 20 20 20 2a 2a 20 69 6e 65 66 66 69 63 69 65 6e     ** inefficien
1e4d0 74 2c 20 62 75 74 20 73 74 69 6c 6c 20 63 6f 72  t, but still cor
1e4e0 72 65 63 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rect.  */.      
1e4f0 69 6e 74 20 6e 20 3d 20 6e 54 65 72 6d 3b 0a 20  int n = nTerm;. 
1e500 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1e510 74 65 72 6d 2e 6e 20 29 7b 0a 20 20 20 20 20 20  term.n ){.      
1e520 20 20 6e 20 3d 20 31 20 2b 20 66 74 73 35 50 72    n = 1 + fts5Pr
1e530 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69  efixCompress(nMi
1e540 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
1e550 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , pTerm);.      
1e560 7d 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74  }.      fts5Writ
1e570 65 42 74 72 65 65 54 65 72 6d 28 70 2c 20 70 57  eBtreeTerm(p, pW
1e580 72 69 74 65 72 2c 20 6e 2c 20 70 54 65 72 6d 29  riter, n, pTerm)
1e590 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
1e5a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1e5b0 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 70 50 61  eturn;.      pPa
1e5c0 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 77  ge = &pWriter->w
1e5d0 72 69 74 65 72 3b 0a 20 20 20 20 7d 0a 20 20 7d  riter;.    }.  }
1e5e0 65 6c 73 65 7b 0a 20 20 20 20 6e 50 72 65 66 69  else{.    nPrefi
1e5f0 78 20 3d 20 66 74 73 35 50 72 65 66 69 78 43 6f  x = fts5PrefixCo
1e600 6d 70 72 65 73 73 28 6e 4d 69 6e 2c 20 70 50 61  mpress(nMin, pPa
1e610 67 65 2d 3e 74 65 72 6d 2e 70 2c 20 70 54 65 72  ge->term.p, pTer
1e620 6d 29 3b 0a 20 20 20 20 66 74 73 35 42 75 66 66  m);.    fts5Buff
1e630 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1e640 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62  p->rc, &pPage->b
1e650 75 66 2c 20 6e 50 72 65 66 69 78 29 3b 0a 20 20  uf, nPrefix);.  
1e660 7d 0a 0a 20 20 2f 2a 20 41 70 70 65 6e 64 20 74  }..  /* Append t
1e670 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1e680 65 73 20 6f 66 20 6e 65 77 20 64 61 74 61 2c 20  es of new data, 
1e690 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 64 61  then the term da
1e6a0 74 61 20 69 74 73 65 6c 66 0a 20 20 2a 2a 20 74  ta itself.  ** t
1e6b0 6f 20 74 68 65 20 70 61 67 65 2e 20 2a 2f 0a 20  o the page. */. 
1e6c0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e6d0 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1e6e0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65  &pPage->buf, nTe
1e6f0 72 6d 20 2d 20 6e 50 72 65 66 69 78 29 3b 0a 20  rm - nPrefix);. 
1e700 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1e710 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1e720 50 61 67 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d  Page->buf, nTerm
1e730 20 2d 20 6e 50 72 65 66 69 78 2c 20 26 70 54 65   - nPrefix, &pTe
1e740 72 6d 5b 6e 50 72 65 66 69 78 5d 29 3b 0a 0a 20  rm[nPrefix]);.. 
1e750 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 46   /* Update the F
1e760 74 73 35 50 61 67 65 57 72 69 74 65 72 2e 74 65  ts5PageWriter.te
1e770 72 6d 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 66  rm field. */.  f
1e780 74 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d  ts5BufferSet(&p-
1e790 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 74 65 72  >rc, &pPage->ter
1e7a0 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29  m, nTerm, pTerm)
1e7b0 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69  ;.  pWriter->bFi
1e7c0 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d 20  rstTermInPage = 
1e7d0 30 3b 0a 0a 20 20 70 57 72 69 74 65 72 2d 3e 62  0;..  pWriter->b
1e7e0 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65  FirstRowidInPage
1e7f0 20 3d 20 30 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 0;.  pWriter-
1e800 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44 6f  >bFirstRowidInDo
1e810 63 6c 69 73 74 20 3d 20 31 3b 0a 0a 20 20 61 73  clist = 1;..  as
1e820 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 28  sert( p->rc || (
1e830 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e  pWriter->nDlidx>
1e840 30 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44  0 && pWriter->aD
1e850 6c 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3d 3d 30  lidx[0].buf.n==0
1e860 29 20 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  ) );.  pWriter->
1e870 61 44 6c 69 64 78 5b 30 5d 2e 70 67 6e 6f 20 3d  aDlidx[0].pgno =
1e880 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 7d 0a   pPage->pgno;.}.
1e890 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
1e8a0 72 6f 77 69 64 20 61 6e 64 20 70 6f 73 69 74 69  rowid and positi
1e8b0 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 20 66 69 65  on-list size fie
1e8c0 6c 64 20 74 6f 20 74 68 65 20 77 72 69 74 65 72  ld to the writer
1e8d0 73 20 6f 75 74 70 75 74 2e 20 0a 2a 2f 0a 73 74  s output. .*/.st
1e8e0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1e8f0 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64 28 0a  iteAppendRowid(.
1e900 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1e910 0a 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72  .  Fts5SegWriter
1e920 20 2a 70 57 72 69 74 65 72 2c 0a 20 20 69 36 34   *pWriter,.  i64
1e930 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 66 28   iRowid.){.  if(
1e940 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1e950 4b 20 29 7b 0a 20 20 20 20 46 74 73 35 50 61 67  K ){.    Fts5Pag
1e960 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20 3d  eWriter *pPage =
1e970 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1e980 72 3b 0a 0a 20 20 20 20 69 66 28 20 28 70 50 61  r;..    if( (pPa
1e990 67 65 2d 3e 62 75 66 2e 6e 20 2b 20 70 50 61 67  ge->buf.n + pPag
1e9a0 65 2d 3e 70 67 69 64 78 2e 6e 29 3e 3d 70 2d 3e  e->pgidx.n)>=p->
1e9b0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29 7b  pConfig->pgsz ){
1e9c0 0a 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65  .      fts5Write
1e9d0 46 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72  FlushLeaf(p, pWr
1e9e0 69 74 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  iter);.    }..  
1e9f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1ea00 74 6f 20 62 65 20 74 68 65 20 66 69 72 73 74 20  to be the first 
1ea10 72 6f 77 69 64 20 77 72 69 74 74 65 6e 20 74 6f  rowid written to
1ea20 20 74 68 65 20 70 61 67 65 2c 20 73 65 74 20 74   the page, set t
1ea30 68 65 20 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  he .    ** rowid
1ea40 2d 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20  -pointer in the 
1ea50 70 61 67 65 2d 68 65 61 64 65 72 2e 20 41 6c 73  page-header. Als
1ea60 6f 20 61 70 70 65 6e 64 20 61 20 76 61 6c 75 65  o append a value
1ea70 20 74 6f 20 74 68 65 20 64 6c 69 64 78 0a 20 20   to the dlidx.  
1ea80 20 20 2a 2a 20 62 75 66 66 65 72 2c 20 69 6e 20    ** buffer, in 
1ea90 63 61 73 65 20 61 20 64 6f 63 6c 69 73 74 2d 69  case a doclist-i
1eaa0 6e 64 65 78 20 69 73 20 72 65 71 75 69 72 65 64  ndex is required
1eab0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 57  .  */.    if( pW
1eac0 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1ead0 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  idInPage ){.    
1eae0 20 20 66 74 73 35 50 75 74 55 31 36 28 70 50 61    fts5PutU16(pPa
1eaf0 67 65 2d 3e 62 75 66 2e 70 2c 20 28 75 31 36 29  ge->buf.p, (u16)
1eb00 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29 3b 0a 20  pPage->buf.n);. 
1eb10 20 20 20 20 20 66 74 73 35 57 72 69 74 65 44 6c       fts5WriteDl
1eb20 69 64 78 41 70 70 65 6e 64 28 70 2c 20 70 57 72  idxAppend(p, pWr
1eb30 69 74 65 72 2c 20 69 52 6f 77 69 64 29 3b 0a 20  iter, iRowid);. 
1eb40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 72 69     }..    /* Wri
1eb50 74 65 20 74 68 65 20 72 6f 77 69 64 2e 20 2a 2f  te the rowid. */
1eb60 0a 20 20 20 20 69 66 28 20 70 57 72 69 74 65 72  .    if( pWriter
1eb70 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1eb80 6f 63 6c 69 73 74 20 7c 7c 20 70 57 72 69 74 65  oclist || pWrite
1eb90 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1eba0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 66 74  Page ){.      ft
1ebb0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1ebc0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1ebd0 61 67 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64  age->buf, iRowid
1ebe0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1ebf0 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 70      assert_nc( p
1ec00 2d 3e 72 63 20 7c 7c 20 69 52 6f 77 69 64 3e 70  ->rc || iRowid>p
1ec10 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52 6f 77  Writer->iPrevRow
1ec20 69 64 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  id );.      fts5
1ec30 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
1ec40 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  nt(&p->rc, &pPag
1ec50 65 2d 3e 62 75 66 2c 20 69 52 6f 77 69 64 20 2d  e->buf, iRowid -
1ec60 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1ec70 6f 77 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  owid);.    }.   
1ec80 20 70 57 72 69 74 65 72 2d 3e 69 50 72 65 76 52   pWriter->iPrevR
1ec90 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20  owid = iRowid;. 
1eca0 20 20 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72     pWriter->bFir
1ecb0 73 74 52 6f 77 69 64 49 6e 44 6f 63 6c 69 73 74  stRowidInDoclist
1ecc0 20 3d 20 30 3b 0a 20 20 20 20 70 57 72 69 74 65   = 0;.    pWrite
1ecd0 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e  r->bFirstRowidIn
1ece0 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  Page = 0;.  }.}.
1ecf0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1ed00 35 57 72 69 74 65 41 70 70 65 6e 64 50 6f 73 6c  5WriteAppendPosl
1ed10 69 73 74 44 61 74 61 28 0a 20 20 46 74 73 35 49  istData(.  Fts5I
1ed20 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1ed30 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1ed40 65 72 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  er, .  const u8 
1ed50 2a 61 44 61 74 61 2c 20 0a 20 20 69 6e 74 20 6e  *aData, .  int n
1ed60 44 61 74 61 0a 29 7b 0a 20 20 46 74 73 35 50 61  Data.){.  Fts5Pa
1ed70 67 65 57 72 69 74 65 72 20 2a 70 50 61 67 65 20  geWriter *pPage 
1ed80 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1ed90 65 72 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  er;.  const u8 *
1eda0 61 20 3d 20 61 44 61 74 61 3b 0a 20 20 69 6e 74  a = aData;.  int
1edb0 20 6e 20 3d 20 6e 44 61 74 61 3b 0a 20 20 0a 20   n = nData;.  . 
1edc0 20 61 73 73 65 72 74 28 20 70 2d 3e 70 43 6f 6e   assert( p->pCon
1edd0 66 69 67 2d 3e 70 67 73 7a 3e 30 20 29 3b 0a 20  fig->pgsz>0 );. 
1ede0 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d 53   while( p->rc==S
1edf0 51 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 20 20 26  QLITE_OK .     &
1ee00 26 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  & (pPage->buf.n 
1ee10 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
1ee20 20 2b 20 6e 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69   + n)>=p->pConfi
1ee30 67 2d 3e 70 67 73 7a 20 0a 20 20 29 7b 0a 20 20  g->pgsz .  ){.  
1ee40 20 20 69 6e 74 20 6e 52 65 71 20 3d 20 70 2d 3e    int nReq = p->
1ee50 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2d 20  pConfig->pgsz - 
1ee60 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70  pPage->buf.n - p
1ee70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3b 0a 20  Page->pgidx.n;. 
1ee80 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 30     int nCopy = 0
1ee90 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 6e 43 6f  ;.    while( nCo
1eea0 70 79 3c 6e 52 65 71 20 29 7b 0a 20 20 20 20 20  py<nReq ){.     
1eeb0 20 69 36 34 20 64 75 6d 6d 79 3b 0a 20 20 20 20   i64 dummy;.    
1eec0 20 20 6e 43 6f 70 79 20 2b 3d 20 66 74 73 35 47    nCopy += fts5G
1eed0 65 74 56 61 72 69 6e 74 28 26 61 5b 6e 43 6f 70  etVarint(&a[nCop
1eee0 79 5d 2c 20 28 75 36 34 2a 29 26 64 75 6d 6d 79  y], (u64*)&dummy
1eef0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  );.    }.    fts
1ef00 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f  5BufferAppendBlo
1ef10 62 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65  b(&p->rc, &pPage
1ef20 2d 3e 62 75 66 2c 20 6e 43 6f 70 79 2c 20 61 29  ->buf, nCopy, a)
1ef30 3b 0a 20 20 20 20 61 20 2b 3d 20 6e 43 6f 70 79  ;.    a += nCopy
1ef40 3b 0a 20 20 20 20 6e 20 2d 3d 20 6e 43 6f 70 79  ;.    n -= nCopy
1ef50 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 46  ;.    fts5WriteF
1ef60 6c 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69  lushLeaf(p, pWri
1ef70 74 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ter);.  }.  if( 
1ef80 6e 3e 30 20 29 7b 0a 20 20 20 20 66 74 73 35 42  n>0 ){.    fts5B
1ef90 75 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28  ufferAppendBlob(
1efa0 26 70 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e  &p->rc, &pPage->
1efb0 62 75 66 2c 20 6e 2c 20 61 29 3b 0a 20 20 7d 0a  buf, n, a);.  }.
1efc0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 61  }../*.** Flush a
1efd0 6e 79 20 64 61 74 61 20 63 61 63 68 65 64 20 62  ny data cached b
1efe0 79 20 74 68 65 20 77 72 69 74 65 72 20 6f 62 6a  y the writer obj
1eff0 65 63 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  ect to the datab
1f000 61 73 65 2e 20 46 72 65 65 20 61 6e 79 0a 2a 2a  ase. Free any.**
1f010 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73   allocations ass
1f020 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
1f030 20 77 72 69 74 65 72 2e 0a 2a 2f 0a 73 74 61 74   writer..*/.stat
1f040 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69 74  ic void fts5Writ
1f050 65 46 69 6e 69 73 68 28 0a 20 20 46 74 73 35 49  eFinish(.  Fts5I
1f060 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1f070 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1f080 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 57  er,         /* W
1f090 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  riter object */.
1f0a0 20 20 69 6e 74 20 2a 70 6e 4c 65 61 66 20 20 20    int *pnLeaf   
1f0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f0c0 20 20 2f 2a 20 4f 55 54 3a 20 4e 75 6d 62 65 72    /* OUT: Number
1f0d0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 69   of leaf pages i
1f0e0 6e 20 62 2d 74 72 65 65 20 2a 2f 0a 29 7b 0a 20  n b-tree */.){. 
1f0f0 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 50 61   int i;.  Fts5Pa
1f100 67 65 57 72 69 74 65 72 20 2a 70 4c 65 61 66 20  geWriter *pLeaf 
1f110 3d 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74  = &pWriter->writ
1f120 65 72 3b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  er;.  if( p->rc=
1f130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f140 20 20 61 73 73 65 72 74 28 20 70 4c 65 61 66 2d    assert( pLeaf-
1f150 3e 70 67 6e 6f 3e 3d 31 20 29 3b 0a 20 20 20 20  >pgno>=1 );.    
1f160 69 66 28 20 70 4c 65 61 66 2d 3e 62 75 66 2e 6e  if( pLeaf->buf.n
1f170 3e 34 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35  >4 ){.      fts5
1f180 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1f190 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20 20  , pWriter);.    
1f1a0 7d 0a 20 20 20 20 2a 70 6e 4c 65 61 66 20 3d 20  }.    *pnLeaf = 
1f1b0 70 4c 65 61 66 2d 3e 70 67 6e 6f 2d 31 3b 0a 20  pLeaf->pgno-1;. 
1f1c0 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e 70 67     if( pLeaf->pg
1f1d0 6e 6f 3e 31 20 29 7b 0a 20 20 20 20 20 20 66 74  no>1 ){.      ft
1f1e0 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72 65  s5WriteFlushBtre
1f1f0 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20  e(p, pWriter);. 
1f200 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 42     }.  }.  fts5B
1f210 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1f220 2d 3e 74 65 72 6d 29 3b 0a 20 20 66 74 73 35 42  ->term);.  fts5B
1f230 75 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66  ufferFree(&pLeaf
1f240 2d 3e 62 75 66 29 3b 0a 20 20 66 74 73 35 42 75  ->buf);.  fts5Bu
1f250 66 66 65 72 46 72 65 65 28 26 70 4c 65 61 66 2d  fferFree(&pLeaf-
1f260 3e 70 67 69 64 78 29 3b 0a 20 20 66 74 73 35 42  >pgidx);.  fts5B
1f270 75 66 66 65 72 46 72 65 65 28 26 70 57 72 69 74  ufferFree(&pWrit
1f280 65 72 2d 3e 62 74 74 65 72 6d 29 3b 0a 0a 20 20  er->btterm);..  
1f290 66 6f 72 28 69 3d 30 3b 20 69 3c 70 57 72 69 74  for(i=0; i<pWrit
1f2a0 65 72 2d 3e 6e 44 6c 69 64 78 3b 20 69 2b 2b 29  er->nDlidx; i++)
1f2b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73  {.    sqlite3Fts
1f2c0 35 42 75 66 66 65 72 46 72 65 65 28 26 70 57 72  5BufferFree(&pWr
1f2d0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 69 5d 2e  iter->aDlidx[i].
1f2e0 62 75 66 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  buf);.  }.  sqli
1f2f0 74 65 33 5f 66 72 65 65 28 70 57 72 69 74 65 72  te3_free(pWriter
1f300 2d 3e 61 44 6c 69 64 78 29 3b 0a 7d 0a 0a 73 74  ->aDlidx);.}..st
1f310 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1f320 69 74 65 49 6e 69 74 28 0a 20 20 46 74 73 35 49  iteInit(.  Fts5I
1f330 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35  ndex *p, .  Fts5
1f340 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1f350 65 72 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  er, .  int iSegi
1f360 64 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69 6e 74  d.){.  const int
1f370 20 6e 42 75 66 66 65 72 20 3d 20 70 2d 3e 70 43   nBuffer = p->pC
1f380 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 2b 20 46 54  onfig->pgsz + FT
1f390 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 3b  S5_DATA_PADDING;
1f3a0 0a 0a 20 20 6d 65 6d 73 65 74 28 70 57 72 69 74  ..  memset(pWrit
1f3b0 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  er, 0, sizeof(Ft
1f3c0 73 35 53 65 67 57 72 69 74 65 72 29 29 3b 0a 20  s5SegWriter));. 
1f3d0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1f3e0 20 3d 20 69 53 65 67 69 64 3b 0a 0a 20 20 66 74   = iSegid;..  ft
1f3f0 73 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77  s5WriteDlidxGrow
1f400 28 70 2c 20 70 57 72 69 74 65 72 2c 20 31 29 3b  (p, pWriter, 1);
1f410 0a 20 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74  .  pWriter->writ
1f420 65 72 2e 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 70  er.pgno = 1;.  p
1f430 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1f440 72 6d 49 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20  rmInPage = 1;.  
1f450 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61 67 65  pWriter->iBtPage
1f460 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
1f470 20 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72   pWriter->writer
1f480 2e 62 75 66 2e 6e 3d 3d 30 20 29 3b 0a 20 20 61  .buf.n==0 );.  a
1f490 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1f4a0 77 72 69 74 65 72 2e 70 67 69 64 78 2e 6e 3d 3d  writer.pgidx.n==
1f4b0 30 20 29 3b 0a 0a 20 20 2f 2a 20 47 72 6f 77 20  0 );..  /* Grow 
1f4c0 74 68 65 20 74 77 6f 20 62 75 66 66 65 72 73 20  the two buffers 
1f4d0 74 6f 20 70 67 73 7a 20 2b 20 70 61 64 64 69 6e  to pgsz + paddin
1f4e0 67 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  g bytes in size.
1f4f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 46 74 73   */.  sqlite3Fts
1f500 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
1f510 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 77 72  rc, &pWriter->wr
1f520 69 74 65 72 2e 70 67 69 64 78 2c 20 6e 42 75 66  iter.pgidx, nBuf
1f530 66 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  fer);.  sqlite3F
1f540 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
1f550 2d 3e 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e  ->rc, &pWriter->
1f560 77 72 69 74 65 72 2e 62 75 66 2c 20 6e 42 75 66  writer.buf, nBuf
1f570 66 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  fer);..  if( p->
1f580 70 49 64 78 57 72 69 74 65 72 3d 3d 30 20 29 7b  pIdxWriter==0 ){
1f590 0a 20 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20  .    Fts5Config 
1f5a0 2a 70 43 6f 6e 66 69 67 20 3d 20 70 2d 3e 70 43  *pConfig = p->pC
1f5b0 6f 6e 66 69 67 3b 0a 20 20 20 20 66 74 73 35 49  onfig;.    fts5I
1f5c0 6e 64 65 78 50 72 65 70 61 72 65 53 74 6d 74 28  ndexPrepareStmt(
1f5d0 70 2c 20 26 70 2d 3e 70 49 64 78 57 72 69 74 65  p, &p->pIdxWrite
1f5e0 72 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  r, sqlite3_mprin
1f5f0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 49  tf(.          "I
1f600 4e 53 45 52 54 20 49 4e 54 4f 20 27 25 71 27 2e  NSERT INTO '%q'.
1f610 27 25 71 5f 69 64 78 27 28 73 65 67 69 64 2c 74  '%q_idx'(segid,t
1f620 65 72 6d 2c 70 67 6e 6f 29 20 56 41 4c 55 45 53  erm,pgno) VALUES
1f630 28 3f 2c 3f 2c 3f 29 22 2c 20 0a 20 20 20 20 20  (?,?,?)", .     
1f640 20 20 20 20 20 70 43 6f 6e 66 69 67 2d 3e 7a 44       pConfig->zD
1f650 62 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d  b, pConfig->zNam
1f660 65 0a 20 20 20 20 29 29 3b 0a 20 20 7d 0a 0a 20  e.    ));.  }.. 
1f670 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
1f680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
1f690 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 34  Initialize the 4
1f6a0 2d 62 79 74 65 20 6c 65 61 66 2d 70 61 67 65 20  -byte leaf-page 
1f6b0 68 65 61 64 65 72 20 74 6f 20 30 78 30 30 2e 20  header to 0x00. 
1f6c0 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 57  */.    memset(pW
1f6d0 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75  riter->writer.bu
1f6e0 66 2e 70 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  f.p, 0, 4);.    
1f6f0 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 2e  pWriter->writer.
1f700 62 75 66 2e 6e 20 3d 20 34 3b 0a 0a 20 20 20 20  buf.n = 4;..    
1f710 2f 2a 20 42 69 6e 64 20 74 68 65 20 63 75 72 72  /* Bind the curr
1f720 65 6e 74 20 6f 75 74 70 75 74 20 73 65 67 6d 65  ent output segme
1f730 6e 74 20 69 64 20 74 6f 20 74 68 65 20 69 6e 64  nt id to the ind
1f740 65 78 2d 77 72 69 74 65 72 2e 20 54 68 69 73 20  ex-writer. This 
1f750 69 73 20 61 6e 0a 20 20 20 20 2a 2a 20 6f 70 74  is an.    ** opt
1f760 69 6d 69 7a 61 74 69 6f 6e 20 6f 76 65 72 20 62  imization over b
1f770 69 6e 64 69 6e 67 20 74 68 65 20 73 61 6d 65 20  inding the same 
1f780 76 61 6c 75 65 20 6f 76 65 72 20 61 6e 64 20 6f  value over and o
1f790 76 65 72 20 61 73 20 72 6f 77 73 20 61 72 65 0a  ver as rows are.
1f7a0 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 65 64 20      ** inserted 
1f7b0 69 6e 74 6f 20 25 5f 69 64 78 20 62 79 20 74 68  into %_idx by th
1f7c0 65 20 63 75 72 72 65 6e 74 20 77 72 69 74 65 72  e current writer
1f7d0 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  .  */.    sqlite
1f7e0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 2d 3e 70 49  3_bind_int(p->pI
1f7f0 64 78 57 72 69 74 65 72 2c 20 31 2c 20 70 57 72  dxWriter, 1, pWr
1f800 69 74 65 72 2d 3e 69 53 65 67 69 64 29 3b 0a 20  iter->iSegid);. 
1f810 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72   }.}../*.** Iter
1f820 61 74 6f 72 20 70 49 74 65 72 20 77 61 73 20 75  ator pIter was u
1f830 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
1f840 68 72 6f 75 67 68 20 74 68 65 20 69 6e 70 75 74  hrough the input
1f850 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 6f 6e 20   segments of on 
1f860 61 6e 0a 2a 2a 20 69 6e 63 72 65 6d 65 6e 74 61  an.** incrementa
1f870 6c 20 6d 65 72 67 65 20 6f 70 65 72 61 74 69 6f  l merge operatio
1f880 6e 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  n. This function
1f890 20 69 73 20 63 61 6c 6c 65 64 20 69 66 20 74 68   is called if th
1f8a0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a  e incremental.**
1f8b0 20 6d 65 72 67 65 20 73 74 65 70 20 68 61 73 20   merge step has 
1f8c0 66 69 6e 69 73 68 65 64 20 62 75 74 20 74 68 65  finished but the
1f8d0 20 69 6e 70 75 74 20 68 61 73 20 6e 6f 74 20 62   input has not b
1f8e0 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65  een completely e
1f8f0 78 68 61 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61  xhausted..*/.sta
1f900 74 69 63 20 76 6f 69 64 20 66 74 73 35 54 72 69  tic void fts5Tri
1f910 6d 53 65 67 6d 65 6e 74 73 28 46 74 73 35 49 6e  mSegments(Fts5In
1f920 64 65 78 20 2a 70 2c 20 46 74 73 35 49 74 65 72  dex *p, Fts5Iter
1f930 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 6e 74 20   *pIter){.  int 
1f940 69 3b 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  i;.  Fts5Buffer 
1f950 62 75 66 3b 0a 20 20 6d 65 6d 73 65 74 28 26 62  buf;.  memset(&b
1f960 75 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  uf, 0, sizeof(Ft
1f970 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20 66 6f  s5Buffer));.  fo
1f980 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72 2d 3e  r(i=0; i<pIter->
1f990 6e 53 65 67 20 26 26 20 70 2d 3e 72 63 3d 3d 53  nSeg && p->rc==S
1f9a0 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a  QLITE_OK; i++){.
1f9b0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
1f9c0 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
1f9d0 61 53 65 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28  aSeg[i];.    if(
1f9e0 20 70 53 65 67 2d 3e 70 53 65 67 3d 3d 30 20 29   pSeg->pSeg==0 )
1f9f0 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70  {.      /* no-op
1fa00 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   */.    }else if
1fa10 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d 30  ( pSeg->pLeaf==0
1fa20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 6c   ){.      /* All
1fa30 20 6b 65 79 73 20 66 72 6f 6d 20 74 68 69 73 20   keys from this 
1fa40 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 20 68 61  input segment ha
1fa50 76 65 20 62 65 65 6e 20 74 72 61 6e 73 66 65 72  ve been transfer
1fa60 65 64 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ed to the output
1fa70 2e 0a 20 20 20 20 20 20 2a 2a 20 53 65 74 20 62  ..      ** Set b
1fa80 6f 74 68 20 74 68 65 20 66 69 72 73 74 20 61 6e  oth the first an
1fa90 64 20 6c 61 73 74 20 70 61 67 65 2d 6e 75 6d 62  d last page-numb
1faa0 65 72 73 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ers to 0 to indi
1fab0 63 61 74 65 20 74 68 61 74 20 74 68 65 0a 20 20  cate that the.  
1fac0 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 69      ** segment i
1fad0 73 20 6e 6f 77 20 65 6d 70 74 79 2e 20 2a 2f 0a  s now empty. */.
1fae0 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
1faf0 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 30 3b 0a  ->pgnoLast = 0;.
1fb00 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53 65 67        pSeg->pSeg
1fb10 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 30 3b  ->pgnoFirst = 0;
1fb20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fb30 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 70 53 65    int iOff = pSe
1fb40 67 2d 3e 69 54 65 72 6d 4c 65 61 66 4f 66 66 73  g->iTermLeafOffs
1fb50 65 74 3b 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  et;     /* Offse
1fb60 74 20 6f 6e 20 6e 65 77 20 66 69 72 73 74 20 6c  t on new first l
1fb70 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  eaf page */.    
1fb80 20 20 69 36 34 20 69 4c 65 61 66 52 6f 77 69 64    i64 iLeafRowid
1fb90 3b 0a 20 20 20 20 20 20 46 74 73 35 44 61 74 61  ;.      Fts5Data
1fba0 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 20 20 69   *pData;.      i
1fbb0 6e 74 20 69 49 64 20 3d 20 70 53 65 67 2d 3e 70  nt iId = pSeg->p
1fbc0 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a 20 20 20  Seg->iSegid;.   
1fbd0 20 20 20 75 38 20 61 48 64 72 5b 34 5d 20 3d 20     u8 aHdr[4] = 
1fbe0 7b 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30  {0x00, 0x00, 0x0
1fbf0 30 2c 20 30 78 30 30 7d 3b 0a 0a 20 20 20 20 20  0, 0x00};..     
1fc00 20 69 4c 65 61 66 52 6f 77 69 64 20 3d 20 46 54   iLeafRowid = FT
1fc10 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
1fc20 28 69 49 64 2c 20 70 53 65 67 2d 3e 69 54 65 72  (iId, pSeg->iTer
1fc30 6d 4c 65 61 66 50 67 6e 6f 29 3b 0a 20 20 20 20  mLeafPgno);.    
1fc40 20 20 70 44 61 74 61 20 3d 20 66 74 73 35 4c 65    pData = fts5Le
1fc50 61 66 52 65 61 64 28 70 2c 20 69 4c 65 61 66 52  afRead(p, iLeafR
1fc60 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 69 66 28  owid);.      if(
1fc70 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20   pData ){.      
1fc80 20 20 69 66 28 20 69 4f 66 66 3e 70 44 61 74 61    if( iOff>pData
1fc90 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
1fca0 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61        /* This ca
1fcb0 6e 20 6f 63 63 75 72 20 69 66 20 74 68 65 20 70  n occur if the p
1fcc0 61 67 65 73 20 74 68 61 74 20 74 68 65 20 73 65  ages that the se
1fcd0 67 6d 65 6e 74 73 20 6f 63 63 75 70 79 20 6f 76  gments occupy ov
1fce0 65 72 6c 61 70 20 2d 20 69 66 0a 20 20 20 20 20  erlap - if.     
1fcf0 20 20 20 20 20 2a 2a 20 61 20 73 69 6e 67 6c 65       ** a single
1fd00 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 61   page has been a
1fd10 73 73 69 67 6e 65 64 20 74 6f 20 6d 6f 72 65 20  ssigned to more 
1fd20 74 68 61 6e 20 6f 6e 65 20 73 65 67 6d 65 6e 74  than one segment
1fd30 2e 20 49 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  . In.          *
1fd40 2a 20 74 68 69 73 20 63 61 73 65 20 61 20 70 72  * this case a pr
1fd50 69 6f 72 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  ior iteration of
1fd60 20 74 68 69 73 20 6c 6f 6f 70 20 6d 61 79 20 68   this loop may h
1fd70 61 76 65 20 63 6f 72 72 75 70 74 65 64 20 74 68  ave corrupted th
1fd80 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
1fd90 65 67 6d 65 6e 74 20 63 75 72 72 65 6e 74 6c 79  egment currently
1fda0 20 62 65 69 6e 67 20 74 72 69 6d 6d 65 64 2e 20   being trimmed. 
1fdb0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 2d   */.          p-
1fdc0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
1fdd0 50 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  PT;.        }els
1fde0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  e{.          fts
1fdf0 35 42 75 66 66 65 72 5a 65 72 6f 28 26 62 75 66  5BufferZero(&buf
1fe00 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  );.          fts
1fe10 35 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e  5BufferGrow(&p->
1fe20 72 63 2c 20 26 62 75 66 2c 20 70 44 61 74 61 2d  rc, &buf, pData-
1fe30 3e 6e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  >nn);.          
1fe40 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fe50 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1fe60 66 2c 20 73 69 7a 65 6f 66 28 61 48 64 72 29 2c  f, sizeof(aHdr),
1fe70 20 61 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   aHdr);.        
1fe80 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1fe90 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1fea0 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74 65 72   &buf, pSeg->ter
1feb0 6d 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m.n);.          
1fec0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fed0 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1fee0 66 2c 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 2c  f, pSeg->term.n,
1fef0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 70 29 3b 0a   pSeg->term.p);.
1ff00 20 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75            fts5Bu
1ff10 66 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26  fferAppendBlob(&
1ff20 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 44 61  p->rc, &buf, pDa
1ff30 74 61 2d 3e 73 7a 4c 65 61 66 2d 69 4f 66 66 2c  ta->szLeaf-iOff,
1ff40 26 70 44 61 74 61 2d 3e 70 5b 69 4f 66 66 5d 29  &pData->p[iOff])
1ff50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ff60 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1ff70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1ff80 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1ff90 66 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 20  f field */.     
1ffa0 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
1ffb0 36 28 26 62 75 66 2e 70 5b 32 5d 2c 20 28 75 31  6(&buf.p[2], (u1
1ffc0 36 29 62 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20  6)buf.n);.      
1ffd0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
1ffe0 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 6e   /* Set up the n
1fff0 65 77 20 70 61 67 65 2d 69 6e 64 65 78 20 61 72  ew page-index ar
20000 72 61 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ray */.         
20010 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
20020 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
20030 26 62 75 66 2c 20 34 29 3b 0a 20 20 20 20 20 20  &buf, 4);.      
20040 20 20 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c      if( pSeg->iL
20050 65 61 66 50 67 6e 6f 3d 3d 70 53 65 67 2d 3e 69  eafPgno==pSeg->i
20060 54 65 72 6d 4c 65 61 66 50 67 6e 6f 20 0a 20 20  TermLeafPgno .  
20070 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
20080 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3c  ->iEndofDoclist<
20090 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 0a 20 20  pData->szLeaf.  
200a0 20 20 20 20 20 20 20 20 20 26 26 20 70 53 65 67           && pSeg
200b0 2d 3e 69 50 67 69 64 78 4f 66 66 3c 3d 70 44 61  ->iPgidxOff<=pDa
200c0 74 61 2d 3e 6e 6e 0a 20 20 20 20 20 20 20 20 20  ta->nn.         
200d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
200e0 69 6e 74 20 6e 44 69 66 66 20 3d 20 70 44 61 74  int nDiff = pDat
200f0 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70 53 65 67  a->szLeaf - pSeg
20100 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69 73 74 3b  ->iEndofDoclist;
20110 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
20120 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
20130 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  int(&p->rc, &buf
20140 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d 20 6e 44  , buf.n - 1 - nD
20150 69 66 66 20 2d 20 34 29 3b 0a 20 20 20 20 20 20  iff - 4);.      
20160 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
20170 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
20180 63 2c 20 26 62 75 66 2c 20 0a 20 20 20 20 20 20  c, &buf, .      
20190 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 2d            pData-
201a0 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69 50 67 69  >nn - pSeg->iPgi
201b0 64 78 4f 66 66 2c 20 26 70 44 61 74 61 2d 3e 70  dxOff, &pData->p
201c0 5b 70 53 65 67 2d 3e 69 50 67 69 64 78 4f 66 66  [pSeg->iPgidxOff
201d0 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  ].            );
201e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
201f0 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e 70 53          pSeg->pS
20200 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20  eg->pgnoFirst = 
20210 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50  pSeg->iTermLeafP
20220 67 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 66  gno;.          f
20230 74 73 35 44 61 74 61 44 65 6c 65 74 65 28 70 2c  ts5DataDelete(p,
20240 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
20250 57 49 44 28 69 49 64 2c 20 31 29 2c 20 69 4c 65  WID(iId, 1), iLe
20260 61 66 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  afRowid);.      
20270 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69 74      fts5DataWrit
20280 65 28 70 2c 20 69 4c 65 61 66 52 6f 77 69 64 2c  e(p, iLeafRowid,
20290 20 62 75 66 2e 70 2c 20 62 75 66 2e 6e 29 3b 0a   buf.p, buf.n);.
202a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
202b0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
202c0 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
202d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74  }.    }.  }.  ft
202e0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 62 75  s5BufferFree(&bu
202f0 66 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f  f);.}..static vo
20300 69 64 20 66 74 73 35 4d 65 72 67 65 43 68 75 6e  id fts5MergeChun
20310 6b 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  kCallback(.  Fts
20320 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 76 6f  5Index *p, .  vo
20330 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 63 6f 6e  id *pCtx, .  con
20340 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20 69  st u8 *pChunk, i
20350 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20 46  nt nChunk.){.  F
20360 74 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57  ts5SegWriter *pW
20370 72 69 74 65 72 20 3d 20 28 46 74 73 35 53 65 67  riter = (Fts5Seg
20380 57 72 69 74 65 72 2a 29 70 43 74 78 3b 0a 20 20  Writer*)pCtx;.  
20390 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 50  fts5WriteAppendP
203a0 6f 73 6c 69 73 74 44 61 74 61 28 70 2c 20 70 57  oslistData(p, pW
203b0 72 69 74 65 72 2c 20 70 43 68 75 6e 6b 2c 20 6e  riter, pChunk, n
203c0 43 68 75 6e 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Chunk);.}../*.**
203d0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
203e0 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c 65  fts5IndexMergeLe
203f0 76 65 6c 28 0a 20 20 46 74 73 35 49 6e 64 65 78  vel(.  Fts5Index
20400 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
20410 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
20420 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
20430 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
20440 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20 20   **ppStruct,    
20450 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 74     /* IN/OUT: St
20460 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78 20  ucture of index 
20470 2a 2f 0a 20 20 69 6e 74 20 69 4c 76 6c 2c 20 20  */.  int iLvl,  
20480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20490 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20 74 6f       /* Level to
204a0 20 72 65 61 64 20 69 6e 70 75 74 20 66 72 6f 6d   read input from
204b0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 52 65 6d   */.  int *pnRem
204c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
204d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 75        /* Write u
204e0 70 20 74 6f 20 74 68 69 73 20 6d 61 6e 79 20 6f  p to this many o
204f0 75 74 70 75 74 20 6c 65 61 76 65 73 20 2a 2f 0a  utput leaves */.
20500 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
20510 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
20520 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35 53  pStruct;.  Fts5S
20530 74 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70  tructureLevel *p
20540 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Lvl = &pStruct->
20550 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20  aLevel[iLvl];.  
20560 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
20570 65 6c 20 2a 70 4c 76 6c 4f 75 74 3b 0a 20 20 46  el *pLvlOut;.  F
20580 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
20590 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 49 74 65   0;       /* Ite
205a0 72 61 74 6f 72 20 74 6f 20 72 65 61 64 20 69 6e  rator to read in
205b0 70 75 74 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  put data */.  in
205c0 74 20 6e 52 65 6d 20 3d 20 70 6e 52 65 6d 20 3f  t nRem = pnRem ?
205d0 20 2a 70 6e 52 65 6d 20 3a 20 30 3b 20 20 2f 2a   *pnRem : 0;  /*
205e0 20 4f 75 74 70 75 74 20 6c 65 61 66 20 70 61 67   Output leaf pag
205f0 65 73 20 6c 65 66 74 20 74 6f 20 77 72 69 74 65  es left to write
20600 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e 70 75 74   */.  int nInput
20610 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20620 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
20630 6f 66 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74  of input segment
20640 73 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  s */.  Fts5SegWr
20650 69 74 65 72 20 77 72 69 74 65 72 3b 20 20 20 20  iter writer;    
20660 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
20670 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
20680 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65 6e  5StructureSegmen
20690 74 20 2a 70 53 65 67 3b 20 20 20 20 20 2f 2a 20  t *pSeg;     /* 
206a0 4f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 2a  Output segment *
206b0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 74  /.  Fts5Buffer t
206c0 65 72 6d 3b 0a 20 20 69 6e 74 20 62 4f 6c 64 65  erm;.  int bOlde
206d0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
206e0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
206f0 66 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  f the output seg
20700 6d 65 6e 74 20 69 73 20 74 68 65 20 6f 6c 64 65  ment is the olde
20710 73 74 20 2a 2f 0a 20 20 69 6e 74 20 65 44 65 74  st */.  int eDet
20720 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  ail = p->pConfig
20730 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 63 6f 6e  ->eDetail;.  con
20740 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
20750 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e  TS5INDEX_QUERY_N
20760 4f 4f 55 54 50 55 54 3b 0a 20 20 69 6e 74 20 62  OOUTPUT;.  int b
20770 54 65 72 6d 57 72 69 74 74 65 6e 20 3d 20 30 3b  TermWritten = 0;
20780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
20790 75 65 20 69 66 20 63 75 72 72 65 6e 74 20 74 65  ue if current te
207a0 72 6d 20 61 6c 72 65 61 64 79 20 6f 75 74 70 75  rm already outpu
207b0 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
207c0 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
207d0 65 76 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  evel );.  assert
207e0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3c 3d  ( pLvl->nMerge<=
207f0 70 4c 76 6c 2d 3e 6e 53 65 67 20 29 3b 0a 0a 20  pLvl->nSeg );.. 
20800 20 6d 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c   memset(&writer,
20810 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 53   0, sizeof(Fts5S
20820 65 67 57 72 69 74 65 72 29 29 3b 0a 20 20 6d 65  egWriter));.  me
20830 6d 73 65 74 28 26 74 65 72 6d 2c 20 30 2c 20 73  mset(&term, 0, s
20840 69 7a 65 6f 66 28 46 74 73 35 42 75 66 66 65 72  izeof(Fts5Buffer
20850 29 29 3b 0a 20 20 69 66 28 20 70 4c 76 6c 2d 3e  ));.  if( pLvl->
20860 6e 4d 65 72 67 65 20 29 7b 0a 20 20 20 20 70 4c  nMerge ){.    pL
20870 76 6c 4f 75 74 20 3d 20 26 70 53 74 72 75 63 74  vlOut = &pStruct
20880 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d  ->aLevel[iLvl+1]
20890 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  ;.    assert( pL
208a0 76 6c 4f 75 74 2d 3e 6e 53 65 67 3e 30 20 29 3b  vlOut->nSeg>0 );
208b0 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c  .    nInput = pL
208c0 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
208d0 70 53 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d  pSeg = &pLvlOut-
208e0 3e 61 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e  >aSeg[pLvlOut->n
208f0 53 65 67 2d 31 5d 3b 0a 0a 20 20 20 20 66 74 73  Seg-1];..    fts
20900 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
20910 72 69 74 65 72 2c 20 70 53 65 67 2d 3e 69 53 65  riter, pSeg->iSe
20920 67 69 64 29 3b 0a 20 20 20 20 77 72 69 74 65 72  gid);.    writer
20930 2e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20 70  .writer.pgno = p
20940 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 2b 31 3b  Seg->pgnoLast+1;
20950 0a 20 20 20 20 77 72 69 74 65 72 2e 69 42 74 50  .    writer.iBtP
20960 61 67 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  age = 0;.  }else
20970 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 67 69 64  {.    int iSegid
20980 20 3d 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53   = fts5AllocateS
20990 65 67 69 64 28 70 2c 20 70 53 74 72 75 63 74 29  egid(p, pStruct)
209a0 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 65 6e 64  ;..    /* Extend
209b0 20 74 68 65 20 46 74 73 35 53 74 72 75 63 74 75   the Fts5Structu
209c0 72 65 20 6f 62 6a 65 63 74 20 61 73 20 72 65 71  re object as req
209d0 75 69 72 65 64 20 74 6f 20 65 6e 73 75 72 65 20  uired to ensure 
209e0 74 68 65 20 6f 75 74 70 75 74 0a 20 20 20 20 2a  the output.    *
209f0 2a 20 73 65 67 6d 65 6e 74 20 65 78 69 73 74 73  * segment exists
20a00 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4c 76  . */.    if( iLv
20a10 6c 3d 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  l==pStruct->nLev
20a20 65 6c 2d 31 20 29 7b 0a 20 20 20 20 20 20 66 74  el-1 ){.      ft
20a30 73 35 53 74 72 75 63 74 75 72 65 41 64 64 4c 65  s5StructureAddLe
20a40 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 70 53 74  vel(&p->rc, ppSt
20a50 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74  ruct);.      pSt
20a60 72 75 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74  ruct = *ppStruct
20a70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
20a80 53 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c  StructureExtendL
20a90 65 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74  evel(&p->rc, pSt
20aa0 72 75 63 74 2c 20 69 4c 76 6c 2b 31 2c 20 31 2c  ruct, iLvl+1, 1,
20ab0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e   0);.    if( p->
20ac0 72 63 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  rc ) return;.   
20ad0 20 70 4c 76 6c 20 3d 20 26 70 53 74 72 75 63 74   pLvl = &pStruct
20ae0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a  ->aLevel[iLvl];.
20af0 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26 70      pLvlOut = &p
20b00 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
20b10 4c 76 6c 2b 31 5d 3b 0a 0a 20 20 20 20 66 74 73  Lvl+1];..    fts
20b20 35 57 72 69 74 65 49 6e 69 74 28 70 2c 20 26 77  5WriteInit(p, &w
20b30 72 69 74 65 72 2c 20 69 53 65 67 69 64 29 3b 0a  riter, iSegid);.
20b40 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
20b50 6e 65 77 20 73 65 67 6d 65 6e 74 20 74 6f 20 74  new segment to t
20b60 68 65 20 6f 75 74 70 75 74 20 6c 65 76 65 6c 20  he output level 
20b70 2a 2f 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  */.    pSeg = &p
20b80 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
20b90 6c 4f 75 74 2d 3e 6e 53 65 67 5d 3b 0a 20 20 20  lOut->nSeg];.   
20ba0 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2b 2b   pLvlOut->nSeg++
20bb0 3b 0a 20 20 20 20 70 53 65 67 2d 3e 70 67 6e 6f  ;.    pSeg->pgno
20bc0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 70  First = 1;.    p
20bd0 53 65 67 2d 3e 69 53 65 67 69 64 20 3d 20 69 53  Seg->iSegid = iS
20be0 65 67 69 64 3b 0a 20 20 20 20 70 53 74 72 75 63  egid;.    pStruc
20bf0 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a 0a  t->nSegment++;..
20c00 20 20 20 20 2f 2a 20 52 65 61 64 20 69 6e 70 75      /* Read inpu
20c10 74 20 66 72 6f 6d 20 61 6c 6c 20 73 65 67 6d 65  t from all segme
20c20 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
20c30 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 6e 49   level */.    nI
20c40 6e 70 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65  nput = pLvl->nSe
20c50 67 3b 0a 20 20 7d 0a 20 20 62 4f 6c 64 65 73 74  g;.  }.  bOldest
20c60 20 3d 20 28 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65   = (pLvlOut->nSe
20c70 67 3d 3d 31 20 26 26 20 70 53 74 72 75 63 74 2d  g==1 && pStruct-
20c80 3e 6e 4c 65 76 65 6c 3d 3d 69 4c 76 6c 2b 32 29  >nLevel==iLvl+2)
20c90 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69 4c 76  ;..  assert( iLv
20ca0 6c 3e 3d 30 20 29 3b 0a 20 20 66 6f 72 28 66 74  l>=0 );.  for(ft
20cb0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28 70  s5MultiIterNew(p
20cc0 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67 73  , pStruct, flags
20cd0 2c 20 30 2c 20 30 2c 20 30 2c 20 69 4c 76 6c 2c  , 0, 0, 0, iLvl,
20ce0 20 6e 49 6e 70 75 74 2c 20 26 70 49 74 65 72 29   nInput, &pIter)
20cf0 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74  ;.      fts5Mult
20d00 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65  iIterEof(p, pIte
20d10 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73  r)==0;.      fts
20d20 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
20d30 2c 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20  , pIter, 0, 0). 
20d40 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
20d50 74 65 72 20 2a 70 53 65 67 49 74 65 72 20 3d 20  ter *pSegIter = 
20d60 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
20d70 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
20d80 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 69 6e 74  First ];.    int
20d90 20 6e 50 6f 73 3b 20 20 20 20 20 20 20 20 20 20   nPos;          
20da0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 6f             /* po
20db0 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65  sition-list size
20dc0 20 66 69 65 6c 64 20 76 61 6c 75 65 20 2a 2f 0a   field value */.
20dd0 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 3b 0a 20      int nTerm;. 
20de0 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54 65     const u8 *pTe
20df0 72 6d 3b 0a 0a 20 20 20 20 70 54 65 72 6d 20 3d  rm;..    pTerm =
20e00 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65   fts5MultiIterTe
20e10 72 6d 28 70 49 74 65 72 2c 20 26 6e 54 65 72 6d  rm(pIter, &nTerm
20e20 29 3b 0a 20 20 20 20 69 66 28 20 6e 54 65 72 6d  );.    if( nTerm
20e30 21 3d 74 65 72 6d 2e 6e 20 7c 7c 20 66 74 73 35  !=term.n || fts5
20e40 4d 65 6d 63 6d 70 28 70 54 65 72 6d 2c 20 74 65  Memcmp(pTerm, te
20e50 72 6d 2e 70 2c 20 6e 54 65 72 6d 29 20 29 7b 0a  rm.p, nTerm) ){.
20e60 20 20 20 20 20 20 69 66 28 20 70 6e 52 65 6d 20        if( pnRem 
20e70 26 26 20 77 72 69 74 65 72 2e 6e 4c 65 61 66 57  && writer.nLeafW
20e80 72 69 74 74 65 6e 3e 6e 52 65 6d 20 29 7b 0a 20  ritten>nRem ){. 
20e90 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
20ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74 73 35      }.      fts5
20eb0 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e 72 63  BufferSet(&p->rc
20ec0 2c 20 26 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  , &term, nTerm, 
20ed0 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 62 54  pTerm);.      bT
20ee0 65 72 6d 57 72 69 74 74 65 6e 20 3d 30 3b 0a 20  ermWritten =0;. 
20ef0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
20f00 63 6b 20 66 6f 72 20 6b 65 79 20 61 6e 6e 69 68  ck for key annih
20f10 69 6c 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  ilation. */.    
20f20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e 6e 50  if( pSegIter->nP
20f30 6f 73 3d 3d 30 20 26 26 20 28 62 4f 6c 64 65 73  os==0 && (bOldes
20f40 74 20 7c 7c 20 70 53 65 67 49 74 65 72 2d 3e 62  t || pSegIter->b
20f50 44 65 6c 3d 3d 30 29 20 29 20 63 6f 6e 74 69 6e  Del==0) ) contin
20f60 75 65 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ue;..    if( p->
20f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
20f80 20 62 54 65 72 6d 57 72 69 74 74 65 6e 3d 3d 30   bTermWritten==0
20f90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69   ){.      /* Thi
20fa0 73 20 69 73 20 61 20 6e 65 77 20 74 65 72 6d 2e  s is a new term.
20fb0 20 41 70 70 65 6e 64 20 61 20 74 65 72 6d 20 74   Append a term t
20fc0 6f 20 74 68 65 20 6f 75 74 70 75 74 20 73 65 67  o the output seg
20fd0 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 66  ment. */.      f
20fe0 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54 65  ts5WriteAppendTe
20ff0 72 6d 28 70 2c 20 26 77 72 69 74 65 72 2c 20 6e  rm(p, &writer, n
21000 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20 20  Term, pTerm);.  
21010 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65 6e      bTermWritten
21020 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 1;.    }..   
21030 20 2f 2a 20 41 70 70 65 6e 64 20 74 68 65 20 72   /* Append the r
21040 6f 77 69 64 20 74 6f 20 74 68 65 20 6f 75 74 70  owid to the outp
21050 75 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 57 52 49  ut */.    /* WRI
21060 54 45 50 4f 53 4c 49 53 54 53 49 5a 45 20 2a 2f  TEPOSLISTSIZE */
21070 0a 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70  .    fts5WriteAp
21080 70 65 6e 64 52 6f 77 69 64 28 70 2c 20 26 77 72  pendRowid(p, &wr
21090 69 74 65 72 2c 20 66 74 73 35 4d 75 6c 74 69 49  iter, fts5MultiI
210a0 74 65 72 52 6f 77 69 64 28 70 49 74 65 72 29 29  terRowid(pIter))
210b0 3b 0a 0a 20 20 20 20 69 66 28 20 65 44 65 74 61  ;..    if( eDeta
210c0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
210d0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66  NONE ){.      if
210e0 28 20 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c  ( pSegIter->bDel
210f0 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35   ){.        fts5
21100 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72 69  BufferAppendVari
21110 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69 74  nt(&p->rc, &writ
21120 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20 30  er.writer.buf, 0
21130 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
21140 53 65 67 49 74 65 72 2d 3e 6e 50 6f 73 3e 30 20  SegIter->nPos>0 
21150 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 74 73  ){.          fts
21160 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61 72  5BufferAppendVar
21170 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77 72 69  int(&p->rc, &wri
21180 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66 2c 20  ter.writer.buf, 
21190 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
211a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
211b0 0a 20 20 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  .      /* Append
211c0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 2d 6c 69   the position-li
211d0 73 74 20 64 61 74 61 20 74 6f 20 74 68 65 20 6f  st data to the o
211e0 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 6e  utput */.      n
211f0 50 6f 73 20 3d 20 70 53 65 67 49 74 65 72 2d 3e  Pos = pSegIter->
21200 6e 50 6f 73 2a 32 20 2b 20 70 53 65 67 49 74 65  nPos*2 + pSegIte
21210 72 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20 66  r->bDel;.      f
21220 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
21230 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 77  arint(&p->rc, &w
21240 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75 66  riter.writer.buf
21250 2c 20 6e 50 6f 73 29 3b 0a 20 20 20 20 20 20 66  , nPos);.      f
21260 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
21270 70 2c 20 70 53 65 67 49 74 65 72 2c 20 28 76 6f  p, pSegIter, (vo
21280 69 64 2a 29 26 77 72 69 74 65 72 2c 20 66 74 73  id*)&writer, fts
21290 35 4d 65 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62  5MergeChunkCallb
212a0 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ack);.    }.  }.
212b0 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
212c0 6c 61 73 74 20 6c 65 61 66 20 70 61 67 65 20 74  last leaf page t
212d0 6f 20 64 69 73 6b 2e 20 53 65 74 20 74 68 65 20  o disk. Set the 
212e0 6f 75 74 70 75 74 20 73 65 67 6d 65 6e 74 20 62  output segment b
212f0 2d 74 72 65 65 20 68 65 69 67 68 74 0a 20 20 2a  -tree height.  *
21300 2a 20 61 6e 64 20 6c 61 73 74 20 6c 65 61 66 20  * and last leaf 
21310 70 61 67 65 20 6e 75 6d 62 65 72 20 61 74 20 74  page number at t
21320 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 20 20 2a  he same time.  *
21330 2f 0a 20 20 66 74 73 35 57 72 69 74 65 46 69 6e  /.  fts5WriteFin
21340 69 73 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20  ish(p, &writer, 
21350 26 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 29  &pSeg->pgnoLast)
21360 3b 0a 0a 20 20 69 66 28 20 66 74 73 35 4d 75 6c  ;..  if( fts5Mul
21370 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
21380 65 72 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  er) ){.    int i
21390 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65  ;..    /* Remove
213a0 20 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73   the redundant s
213b0 65 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65  egments from the
213c0 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 2a 2f   %_data table */
213d0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
213e0 6e 49 6e 70 75 74 3b 20 69 2b 2b 29 7b 0a 20 20  nInput; i++){.  
213f0 20 20 20 20 66 74 73 35 44 61 74 61 52 65 6d 6f      fts5DataRemo
21400 76 65 53 65 67 6d 65 6e 74 28 70 2c 20 70 4c 76  veSegment(p, pLv
21410 6c 2d 3e 61 53 65 67 5b 69 5d 2e 69 53 65 67 69  l->aSeg[i].iSegi
21420 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
21430 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64  * Remove the red
21440 75 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20  undant segments 
21450 66 72 6f 6d 20 74 68 65 20 69 6e 70 75 74 20 6c  from the input l
21460 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20  evel */.    if( 
21470 70 4c 76 6c 2d 3e 6e 53 65 67 21 3d 6e 49 6e 70  pLvl->nSeg!=nInp
21480 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
21490 6e 4d 6f 76 65 20 3d 20 28 70 4c 76 6c 2d 3e 6e  nMove = (pLvl->n
214a0 53 65 67 20 2d 20 6e 49 6e 70 75 74 29 20 2a 20  Seg - nInput) * 
214b0 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
214c0 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
214d0 20 20 20 20 6d 65 6d 6d 6f 76 65 28 70 4c 76 6c      memmove(pLvl
214e0 2d 3e 61 53 65 67 2c 20 26 70 4c 76 6c 2d 3e 61  ->aSeg, &pLvl->a
214f0 53 65 67 5b 6e 49 6e 70 75 74 5d 2c 20 6e 4d 6f  Seg[nInput], nMo
21500 76 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ve);.    }.    p
21510 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
21520 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20 20   -= nInput;.    
21530 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 3d 20 6e 49  pLvl->nSeg -= nI
21540 6e 70 75 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e  nput;.    pLvl->
21550 6e 4d 65 72 67 65 20 3d 20 30 3b 0a 20 20 20 20  nMerge = 0;.    
21560 69 66 28 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61  if( pSeg->pgnoLa
21570 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  st==0 ){.      p
21580 4c 76 6c 4f 75 74 2d 3e 6e 53 65 67 2d 2d 3b 0a  LvlOut->nSeg--;.
21590 20 20 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e        pStruct->n
215a0 53 65 67 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 7d  Segment--;.    }
215b0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
215c0 73 65 72 74 28 20 70 53 65 67 2d 3e 70 67 6e 6f  sert( pSeg->pgno
215d0 4c 61 73 74 3e 30 20 29 3b 0a 20 20 20 20 66 74  Last>0 );.    ft
215e0 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28 70  s5TrimSegments(p
215f0 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 70 4c  , pIter);.    pL
21600 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20 6e 49 6e  vl->nMerge = nIn
21610 70 75 74 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  put;.  }..  fts5
21620 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70 49  MultiIterFree(pI
21630 74 65 72 29 3b 0a 20 20 66 74 73 35 42 75 66 66  ter);.  fts5Buff
21640 65 72 46 72 65 65 28 26 74 65 72 6d 29 3b 0a 20  erFree(&term);. 
21650 20 69 66 28 20 70 6e 52 65 6d 20 29 20 2a 70 6e   if( pnRem ) *pn
21660 52 65 6d 20 2d 3d 20 77 72 69 74 65 72 2e 6e 4c  Rem -= writer.nL
21670 65 61 66 57 72 69 74 74 65 6e 3b 0a 7d 0a 0a 2f  eafWritten;.}../
21680 2a 0a 2a 2a 20 44 6f 20 75 70 20 74 6f 20 6e 50  *.** Do up to nP
21690 67 20 70 61 67 65 73 20 6f 66 20 61 75 74 6f 6d  g pages of autom
216a0 65 72 67 65 20 77 6f 72 6b 20 6f 6e 20 74 68 65  erge work on the
216b0 20 69 6e 64 65 78 2e 0a 2a 2a 0a 2a 2a 20 52 65   index..**.** Re
216c0 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 79  turn true if any
216d0 20 63 68 61 6e 67 65 73 20 77 65 72 65 20 61 63   changes were ac
216e0 74 75 61 6c 6c 79 20 6d 61 64 65 2c 20 6f 72 20  tually made, or 
216f0 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
21700 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21710 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 0a 20  ts5IndexMerge(. 
21720 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20   Fts5Index *p,  
21730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21740 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64   /* FTS5 backend
21750 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73   object */.  Fts
21760 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53  5Structure **ppS
21770 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a 20  truct,       /* 
21780 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20  IN/OUT: Current 
21790 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64  structure of ind
217a0 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 67 2c  ex */.  int nPg,
217b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
217c0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
217d0 20 6f 66 20 77 6f 72 6b 20 74 6f 20 64 6f 20 2a   of work to do *
217e0 2f 0a 20 20 69 6e 74 20 6e 4d 69 6e 20 20 20 20  /.  int nMin    
217f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21800 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e      /* Minimum n
21810 75 6d 62 65 72 20 6f 66 20 73 65 67 6d 65 6e 74  umber of segment
21820 73 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b  s to merge */.){
21830 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 6e 50  .  int nRem = nP
21840 67 3b 0a 20 20 69 6e 74 20 62 52 65 74 20 3d 20  g;.  int bRet = 
21850 30 3b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  0;.  Fts5Structu
21860 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 2a 70  re *pStruct = *p
21870 70 53 74 72 75 63 74 3b 0a 20 20 77 68 69 6c 65  pStruct;.  while
21880 28 20 6e 52 65 6d 3e 30 20 26 26 20 70 2d 3e 72  ( nRem>0 && p->r
21890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
218a0 20 20 20 20 69 6e 74 20 69 4c 76 6c 3b 20 20 20      int iLvl;   
218b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218c0 2f 2a 20 54 6f 20 69 74 65 72 61 74 65 20 74 68  /* To iterate th
218d0 72 6f 75 67 68 20 6c 65 76 65 6c 73 20 2a 2f 0a  rough levels */.
218e0 20 20 20 20 69 6e 74 20 69 42 65 73 74 4c 76 6c      int iBestLvl
218f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
21900 2f 2a 20 4c 65 76 65 6c 20 6f 66 66 65 72 69 6e  /* Level offerin
21910 67 20 74 68 65 20 6d 6f 73 74 20 69 6e 70 75 74  g the most input
21920 20 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 20   segments */.   
21930 20 69 6e 74 20 6e 42 65 73 74 20 3d 20 30 3b 20   int nBest = 0; 
21940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21950 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
21960 73 65 67 6d 65 6e 74 73 20 6f 6e 20 62 65 73 74  segments on best
21970 20 6c 65 76 65 6c 20 2a 2f 0a 0a 20 20 20 20 2f   level */..    /
21980 2a 20 53 65 74 20 69 42 65 73 74 4c 76 6c 20 74  * Set iBestLvl t
21990 6f 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 72  o the level to r
219a0 65 61 64 20 69 6e 70 75 74 20 73 65 67 6d 65 6e  ead input segmen
219b0 74 73 20 66 72 6f 6d 2e 20 2a 2f 0a 20 20 20 20  ts from. */.    
219c0 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
219d0 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b 0a 20 20 20  >nLevel>0 );.   
219e0 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20 69 4c 76   for(iLvl=0; iLv
219f0 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  l<pStruct->nLeve
21a00 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
21a10 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
21a20 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
21a30 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
21a40 76 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  vl];.      if( p
21a50 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b 0a 20  Lvl->nMerge ){. 
21a60 20 20 20 20 20 20 20 69 66 28 20 70 4c 76 6c 2d         if( pLvl-
21a70 3e 6e 4d 65 72 67 65 3e 6e 42 65 73 74 20 29 7b  >nMerge>nBest ){
21a80 0a 20 20 20 20 20 20 20 20 20 20 69 42 65 73 74  .          iBest
21a90 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a 20 20 20 20  Lvl = iLvl;.    
21aa0 20 20 20 20 20 20 6e 42 65 73 74 20 3d 20 70 4c        nBest = pL
21ab0 76 6c 2d 3e 6e 4d 65 72 67 65 3b 0a 20 20 20 20  vl->nMerge;.    
21ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72      }.        br
21ad0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
21ae0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65     if( pLvl->nSe
21af0 67 3e 6e 42 65 73 74 20 29 7b 0a 20 20 20 20 20  g>nBest ){.     
21b00 20 20 20 6e 42 65 73 74 20 3d 20 70 4c 76 6c 2d     nBest = pLvl-
21b10 3e 6e 53 65 67 3b 0a 20 20 20 20 20 20 20 20 69  >nSeg;.        i
21b20 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76 6c 3b 0a  BestLvl = iLvl;.
21b30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21b40 20 20 20 2f 2a 20 49 66 20 6e 42 65 73 74 20 69     /* If nBest i
21b50 73 20 73 74 69 6c 6c 20 30 2c 20 74 68 65 6e 20  s still 0, then 
21b60 74 68 65 20 69 6e 64 65 78 20 6d 75 73 74 20 62  the index must b
21b70 65 20 65 6d 70 74 79 2e 20 2a 2f 0a 23 69 66 64  e empty. */.#ifd
21b80 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
21b90 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
21ba0 6e 42 65 73 74 3d 3d 30 20 26 26 20 69 4c 76 6c  nBest==0 && iLvl
21bb0 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
21bc0 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iLvl++){.     
21bd0 20 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74   assert( pStruct
21be0 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e  ->aLevel[iLvl].n
21bf0 53 65 67 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  Seg==0 );.    }.
21c00 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
21c10 6e 42 65 73 74 3c 6e 4d 69 6e 20 26 26 20 70 53  nBest<nMin && pS
21c20 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 42  truct->aLevel[iB
21c30 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65 3d 3d  estLvl].nMerge==
21c40 30 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 ){.      break
21c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 52 65 74  ;.    }.    bRet
21c60 20 3d 20 31 3b 0a 20 20 20 20 66 74 73 35 49 6e   = 1;.    fts5In
21c70 64 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c  dexMergeLevel(p,
21c80 20 26 70 53 74 72 75 63 74 2c 20 69 42 65 73 74   &pStruct, iBest
21c90 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b 0a 20 20 20  Lvl, &nRem);.   
21ca0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
21cb0 54 45 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74  TE_OK && pStruct
21cc0 2d 3e 61 4c 65 76 65 6c 5b 69 42 65 73 74 4c 76  ->aLevel[iBestLv
21cd0 6c 5d 2e 6e 4d 65 72 67 65 3d 3d 30 20 29 7b 0a  l].nMerge==0 ){.
21ce0 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
21cf0 75 72 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 42  urePromote(p, iB
21d00 65 73 74 4c 76 6c 2b 31 2c 20 70 53 74 72 75 63  estLvl+1, pStruc
21d10 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
21d20 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
21d30 75 63 74 3b 0a 20 20 72 65 74 75 72 6e 20 62 52  uct;.  return bR
21d40 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 74  et;.}../*.** A t
21d50 6f 74 61 6c 20 6f 66 20 6e 4c 65 61 66 20 6c 65  otal of nLeaf le
21d60 61 66 20 70 61 67 65 73 20 6f 66 20 64 61 74 61  af pages of data
21d70 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 66   has just been f
21d80 6c 75 73 68 65 64 20 74 6f 20 61 20 6c 65 76 65  lushed to a leve
21d90 6c 2d 30 0a 2a 2a 20 73 65 67 6d 65 6e 74 2e 20  l-0.** segment. 
21da0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 70  This function up
21db0 64 61 74 65 73 20 74 68 65 20 77 72 69 74 65 2d  dates the write-
21dc0 63 6f 75 6e 74 65 72 20 61 63 63 6f 72 64 69 6e  counter accordin
21dd0 67 6c 79 20 61 6e 64 2c 20 69 66 0a 2a 2a 20 6e  gly and, if.** n
21de0 65 63 65 73 73 61 72 79 2c 20 70 65 72 66 6f 72  ecessary, perfor
21df0 6d 73 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 6d  ms incremental m
21e00 65 72 67 65 20 77 6f 72 6b 2e 0a 2a 2a 0a 2a 2a  erge work..**.**
21e10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
21e20 75 72 73 2c 20 73 65 74 20 74 68 65 20 46 74 73  urs, set the Fts
21e30 35 49 6e 64 65 78 2e 72 63 20 65 72 72 6f 72 20  5Index.rc error 
21e40 63 6f 64 65 2e 20 49 66 20 61 6e 20 65 72 72 6f  code. If an erro
21e50 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72 65 61 64  r has .** alread
21e60 79 20 6f 63 63 75 72 72 65 64 2c 20 74 68 69 73  y occurred, this
21e70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
21e80 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
21e90 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 41 75  void fts5IndexAu
21ea0 74 6f 6d 65 72 67 65 28 0a 20 20 46 74 73 35 49  tomerge(.  Fts5I
21eb0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
21ec0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
21ed0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
21ee0 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63  t */.  Fts5Struc
21ef0 74 75 72 65 20 2a 2a 70 70 53 74 72 75 63 74 2c  ture **ppStruct,
21f00 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
21f10 3a 20 43 75 72 72 65 6e 74 20 73 74 72 75 63 74  : Current struct
21f20 75 72 65 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a  ure of index */.
21f30 20 20 69 6e 74 20 6e 4c 65 61 66 20 20 20 20 20    int nLeaf     
21f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
21f60 75 74 70 75 74 20 6c 65 61 76 65 73 20 6a 75 73  utput leaves jus
21f70 74 20 77 72 69 74 74 65 6e 20 2a 2f 0a 29 7b 0a  t written */.){.
21f80 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
21f90 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 70 43 6f  ITE_OK && p->pCo
21fa0 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67 65  nfig->nAutomerge
21fb0 3e 30 20 29 7b 0a 20 20 20 20 46 74 73 35 53 74  >0 ){.    Fts5St
21fc0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
21fd0 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20   = *ppStruct;.  
21fe0 20 20 75 36 34 20 6e 57 72 69 74 65 3b 20 20 20    u64 nWrite;   
21ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22000 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75 65  /* Initial value
22010 20 6f 66 20 77 72 69 74 65 2d 63 6f 75 6e 74 65   of write-counte
22020 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 57 6f  r */.    int nWo
22030 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
22040 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
22050 20 6f 66 20 77 6f 72 6b 2d 71 75 61 6e 74 61 20   of work-quanta 
22060 74 6f 20 70 65 72 66 6f 72 6d 20 2a 2f 0a 20 20  to perform */.  
22070 20 20 69 6e 74 20 6e 52 65 6d 3b 20 20 20 20 20    int nRem;     
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22090 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61  /* Number of lea
220a0 66 20 70 61 67 65 73 20 6c 65 66 74 20 74 6f 20  f pages left to 
220b0 77 72 69 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  write */..    /*
220c0 20 55 70 64 61 74 65 20 74 68 65 20 77 72 69 74   Update the writ
220d0 65 2d 63 6f 75 6e 74 65 72 2e 20 57 68 69 6c 65  e-counter. While
220e0 20 64 6f 69 6e 67 20 73 6f 2c 20 73 65 74 20 6e   doing so, set n
220f0 57 6f 72 6b 2e 20 2a 2f 0a 20 20 20 20 6e 57 72  Work. */.    nWr
22100 69 74 65 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  ite = pStruct->n
22110 57 72 69 74 65 43 6f 75 6e 74 65 72 3b 0a 20 20  WriteCounter;.  
22120 20 20 6e 57 6f 72 6b 20 3d 20 28 69 6e 74 29 28    nWork = (int)(
22130 28 28 6e 57 72 69 74 65 20 2b 20 6e 4c 65 61 66  ((nWrite + nLeaf
22140 29 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  ) / p->nWorkUnit
22150 29 20 2d 20 28 6e 57 72 69 74 65 20 2f 20 70 2d  ) - (nWrite / p-
22160 3e 6e 57 6f 72 6b 55 6e 69 74 29 29 3b 0a 20 20  >nWorkUnit));.  
22170 20 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74    pStruct->nWrit
22180 65 43 6f 75 6e 74 65 72 20 2b 3d 20 6e 4c 65 61  eCounter += nLea
22190 66 3b 0a 20 20 20 20 6e 52 65 6d 20 3d 20 28 69  f;.    nRem = (i
221a0 6e 74 29 28 70 2d 3e 6e 57 6f 72 6b 55 6e 69 74  nt)(p->nWorkUnit
221b0 20 2a 20 6e 57 6f 72 6b 20 2a 20 70 53 74 72 75   * nWork * pStru
221c0 63 74 2d 3e 6e 4c 65 76 65 6c 29 3b 0a 0a 20 20  ct->nLevel);..  
221d0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
221e0 28 70 2c 20 70 70 53 74 72 75 63 74 2c 20 6e 52  (p, ppStruct, nR
221f0 65 6d 2c 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  em, p->pConfig->
22200 6e 41 75 74 6f 6d 65 72 67 65 29 3b 0a 20 20 7d  nAutomerge);.  }
22210 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
22220 66 74 73 35 49 6e 64 65 78 43 72 69 73 69 73 6d  fts5IndexCrisism
22230 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erge(.  Fts5Inde
22240 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
22250 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
22260 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
22270 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
22280 65 20 2a 2a 70 70 53 74 72 75 63 74 20 20 20 20  e **ppStruct    
22290 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
222a0 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65  urrent structure
222b0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a   of index */.){.
222c0 20 20 63 6f 6e 73 74 20 69 6e 74 20 6e 43 72 69    const int nCri
222d0 73 69 73 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67  sis = p->pConfig
222e0 2d 3e 6e 43 72 69 73 69 73 4d 65 72 67 65 3b 0a  ->nCrisisMerge;.
222f0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
22300 2a 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74  *pStruct = *ppSt
22310 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 4c 76 6c  ruct;.  int iLvl
22320 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
22330 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f   p->rc!=SQLITE_O
22340 4b 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c  K || pStruct->nL
22350 65 76 65 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c  evel>0 );.  whil
22360 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  e( p->rc==SQLITE
22370 5f 4f 4b 20 26 26 20 70 53 74 72 75 63 74 2d 3e  _OK && pStruct->
22380 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65  aLevel[iLvl].nSe
22390 67 3e 3d 6e 43 72 69 73 69 73 20 29 7b 0a 20 20  g>=nCrisis ){.  
223a0 20 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65    fts5IndexMerge
223b0 4c 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63  Level(p, &pStruc
223c0 74 2c 20 69 4c 76 6c 2c 20 30 29 3b 0a 20 20 20  t, iLvl, 0);.   
223d0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d   assert( p->rc!=
223e0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
223f0 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 28 69 4c  ruct->nLevel>(iL
22400 76 6c 2b 31 29 20 29 3b 0a 20 20 20 20 66 74 73  vl+1) );.    fts
22410 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
22420 65 28 70 2c 20 69 4c 76 6c 2b 31 2c 20 70 53 74  e(p, iLvl+1, pSt
22430 72 75 63 74 29 3b 0a 20 20 20 20 69 4c 76 6c 2b  ruct);.    iLvl+
22440 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75  +;.  }.  *ppStru
22450 63 74 20 3d 20 70 53 74 72 75 63 74 3b 0a 7d 0a  ct = pStruct;.}.
22460 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35  .static int fts5
22470 49 6e 64 65 78 52 65 74 75 72 6e 28 46 74 73 35  IndexReturn(Fts5
22480 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 69 6e 74  Index *p){.  int
22490 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 70   rc = p->rc;.  p
224a0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
224b0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
224c0 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
224d0 20 46 74 73 35 46 6c 75 73 68 43 74 78 20 46 74   Fts5FlushCtx Ft
224e0 73 35 46 6c 75 73 68 43 74 78 3b 0a 73 74 72 75  s5FlushCtx;.stru
224f0 63 74 20 46 74 73 35 46 6c 75 73 68 43 74 78 20  ct Fts5FlushCtx 
22500 7b 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  {.  Fts5Index *p
22510 49 64 78 3b 0a 20 20 46 74 73 35 53 65 67 57 72  Idx;.  Fts5SegWr
22520 69 74 65 72 20 77 72 69 74 65 72 3b 20 0a 7d 3b  iter writer; .};
22530 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66 65 72 20 61  ../*.** Buffer a
22540 42 75 66 5b 5d 20 63 6f 6e 74 61 69 6e 73 20 61  Buf[] contains a
22550 20 6c 69 73 74 20 6f 66 20 76 61 72 69 6e 74 73   list of varints
22560 2c 20 61 6c 6c 20 73 6d 61 6c 6c 20 65 6e 6f 75  , all small enou
22570 67 68 20 74 6f 20 66 69 74 0a 2a 2a 20 69 6e 20  gh to fit.** in 
22580 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
22590 2e 20 52 65 74 75 72 6e 20 74 68 65 20 73 69 7a  . Return the siz
225a0 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  e of the largest
225b0 20 70 72 65 66 69 78 20 6f 66 20 74 68 69 73 20   prefix of this 
225c0 0a 2a 2a 20 6c 69 73 74 20 6e 4d 61 78 20 62 79  .** list nMax by
225d0 74 65 73 20 6f 72 20 6c 65 73 73 20 69 6e 20 73  tes or less in s
225e0 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
225f0 6e 74 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72  nt fts5PoslistPr
22600 65 66 69 78 28 63 6f 6e 73 74 20 75 38 20 2a 61  efix(const u8 *a
22610 42 75 66 2c 20 69 6e 74 20 6e 4d 61 78 29 7b 0a  Buf, int nMax){.
22620 20 20 69 6e 74 20 72 65 74 3b 0a 20 20 75 33 32    int ret;.  u32
22630 20 64 75 6d 6d 79 3b 0a 20 20 72 65 74 20 3d 20   dummy;.  ret = 
22640 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
22650 61 42 75 66 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  aBuf, dummy);.  
22660 69 66 28 20 72 65 74 3c 6e 4d 61 78 20 29 7b 0a  if( ret<nMax ){.
22670 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a      while( 1 ){.
22680 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 66 74        int i = ft
22690 73 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61  s5GetVarint32(&a
226a0 42 75 66 5b 72 65 74 5d 2c 20 64 75 6d 6d 79 29  Buf[ret], dummy)
226b0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 72 65 74  ;.      if( (ret
226c0 20 2b 20 69 29 20 3e 20 6e 4d 61 78 20 29 20 62   + i) > nMax ) b
226d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 65 74 20  reak;.      ret 
226e0 2b 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  += i;.    }.  }.
226f0 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
22700 0a 2f 2a 0a 2a 2a 20 46 6c 75 73 68 20 74 68 65  ./*.** Flush the
22710 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 2d   contents of in-
22720 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61 62 6c  memory hash tabl
22730 65 20 69 48 61 73 68 20 74 6f 20 61 20 6e 65 77  e iHash to a new
22740 20 6c 65 76 65 6c 2d 30 20 0a 2a 2a 20 73 65 67   level-0 .** seg
22750 6d 65 6e 74 20 6f 6e 20 64 69 73 6b 2e 20 41 6c  ment on disk. Al
22760 73 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 6f  so update the co
22770 72 72 65 73 70 6f 6e 64 69 6e 67 20 73 74 72 75  rresponding stru
22780 63 74 75 72 65 20 72 65 63 6f 72 64 2e 0a 2a 2a  cture record..**
22790 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
227a0 6f 63 63 75 72 73 2c 20 73 65 74 20 74 68 65 20  occurs, set the 
227b0 46 74 73 35 49 6e 64 65 78 2e 72 63 20 65 72 72  Fts5Index.rc err
227c0 6f 72 20 63 6f 64 65 2e 20 49 66 20 61 6e 20 65  or code. If an e
227d0 72 72 6f 72 20 68 61 73 20 0a 2a 2a 20 61 6c 72  rror has .** alr
227e0 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c 20 74  eady occurred, t
227f0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
22800 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
22810 69 63 20 76 6f 69 64 20 66 74 73 35 46 6c 75 73  ic void fts5Flus
22820 68 4f 6e 65 48 61 73 68 28 46 74 73 35 49 6e 64  hOneHash(Fts5Ind
22830 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 48 61  ex *p){.  Fts5Ha
22840 73 68 20 2a 70 48 61 73 68 20 3d 20 70 2d 3e 70  sh *pHash = p->p
22850 48 61 73 68 3b 0a 20 20 46 74 73 35 53 74 72 75  Hash;.  Fts5Stru
22860 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a  cture *pStruct;.
22870 20 20 69 6e 74 20 69 53 65 67 69 64 3b 0a 20 20    int iSegid;.  
22880 69 6e 74 20 70 67 6e 6f 4c 61 73 74 20 3d 20 30  int pgnoLast = 0
22890 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
228a0 20 20 2f 2a 20 4c 61 73 74 20 6c 65 61 66 20 70    /* Last leaf p
228b0 61 67 65 20 6e 75 6d 62 65 72 20 69 6e 20 73 65  age number in se
228c0 67 6d 65 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  gment */..  /* O
228d0 62 74 61 69 6e 20 61 20 72 65 66 65 72 65 6e 63  btain a referenc
228e0 65 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 73  e to the index s
228f0 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 6c 6c  tructure and all
22900 6f 63 61 74 65 20 61 20 6e 65 77 20 73 65 67 6d  ocate a new segm
22910 65 6e 74 2d 69 64 0a 20 20 2a 2a 20 66 6f 72 20  ent-id.  ** for 
22920 74 68 65 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  the new level-0 
22930 73 65 67 6d 65 6e 74 2e 20 20 2a 2f 0a 20 20 70  segment.  */.  p
22940 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
22950 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20  uctureRead(p);. 
22960 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
22970 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
22980 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
22990 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
229a0 74 65 28 70 29 3b 0a 0a 20 20 69 66 28 20 69 53  te(p);..  if( iS
229b0 65 67 69 64 20 29 7b 0a 20 20 20 20 63 6f 6e 73  egid ){.    cons
229c0 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 2d 3e  t int pgsz = p->
229d0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3b 0a 20  pConfig->pgsz;. 
229e0 20 20 20 69 6e 74 20 65 44 65 74 61 69 6c 20 3d     int eDetail =
229f0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
22a00 74 61 69 6c 3b 0a 20 20 20 20 46 74 73 35 53 74  tail;.    Fts5St
22a10 72 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a  ructureSegment *
22a20 70 53 65 67 3b 20 20 20 2f 2a 20 4e 65 77 20 73  pSeg;   /* New s
22a30 65 67 6d 65 6e 74 20 77 69 74 68 69 6e 20 70 53  egment within pS
22a40 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 46 74 73  truct */.    Fts
22a50 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20 20  5Buffer *pBuf;  
22a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
22a70 66 66 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f  ffer in which to
22a80 20 61 73 73 65 6d 62 6c 65 20 6c 65 61 66 20 70   assemble leaf p
22a90 61 67 65 20 2a 2f 0a 20 20 20 20 46 74 73 35 42  age */.    Fts5B
22aa0 75 66 66 65 72 20 2a 70 50 67 69 64 78 3b 20 20  uffer *pPgidx;  
22ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66           /* Buff
22ac0 65 72 20 69 6e 20 77 68 69 63 68 20 74 6f 20 61  er in which to a
22ad0 73 73 65 6d 62 6c 65 20 70 67 69 64 78 20 2a 2f  ssemble pgidx */
22ae0 0a 0a 20 20 20 20 46 74 73 35 53 65 67 57 72 69  ..    Fts5SegWri
22af0 74 65 72 20 77 72 69 74 65 72 3b 0a 20 20 20 20  ter writer;.    
22b00 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 70 2c  fts5WriteInit(p,
22b10 20 26 77 72 69 74 65 72 2c 20 69 53 65 67 69 64   &writer, iSegid
22b20 29 3b 0a 0a 20 20 20 20 70 42 75 66 20 3d 20 26  );..    pBuf = &
22b30 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 62 75  writer.writer.bu
22b40 66 3b 0a 20 20 20 20 70 50 67 69 64 78 20 3d 20  f;.    pPgidx = 
22b50 26 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70  &writer.writer.p
22b60 67 69 64 78 3b 0a 0a 20 20 20 20 2f 2a 20 66 74  gidx;..    /* ft
22b70 73 35 57 72 69 74 65 49 6e 69 74 28 29 20 73 68  s5WriteInit() sh
22b80 6f 75 6c 64 20 68 61 76 65 20 69 6e 69 74 69 61  ould have initia
22b90 6c 69 7a 65 64 20 74 68 65 20 62 75 66 66 65 72  lized the buffer
22ba0 73 20 74 6f 20 28 6d 6f 73 74 20 6c 69 6b 65 6c  s to (most likel
22bb0 79 29 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61  y).    ** the ma
22bc0 78 69 6d 75 6d 20 73 70 61 63 65 20 72 65 71 75  ximum space requ
22bd0 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ired. */.    ass
22be0 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70 42  ert( p->rc || pB
22bf0 75 66 2d 3e 6e 53 70 61 63 65 3e 3d 28 70 67 73  uf->nSpace>=(pgs
22c00 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
22c10 44 44 49 4e 47 29 20 29 3b 0a 20 20 20 20 61 73  DDING) );.    as
22c20 73 65 72 74 28 20 70 2d 3e 72 63 20 7c 7c 20 70  sert( p->rc || p
22c30 50 67 69 64 78 2d 3e 6e 53 70 61 63 65 3e 3d 28  Pgidx->nSpace>=(
22c40 70 67 73 7a 20 2b 20 46 54 53 35 5f 44 41 54 41  pgsz + FTS5_DATA
22c50 5f 50 41 44 44 49 4e 47 29 20 29 3b 0a 0a 20 20  _PADDING) );..  
22c60 20 20 2f 2a 20 42 65 67 69 6e 20 73 63 61 6e 6e    /* Begin scann
22c70 69 6e 67 20 74 68 72 6f 75 67 68 20 68 61 73 68  ing through hash
22c80 20 74 61 62 6c 65 20 65 6e 74 72 69 65 73 2e 20   table entries. 
22c90 54 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20 6f  This loop runs o
22ca0 6e 63 65 20 66 6f 72 20 65 61 63 68 0a 20 20 20  nce for each.   
22cb0 20 2a 2a 20 74 65 72 6d 2f 64 6f 63 6c 69 73 74   ** term/doclist
22cc0 20 63 75 72 72 65 6e 74 6c 79 20 73 74 6f 72 65   currently store
22cd0 64 20 77 69 74 68 69 6e 20 74 68 65 20 68 61 73  d within the has
22ce0 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20  h table. */.    
22cf0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
22d00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
22d10 3e 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73  >rc = sqlite3Fts
22d20 35 48 61 73 68 53 63 61 6e 49 6e 69 74 28 70 48  5HashScanInit(pH
22d30 61 73 68 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ash, 0, 0);.    
22d40 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e  }.    while( p->
22d50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
22d60 20 30 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 48   0==sqlite3Fts5H
22d70 61 73 68 53 63 61 6e 45 6f 66 28 70 48 61 73 68  ashScanEof(pHash
22d80 29 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ) ){.      const
22d90 20 63 68 61 72 20 2a 7a 54 65 72 6d 3b 20 20 20   char *zTerm;   
22da0 20 20 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72         /* Buffer
22db0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 65 72 6d   containing term
22dc0 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
22dd0 75 38 20 2a 70 44 6f 63 6c 69 73 74 3b 20 20 20  u8 *pDoclist;   
22de0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
22df0 20 74 6f 20 64 6f 63 6c 69 73 74 20 66 6f 72 20   to doclist for 
22e00 74 68 69 73 20 74 65 72 6d 20 2a 2f 0a 20 20 20  this term */.   
22e10 20 20 20 69 6e 74 20 6e 44 6f 63 6c 69 73 74 3b     int nDoclist;
22e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22e30 2a 20 53 69 7a 65 20 6f 66 20 64 6f 63 6c 69 73  * Size of doclis
22e40 74 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20  t in bytes */.. 
22e50 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
22e60 65 20 74 65 72 6d 20 66 6f 72 20 74 68 69 73 20  e term for this 
22e70 65 6e 74 72 79 20 74 6f 20 64 69 73 6b 2e 20 2a  entry to disk. *
22e80 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  /.      sqlite3F
22e90 74 73 35 48 61 73 68 53 63 61 6e 45 6e 74 72 79  ts5HashScanEntry
22ea0 28 70 48 61 73 68 2c 20 26 7a 54 65 72 6d 2c 20  (pHash, &zTerm, 
22eb0 26 70 44 6f 63 6c 69 73 74 2c 20 26 6e 44 6f 63  &pDoclist, &nDoc
22ec0 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73  list);.      fts
22ed0 35 57 72 69 74 65 41 70 70 65 6e 64 54 65 72 6d  5WriteAppendTerm
22ee0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 28 69 6e  (p, &writer, (in
22ef0 74 29 73 74 72 6c 65 6e 28 7a 54 65 72 6d 29 2c  t)strlen(zTerm),
22f00 20 28 63 6f 6e 73 74 20 75 38 2a 29 7a 54 65 72   (const u8*)zTer
22f10 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  m);.      if( p-
22f20 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc!=SQLITE_OK )
22f30 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 61   break;..      a
22f40 73 73 65 72 74 28 20 77 72 69 74 65 72 2e 62 46  ssert( writer.bF
22f50 69 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 3d  irstRowidInPage=
22f60 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
22f70 70 67 73 7a 3e 3d 28 70 42 75 66 2d 3e 6e 20 2b  pgsz>=(pBuf->n +
22f80 20 70 50 67 69 64 78 2d 3e 6e 20 2b 20 6e 44 6f   pPgidx->n + nDo
22f90 63 6c 69 73 74 20 2b 20 31 29 20 29 7b 0a 20 20  clist + 1) ){.  
22fa0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
22fb0 69 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c  ire doclist will
22fc0 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
22fd0 65 6e 74 20 6c 65 61 66 2e 20 2a 2f 0a 20 20 20  ent leaf. */.   
22fe0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
22ff0 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
23000 75 66 2c 20 70 44 6f 63 6c 69 73 74 2c 20 6e 44  uf, pDoclist, nD
23010 6f 63 6c 69 73 74 29 3b 0a 20 20 20 20 20 20 7d  oclist);.      }
23020 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
23030 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  4 iRowid = 0;.  
23040 20 20 20 20 20 20 69 36 34 20 69 44 65 6c 74 61        i64 iDelta
23050 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
23060 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 20  t iOff = 0;..   
23070 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74 69       /* The enti
23080 72 65 20 64 6f 63 6c 69 73 74 20 77 69 6c 6c 20  re doclist will 
23090 6e 6f 74 20 66 69 74 20 6f 6e 20 74 68 69 73 20  not fit on this 
230a0 6c 65 61 66 2e 20 54 68 65 20 66 6f 6c 6c 6f 77  leaf. The follow
230b0 69 6e 67 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ing .        ** 
230c0 6c 6f 6f 70 20 69 74 65 72 61 74 65 73 20 74 68  loop iterates th
230d0 72 6f 75 67 68 20 74 68 65 20 70 6f 73 6c 69 73  rough the poslis
230e0 74 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  ts that make up 
230f0 74 68 65 20 63 75 72 72 65 6e 74 20 0a 20 20 20  the current .   
23100 20 20 20 20 20 2a 2a 20 64 6f 63 6c 69 73 74 2e       ** doclist.
23110 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69    */.        whi
23120 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
23130 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 6e 44 6f  E_OK && iOff<nDo
23140 63 6c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  clist ){.       
23150 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
23160 65 74 56 61 72 69 6e 74 28 26 70 44 6f 63 6c 69  etVarint(&pDocli
23170 73 74 5b 69 4f 66 66 5d 2c 20 28 75 36 34 2a 29  st[iOff], (u64*)
23180 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 20 20  &iDelta);.      
23190 20 20 20 20 69 52 6f 77 69 64 20 2b 3d 20 69 44      iRowid += iD
231a0 65 6c 74 61 3b 0a 20 20 20 20 20 20 20 20 20 20  elta;.          
231b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77  .          if( w
231c0 72 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69  riter.bFirstRowi
231d0 64 49 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20  dInPage ){.     
231e0 20 20 20 20 20 20 20 66 74 73 35 50 75 74 55 31         fts5PutU1
231f0 36 28 26 70 42 75 66 2d 3e 70 5b 30 5d 2c 20 28  6(&pBuf->p[0], (
23200 75 31 36 29 70 42 75 66 2d 3e 6e 29 3b 20 20 20  u16)pBuf->n);   
23210 2f 2a 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f  /* first rowid o
23220 6e 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  n page */.      
23230 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
23240 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
23250 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
23260 42 75 66 2d 3e 6e 5d 2c 20 69 52 6f 77 69 64 29  Buf->n], iRowid)
23270 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 72  ;.            wr
23280 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
23290 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  InPage = 0;.    
232a0 20 20 20 20 20 20 20 20 66 74 73 35 57 72 69 74          fts5Writ
232b0 65 44 6c 69 64 78 41 70 70 65 6e 64 28 70 2c 20  eDlidxAppend(p, 
232c0 26 77 72 69 74 65 72 2c 20 69 52 6f 77 69 64 29  &writer, iRowid)
232d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
232e0 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
232f0 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  OK ) break;.    
23300 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23310 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 6e           pBuf->n
23320 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 50   += sqlite3Fts5P
23330 75 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  utVarint(&pBuf->
23340 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c  p[pBuf->n], iDel
23350 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ta);.          }
23360 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
23370 74 28 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66  t( pBuf->n<=pBuf
23380 2d 3e 6e 53 70 61 63 65 20 29 3b 0a 0a 20 20 20  ->nSpace );..   
23390 20 20 20 20 20 20 20 69 66 28 20 65 44 65 74 61         if( eDeta
233a0 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f  il==FTS5_DETAIL_
233b0 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  NONE ){.        
233c0 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f      if( iOff<nDo
233d0 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69 73  clist && pDoclis
233e0 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20  t[iOff]==0 ){.  
233f0 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75 66              pBuf
23400 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d  ->p[pBuf->n++] =
23410 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
23420 20 20 69 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20    iOff++;.      
23430 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
23440 3c 6e 44 6f 63 6c 69 73 74 20 26 26 20 70 44 6f  <nDoclist && pDo
23450 63 6c 69 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29  clist[iOff]==0 )
23460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23470 20 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e    pBuf->p[pBuf->
23480 6e 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  n++] = 0;.      
23490 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 2b 2b            iOff++
234a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
234b0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
234c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
234d0 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64  (pBuf->n + pPgid
234e0 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20  x->n)>=pgsz ){. 
234f0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73               fts
23500 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
23510 70 2c 20 26 77 72 69 74 65 72 29 3b 0a 20 20 20  p, &writer);.   
23520 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23540 20 20 20 20 20 20 20 20 69 6e 74 20 62 44 75 6d          int bDum
23550 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  my;.            
23560 69 6e 74 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20  int nPos;.      
23570 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
23580 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
23590 53 69 7a 65 28 26 70 44 6f 63 6c 69 73 74 5b 69  Size(&pDoclist[i
235a0 4f 66 66 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44  Off], &nPos, &bD
235b0 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20 20  ummy);.         
235c0 20 20 20 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73     nCopy += nPos
235d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
235e0 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67  ( (pBuf->n + pPg
235f0 69 64 78 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20  idx->n + nCopy) 
23600 3c 3d 20 70 67 73 7a 20 29 7b 0a 20 20 20 20 20  <= pgsz ){.     
23610 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
23620 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74 20 77  entire poslist w
23630 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 63  ill fit on the c
23640 75 72 72 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20  urrent leaf. So 
23650 63 6f 70 79 0a 20 20 20 20 20 20 20 20 20 20 20  copy.           
23660 20 20 20 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20     ** it in one 
23670 67 6f 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  go. */.         
23680 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
23690 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42  afeAppendBlob(pB
236a0 75 66 2c 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f  uf, &pDoclist[iO
236b0 66 66 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  ff], nCopy);.   
236c0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236e0 20 54 68 65 20 65 6e 74 69 72 65 20 70 6f 73 6c   The entire posl
236f0 69 73 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74  ist will not fit
23700 20 6f 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 53   on this leaf. S
23710 6f 20 69 74 20 6e 65 65 64 73 0a 20 20 20 20 20  o it needs.     
23720 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 62           ** to b
23730 65 20 62 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65  e broken into se
23740 63 74 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  ctions. The only
23750 20 71 75 61 6c 69 66 69 63 61 74 69 6f 6e 20 62   qualification b
23760 65 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20  eing.           
23770 20 20 20 2a 2a 20 74 68 61 74 20 65 61 63 68 20     ** that each 
23780 76 61 72 69 6e 74 20 6d 75 73 74 20 62 65 20 73  varint must be s
23790 74 6f 72 65 64 20 63 6f 6e 74 69 67 75 6f 75 73  tored contiguous
237a0 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ly.  */.        
237b0 20 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a        const u8 *
237c0 70 50 6f 73 6c 69 73 74 20 3d 20 26 70 44 6f 63  pPoslist = &pDoc
237d0 6c 69 73 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20  list[iOff];.    
237e0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
237f0 6f 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  os = 0;.        
23800 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e        while( p->
23810 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23820 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23830 20 69 6e 74 20 6e 53 70 61 63 65 20 3d 20 70 67   int nSpace = pg
23840 73 7a 20 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70  sz - pBuf->n - p
23850 50 67 69 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20  Pgidx->n;.      
23860 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20            int n 
23870 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23880 20 20 20 20 20 69 66 28 20 28 6e 43 6f 70 79 20       if( (nCopy 
23890 2d 20 69 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20  - iPos)<=nSpace 
238a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
238b0 20 20 20 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d       n = nCopy -
238c0 20 69 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   iPos;.         
238d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238f0 6e 20 3d 20 66 74 73 35 50 6f 73 6c 69 73 74 50  n = fts5PoslistP
23900 72 65 66 69 78 28 26 70 50 6f 73 6c 69 73 74 5b  refix(&pPoslist[
23910 69 50 6f 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a  iPos], nSpace);.
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23930 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }.              
23940 20 20 61 73 73 65 72 74 28 20 6e 3e 30 20 29 3b    assert( n>0 );
23950 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23960 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
23970 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20  ppendBlob(pBuf, 
23980 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c  &pPoslist[iPos],
23990 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   n);.           
239a0 20 20 20 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a       iPos += n;.
239b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
239c0 69 66 28 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70  if( (pBuf->n + p
239d0 50 67 69 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20  Pgidx->n)>=pgsz 
239e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
239f0 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
23a00 75 73 68 4c 65 61 66 28 70 2c 20 26 77 72 69 74  ushLeaf(p, &writ
23a10 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
23a20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23a30 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 3e         if( iPos>
23a40 3d 6e 43 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a  =nCopy ) break;.
23a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
23a60 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23a70 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
23a80 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  = nCopy;.       
23a90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23aa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
23ab0 20 54 4f 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20   TODO2: Doclist 
23ac0 74 65 72 6d 69 6e 61 74 6f 72 20 77 72 69 74 74  terminator writt
23ad0 65 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20  en here. */.    
23ae0 20 20 2f 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75    /* pBuf->p[pBu
23af0 66 2d 3e 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20  f->n++] = '\0'; 
23b00 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
23b10 20 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e   pBuf->n<=pBuf->
23b20 6e 53 70 61 63 65 20 29 3b 0a 20 20 20 20 20 20  nSpace );.      
23b30 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
23b40 45 5f 4f 4b 20 29 20 73 71 6c 69 74 65 33 46 74  E_OK ) sqlite3Ft
23b50 73 35 48 61 73 68 53 63 61 6e 4e 65 78 74 28 70  s5HashScanNext(p
23b60 48 61 73 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Hash);.    }.   
23b70 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68   sqlite3Fts5Hash
23b80 43 6c 65 61 72 28 70 48 61 73 68 29 3b 0a 20 20  Clear(pHash);.  
23b90 20 20 66 74 73 35 57 72 69 74 65 46 69 6e 69 73    fts5WriteFinis
23ba0 68 28 70 2c 20 26 77 72 69 74 65 72 2c 20 26 70  h(p, &writer, &p
23bb0 67 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f  gnoLast);..    /
23bc0 2a 20 55 70 64 61 74 65 20 74 68 65 20 46 74 73  * Update the Fts
23bd0 35 53 74 72 75 63 74 75 72 65 2e 20 49 74 20 69  5Structure. It i
23be0 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74  s written back t
23bf0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
23c00 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 74 73  y the.    ** fts
23c10 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
23c20 65 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20  e() call below. 
23c30 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 74 72   */.    if( pStr
23c40 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29  uct->nLevel==0 )
23c50 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
23c60 63 74 75 72 65 41 64 64 4c 65 76 65 6c 28 26 70  ctureAddLevel(&p
23c70 2d 3e 72 63 2c 20 26 70 53 74 72 75 63 74 29 3b  ->rc, &pStruct);
23c80 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53  .    }.    fts5S
23c90 74 72 75 63 74 75 72 65 45 78 74 65 6e 64 4c 65  tructureExtendLe
23ca0 76 65 6c 28 26 70 2d 3e 72 63 2c 20 70 53 74 72  vel(&p->rc, pStr
23cb0 75 63 74 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20  uct, 0, 1, 0);. 
23cc0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
23cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23ce0 20 70 53 65 67 20 3d 20 26 70 53 74 72 75 63 74   pSeg = &pStruct
23cf0 2d 3e 61 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67  ->aLevel[0].aSeg
23d00 5b 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65  [ pStruct->aLeve
23d10 6c 5b 30 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20  l[0].nSeg++ ];. 
23d20 20 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67 69       pSeg->iSegi
23d30 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20 20  d = iSegid;.    
23d40 20 20 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73    pSeg->pgnoFirs
23d50 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 53 65  t = 1;.      pSe
23d60 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67  g->pgnoLast = pg
23d70 6e 6f 4c 61 73 74 3b 0a 20 20 20 20 20 20 70 53  noLast;.      pS
23d80 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b  truct->nSegment+
23d90 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  +;.    }.    fts
23da0 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
23db0 65 28 70 2c 20 30 2c 20 70 53 74 72 75 63 74 29  e(p, 0, pStruct)
23dc0 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64  ;.  }..  fts5Ind
23dd0 65 78 41 75 74 6f 6d 65 72 67 65 28 70 2c 20 26  exAutomerge(p, &
23de0 70 53 74 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73  pStruct, pgnoLas
23df0 74 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 43  t);.  fts5IndexC
23e00 72 69 73 69 73 6d 65 72 67 65 28 70 2c 20 26 70  risismerge(p, &p
23e10 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53  Struct);.  fts5S
23e20 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70 2c  tructureWrite(p,
23e30 20 70 53 74 72 75 63 74 29 3b 0a 20 20 66 74 73   pStruct);.  fts
23e40 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
23e50 65 28 70 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f  e(pStruct);.}../
23e60 2a 0a 2a 2a 20 46 6c 75 73 68 20 61 6e 79 20 64  *.** Flush any d
23e70 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
23e80 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68  e in-memory hash
23e90 20 74 61 62 6c 65 73 20 74 6f 20 74 68 65 20 64   tables to the d
23ea0 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  atabase..*/.stat
23eb0 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65  ic void fts5Inde
23ec0 78 46 6c 75 73 68 28 46 74 73 35 49 6e 64 65 78  xFlush(Fts5Index
23ed0 20 2a 70 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73   *p){.  /* Unles
23ee0 73 20 69 74 20 69 73 20 65 6d 70 74 79 2c 20 66  s it is empty, f
23ef0 6c 75 73 68 20 74 68 65 20 68 61 73 68 20 74 61  lush the hash ta
23f00 62 6c 65 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20  ble to disk */. 
23f10 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67   if( p->nPending
23f20 44 61 74 61 20 29 7b 0a 20 20 20 20 61 73 73 65  Data ){.    asse
23f30 72 74 28 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a  rt( p->pHash );.
23f40 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44      p->nPendingD
23f50 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 66 74 73  ata = 0;.    fts
23f60 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28 70 29  5FlushOneHash(p)
23f70 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
23f80 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 66  Fts5Structure *f
23f90 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
23fa0 53 74 72 75 63 74 28 0a 20 20 46 74 73 35 49 6e  Struct(.  Fts5In
23fb0 64 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53  dex *p, .  Fts5S
23fc0 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
23fd0 74 0a 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  t.){.  Fts5Struc
23fe0 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a  ture *pNew = 0;.
23ff0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
24000 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 46  nByte = sizeof(F
24010 74 73 35 53 74 72 75 63 74 75 72 65 29 3b 0a 20  ts5Structure);. 
24020 20 69 6e 74 20 6e 53 65 67 20 3d 20 70 53 74 72   int nSeg = pStr
24030 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20  uct->nSegment;. 
24040 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69   int i;..  /* Fi
24050 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73  gure out if this
24060 20 73 74 72 75 63 74 75 72 65 20 72 65 71 75 69   structure requi
24070 72 65 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  res optimization
24080 2e 20 41 20 73 74 72 75 63 74 75 72 65 20 64 6f  . A structure do
24090 65 73 0a 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75  es.  ** not requ
240a0 69 72 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ire optimization
240b0 20 69 66 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a   if either:.  **
240c0 0a 20 20 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73  .  **  + it cons
240d0 69 73 74 73 20 6f 66 20 66 65 77 65 72 20 74 68  ists of fewer th
240e0 61 6e 20 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c  an two segments,
240f0 20 6f 72 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c   or .  **  + all
24100 20 73 65 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e   segments are on
24110 20 74 68 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c   the same level,
24120 20 6f 72 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20   or.  **  + all 
24130 73 65 67 6d 65 6e 74 73 20 65 78 63 65 70 74 20  segments except 
24140 6f 6e 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  one are currentl
24150 79 20 69 6e 70 75 74 73 20 74 6f 20 61 20 6d 65  y inputs to a me
24160 72 67 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  rge operation.. 
24170 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20   **.  ** In the 
24180 66 69 72 73 74 20 63 61 73 65 2c 20 72 65 74 75  first case, retu
24190 72 6e 20 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20  rn NULL. In the 
241a0 73 65 63 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e  second, incremen
241b0 74 20 74 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a  t the ref-count.
241c0 20 20 2a 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74    ** on *pStruct
241d0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 6f   and return a co
241e0 70 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65  py of the pointe
241f0 72 20 74 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  r to it..  */.  
24200 69 66 28 20 6e 53 65 67 3c 32 20 29 20 72 65 74  if( nSeg<2 ) ret
24210 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
24220 3b 20 69 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65  ; i<pStruct->nLe
24230 76 65 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  vel; i++){.    i
24240 6e 74 20 6e 54 68 69 73 20 3d 20 70 53 74 72 75  nt nThis = pStru
24250 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53  ct->aLevel[i].nS
24260 65 67 3b 0a 20 20 20 20 69 66 28 20 6e 54 68 69  eg;.    if( nThi
24270 73 3d 3d 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69  s==nSeg || (nThi
24280 73 3d 3d 6e 53 65 67 2d 31 20 26 26 20 70 53 74  s==nSeg-1 && pSt
24290 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e  ruct->aLevel[i].
242a0 6e 4d 65 72 67 65 3d 3d 6e 54 68 69 73 29 20 29  nMerge==nThis) )
242b0 7b 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75  {.      fts5Stru
242c0 63 74 75 72 65 52 65 66 28 70 53 74 72 75 63 74  ctureRef(pStruct
242d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
242e0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20  pStruct;.    }. 
242f0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 72 75     assert( pStru
24300 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d  ct->aLevel[i].nM
24310 65 72 67 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20  erge<=nThis );. 
24320 20 7d 0a 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28   }..  nByte += (
24330 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b  pStruct->nLevel+
24340 31 29 20 2a 20 73 69 7a 65 6f 66 28 46 74 73 35  1) * sizeof(Fts5
24350 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c 29 3b  StructureLevel);
24360 0a 20 20 70 4e 65 77 20 3d 20 28 46 74 73 35 53  .  pNew = (Fts5S
24370 74 72 75 63 74 75 72 65 2a 29 73 71 6c 69 74 65  tructure*)sqlite
24380 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
24390 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
243a0 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20  .  if( pNew ){. 
243b0 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
243c0 4c 65 76 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20  Level *pLvl;.   
243d0 20 6e 42 79 74 65 20 3d 20 6e 53 65 67 20 2a 20   nByte = nSeg * 
243e0 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72 75 63  sizeof(Fts5Struc
243f0 74 75 72 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20  tureSegment);.  
24400 20 20 70 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d    pNew->nLevel =
24410 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c   pStruct->nLevel
24420 2b 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52  +1;.    pNew->nR
24430 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77  ef = 1;.    pNew
24440 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
24450 3d 20 70 53 74 72 75 63 74 2d 3e 6e 57 72 69 74  = pStruct->nWrit
24460 65 43 6f 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c  eCounter;.    pL
24470 76 6c 20 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76  vl = &pNew->aLev
24480 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76  el[pStruct->nLev
24490 65 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61  el];.    pLvl->a
244a0 53 65 67 20 3d 20 28 46 74 73 35 53 74 72 75 63  Seg = (Fts5Struc
244b0 74 75 72 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c  tureSegment*)sql
244c0 69 74 65 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65  ite3Fts5MallocZe
244d0 72 6f 28 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65  ro(&p->rc, nByte
244e0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 76 6c 2d  );.    if( pLvl-
244f0 3e 61 53 65 67 20 29 7b 0a 20 20 20 20 20 20 69  >aSeg ){.      i
24500 6e 74 20 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20  nt iLvl, iSeg;. 
24510 20 20 20 20 20 69 6e 74 20 69 53 65 67 4f 75 74       int iSegOut
24520 20 3d 20 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49   = 0;.      /* I
24530 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
24540 6c 6c 20 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f  ll segments, fro
24550 6d 20 6f 6c 64 65 73 74 20 74 6f 20 6e 65 77 65  m oldest to newe
24560 73 74 2e 20 41 64 64 20 74 68 65 6d 20 74 6f 0a  st. Add them to.
24570 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77        ** the new
24580 20 46 74 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63   Fts5Level objec
24590 74 20 73 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e  t so that pLvl->
245a0 61 53 65 67 5b 30 5d 20 69 73 20 74 68 65 20 6f  aSeg[0] is the o
245b0 6c 64 65 73 74 0a 20 20 20 20 20 20 2a 2a 20 73  ldest.      ** s
245c0 65 67 6d 65 6e 74 20 69 6e 20 74 68 65 20 64 61  egment in the da
245d0 74 61 20 73 74 72 75 63 74 75 72 65 2e 20 20 2a  ta structure.  *
245e0 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c  /.      for(iLvl
245f0 3d 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  =pStruct->nLevel
24600 2d 31 3b 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76  -1; iLvl>=0; iLv
24610 6c 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  l--){.        fo
24620 72 28 69 53 65 67 3d 30 3b 20 69 53 65 67 3c 70  r(iSeg=0; iSeg<p
24630 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69  Struct->aLevel[i
24640 4c 76 6c 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b  Lvl].nSeg; iSeg+
24650 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  +){.          pL
24660 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67 4f 75 74  vl->aSeg[iSegOut
24670 5d 20 3d 20 70 53 74 72 75 63 74 2d 3e 61 4c 65  ] = pStruct->aLe
24680 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69  vel[iLvl].aSeg[i
24690 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  Seg];.          
246a0 69 53 65 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20  iSegOut++;.     
246b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
246c0 20 20 20 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e     pNew->nSegmen
246d0 74 20 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d  t = pLvl->nSeg =
246e0 20 6e 53 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65   nSeg;.    }else
246f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24700 66 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  free(pNew);.    
24710 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    pNew = 0;.    
24720 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
24730 70 4e 65 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c  pNew;.}..int sql
24740 69 74 65 33 46 74 73 35 49 6e 64 65 78 4f 70 74  ite3Fts5IndexOpt
24750 69 6d 69 7a 65 28 46 74 73 35 49 6e 64 65 78 20  imize(Fts5Index 
24760 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63  *p){.  Fts5Struc
24770 74 75 72 65 20 2a 70 53 74 72 75 63 74 3b 0a 20  ture *pStruct;. 
24780 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
24790 70 4e 65 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73  pNew = 0;..  ass
247a0 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
247b0 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49  TE_OK );.  fts5I
247c0 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
247d0 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
247e0 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
247f0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
24800 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20  nvalidate(p);.. 
24810 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b 0a   if( pStruct ){.
24820 20 20 20 20 70 4e 65 77 20 3d 20 66 74 73 35 49      pNew = fts5I
24830 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72 75  ndexOptimizeStru
24840 63 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  ct(p, pStruct);.
24850 20 20 7d 0a 20 20 66 74 73 35 53 74 72 75 63 74    }.  fts5Struct
24860 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
24870 63 74 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ct);..  assert( 
24880 70 4e 65 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d  pNew==0 || pNew-
24890 3e 6e 53 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20  >nSegment>0 );. 
248a0 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20   if( pNew ){.   
248b0 20 69 6e 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66   int iLvl;.    f
248c0 6f 72 28 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d  or(iLvl=0; pNew-
248d0 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
248e0 65 67 3d 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d  eg==0; iLvl++){}
248f0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72  .    while( p->r
24900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24910 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  pNew->aLevel[iLv
24920 6c 5d 2e 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20  l].nSeg>0 ){.   
24930 20 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54     int nRem = FT
24940 53 35 5f 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54  S5_OPT_WORK_UNIT
24950 3b 0a 20 20 20 20 20 20 66 74 73 35 49 6e 64 65  ;.      fts5Inde
24960 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20 26  xMergeLevel(p, &
24970 70 4e 65 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65  pNew, iLvl, &nRe
24980 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66  m);.    }..    f
24990 74 73 35 53 74 72 75 63 74 75 72 65 57 72 69 74  ts5StructureWrit
249a0 65 28 70 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20  e(p, pNew);.    
249b0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 6c  fts5StructureRel
249c0 65 61 73 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a  ease(pNew);.  }.
249d0 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49 6e  .  return fts5In
249e0 64 65 78 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d  dexReturn(p); .}
249f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
24a00 63 61 6c 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d  called to implem
24a10 65 6e 74 20 74 68 65 20 73 70 65 63 69 61 6c 20  ent the special 
24a20 22 56 41 4c 55 45 53 28 27 6d 65 72 67 65 27 2c  "VALUES('merge',
24a30 20 24 6e 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e   $nMerge)".** IN
24a40 53 45 52 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f  SERT command..*/
24a50 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
24a60 49 6e 64 65 78 4d 65 72 67 65 28 46 74 73 35 49  IndexMerge(Fts5I
24a70 6e 64 65 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65  ndex *p, int nMe
24a80 72 67 65 29 7b 0a 20 20 46 74 73 35 53 74 72 75  rge){.  Fts5Stru
24a90 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20 3d  cture *pStruct =
24aa0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65   fts5StructureRe
24ab0 61 64 28 70 29 3b 0a 20 20 69 66 28 20 70 53 74  ad(p);.  if( pSt
24ac0 72 75 63 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ruct ){.    int 
24ad0 6e 4d 69 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69  nMin = p->pConfi
24ae0 67 2d 3e 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20  g->nUsermerge;. 
24af0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24b00 49 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20  Invalidate(p);. 
24b10 20 20 20 69 66 28 20 6e 4d 65 72 67 65 3c 30 20     if( nMerge<0 
24b20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
24b30 75 63 74 75 72 65 20 2a 70 4e 65 77 20 3d 20 66  ucture *pNew = f
24b40 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65  ts5IndexOptimize
24b50 53 74 72 75 63 74 28 70 2c 20 70 53 74 72 75 63  Struct(p, pStruc
24b60 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 53 74  t);.      fts5St
24b70 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
24b80 53 74 72 75 63 74 29 3b 0a 20 20 20 20 20 20 70  Struct);.      p
24b90 53 74 72 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20  Struct = pNew;. 
24ba0 20 20 20 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20       nMin = 2;. 
24bb0 20 20 20 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d       nMerge = nM
24bc0 65 72 67 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20  erge*-1;.    }. 
24bd0 20 20 20 69 66 28 20 70 53 74 72 75 63 74 20 26     if( pStruct &
24be0 26 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  & pStruct->nLeve
24bf0 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 66  l ){.      if( f
24c00 74 73 35 49 6e 64 65 78 4d 65 72 67 65 28 70 2c  ts5IndexMerge(p,
24c10 20 26 70 53 74 72 75 63 74 2c 20 6e 4d 65 72 67   &pStruct, nMerg
24c20 65 2c 20 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20  e, nMin) ){.    
24c30 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
24c40 65 57 72 69 74 65 28 70 2c 20 70 53 74 72 75 63  eWrite(p, pStruc
24c50 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
24c60 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  }.    fts5Struct
24c70 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
24c80 63 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ct);.  }.  retur
24c90 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
24ca0 6e 28 70 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n(p);.}..static 
24cb0 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 52  void fts5AppendR
24cc0 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
24cd0 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65 6c  x *p,.  i64 iDel
24ce0 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20 2a  ta,.  Fts5Iter *
24cf0 70 55 6e 75 73 65 64 2c 0a 20 20 46 74 73 35 42  pUnused,.  Fts5B
24d00 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
24d10 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55   UNUSED_PARAM(pU
24d20 6e 75 73 65 64 29 3b 0a 20 20 66 74 73 35 42 75  nused);.  fts5Bu
24d30 66 66 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74  fferAppendVarint
24d40 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69  (&p->rc, pBuf, i
24d50 44 65 6c 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69  Delta);.}..stati
24d60 63 20 76 6f 69 64 20 66 74 73 35 41 70 70 65 6e  c void fts5Appen
24d70 64 50 6f 73 6c 69 73 74 28 0a 20 20 46 74 73 35  dPoslist(.  Fts5
24d80 49 6e 64 65 78 20 2a 70 2c 0a 20 20 69 36 34 20  Index *p,.  i64 
24d90 69 44 65 6c 74 61 2c 0a 20 20 46 74 73 35 49 74  iDelta,.  Fts5It
24da0 65 72 20 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74  er *pMulti,.  Ft
24db0 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 0a 29  s5Buffer *pBuf.)
24dc0 7b 0a 20 20 69 6e 74 20 6e 44 61 74 61 20 3d 20  {.  int nData = 
24dd0 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61  pMulti->base.nDa
24de0 74 61 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  ta;.  int nByte 
24df0 3d 20 6e 44 61 74 61 20 2b 20 39 20 2b 20 39 20  = nData + 9 + 9 
24e00 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  + FTS5_DATA_ZERO
24e10 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 73 73 65  _PADDING;.  asse
24e20 72 74 28 20 6e 44 61 74 61 3e 30 20 29 3b 0a 20  rt( nData>0 );. 
24e30 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
24e40 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 66 74 73 35  TE_OK && 0==fts5
24e50 42 75 66 66 65 72 47 72 6f 77 28 26 70 2d 3e 72  BufferGrow(&p->r
24e60 63 2c 20 70 42 75 66 2c 20 6e 42 79 74 65 29 20  c, pBuf, nByte) 
24e70 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
24e80 72 53 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e  rSafeAppendVarin
24e90 74 28 70 42 75 66 2c 20 69 44 65 6c 74 61 29 3b  t(pBuf, iDelta);
24ea0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53  .    fts5BufferS
24eb0 61 66 65 41 70 70 65 6e 64 56 61 72 69 6e 74 28  afeAppendVarint(
24ec0 70 42 75 66 2c 20 6e 44 61 74 61 2a 32 29 3b 0a  pBuf, nData*2);.
24ed0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
24ee0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75  feAppendBlob(pBu
24ef0 66 2c 20 70 4d 75 6c 74 69 2d 3e 62 61 73 65 2e  f, pMulti->base.
24f00 70 44 61 74 61 2c 20 6e 44 61 74 61 29 3b 0a 20  pData, nData);. 
24f10 20 20 20 6d 65 6d 73 65 74 28 26 70 42 75 66 2d     memset(&pBuf-
24f20 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20 30 2c 20  >p[pBuf->n], 0, 
24f30 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50  FTS5_DATA_ZERO_P
24f40 41 44 44 49 4e 47 29 3b 0a 20 20 7d 0a 7d 0a 0a  ADDING);.  }.}..
24f50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
24f60 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
24f70 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72  (Fts5DoclistIter
24f80 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20 2a   *pIter){.  u8 *
24f90 70 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c  p = pIter->aPosl
24fa0 69 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53 69  ist + pIter->nSi
24fb0 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f 73  ze + pIter->nPos
24fc0 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  list;..  assert(
24fd0 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
24fe0 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49 74   );.  if( p>=pIt
24ff0 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20 20  er->aEof ){.    
25000 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
25010 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
25020 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a 20    i64 iDelta;.. 
25030 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74 56     p += fts5GetV
25040 61 72 69 6e 74 28 70 2c 20 28 75 36 34 2a 29 26  arint(p, (u64*)&
25050 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49 74  iDelta);.    pIt
25060 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69 44  er->iRowid += iD
25070 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  elta;..    /* Re
25080 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  ad position list
25090 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66 28   size */.    if(
250a0 20 70 5b 30 5d 20 26 20 30 78 38 30 20 29 7b 0a   p[0] & 0x80 ){.
250b0 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 0a        int nPos;.
250c0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53 69        pIter->nSi
250d0 7a 65 20 3d 20 66 74 73 35 47 65 74 56 61 72 69  ze = fts5GetVari
250e0 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a 20  nt32(p, nPos);. 
250f0 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73       pIter->nPos
25100 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31 29  list = (nPos>>1)
25110 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25120 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c 69     pIter->nPosli
25130 73 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30 5d  st = ((int)(p[0]
25140 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20 70  )) >> 1;.      p
25150 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31 3b  Iter->nSize = 1;
25160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74 65  .    }..    pIte
25170 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70 3b  r->aPoslist = p;
25180 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
25190 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74 49  oid fts5DoclistI
251a0 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35 42  terInit(.  Fts5B
251b0 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20 20  uffer *pBuf, .  
251c0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
251d0 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d 73  *pIter.){.  mems
251e0 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69 7a  et(pIter, 0, siz
251f0 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20 20  eof(*pIter));.  
25200 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20  pIter->aPoslist 
25210 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49 74  = pBuf->p;.  pIt
25220 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75 66  er->aEof = &pBuf
25230 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20 20  ->p[pBuf->n];.  
25240 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e  fts5DoclistIterN
25250 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a 23  ext(pIter);.}..#
25260 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  if 0./*.** Appen
25270 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20 62  d a doclist to b
25280 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
25290 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
252a0 61 73 73 75 6d 65 73 20 74 68 61 74 20 73 70 61  assumes that spa
252b0 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 62 75  ce within the bu
252c0 66 66 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ffer has already
252d0 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74   been.** allocat
252e0 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
252f0 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70 65  id fts5MergeAppe
25300 6e 64 44 6f 63 69 64 28 0a 20 20 46 74 73 35 42  ndDocid(.  Fts5B
25310 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20 20  uffer *pBuf,    
25320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
25330 66 66 65 72 20 74 6f 20 77 72 69 74 65 20 74 6f  ffer to write to
25340 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61 73   */.  i64 *piLas
25350 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20 20  tRowid,         
25360 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
25370 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64 20   Previous rowid 
25380 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e 79 29  written (if any)
25390 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69 64   */.  i64 iRowid
253a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
253b0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 74        /* Rowid t
253c0 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  o append */.){. 
253d0 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e 6e   assert( pBuf->n
253e0 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74 52  !=0 || (*piLastR
253f0 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66 74  owid)==0 );.  ft
25400 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
25410 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20 69  ndVarint(pBuf, i
25420 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74 52  Rowid - *piLastR
25430 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73 74  owid);.  *piLast
25440 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a  Rowid = iRowid;.
25450 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e  }.#endif..#defin
25460 65 20 66 74 73 35 4d 65 72 67 65 41 70 70 65 6e  e fts5MergeAppen
25470 64 44 6f 63 69 64 28 70 42 75 66 2c 20 69 4c 61  dDocid(pBuf, iLa
25480 73 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64 29  stRowid, iRowid)
25490 20 7b 20 20 20 20 20 20 20 5c 0a 20 20 61 73 73   {       \.  ass
254a0 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 21 3d  ert( (pBuf)->n!=
254b0 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69 64  0 || (iLastRowid
254c0 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  )==0 );         
254d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 66 74            \.  ft
254e0 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
254f0 6e 64 56 61 72 69 6e 74 28 28 70 42 75 66 29 2c  ndVarint((pBuf),
25500 20 28 69 52 6f 77 69 64 29 20 2d 20 28 69 4c 61   (iRowid) - (iLa
25510 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20 28  stRowid)); \.  (
25520 69 4c 61 73 74 52 6f 77 69 64 29 20 3d 20 28 69  iLastRowid) = (i
25530 52 6f 77 69 64 29 3b 20 20 20 20 20 20 20 20 20  Rowid);         
25540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25550 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 0a              \.}.
25560 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65 20  ./*.** Swap the 
25570 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62 75 66 66  contents of buff
25580 65 72 20 2a 70 31 20 77 69 74 68 20 74 68 61 74  er *p1 with that
25590 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61 74   of *p2..*/.stat
255a0 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66 66  ic void fts5Buff
255b0 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66 65  erSwap(Fts5Buffe
255c0 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66 65  r *p1, Fts5Buffe
255d0 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42 75  r *p2){.  Fts5Bu
255e0 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b 0a  ffer tmp = *p1;.
255f0 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20 2a    *p1 = *p2;.  *
25600 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74 61  p2 = tmp;.}..sta
25610 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 65 78  tic void fts5Nex
25620 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66 65  tRowid(Fts5Buffe
25630 72 20 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70 69  r *pBuf, int *pi
25640 4f 66 66 2c 20 69 36 34 20 2a 70 69 52 6f 77 69  Off, i64 *piRowi
25650 64 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 70  d){.  int i = *p
25660 69 4f 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d 70  iOff;.  if( i>=p
25670 42 75 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a 70  Buf->n ){.    *p
25680 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  iOff = -1;.  }el
25690 73 65 7b 0a 20 20 20 20 75 36 34 20 69 56 61 6c  se{.    u64 iVal
256a0 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20 69  ;.    *piOff = i
256b0 20 2b 20 73 71 6c 69 74 65 33 46 74 73 35 47 65   + sqlite3Fts5Ge
256c0 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70  tVarint(&pBuf->p
256d0 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
256e0 20 2a 70 69 52 6f 77 69 64 20 2b 3d 20 69 56 61   *piRowid += iVa
256f0 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
25700 54 68 69 73 20 69 73 20 74 68 65 20 65 71 75 69  This is the equi
25710 76 61 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d 65  valent of fts5Me
25720 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28 29  rgePrefixLists()
25730 20 66 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e 65   for detail=none
25740 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68 69   mode..** In thi
25750 73 20 63 61 73 65 20 74 68 65 20 62 75 66 66 65  s case the buffe
25760 72 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 61 20  rs consist of a 
25770 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c 69  delta-encoded li
25780 73 74 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e 6c  st of rowids onl
25790 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  y..*/.static voi
257a0 64 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69 64  d fts5MergeRowid
257b0 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64  Lists(.  Fts5Ind
257c0 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ex *p,          
257d0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35           /* FTS5
257e0 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20   backend object 
257f0 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  */.  Fts5Buffer 
25800 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20  *p1,            
25810 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69       /* First li
25820 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20  st to merge */. 
25830 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20   Fts5Buffer *p2 
25840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25850 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20   /* Second list 
25860 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20  to merge */.){. 
25870 20 69 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20 69   int i1 = 0;.  i
25880 6e 74 20 69 32 20 3d 20 30 3b 0a 20 20 69 36 34  nt i2 = 0;.  i64
25890 20 69 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20 20   iRowid1 = 0;.  
258a0 69 36 34 20 69 52 6f 77 69 64 32 20 3d 20 30 3b  i64 iRowid2 = 0;
258b0 0a 20 20 69 36 34 20 69 4f 75 74 20 3d 20 30 3b  .  i64 iOut = 0;
258c0 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 6f  ..  Fts5Buffer o
258d0 75 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f 75  ut;.  memset(&ou
258e0 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75 74  t, 0, sizeof(out
258f0 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73  ));.  sqlite3Fts
25900 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e  5BufferSize(&p->
25910 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e 20  rc, &out, p1->n 
25920 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28 20  + p2->n);.  if( 
25930 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b 0a  p->rc ) return;.
25940 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64  .  fts5NextRowid
25950 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69  (p1, &i1, &iRowi
25960 64 31 29 3b 0a 20 20 66 74 73 35 4e 65 78 74 52  d1);.  fts5NextR
25970 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26 69  owid(p2, &i2, &i
25980 52 6f 77 69 64 32 29 3b 0a 20 20 77 68 69 6c 65  Rowid2);.  while
25990 28 20 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d 30  ( i1>=0 || i2>=0
259a0 20 29 7b 0a 20 20 20 20 69 66 28 20 69 31 3e 3d   ){.    if( i1>=
259b0 30 20 26 26 20 28 69 32 3c 30 20 7c 7c 20 69 52  0 && (i2<0 || iR
259c0 6f 77 69 64 31 3c 69 52 6f 77 69 64 32 29 20 29  owid1<iRowid2) )
259d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
259e0 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77 69  iOut==0 || iRowi
259f0 64 31 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20 20  d1>iOut );.     
25a00 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
25a10 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
25a20 2c 20 69 52 6f 77 69 64 31 20 2d 20 69 4f 75 74  , iRowid1 - iOut
25a30 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d 20  );.      iOut = 
25a40 69 52 6f 77 69 64 31 3b 0a 20 20 20 20 20 20 66  iRowid1;.      f
25a50 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31 2c  ts5NextRowid(p1,
25a60 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29 3b   &i1, &iRowid1);
25a70 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25a80 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d 3d    assert( iOut==
25a90 30 20 7c 7c 20 69 52 6f 77 69 64 32 3e 69 4f 75  0 || iRowid2>iOu
25aa0 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35 42  t );.      fts5B
25ab0 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64 56  ufferSafeAppendV
25ac0 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f 77  arint(&out, iRow
25ad0 69 64 32 20 2d 20 69 4f 75 74 29 3b 0a 20 20 20  id2 - iOut);.   
25ae0 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69 64     iOut = iRowid
25af0 32 3b 0a 20 20 20 20 20 20 69 66 28 20 69 31 3e  2;.      if( i1>
25b00 3d 30 20 26 26 20 69 52 6f 77 69 64 31 3d 3d 69  =0 && iRowid1==i
25b10 52 6f 77 69 64 32 20 29 7b 0a 20 20 20 20 20 20  Rowid2 ){.      
25b20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25b30 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64  p1, &i1, &iRowid
25b40 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
25b50 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28    fts5NextRowid(
25b60 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69 64  p2, &i2, &iRowid
25b70 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  2);.    }.  }.. 
25b80 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70 28   fts5BufferSwap(
25b90 26 6f 75 74 2c 20 70 31 29 3b 0a 20 20 66 74 73  &out, p1);.  fts
25ba0 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74  5BufferFree(&out
25bb0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66  );.}../*.** Buff
25bc0 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63 6f  ers p1 and p2 co
25bd0 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e 20  ntain doclists. 
25be0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 65  This function me
25bf0 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  rges the content
25c00 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20 64  .** of the two d
25c10 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65 72  oclists together
25c20 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65 72   and sets buffer
25c30 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75 6c   p1 to the resul
25c40 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  t before.** retu
25c50 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rning..**.** If 
25c60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
25c70 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
25c80 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63 2e  s left in p->rc.
25c90 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
25ca0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
25cb0 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
25cc0 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
25cd0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
25ce0 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c 69  ts5MergePrefixLi
25cf0 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65 78  sts(.  Fts5Index
25d00 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
25d10 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62         /* FTS5 b
25d20 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f  ackend object */
25d30 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
25d40 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
25d50 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73 74     /* First list
25d60 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20 46   to merge */.  F
25d70 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20 20  ts5Buffer *p2   
25d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25d90 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74 6f  * Second list to
25da0 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20 69   merge */.){.  i
25db0 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20 20  f( p2->n ){.    
25dc0 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20 3d  i64 iLastRowid =
25dd0 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63 6c   0;.    Fts5Docl
25de0 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20 20  istIter i1;.    
25df0 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 20  Fts5DoclistIter 
25e00 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  i2;.    Fts5Buff
25e10 65 72 20 6f 75 74 20 3d 20 7b 30 2c 20 30 2c 20  er out = {0, 0, 
25e20 30 7d 3b 0a 20 20 20 20 46 74 73 35 42 75 66 66  0};.    Fts5Buff
25e30 65 72 20 74 6d 70 20 3d 20 7b 30 2c 20 30 2c 20  er tmp = {0, 0, 
25e40 30 7d 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  0};..    /* The 
25e50 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20  maximum size of 
25e60 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 65 71  the output is eq
25e70 75 61 6c 20 74 6f 20 74 68 65 20 73 75 6d 20 6f  ual to the sum o
25e80 66 20 74 68 65 20 74 77 6f 20 0a 20 20 20 20 2a  f the two .    *
25e90 2a 20 69 6e 70 75 74 20 73 69 7a 65 73 20 2b 20  * input sizes + 
25ea0 31 20 76 61 72 69 6e 74 20 28 39 20 62 79 74 65  1 varint (9 byte
25eb0 73 29 2e 20 54 68 65 20 65 78 74 72 61 20 76 61  s). The extra va
25ec0 72 69 6e 74 20 69 73 20 62 65 63 61 75 73 65 20  rint is because 
25ed0 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69  if the.    ** fi
25ee0 72 73 74 20 72 6f 77 69 64 20 69 6e 20 6f 6e 65  rst rowid in one
25ef0 20 69 6e 70 75 74 20 69 73 20 61 20 6c 61 72 67   input is a larg
25f00 65 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65  e negative numbe
25f10 72 2c 20 61 6e 64 20 74 68 65 20 66 69 72 73 74  r, and the first
25f20 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6f   in.    ** the o
25f30 74 68 65 72 20 61 20 6e 6f 6e 2d 6e 65 67 61 74  ther a non-negat
25f40 69 76 65 20 6e 75 6d 62 65 72 2c 20 74 68 65 20  ive number, the 
25f50 64 65 6c 74 61 20 66 6f 72 20 74 68 65 20 6e 6f  delta for the no
25f60 6e 2d 6e 65 67 61 74 69 76 65 0a 20 20 20 20 2a  n-negative.    *
25f70 2a 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 62 65  * number will be
25f80 20 6c 61 72 67 65 72 20 6f 6e 20 64 69 73 6b 20   larger on disk 
25f90 74 68 61 6e 20 74 68 65 20 6c 69 74 65 72 61 6c  than the literal
25fa0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 20   integer value. 
25fb0 20 20 20 2a 2a 20 77 61 73 2e 20 20 2a 2f 0a 20     ** was.  */. 
25fc0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 74     if( sqlite3Ft
25fd0 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
25fe0 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e  >rc, &out, p1->n
25ff0 20 2b 20 70 32 2d 3e 6e 20 2b 20 39 29 20 29 20   + p2->n + 9) ) 
26000 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 74 73 35  return;.    fts5
26010 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74 28  DoclistIterInit(
26020 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66 74  p1, &i1);.    ft
26030 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69  s5DoclistIterIni
26040 74 28 70 32 2c 20 26 69 32 29 3b 0a 0a 20 20 20  t(p2, &i2);..   
26050 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
26060 20 20 20 69 66 28 20 69 31 2e 69 52 6f 77 69 64     if( i1.iRowid
26070 3c 69 32 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20  <i2.iRowid ){.  
26080 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e        /* Copy en
26090 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a 20  try from i1 */. 
260a0 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67 65         fts5Merge
260b0 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75 74  AppendDocid(&out
260c0 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69 31  , iLastRowid, i1
260d0 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20  .iRowid);.      
260e0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
260f0 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
26100 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69 31   i1.aPoslist, i1
26110 2e 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53 69  .nPoslist+i1.nSi
26120 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  ze);.        fts
26130 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
26140 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 69  (&i1);.        i
26150 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d 3d  f( i1.aPoslist==
26160 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
26170 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
26180 28 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31 2e  ( i2.iRowid!=i1.
26190 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20 20  iRowid ){.      
261a0 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79 20    /* Copy entry 
261b0 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20 20  from i2 */.     
261c0 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
261d0 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
261e0 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52 6f  astRowid, i2.iRo
261f0 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66 74  wid);.        ft
26200 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
26210 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32 2e  ndBlob(&out, i2.
26220 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50 6f  aPoslist, i2.nPo
26230 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29 3b  slist+i2.nSize);
26240 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f 63  .        fts5Doc
26250 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69 32  listIterNext(&i2
26260 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
26270 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  2.aPoslist==0 ) 
26280 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26290 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20       else{.     
262a0 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65 20     /* Merge the 
262b0 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  two position lis
262c0 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  ts. */ .        
262d0 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a 20  i64 iPos1 = 0;. 
262e0 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73 32         i64 iPos2
262f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
26300 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20 20  t iOff1 = 0;.   
26310 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20 3d       int iOff2 =
26320 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   0;.        u8 *
26330 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69 73  a1 = &i1.aPoslis
26340 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20 20  t[i1.nSize];.   
26350 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26 69       u8 *a2 = &i
26360 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e 53  2.aPoslist[i2.nS
26370 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 69 6e  ize];.        in
26380 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 20  t nCopy;.       
26390 20 75 38 20 2a 61 43 6f 70 79 3b 0a 0a 20 20 20   u8 *aCopy;..   
263a0 20 20 20 20 20 69 36 34 20 69 50 72 65 76 20 3d       i64 iPrev =
263b0 20 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73 35   0;.        Fts5
263c0 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77 72  PoslistWriter wr
263d0 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d 65  iter;.        me
263e0 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30 2c  mset(&writer, 0,
263f0 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29 29   sizeof(writer))
26400 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ;..        fts5M
26410 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28  ergeAppendDocid(
26420 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64  &out, iLastRowid
26430 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20  , i2.iRowid);.  
26440 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26450 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20 20  Zero(&tmp);.    
26460 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
26470 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72 63  ufferSize(&p->rc
26480 2c 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73 6c  , &tmp, i1.nPosl
26490 69 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69 73  ist + i2.nPoslis
264a0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
264b0 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a  p->rc ) break;..
264c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
264d0 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36 34  ts5PoslistNext64
264e0 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74  (a1, i1.nPoslist
264f0 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73 31  , &iOff1, &iPos1
26500 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
26510 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78  e3Fts5PoslistNex
26520 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73 6c  t64(a2, i2.nPosl
26530 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69 50  ist, &iOff2, &iP
26540 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61 73  os2);.        as
26550 73 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20 26  sert( iPos1>=0 &
26560 26 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a 20  & iPos2>=0 );.. 
26570 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 31         if( iPos1
26580 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20 20  <iPos2 ){.      
26590 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
265a0 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
265b0 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
265c0 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
265d0 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c   sqlite3Fts5Posl
265e0 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69 31  istNext64(a1, i1
265f0 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66  .nPoslist, &iOff
26600 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20 20  1, &iPos1);.    
26610 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26620 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26630 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
26640 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
26650 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
26660 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
26670 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20 69  listNext64(a2, i
26680 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  2.nPoslist, &iOf
26690 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20 20  f2, &iPos2);.   
266a0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
266b0 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26 20  if( iPos1>=0 && 
266c0 69 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20 20  iPos2>=0 ){.    
266d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20 29        while( 1 )
266e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
266f0 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29 7b  ( iPos1<iPos2 ){
26700 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
26710 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76 20  f( iPos1!=iPrev 
26720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26730 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26740 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
26750 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
26760 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
26770 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26780 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26790 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c  oslistNext64(a1,
267a0 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69   i1.nPoslist, &i
267b0 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20  Off1, &iPos1);. 
267c0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
267d0 20 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61 6b   iPos1<0 ) break
267e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
267f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
26800 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69 50     assert_nc( iP
26810 6f 73 32 21 3d 69 50 72 65 76 20 29 3b 0a 20 20  os2!=iPrev );.  
26820 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26830 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53 61  te3Fts5PoslistSa
26840 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20 26  feAppend(&tmp, &
26850 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a 20  iPrev, iPos2);. 
26860 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
26870 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e  ite3Fts5PoslistN
26880 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f  ext64(a2, i2.nPo
26890 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26  slist, &iOff2, &
268a0 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20  iPos2);.        
268b0 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 32 3c        if( iPos2<
268c0 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
268d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
268e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a     }.        }..
268f0 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
26900 31 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  1>=0 ){.        
26910 20 20 69 66 28 20 69 50 6f 73 31 21 3d 69 50 72    if( iPos1!=iPr
26920 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ev ){.          
26930 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
26940 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28 26  listSafeAppend(&
26950 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50 6f  tmp, &iPrev, iPo
26960 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  s1);.          }
26970 0a 20 20 20 20 20 20 20 20 20 20 61 43 6f 70 79  .          aCopy
26980 20 3d 20 26 61 31 5b 69 4f 66 66 31 5d 3b 0a 20   = &a1[iOff1];. 
26990 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
269a0 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2d 20 69   i1.nPoslist - i
269b0 4f 66 66 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  Off1;.        }e
269c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
269d0 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30 20  ssert( iPos2>=0 
269e0 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76 20  && iPos2!=iPrev 
269f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
26a00 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
26a10 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
26a20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a  &iPrev, iPos2);.
26a30 20 20 20 20 20 20 20 20 20 20 61 43 6f 70 79 20            aCopy 
26a40 3d 20 26 61 32 5b 69 4f 66 66 32 5d 3b 0a 20 20  = &a2[iOff2];.  
26a50 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20          nCopy = 
26a60 69 32 2e 6e 50 6f 73 6c 69 73 74 20 2d 20 69 4f  i2.nPoslist - iO
26a70 66 66 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ff2;.        }. 
26a80 20 20 20 20 20 20 20 69 66 28 20 6e 43 6f 70 79         if( nCopy
26a90 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
26aa0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
26ab0 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20 61  pendBlob(&tmp, a
26ac0 43 6f 70 79 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Copy, nCopy);.  
26ad0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
26ae0 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
26af0 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20 20  SIZE */.        
26b00 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
26b10 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74 2c  pendVarint(&out,
26b20 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20 20   tmp.n * 2);.   
26b30 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
26b40 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f  afeAppendBlob(&o
26b50 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e 6e  ut, tmp.p, tmp.n
26b60 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44  );.        fts5D
26b70 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26  oclistIterNext(&
26b80 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73  i1);.        fts
26b90 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74  5DoclistIterNext
26ba0 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20 61  (&i2);.        a
26bb0 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28 70  ssert( out.n<=(p
26bc0 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29 3b  1->n+p2->n+9) );
26bd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31 2e  .        if( i1.
26be0 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20 69  aPoslist==0 || i
26bf0 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29 20  2.aPoslist==0 ) 
26c00 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
26c10 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 31     }..    if( i1
26c20 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20 20  .aPoslist ){.   
26c30 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70 65     fts5MergeAppe
26c40 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69 4c  ndDocid(&out, iL
26c50 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52 6f  astRowid, i1.iRo
26c60 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73 35  wid);.      fts5
26c70 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
26c80 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61 50  Blob(&out, i1.aP
26c90 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66 20  oslist, i1.aEof 
26ca0 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b 0a  - i1.aPoslist);.
26cb0 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
26cc0 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20 29  f( i2.aPoslist )
26cd0 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72 67  {.      fts5Merg
26ce0 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
26cf0 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
26d00 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  2.iRowid);.     
26d10 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
26d20 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20  ppendBlob(&out, 
26d30 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e  i2.aPoslist, i2.
26d40 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c 69  aEof - i2.aPosli
26d50 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  st);.    }.    a
26d60 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28 70  ssert( out.n<=(p
26d70 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29 3b  1->n+p2->n+9) );
26d80 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  ..    fts5Buffer
26d90 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c 20  Set(&p->rc, p1, 
26da0 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a 20  out.n, out.p);. 
26db0 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72 65     fts5BufferFre
26dc0 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74 73  e(&tmp);.    fts
26dd0 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75 74  5BufferFree(&out
26de0 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
26df0 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70 50   void fts5SetupP
26e00 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74 73  refixIter(.  Fts
26e10 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
26e20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26e30 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66 72  Index to read fr
26e40 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65 73  om */.  int bDes
26e50 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26e60 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
26e70 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72 6f  for "ORDER BY ro
26e80 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20 63  wid DESC" */.  c
26e90 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e 2c  onst u8 *pToken,
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26eb0 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  * Buffer contain
26ec0 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d 61  ing prefix to ma
26ed0 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f  tch */.  int nTo
26ee0 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ken,            
26ef0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
26f00 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b 65   of buffer pToke
26f10 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  n in bytes */.  
26f20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
26f30 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
26f40 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74 63  /* Restrict matc
26f50 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f 6c  hes to these col
26f60 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49 74  umns */.  Fts5It
26f70 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20 20  er **ppIter     
26f80 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77       /* OUT: New
26f90 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b 0a   iterator */.){.
26fa0 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20    Fts5Structure 
26fb0 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73 35  *pStruct;.  Fts5
26fc0 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20 20  Buffer *aBuf;.  
26fd0 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20 3d  const int nBuf =
26fe0 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   32;..  void (*x
26ff0 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65 78  Merge)(Fts5Index
27000 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c 20  *, Fts5Buffer*, 
27010 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20 20  Fts5Buffer*);.  
27020 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64 29 28  void (*xAppend)(
27030 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34 2c  Fts5Index*, i64,
27040 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73 35   Fts5Iter*, Fts5
27050 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28 20  Buffer*);.  if( 
27060 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74  p->pConfig->eDet
27070 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c  ail==FTS5_DETAIL
27080 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d 65  _NONE ){.    xMe
27090 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65 52  rge = fts5MergeR
270a0 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20 78  owidLists;.    x
270b0 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70 70  Append = fts5App
270c0 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c 73  endRowid;.  }els
270d0 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d 20  e{.    xMerge = 
270e0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
270f0 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65 6e  ists;.    xAppen
27100 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50 6f  d = fts5AppendPo
27110 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61 42  slist;.  }..  aB
27120 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65 72  uf = (Fts5Buffer
27130 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28  *)fts5IdxMalloc(
27140 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42 75  p, sizeof(Fts5Bu
27150 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20 70  ffer)*nBuf);.  p
27160 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74 72  Struct = fts5Str
27170 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a 0a  uctureRead(p);..
27180 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70 53    if( aBuf && pS
27190 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f 6e  truct ){.    con
271a0 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 46  st int flags = F
271b0 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53  TS5INDEX_QUERY_S
271c0 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20  CAN .           
271d0 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35 49           | FTS5I
271e0 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50 45  NDEX_QUERY_SKIPE
271f0 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20 20 20  MPTY .          
27200 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35            | FTS5
27210 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f 55  INDEX_QUERY_NOOU
27220 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20 69 3b  TPUT;.    int i;
27230 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52 6f  .    i64 iLastRo
27240 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74 73  wid = 0;.    Fts
27250 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20 20  5Iter *p1 = 0;  
27260 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 75     /* Iterator u
27270 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64 61  sed to gather da
27280 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a 2f  ta from index */
27290 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a 70  .    Fts5Data *p
272a0 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42 75  Data;.    Fts5Bu
272b0 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20 20  ffer doclist;.  
272c0 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20 3d    int bNewTerm =
272d0 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28   1;..    memset(
272e0 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69 7a  &doclist, 0, siz
272f0 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a 20  eof(doclist));. 
27300 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
27310 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
27320 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c 20  flags, pColset, 
27330 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
27340 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20 20  -1, 0, &p1);.   
27350 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
27360 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 31 29  utCb(&p->rc, p1)
27370 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e 6f  ;.    for( /* no
27380 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20 20  -op */ ;.       
27390 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f   fts5MultiIterEo
273a0 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20 20  f(p, p1)==0;.   
273b0 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74       fts5MultiIt
273c0 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20 26  erNext2(p, p1, &
273d0 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29 7b  bNewTerm).    ){
273e0 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
273f0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31 2d 3e  er *pSeg = &p1->
27400 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72 73 74  aSeg[ p1->aFirst
27410 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20 20  [1].iFirst ];.  
27420 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d 20      int nTerm = 
27430 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20  pSeg->term.n;.  
27440 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 54      const u8 *pT
27450 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72 6d  erm = pSeg->term
27460 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78 53  .p;.      p1->xS
27470 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20 70 53  etOutputs(p1, pS
27480 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  eg);..      asse
27490 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70 54  rt_nc( memcmp(pT
274a0 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49 4e  oken, pTerm, MIN
274b0 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29 29  (nToken, nTerm))
274c0 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  <=0 );.      if(
274d0 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20 20   bNewTerm ){.   
274e0 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c 6e       if( nTerm<n
274f0 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70 28  Token || memcmp(
27500 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 6e  pToken, pTerm, n
27510 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b 0a  Token) ) break;.
27520 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
27530 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61 74  f( p1->base.nDat
27540 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  a==0 ) continue;
27550 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d 3e  ..      if( p1->
27560 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c 61  base.iRowid<=iLa
27570 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63 6c 69  stRowid && docli
27580 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20  st.n>0 ){.      
27590 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72 63    for(i=0; p->rc
275a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
275b0 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b 0a  oclist.n; i++){.
275c0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
275d0 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20 20  ( i<nBuf );.    
275e0 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b 69        if( aBuf[i
275f0 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ].n==0 ){.      
27600 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27610 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20 26  Swap(&doclist, &
27620 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20 20  aBuf[i]);.      
27630 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
27640 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b 0a  Zero(&doclist);.
27650 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
27660 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 4d 65  .            xMe
27670 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74 2c  rge(p, &doclist,
27680 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20   &aBuf[i]);.    
27690 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
276a0 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d 29  erZero(&aBuf[i])
276b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
276c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
276d0 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b 0a  iLastRowid = 0;.
276e0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 78        }..      x
276f0 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62 61  Append(p, p1->ba
27700 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74 52  se.iRowid-iLastR
27710 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c 69  owid, p1, &docli
27720 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61 73 74  st);.      iLast
27730 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61 73 65  Rowid = p1->base
27740 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a 0a  .iRowid;.    }..
27750 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
27760 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Buf; i++){.     
27770 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
27780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
27790 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63 6c   xMerge(p, &docl
277a0 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a  ist, &aBuf[i]);.
277b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
277c0 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61 42  s5BufferFree(&aB
277d0 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  uf[i]);.    }.  
277e0 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
277f0 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20 70 44  ree(p1);..    pD
27800 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61 6c  ata = fts5IdxMal
27810 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46 74  loc(p, sizeof(Ft
27820 73 35 44 61 74 61 29 2b 64 6f 63 6c 69 73 74 2e  s5Data)+doclist.
27830 6e 2b 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  n+FTS5_DATA_ZERO
27840 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20 69  _PADDING);.    i
27850 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20 20  f( pData ){.    
27860 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75 38    pData->p = (u8
27870 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20 20  *)&pData[1];.   
27880 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20 70     pData->nn = p
27890 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20 64  Data->szLeaf = d
278a0 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20 20  oclist.n;.      
278b0 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 20 29 20  if( doclist.n ) 
278c0 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70 2c  memcpy(pData->p,
278d0 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63 6c   doclist.p, docl
278e0 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74  ist.n);.      ft
278f0 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28  s5MultiIterNew2(
27900 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63 2c  p, pData, bDesc,
27910 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d 0a   ppIter);.    }.
27920 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
27930 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20 20  ee(&doclist);.  
27940 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74 75  }..  fts5Structu
27950 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75 63  reRelease(pStruc
27960 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  t);.  sqlite3_fr
27970 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f 2a  ee(aBuf);.}.../*
27980 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
27990 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  t all subsequent
279a0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
279b0 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65 28  3Fts5IndexWrite(
279c0 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f 20  ) pertain.** to 
279d0 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69 74  the document wit
279e0 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e 0a  h rowid iRowid..
279f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27a00 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69 74  s5IndexBeginWrit
27a10 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20  e(Fts5Index *p, 
27a20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36 34  int bDelete, i64
27a30 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73 65   iRowid){.  asse
27a40 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
27a50 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  E_OK );..  /* Al
27a60 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68 20  locate the hash 
27a70 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73 20  table if it has 
27a80 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e  not already been
27a90 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
27aa0 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30 20  if( p->pHash==0 
27ab0 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  ){.    p->rc = s
27ac0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e 65  qlite3Fts5HashNe
27ad0 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26 70  w(p->pConfig, &p
27ae0 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50 65  ->pHash, &p->nPe
27af0 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d 0a  ndingData);.  }.
27b00 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65 20  .  /* Flush the 
27b10 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64 69  hash table to di
27b20 73 6b 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  sk if required *
27b30 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c 70  /.  if( iRowid<p
27b40 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a 20  ->iWriteRowid . 
27b50 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70 2d    || (iRowid==p-
27b60 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26 26 20  >iWriteRowid && 
27b70 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a 20  p->bDelete==0). 
27b80 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69 6e    || (p->nPendin
27b90 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e 66  gData > p->pConf
27ba0 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20 0a  ig->nHashSize) .
27bb0 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64    ){.    fts5Ind
27bc0 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d 0a  exFlush(p);.  }.
27bd0 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77 69  .  p->iWriteRowi
27be0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70 2d  d = iRowid;.  p-
27bf0 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c 65  >bDelete = bDele
27c00 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  te;.  return fts
27c10 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
27c20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
27c30 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a 2a   data to disk..*
27c40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27c50 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35 49  5IndexSync(Fts5I
27c60 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73 65  ndex *p){.  asse
27c70 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rt( p->rc==SQLIT
27c80 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e  E_OK );.  fts5In
27c90 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 66  dexFlush(p);.  f
27ca0 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
27cb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
27cc0 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
27cd0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64  }../*.** Discard
27ce0 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65 64   any data stored
27cf0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
27d00 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20 44  y hash tables. D
27d10 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a 2a  o not write it.*
27d20 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
27d30 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  e. Additionally,
27d40 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
27d50 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
27d60 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c 65   %_data.** table
27d70 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67 65   may have change
27d80 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61 6e  d on disk. So an
27d90 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  y in-memory cach
27da0 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a 2a  es of %_data .**
27db0 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62 65   records must be
27dc0 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
27dd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
27de0 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46 74  IndexRollback(Ft
27df0 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 66  s5Index *p){.  f
27e00 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
27e10 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44 69  );.  fts5IndexDi
27e20 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20 20  scardData(p);.  
27e30 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
27e40 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 2f 2a  alidate(p);.  /*
27e50 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
27e60 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f 0a  SQLITE_OK ); */.
27e70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27e80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
27e90 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69 73   %_data table is
27ea0 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74   completely empt
27eb0 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  y when this func
27ec0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 20  tion is called. 
27ed0 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
27ee0 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69   populates it wi
27ef0 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73  th the initial s
27f00 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 73  tructure objects
27f10 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78 2c   for each index,
27f20 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69 74  .** and the init
27f30 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  ial version of t
27f40 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72 65  he "averages" re
27f50 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79 74  cord (a zero-byt
27f60 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74 20  e blob)..*/.int 
27f70 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
27f80 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65 78  Reinit(Fts5Index
27f90 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72 75   *p){.  Fts5Stru
27fa0 63 74 75 72 65 20 73 3b 0a 20 20 66 74 73 35 53  cture s;.  fts5S
27fb0 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61  tructureInvalida
27fc0 74 65 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74 28  te(p);.  memset(
27fd0 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74  &s, 0, sizeof(Ft
27fe0 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a 20  s5Structure));. 
27ff0 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
28000 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
28010 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20 75 38  ROWID, (const u8
28020 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74 73 35  *)"", 0);.  fts5
28030 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
28040 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72 6e 20  , &s);.  return 
28050 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
28060 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  p);.}../*.** Ope
28070 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64 65  n a new Fts5Inde
28080 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68 65  x handle. If the
28090 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65 6e   bCreate argumen
280a0 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61 74  t is true, creat
280b0 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c  e.** and initial
280c0 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69  ize the underlyi
280d0 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65 2e  ng %_data table.
280e0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
280f0 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74 6f  sful, set *pp to
28100 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65   point to the ne
28110 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  w object and ret
28120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
28130 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65 74  * Otherwise, set
28140 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   *pp to NULL and
28150 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
28160 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
28170 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
28180 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74 73  IndexOpen(.  Fts
28190 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
281a0 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74 65  , .  int bCreate
281b0 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  , .  Fts5Index *
281c0 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a  *pp,.  char **pz
281d0 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  Err.){.  int rc 
281e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 46  = SQLITE_OK;.  F
281f0 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20 20  ts5Index *p;    
28200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28210 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f 0a  * New object */.
28220 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46 74  .  *pp = p = (Ft
28230 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65 33  s5Index*)sqlite3
28240 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26  Fts5MallocZero(&
28250 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 49  rc, sizeof(Fts5I
28260 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72 63  ndex));.  if( rc
28270 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28280 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d 20     p->pConfig = 
28290 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d 3e  pConfig;.    p->
282a0 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53 35  nWorkUnit = FTS5
282b0 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20 20  _WORK_UNIT;.    
282c0 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73 71  p->zDataTbl = sq
282d0 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74 66  lite3Fts5Mprintf
282e0 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22 2c  (&rc, "%s_data",
282f0 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 29   pConfig->zName)
28300 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44 61  ;.    if( p->zDa
28310 74 61 54 62 6c 20 26 26 20 62 43 72 65 61 74 65  taTbl && bCreate
28320 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
28330 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74 65  qlite3Fts5Create
28340 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20 20  Table(.         
28350 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61 22   pConfig, "data"
28360 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50 52  , "id INTEGER PR
28370 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b  IMARY KEY, block
28380 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72 72   BLOB", 0, pzErr
28390 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
283a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
283b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
283c0 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72 65  = sqlite3Fts5Cre
283d0 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69 67  ateTable(pConfig
283e0 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20 20  , "idx", .      
283f0 20 20 20 20 20 20 22 73 65 67 69 64 2c 20 74 65        "segid, te
28400 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52  rm, pgno, PRIMAR
28410 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65 72  Y KEY(segid, ter
28420 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  m)", .          
28430 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20 20    1, pzErr.     
28440 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
28450 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28470 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
28480 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29 3b  5IndexReinit(p);
28490 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
284a0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72 63   }..  assert( rc
284b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  !=SQLITE_OK || p
284c0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
284d0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
284e0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e     sqlite3Fts5In
284f0 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20 20  dexClose(p);.   
28500 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
28510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
28520 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e 64  .** Close a hand
28530 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e 20  le opened by an 
28540 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f 20  earlier call to 
28550 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28560 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  Open()..*/.int s
28570 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
28580 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20 2a  lose(Fts5Index *
28590 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
285a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
285b0 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
285c0 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20 29   p->pReader==0 )
285d0 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63 74  ;.    fts5Struct
285e0 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70 29  ureInvalidate(p)
285f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28600 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74 65  nalize(p->pWrite
28610 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  r);.    sqlite3_
28620 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65 6c  finalize(p->pDel
28630 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  eter);.    sqlit
28640 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
28650 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20 20  IdxWriter);.    
28660 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
28670 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72 29  (p->pIdxDeleter)
28680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
28690 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53 65  nalize(p->pIdxSe
286a0 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  lect);.    sqlit
286b0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70  e3_finalize(p->p
286c0 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20 20  DataVersion);.  
286d0 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
286e0 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29 3b  hFree(p->pHash);
286f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
28700 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b 0a  e(p->zDataTbl);.
28710 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28720 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
28730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
28740 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74 73  rgument p points
28750 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
28760 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74 65  taining utf-8 te
28770 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79 74  xt that is n byt
28780 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e 20  es in .** size. 
28790 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
287a0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
287b0 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74 65  e nChar characte
287c0 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 0a  r prefix of the.
287d0 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30 20  ** buffer, or 0 
287e0 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65 73  if there are les
287f0 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68 61  s than nChar cha
28800 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61 6c  racters in total
28810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28820 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  Fts5IndexCharlen
28830 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f 6e  ToBytelen(.  con
28840 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20 69  st char *p, .  i
28850 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e 74  nt nByte, .  int
28860 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74 20   nChar.){.  int 
28870 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  n = 0;.  int i;.
28880 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 68    for(i=0; i<nCh
28890 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ar; i++){.    if
288a0 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65 74  ( n>=nByte ) ret
288b0 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20 49  urn 0;      /* I
288c0 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66 65  nput contains fe
288d0 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20 63  wer than nChar c
288e0 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  hars */.    if( 
288f0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
28900 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a 20  [n++]>=0xc0 ){. 
28910 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b 6e       while( (p[n
28920 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30 20  ] & 0xc0)==0x80 
28930 29 7b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  ){.        n++;.
28940 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 6e          if( n>=n
28950 42 79 74 65 20 29 20 62 72 65 61 6b 3b 0a 20 20  Byte ) break;.  
28960 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
28970 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
28980 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55 54  *.** pIn is a UT
28990 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72 69  F-8 encoded stri
289a0 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69 6e  ng, nIn bytes in
289b0 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74 68   size. Return th
289c0 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 75  e number of.** u
289d0 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65 72  nicode character
289e0 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 2e  s in the string.
289f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
28a00 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e 28  ts5IndexCharlen(
28a10 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e 2c  const char *pIn,
28a20 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e 74   int nIn){.  int
28a30 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20 20   nChar = 0;     
28a40 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69 20         .  int i 
28a50 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3c  = 0;.  while( i<
28a60 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 28  nIn ){.    if( (
28a70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70 49  unsigned char)pI
28a80 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  n[i++]>=0xc0 ){.
28a90 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 6e        while( i<n
28aa0 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26 20  In && (pIn[i] & 
28ab0 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69 2b  0xc0)==0x80 ) i+
28ac0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 68  +;.    }.    nCh
28ad0 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ar++;.  }.  retu
28ae0 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a 0a  rn nChar;.}../*.
28af0 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65 6d  ** Insert or rem
28b00 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20 66  ove data to or f
28b10 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20 45  rom the index. E
28b20 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75 6d  ach time a docum
28b30 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65 64  ent is .** added
28b40 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20 66   to or removed f
28b50 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20 74  rom the index, t
28b60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
28b70 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d 6f  called one or mo
28b80 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a 0a  re.** times..**.
28b90 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72 74  ** For an insert
28ba0 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61 6c  , it must be cal
28bb0 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  led once for eac
28bc0 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20 6e  h token in the n
28bd0 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a 20  ew document..** 
28be0 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  If the operation
28bf0 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69 74   is a delete, it
28c00 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
28c10 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65 20  (at least) once 
28c20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69 71  for each.** uniq
28c30 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ue token in the 
28c40 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61 6e  document with an
28c50 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73 73   iCol value less
28c60 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65 20   than zero. The 
28c70 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iPos.** argument
28c80 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72 20   is ignored for 
28c90 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e 74  a delete..*/.int
28ca0 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28cb0 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49 6e  xWrite(.  Fts5In
28cc0 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
28cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
28ce0 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  ex to write to *
28cf0 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20  /.  int iCol,   
28d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d10 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 6f      /* Column to
28d20 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20 28  ken appears in (
28d30 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20 2a  -ve -> delete) *
28d40 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20 20  /.  int iPos,   
28d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d60 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
28d70 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e 20  of token within 
28d80 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e 73  column */.  cons
28d90 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20  t char *pToken, 
28da0 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20 54  int nToken  /* T
28db0 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20 72  oken to add or r
28dc0 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f 6d  emove to or from
28dd0 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20 69   index */.){.  i
28de0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
28df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28e00 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
28e10 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78 65  e through indexe
28e20 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  s */.  int rc = 
28e30 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
28e40 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
28e50 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35 43   code */.  Fts5C
28e60 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
28e70 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20 20   p->pConfig;..  
28e80 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53  assert( p->rc==S
28e90 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61 73  QLITE_OK );.  as
28ea0 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d 3d  sert( (iCol<0)==
28eb0 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a 20  p->bDelete );.. 
28ec0 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74 72   /* Add the entr
28ed0 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74 65  y to the main te
28ee0 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20  rms index. */.  
28ef0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
28f00 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20 20  HashWrite(.     
28f10 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69 57   p->pHash, p->iW
28f20 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c 2c  riteRowid, iCol,
28f30 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49 4e   iPos, FTS5_MAIN
28f40 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e 2c  _PREFIX, pToken,
28f50 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20 20   nToken.  );..  
28f60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e 66  for(i=0; i<pConf
28f70 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20 72  ig->nPrefix && r
28f80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
28f90 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e  +){.    const in
28fa0 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e 66 69  t nChar = pConfi
28fb0 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b 0a 20  g->aPrefix[i];. 
28fc0 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 73     int nByte = s
28fd0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 43  qlite3Fts5IndexC
28fe0 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e 28  harlenToBytelen(
28ff0 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c 20  pToken, nToken, 
29000 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66 28 20  nChar);.    if( 
29010 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 72  nByte ){.      r
29020 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 48  c = sqlite3Fts5H
29030 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48 61 73  ashWrite(p->pHas
29040 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 2d  h, .          p-
29050 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43  >iWriteRowid, iC
29060 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61 72 29  ol, iPos, (char)
29070 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  (FTS5_MAIN_PREFI
29080 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c 0a  X+i+1), pToken,.
29090 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65 0a            nByte.
290a0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
290b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
290c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
290d0 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74 6f   new iterator to
290e0 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68 20   iterate though 
290f0 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74 20 6d  all rowid that m
29100 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70 65  atch the .** spe
29110 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72 20  cified token or 
29120 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a 2f  token prefix..*/
29130 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35  .int sqlite3Fts5
29140 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46 74  IndexQuery(.  Ft
29150 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29170 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71 75   FTS index to qu
29180 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ery */.  const c
29190 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e 74  har *pToken, int
291a0 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b 65   nToken, /* Toke
291b0 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74 6f  n (or prefix) to
291c0 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20 20   query for */.  
291d0 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
291e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
291f0 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35 49  /* Mask of FTS5I
29200 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c 61  NDEX_QUERY_X fla
29210 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c 73  gs */.  Fts5Cols
29220 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
29230 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68          /* Match
29240 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20 6f   these columns o
29250 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e 64  nly */.  Fts5Ind
29260 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72 20  exIter **ppIter 
29270 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
29280 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f 62   New iterator ob
29290 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73  ject */.){.  Fts
292a0 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
292b0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20   = p->pConfig;. 
292c0 20 46 74 73 35 49 74 65 72 20 2a 70 52 65 74 20   Fts5Iter *pRet 
292d0 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66 65  = 0;.  Fts5Buffe
292e0 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20 30  r buf = {0, 0, 0
292f0 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  };..  /* If the 
29300 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67 20  QUERY_SCAN flag 
29310 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68 65  is set, all othe
29320 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  r flags must be 
29330 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73 65  clear. */.  asse
29340 72 74 28 20 28 66 6c 61 67 73 20 26 20 46 54 53  rt( (flags & FTS
29350 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43 41  5INDEX_QUERY_SCA
29360 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d 3d  N)==0 || flags==
29370 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
29380 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20 73  SCAN );..  if( s
29390 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
293a0 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62 75  Size(&p->rc, &bu
293b0 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30 20  f, nToken+1)==0 
293c0 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 20  ){.    int iIdx 
293d0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
293e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74 6f       /* Index to
293f0 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20 69   search */.    i
29400 66 28 20 6e 54 6f 6b 65 6e 20 29 20 6d 65 6d 63  f( nToken ) memc
29410 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70 54  py(&buf.p[1], pT
29420 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a 0a  oken, nToken);..
29430 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
29440 74 20 77 68 69 63 68 20 69 6e 64 65 78 20 74 6f  t which index to
29450 20 73 65 61 72 63 68 20 61 6e 64 20 73 65 74 20   search and set 
29460 69 49 64 78 20 61 63 63 6f 72 64 69 6e 67 6c 79  iIdx accordingly
29470 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 2a 2a  . If this.    **
29480 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65   is a prefix que
29490 72 79 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  ry for which the
294a0 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78 20  re is no prefix 
294b0 69 6e 64 65 78 2c 20 73 65 74 20 69 49 64 78 20  index, set iIdx 
294c0 74 6f 0a 20 20 20 20 2a 2a 20 67 72 65 61 74 65  to.    ** greate
294d0 72 20 74 68 61 6e 20 70 43 6f 6e 66 69 67 2d 3e  r than pConfig->
294e0 6e 50 72 65 66 69 78 20 74 6f 20 69 6e 64 69 63  nPrefix to indic
294f0 61 74 65 20 74 68 61 74 20 74 68 65 20 71 75 65  ate that the que
29500 72 79 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a  ry will be.    *
29510 2a 20 73 61 74 69 73 66 69 65 64 20 62 79 20 73  * satisfied by s
29520 63 61 6e 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65  canning multiple
29530 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61   terms in the ma
29540 69 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a 2a  in index..    **
29550 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 51  .    ** If the Q
29560 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 20  UERY_TEST_NOIDX 
29570 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66 69  flag was specifi
29580 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 75  ed, then this mu
29590 73 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20 70  st be a.    ** p
295a0 72 65 66 69 78 2d 71 75 65 72 79 2e 20 49 6e 73  refix-query. Ins
295b0 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 61 20  tead of using a 
295c0 70 72 65 66 69 78 2d 69 6e 64 65 78 20 28 69 66  prefix-index (if
295d0 20 6f 6e 65 20 65 78 69 73 74 73 29 2c 20 0a 20   one exists), . 
295e0 20 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 20 74     ** evaluate t
295f0 68 65 20 70 72 65 66 69 78 20 71 75 65 72 79 20  he prefix query 
29600 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 46  using the main F
29610 54 53 20 69 6e 64 65 78 2e 20 54 68 69 73 20 69  TS index. This i
29620 73 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 66 6f  s used.    ** fo
29630 72 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69 74  r internal sanit
29640 79 20 63 68 65 63 6b 69 6e 67 20 62 79 20 74 68  y checking by th
29650 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
29660 6b 20 69 6e 20 64 65 62 75 67 20 0a 20 20 20 20  k in debug .    
29670 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20 2a  ** mode only.  *
29680 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
29690 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 43  DEBUG.    if( pC
296a0 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49 6e  onfig->bPrefixIn
296b0 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67 73  dex==0 || (flags
296c0 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45   & FTS5INDEX_QUE
296d0 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20 29  RY_TEST_NOIDX) )
296e0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
296f0 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45  flags & FTS5INDE
29700 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20 29  X_QUERY_PREFIX )
29710 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 31  ;.      iIdx = 1
29720 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66 69  +pConfig->nPrefi
29730 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  x;.    }else.#en
29740 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61 67  dif.    if( flag
29750 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
29760 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20 20  ERY_PREFIX ){.  
29770 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d 20      int nChar = 
29780 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
29790 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  (pToken, nToken)
297a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64 78  ;.      for(iIdx
297b0 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69  =1; iIdx<=pConfi
297c0 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64 78  g->nPrefix; iIdx
297d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
297e0 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66 69   pConfig->aPrefi
297f0 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61 72  x[iIdx-1]==nChar
29800 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
29810 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
29820 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d 3e   iIdx<=pConfig->
29830 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20 20  nPrefix ){.     
29840 20 2f 2a 20 53 74 72 61 69 67 68 74 20 69 6e 64   /* Straight ind
29850 65 78 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20 20  ex lookup */.   
29860 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65     Fts5Structure
29870 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73 35   *pStruct = fts5
29880 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70 29  StructureRead(p)
29890 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d  ;.      buf.p[0]
298a0 20 3d 20 28 75 38 29 28 46 54 53 35 5f 4d 41 49   = (u8)(FTS5_MAI
298b0 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78 29  N_PREFIX + iIdx)
298c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74 72  ;.      if( pStr
298d0 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 66  uct ){.        f
298e0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
298f0 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61 67  p, pStruct, flag
29900 73 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s | FTS5INDEX_QU
29910 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 2c 20 0a  ERY_SKIPEMPTY, .
29920 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
29930 73 65 74 2c 20 62 75 66 2e 70 2c 20 6e 54 6f 6b  set, buf.p, nTok
29940 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70 52  en+1, -1, 0, &pR
29950 65 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  et.        );.  
29960 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74        fts5Struct
29970 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
29980 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ct);.      }.   
29990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
299a0 20 53 63 61 6e 20 6d 75 6c 74 69 70 6c 65 20 74   Scan multiple t
299b0 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  erms in the main
299c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20 20   index */.      
299d0 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c 61  int bDesc = (fla
299e0 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
299f0 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a 20  UERY_DESC)!=0;. 
29a00 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d 20       buf.p[0] = 
29a10 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58  FTS5_MAIN_PREFIX
29a20 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74 75  ;.      fts5Setu
29a30 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20 62  pPrefixIter(p, b
29a40 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  Desc, buf.p, nTo
29a50 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c 20  ken+1, pColset, 
29a60 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20 61 73  &pRet);.      as
29a70 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 4c  sert( p->rc!=SQL
29a80 49 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d 3e  ITE_OK || pRet->
29a90 70 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 20 20  pColset==0 );.  
29aa0 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74 4f      fts5IterSetO
29ab0 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20  utputCb(&p->rc, 
29ac0 70 52 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28  pRet);.      if(
29ad0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
29ae0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74 73  K ){.        Fts
29af0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
29b00 20 26 70 52 65 74 2d 3e 61 53 65 67 5b 70 52 65   &pRet->aSeg[pRe
29b10 74 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  t->aFirst[1].iFi
29b20 72 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  rst];.        if
29b30 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29 20  ( pSeg->pLeaf ) 
29b40 70 52 65 74 2d 3e 78 53 65 74 4f 75 74 70 75 74  pRet->xSetOutput
29b50 73 28 70 52 65 74 2c 20 70 53 65 67 29 3b 0a 20  s(pRet, pSeg);. 
29b60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
29b70 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20    if( p->rc ){. 
29b80 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
29b90 49 74 65 72 43 6c 6f 73 65 28 28 46 74 73 35 49  IterClose((Fts5I
29ba0 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74 29 3b  ndexIter*)pRet);
29bb0 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b  .      pRet = 0;
29bc0 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73 65  .      fts5Close
29bd0 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20 7d  Reader(p);.    }
29be0 0a 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20  ..    *ppIter = 
29bf0 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a 29  (Fts5IndexIter*)
29c00 70 52 65 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  pRet;.    sqlite
29c10 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65 28  3Fts5BufferFree(
29c20 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74  &buf);.  }.  ret
29c30 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74  urn fts5IndexRet
29c40 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn(p);.}../*.**
29c50 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
29c60 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73  the iterator pas
29c70 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20  sed as the only 
29c80 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20 45  argument is at E
29c90 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f 76  OF..*/./*.** Mov
29ca0 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61  e to the next ma
29cb0 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a 2a  tching rowid. .*
29cc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
29cd0 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49 6e  5IterNext(Fts5In
29ce0 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49  dexIter *pIndexI
29cf0 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65 72  ter){.  Fts5Iter
29d00 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35 49   *pIter = (Fts5I
29d10 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b  ter*)pIndexIter;
29d20 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65 72  .  assert( pIter
29d30 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53 51  ->pIndex->rc==SQ
29d40 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73  LITE_OK );.  fts
29d50 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70  5MultiIterNext(p
29d60 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 49  Iter->pIndex, pI
29d70 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  ter, 0, 0);.  re
29d80 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
29d90 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e 64  turn(pIter->pInd
29da0 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f  ex);.}../*.** Mo
29db0 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
29dc0 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f 77  atching term/row
29dd0 69 64 2e 20 55 73 65 64 20 62 79 20 74 68 65 20  id. Used by the 
29de0 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c 65  fts5vocab module
29df0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29e00 46 74 73 35 49 74 65 72 4e 65 78 74 53 63 61 6e  Fts5IterNextScan
29e10 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20 2a  (Fts5IndexIter *
29e20 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20 46  pIndexIter){.  F
29e30 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d  ts5Iter *pIter =
29e40 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64   (Fts5Iter*)pInd
29e50 65 78 49 74 65 72 3b 0a 20 20 46 74 73 35 49 6e  exIter;.  Fts5In
29e60 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d 3e  dex *p = pIter->
29e70 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65 72  pIndex;..  asser
29e80 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78  t( pIter->pIndex
29e90 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
29ea0 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69 49  );..  fts5MultiI
29eb0 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72  terNext(p, pIter
29ec0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  , 0, 0);.  if( p
29ed0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
29ee0 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49 74  ){.    Fts5SegIt
29ef0 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65  er *pSeg = &pIte
29f00 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e  r->aSeg[ pIter->
29f10 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
29f20 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67   ];.    if( pSeg
29f30 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67 2d  ->pLeaf && pSeg-
29f40 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53 35  >term.p[0]!=FTS5
29f50 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29 7b 0a  _MAIN_PREFIX ){.
29f60 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52 65        fts5DataRe
29f70 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c 65 61  lease(pSeg->pLea
29f80 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e  f);.      pSeg->
29f90 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20 20  pLeaf = 0;.     
29fa0 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45 6f   pIter->base.bEo
29fb0 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  f = 1;.    }.  }
29fc0 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ..  return fts5I
29fd0 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65 72  ndexReturn(pIter
29fe0 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f 2a  ->pIndex);.}../*
29ff0 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65 20  .** Move to the 
2a000 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72 6f  next matching ro
2a010 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73 20  wid that occurs 
2a020 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61 74  at or after iMat
2a030 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69 6e  ch. The.** defin
2a040 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72 20  ition of "at or 
2a050 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20 6f  after" depends o
2a060 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20 69  n whether this i
2a070 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65 73  terator iterates
2a080 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  .** in ascending
2a090 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20 72   or descending r
2a0a0 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a 69  owid order..*/.i
2a0b0 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 74  nt sqlite3Fts5It
2a0c0 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35 49  erNextFrom(Fts5I
2a0d0 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78  ndexIter *pIndex
2a0e0 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63 68  Iter, i64 iMatch
2a0f0 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  ){.  Fts5Iter *p
2a100 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65 72  Iter = (Fts5Iter
2a110 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20 20  *)pIndexIter;.  
2a120 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78  fts5MultiIterNex
2a130 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49 6e  tFrom(pIter->pIn
2a140 64 65 78 2c 20 70 49 74 65 72 2c 20 69 4d 61 74  dex, pIter, iMat
2a150 63 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ch);.  return ft
2a160 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49  s5IndexReturn(pI
2a170 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a  ter->pIndex);.}.
2a180 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2a190 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e 0a  e current term..
2a1a0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2a1b0 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 54 65  qlite3Fts5IterTe
2a1c0 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65 72  rm(Fts5IndexIter
2a1d0 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20 69 6e   *pIndexIter, in
2a1e0 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e 3b  t *pn){.  int n;
2a1f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a200 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
2a210 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
2a220 6d 28 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  m((Fts5Iter*)pIn
2a230 64 65 78 49 74 65 72 2c 20 26 6e 29 3b 0a 20 20  dexIter, &n);.  
2a240 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65 74  *pn = n-1;.  ret
2a250 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f 2a  urn &z[1];.}../*
2a260 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74 65  .** Close an ite
2a270 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79 20  rator opened by 
2a280 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
2a290 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e  to sqlite3Fts5In
2a2a0 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a 76  dexQuery()..*/.v
2a2b0 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35 49  oid sqlite3Fts5I
2a2c0 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e 64  terClose(Fts5Ind
2a2d0 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49 74  exIter *pIndexIt
2a2e0 65 72 29 7b 0a 20 20 69 66 28 20 70 49 6e 64 65  er){.  if( pInde
2a2f0 78 49 74 65 72 20 29 7b 0a 20 20 20 20 46 74 73  xIter ){.    Fts
2a300 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20 28  5Iter *pIter = (
2a310 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65 78  Fts5Iter*)pIndex
2a320 49 74 65 72 3b 0a 20 20 20 20 46 74 73 35 49 6e  Iter;.    Fts5In
2a330 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70 49  dex *pIndex = pI
2a340 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20 20  ter->pIndex;.   
2a350 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72   fts5MultiIterFr
2a360 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20 66  ee(pIter);.    f
2a370 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28 70  ts5CloseReader(p
2a380 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  Index);.  }.}../
2a390 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 64 65  *.** Read and de
2a3a0 63 6f 64 65 20 74 68 65 20 22 61 76 65 72 61 67  code the "averag
2a3b0 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f 6d 20  es" record from 
2a3c0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a 2a  the database. .*
2a3d0 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
2a3e0 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69 6e 74  nSize must point
2a3f0 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20   to an array of 
2a400 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65 72 65  size nCol, where
2a410 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68 65 20   nCol is.** the 
2a420 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20 64  number of user d
2a430 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20 69  efined columns i
2a440 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65 2e  n the FTS table.
2a450 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
2a460 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72 61  ts5IndexGetAvera
2a470 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ges(Fts5Index *p
2a480 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69 36  , i64 *pnRow, i6
2a490 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20 69 6e  4 *anSize){.  in
2a4a0 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f 6e  t nCol = p->pCon
2a4b0 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74 73  fig->nCol;.  Fts
2a4c0 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a 20  5Data *pData;.. 
2a4d0 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20 20 6d   *pnRow = 0;.  m
2a4e0 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20 30 2c  emset(anSize, 0,
2a4f0 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a 20 6e   sizeof(i64) * n
2a500 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d 20  Col);.  pData = 
2a510 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2a520 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52 4f  FTS5_AVERAGES_RO
2a530 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  WID);.  if( p->r
2a540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2a550 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20 20  pData->nn ){.   
2a560 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20 20   int i = 0;.    
2a570 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69 20  int iCol;.    i 
2a580 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2a590 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20 28  (&pData->p[i], (
2a5a0 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20 20 20  u64*)pnRow);.   
2a5b0 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 3c 70   for(iCol=0; i<p
2a5c0 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43 6f 6c  Data->nn && iCol
2a5d0 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a  <nCol; iCol++){.
2a5e0 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35 47        i += fts5G
2a5f0 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 2d  etVarint(&pData-
2a600 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26 61 6e  >p[i], (u64*)&an
2a610 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20 20  Size[iCol]);.   
2a620 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44 61   }.  }..  fts5Da
2a630 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29  taRelease(pData)
2a640 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35 49  ;.  return fts5I
2a650 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a 7d  ndexReturn(p);.}
2a660 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  ../*.** Replace 
2a670 74 68 65 20 63 75 72 72 65 6e 74 20 22 61 76 65  the current "ave
2a680 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 77 69  rages" record wi
2a690 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  th the contents 
2a6a0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a 2a  of the buffer .*
2a6b0 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20 74 68  * supplied as th
2a6c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a6d0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2a6e0 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76 65  3Fts5IndexSetAve
2a6f0 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20  rages(Fts5Index 
2a700 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 44  *p, const u8 *pD
2a710 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29 7b  ata, int nData){
2a720 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
2a730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2a740 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28 70   fts5DataWrite(p
2a750 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f  , FTS5_AVERAGES_
2a760 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e 44  ROWID, pData, nD
2a770 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  ata);.  return f
2a780 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
2a790 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2a7a0 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
2a7b0 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74 68  ber of blocks th
2a7c0 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72 65  is module has re
2a7d0 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64 61  ad from the %_da
2a7e0 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e 63  ta.** table sinc
2a7f0 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65 64  e it was created
2a800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a810 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28 46  Fts5IndexReads(F
2a820 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
2a830 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64 3b  return p->nRead;
2a840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
2a850 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65 20  e 32-bit cookie 
2a860 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74 20  value stored at 
2a870 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c 6c  the start of all
2a880 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 72   structure .** r
2a890 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76 61  ecords to the va
2a8a0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
2a8b0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
2a8c0 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  t..**.** Return 
2a8d0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63  SQLITE_OK if suc
2a8e0 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20 53  cessful, or an S
2a8f0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
2a900 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20   if an error.** 
2a910 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  occurs..*/.int s
2a920 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 53  qlite3Fts5IndexS
2a930 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e 64  etCookie(Fts5Ind
2a940 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77 29  ex *p, int iNew)
2a950 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2a980 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  rn code */.  Fts
2a990 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67  5Config *pConfig
2a9a0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20 20   = p->pConfig;  
2a9b0 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69    /* Configurati
2a9c0 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  on object */.  u
2a9d0 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20 20  8 aCookie[4];   
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a9f0 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72 65      /* Binary re
2aa00 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
2aa10 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74 65  iNew */.  sqlite
2aa20 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20  3_blob *pBlob = 
2aa30 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d  0;..  assert( p-
2aa40 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
2aa50 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35 50  ;.  sqlite3Fts5P
2aa60 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69 4e  ut32(aCookie, iN
2aa70 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ew);..  rc = sql
2aa80 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28 70  ite3_blob_open(p
2aa90 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f 6e  Config->db, pCon
2aaa0 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44 61  fig->zDb, p->zDa
2aab0 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22 62  taTbl, .      "b
2aac0 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52 55  lock", FTS5_STRU
2aad0 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c 20  CTURE_ROWID, 1, 
2aae0 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69 66  &pBlob.  );.  if
2aaf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ab00 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
2ab10 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c  lob_write(pBlob,
2ab20 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29 3b   aCookie, 4, 0);
2ab30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2ab40 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42 6c  3_blob_close(pBl
2ab50 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ob);.  }..  retu
2ab60 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73 71  rn rc;.}..int sq
2ab70 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c 6f  lite3Fts5IndexLo
2ab80 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e 64  adConfig(Fts5Ind
2ab90 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74  ex *p){.  Fts5St
2aba0 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
2abb0 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66 74  ;.  pStruct = ft
2abc0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
2abd0 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74  p);.  fts5Struct
2abe0 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
2abf0 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ct);.  return ft
2ac00 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
2ac10 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
2ac20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
2ac70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ac90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 42  ***********.** B
2acb0 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74 20  elow this point 
2acc0 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  is the implement
2acd0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e 74  ation of the int
2ace0 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a 2a  egrity-check .**
2acf0 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e 0a   functionality..
2ad00 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
2ad10 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b 73   a simple checks
2ad20 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20 6f  um value based o
2ad30 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 2e  n the arguments.
2ad40 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33 46  .*/.u64 sqlite3F
2ad50 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b 73  ts5IndexEntryCks
2ad60 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64  um(.  i64 iRowid
2ad70 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 0a  , .  int iCol, .
2ad80 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20 69    int iPos, .  i
2ad90 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74  nt iIdx,.  const
2ada0 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20 20   char *pTerm,.  
2adb0 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20 69  int nTerm.){.  i
2adc0 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74 20  nt i;.  u64 ret 
2add0 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74 20  = iRowid;.  ret 
2ade0 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69 43  += (ret<<3) + iC
2adf0 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72 65  ol;.  ret += (re
2ae00 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20 20  t<<3) + iPos;.  
2ae10 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72 65  if( iIdx>=0 ) re
2ae20 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20  t += (ret<<3) + 
2ae30 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49  (FTS5_MAIN_PREFI
2ae40 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f 72  X + iIdx);.  for
2ae50 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20 69  (i=0; i<nTerm; i
2ae60 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74 3c  ++) ret += (ret<
2ae70 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b 0a  <3) + pTerm[i];.
2ae80 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
2ae90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
2aea0 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
2aeb0 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72 65  function is pure
2aec0 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
2aed0 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
2aee0 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
2aef0 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
2af00 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
2af10 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
2af20 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
2af30 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74  *.** Instead, it
2af40 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65 20   tests that the 
2af50 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e 6f  same set of pgno
2af60 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74 69  /rowid combinati
2af70 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73 69  ons are .** visi
2af80 74 65 64 20 72 65 67 61 72 64 6c 65 73 73 20 6f  ted regardless o
2af90 66 20 77 68 65 74 68 65 72 20 74 68 65 20 64 6f  f whether the do
2afa0 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65 6e  clist-index iden
2afb0 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  tified by parame
2afc0 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f 69  ters.** iSegid/i
2afd0 4c 65 61 66 20 69 73 20 69 74 65 72 61 74 65 64  Leaf is iterated
2afe0 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72 20   in forwards or 
2aff0 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a 2a  reverse order..*
2b000 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2b010 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65 72  s5TestDlidxRever
2b020 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20  se(.  Fts5Index 
2b030 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65 67 69  *p, .  int iSegi
2b040 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2b050 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65 6e         /* Segmen
2b060 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72 6f  t id to load fro
2b070 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61 66  m */.  int iLeaf
2b080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b090 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20 64         /* Load d
2b0a0 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72  oclist-index for
2b0b0 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29 7b   this leaf */.){
2b0c0 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65 72  .  Fts5DlidxIter
2b0d0 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20 20   *pDlidx = 0;.  
2b0e0 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33 3b  u64 cksum1 = 13;
2b0f0 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d 20  .  u64 cksum2 = 
2b100 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64  13;..  for(pDlid
2b110 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72 49  x=fts5DlidxIterI
2b120 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69 64  nit(p, 0, iSegid
2b130 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  , iLeaf);.      
2b140 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f 66  fts5DlidxIterEof
2b150 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a  (p, pDlidx)==0;.
2b160 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49        fts5DlidxI
2b170 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64  terNext(p, pDlid
2b180 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34 20  x).  ){.    i64 
2b190 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c 69  iRowid = fts5Dli
2b1a0 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
2b1b0 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e  dx);.    int pgn
2b1c0 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
2b1d0 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20  rPgno(pDlidx);. 
2b1e0 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e     assert( pgno>
2b1f0 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b 73  iLeaf );.    cks
2b200 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b 20  um1 += iRowid + 
2b210 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29 3b  ((i64)pgno<<32);
2b220 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64 78  .  }.  fts5Dlidx
2b230 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78 29  IterFree(pDlidx)
2b240 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b 0a  ;.  pDlidx = 0;.
2b250 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66 74  .  for(pDlidx=ft
2b260 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74 28  s5DlidxIterInit(
2b270 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20 69 4c  p, 1, iSegid, iL
2b280 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73 35  eaf);.      fts5
2b290 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
2b2a0 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20  pDlidx)==0;.    
2b2b0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50    fts5DlidxIterP
2b2c0 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 0a 20  rev(p, pDlidx). 
2b2d0 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f 77   ){.    i64 iRow
2b2e0 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  id = fts5DlidxIt
2b2f0 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29 3b  erRowid(pDlidx);
2b300 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d 20  .    int pgno = 
2b310 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67 6e  fts5DlidxIterPgn
2b320 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 61  o(pDlidx);.    a
2b330 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64 78  ssert( fts5Dlidx
2b340 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29  IterPgno(pDlidx)
2b350 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
2b360 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20 2b  sum2 += iRowid +
2b370 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29   ((i64)pgno<<32)
2b380 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
2b390 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
2b3a0 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
2b3b0 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
2b3c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73 75  QLITE_OK && cksu
2b3d0 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d 3e  m1!=cksum2 ) p->
2b3e0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2b3f0 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  T;.}..static int
2b400 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
2b410 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
2b420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b430 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64 65 78     /* Fts5 index
2b440 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
2b450 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20 63   iIdx,.  const c
2b460 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20 20  har *z,         
2b470 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2b480 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79 20 66  x key to query f
2b490 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  or */.  int n,  
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2b4c0 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69 6e 20  of index key in 
2b4d0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 66  bytes */.  int f
2b4e0 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
2b4f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
2b500 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e 64 65  ags for Fts5Inde
2b510 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36 34 20  xQuery */.  u64 
2b520 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20 20 20  *pCksum         
2b530 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2b540 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d 20  N/OUT: Checksum 
2b550 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  value */.){.  in
2b560 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e 70  t eDetail = p->p
2b570 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3b  Config->eDetail;
2b580 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20 2a  .  u64 cksum = *
2b590 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49 6e  pCksum;.  Fts5In
2b5a0 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20 3d  dexIter *pIter =
2b5b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73   0;.  int rc = s
2b5c0 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 51  qlite3Fts5IndexQ
2b5d0 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66 6c  uery(p, z, n, fl
2b5e0 61 67 73 2c 20 30 2c 20 26 70 49 74 65 72 29 3b  ags, 0, &pIter);
2b5f0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
2b600 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 73  QLITE_OK && 0==s
2b610 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45 6f  qlite3Fts5IterEo
2b620 66 28 70 49 74 65 72 29 20 29 7b 0a 20 20 20 20  f(pIter) ){.    
2b630 69 36 34 20 72 6f 77 69 64 20 3d 20 70 49 74 65  i64 rowid = pIte
2b640 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20 20  r->iRowid;..    
2b650 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53  if( eDetail==FTS
2b660 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b  5_DETAIL_NONE ){
2b670 0a 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d 20  .      cksum ^= 
2b680 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2b690 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69 64  EntryCksum(rowid
2b6a0 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c 20 7a 2c  , 0, 0, iIdx, z,
2b6b0 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2b6c0 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69 73        Fts5Poslis
2b6d0 74 52 65 61 64 65 72 20 73 52 65 61 64 65 72 3b  tReader sReader;
2b6e0 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69 74  .      for(sqlit
2b6f0 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65 61  e3Fts5PoslistRea
2b700 64 65 72 49 6e 69 74 28 70 49 74 65 72 2d 3e 70  derInit(pIter->p
2b710 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 6e 44 61  Data, pIter->nDa
2b720 74 61 2c 20 26 73 52 65 61 64 65 72 29 3b 0a 20  ta, &sReader);. 
2b730 20 20 20 20 20 20 20 20 20 73 52 65 61 64 65 72           sReader
2b740 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20 20  .bEof==0;.      
2b750 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
2b760 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78 74  oslistReaderNext
2b770 28 26 73 52 65 61 64 65 72 29 0a 20 20 20 20 20  (&sReader).     
2b780 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2b790 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32  iCol = FTS5_POS2
2b7a0 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e 69  COLUMN(sReader.i
2b7b0 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  Pos);.        in
2b7c0 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50 4f  t iOff = FTS5_PO
2b7d0 53 32 4f 46 46 53 45 54 28 73 52 65 61 64 65 72  S2OFFSET(sReader
2b7e0 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  .iPos);.        
2b7f0 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65 33  cksum ^= sqlite3
2b800 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2b810 73 75 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c 2c  sum(rowid, iCol,
2b820 20 69 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c 20   iOff, iIdx, z, 
2b830 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
2b840 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
2b850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
2b870 35 49 74 65 72 4e 65 78 74 28 70 49 74 65 72 29  5IterNext(pIter)
2b880 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
2b890 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c 6f  lite3Fts5IterClo
2b8a0 73 65 28 70 49 74 65 72 29 3b 0a 0a 20 20 2a 70  se(pIter);..  *p
2b8b0 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a 20  Cksum = cksum;. 
2b8c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
2b8d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
2b8e0 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72 65  ion is also pure
2b8f0 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ly an internal t
2b900 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f 74  est. It does not
2b910 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20 0a   contribute to .
2b920 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e 61  ** FTS functiona
2b930 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74 68  lity, or even th
2b940 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65 63  e integrity-chec
2b950 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  k, in any way..*
2b960 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2b970 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46 74  s5TestTerm(.  Ft
2b980 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46  s5Index *p, .  F
2b990 74 73 35 42 75 66 66 65 72 20 2a 70 50 72 65 76  ts5Buffer *pPrev
2b9a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2b9b0 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d 20  * Previous term 
2b9c0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
2b9d0 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  *z, int n,      
2b9e0 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79       /* Possibly
2b9f0 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65 73   new term to tes
2ba00 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65 63  t */.  u64 expec
2ba10 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b 73  ted,.  u64 *pCks
2ba20 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  um.){.  int rc =
2ba30 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 50   p->rc;.  if( pP
2ba40 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20 20  rev->n==0 ){.   
2ba50 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2ba60 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
2ba70 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20 7d  onst u8*)z);.  }
2ba80 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d 53  else.  if( rc==S
2ba90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50 72  QLITE_OK && (pPr
2baa0 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d 63  ev->n!=n || memc
2bab0 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c 20  mp(pPrev->p, z, 
2bac0 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20 63  n)) ){.    u64 c
2bad0 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d 3b  ksum3 = *pCksum;
2bae0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2baf0 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20  *zTerm = (const 
2bb00 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70 5b  char*)&pPrev->p[
2bb10 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61 6e  1];  /* term san
2bb20 73 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a 2f  s prefix-byte */
2bb30 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d  .    int nTerm =
2bb40 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20 20   pPrev->n-1;    
2bb50 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
2bb60 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74 65  of zTerm in byte
2bb70 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 64  s */.    int iId
2bb80 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30 5d  x = (pPrev->p[0]
2bb90 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45   - FTS5_MAIN_PRE
2bba0 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66 6c  FIX);.    int fl
2bbb0 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20 3f  ags = (iIdx==0 ?
2bbc0 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f 51   0 : FTS5INDEX_Q
2bbd0 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20 20  UERY_PREFIX);.  
2bbe0 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a 20    u64 ck1 = 0;. 
2bbf0 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b 0a     u64 ck2 = 0;.
2bc00 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
2bc10 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 72  at the results r
2bc20 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43 20  eturned for ASC 
2bc30 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65 73  and DESC queries
2bc40 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65 20   are.    ** the 
2bc50 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63 61  same. If not, ca
2bc60 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74 69  ll this corrupti
2bc70 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  on.  */.    rc =
2bc80 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28   fts5QueryCksum(
2bc90 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20  p, iIdx, zTerm, 
2bca0 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26 63  nTerm, flags, &c
2bcb0 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  k1);.    if( rc=
2bcc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2bcd0 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67      int f = flag
2bce0 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52  s|FTS5INDEX_QUER
2bcf0 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72 63  Y_DESC;.      rc
2bd00 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
2bd10 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
2bd20 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
2bd30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2bd40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2bd50 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20  & ck1!=ck2 ) rc 
2bd60 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2bd70 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2bd80 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65 72  is a prefix quer
2bd90 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  y, check that th
2bda0 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72 6e  e results return
2bdb0 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a  ed if the.    **
2bdc0 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 64 69   the index is di
2bdd0 73 61 62 6c 65 64 20 61 72 65 20 74 68 65 20 73  sabled are the s
2bde0 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53 43  ame. In both ASC
2bdf0 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72 2e   and DESC order.
2be00 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
2be10 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20 6f  This check may o
2be20 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65 64  nly be performed
2be30 20 69 66 20 74 68 65 20 68 61 73 68 20 74 61 62   if the hash tab
2be40 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68 69  le is empty. Thi
2be50 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63 61  s.    ** is beca
2be60 75 73 65 20 74 68 65 20 68 61 73 68 20 74 61 62  use the hash tab
2be70 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 73  le only supports
2be80 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20 71   a single scan q
2be90 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20 61  uery at.    ** a
2bea0 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20 6d   time, and the m
2beb0 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20 66  ulti-iter loop f
2bec0 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20 66  rom which this f
2bed0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2bee0 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65  d.    ** is alre
2bef0 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20 73  ady performing s
2bf00 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a 20  uch a scan. */. 
2bf10 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64 69     if( p->nPendi
2bf20 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20  ngData==0 ){.   
2bf30 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26 26     if( iIdx>0 &&
2bf40 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bf50 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 20  {.        int f 
2bf60 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44 45  = flags|FTS5INDE
2bf70 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49  X_QUERY_TEST_NOI
2bf80 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20  DX;.        ck2 
2bf90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2bfa0 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
2bfb0 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
2bfc0 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29   nTerm, f, &ck2)
2bfd0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2bfe0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
2bff0 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46  k1!=ck2 ) rc = F
2c000 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2c010 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2c020 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51 4c  Idx>0 && rc==SQL
2c030 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c040 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73 7c    int f = flags|
2c050 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
2c060 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35 49  TEST_NOIDX|FTS5I
2c070 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43 3b  NDEX_QUERY_DESC;
2c080 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20 30  .        ck2 = 0
2c090 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  ;.        rc = f
2c0a0 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70 2c  ts5QueryCksum(p,
2c0b0 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e 54   iIdx, zTerm, nT
2c0c0 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a 20  erm, f, &ck2);. 
2c0d0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2c0e0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31 21  QLITE_OK && ck1!
2c0f0 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53 35  =ck2 ) rc = FTS5
2c100 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c110 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b 73  }.    }..    cks
2c120 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20 20  um3 ^= ck1;.    
2c130 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26 72  fts5BufferSet(&r
2c140 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63 6f  c, pPrev, n, (co
2c150 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20 20  nst u8*)z);..   
2c160 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c170 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65 78  OK && cksum3!=ex
2c180 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20 20  pected ){.      
2c190 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c1a0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 43  T;.    }.    *pC
2c1b0 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a 20  ksum = cksum3;. 
2c1c0 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b   }.  p->rc = rc;
2c1d0 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65 66  .}. .#else.# def
2c1e0 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69 64  ine fts5TestDlid
2c1f0 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29 0a  xReverse(x,y,z).
2c200 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65 73  # define fts5Tes
2c210 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79 2c  tTerm(u,v,w,x,y,
2c220 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  z).#endif../*.**
2c230 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a 0a   Check that:.**.
2c240 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61 76  **   1) All leav
2c250 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77 65  es of pSeg betwe
2c260 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69 4c  en iFirst and iL
2c270 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29 20  ast (inclusive) 
2c280 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20 20  exist and.**    
2c290 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20 74    contain zero t
2c2a0 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41 6c  erms..**   2) Al
2c2b0 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65 67  l leaves of pSeg
2c2c0 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77 69   between iNoRowi
2c2d0 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e 63  d and iLast (inc
2c2e0 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61 6e  lusive) exist an
2c2f0 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61 69  d.**      contai
2c300 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a 2a  n zero rowids..*
2c310 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
2c320 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74 79  s5IndexIntegrity
2c330 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46 74  CheckEmpty(.  Ft
2c340 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
2c350 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
2c360 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f 2a  nt *pSeg,     /*
2c370 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65 63   Segment to chec
2c380 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73 69  k internal consi
2c390 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74 20  stency */.  int 
2c3a0 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69 4e  iFirst,.  int iN
2c3b0 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69 4c  oRowid,.  int iL
2c3c0 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  ast.){.  int i;.
2c3d0 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b 20  .  /* Now check 
2c3e0 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e 45  that the iter.nE
2c3f0 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c 6c  mpty leaves foll
2c400 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  owing the curren
2c410 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29 20  t leaf.  ** (a) 
2c420 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63 6f  exist and (b) co
2c430 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e 20  ntain no terms. 
2c440 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72 73  */.  for(i=iFirs
2c450 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t; p->rc==SQLITE
2c460 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74 3b  _OK && i<=iLast;
2c470 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44   i++){.    Fts5D
2c480 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74 73  ata *pLeaf = fts
2c490 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54 53  5DataRead(p, FTS
2c4a0 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
2c4b0 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 29  pSeg->iSegid, i)
2c4c0 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66  );.    if( pLeaf
2c4d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 66   ){.      if( !f
2c4e0 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65 73  ts5LeafIsTermles
2c4f0 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72 63  s(pLeaf) ) p->rc
2c500 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2c510 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69 4e  .      if( i>=iN
2c520 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74 73  oRowid && 0!=fts
2c530 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64 4f  5LeafFirstRowidO
2c540 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72  ff(pLeaf) ) p->r
2c550 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2c560 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
2c570 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65 61  DataRelease(pLea
2c580 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
2c590 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74 65 67  c void fts5Integ
2c5a0 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28 46  rityCheckPgidx(F
2c5b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73  ts5Index *p, Fts
2c5c0 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a 20  5Data *pLeaf){. 
2c5d0 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d 20   int iTermOff = 
2c5e0 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20  0;.  int ii;..  
2c5f0 46 74 73 35 42 75 66 66 65 72 20 62 75 66 31 20  Fts5Buffer buf1 
2c600 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74 73  = {0,0,0};.  Fts
2c610 35 42 75 66 66 65 72 20 62 75 66 32 20 3d 20 7b  5Buffer buf2 = {
2c620 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d 20  0,0,0};..  ii = 
2c630 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a 20  pLeaf->szLeaf;. 
2c640 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65 61 66   while( ii<pLeaf
2c650 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d 53  ->nn && p->rc==S
2c660 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c670 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
2c680 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e   iOff;.    int n
2c690 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b 3d  Incr;..    ii +=
2c6a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2c6b0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c 20  (&pLeaf->p[ii], 
2c6c0 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54 65 72  nIncr);.    iTer
2c6d0 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a 20  mOff += nIncr;. 
2c6e0 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d 4f     iOff = iTermO
2c6f0 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f 66  ff;..    if( iOf
2c700 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66  f>=pLeaf->szLeaf
2c710 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20   ){.      p->rc 
2c720 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2c730 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 54      }else if( iT
2c740 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29 7b  ermOff==nIncr ){
2c750 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
2c760 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
2c770 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2c780 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2c790 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69   nByte);.      i
2c7a0 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65 29 3e  f( (iOff+nByte)>
2c7b0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b  pLeaf->szLeaf ){
2c7c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d  .        p->rc =
2c7d0 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20   FTS5_CORRUPT;. 
2c7e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c7f0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65      fts5BufferSe
2c800 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31 2c  t(&p->rc, &buf1,
2c810 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d 3e   nByte, &pLeaf->
2c820 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20  p[iOff]);.      
2c830 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
2c840 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e 42     int nKeep, nB
2c850 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20  yte;.      iOff 
2c860 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
2c870 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  32(&pLeaf->p[iOf
2c880 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20  f], nKeep);.    
2c890 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2c8a0 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61 66  tVarint32(&pLeaf
2c8b0 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74 65  ->p[iOff], nByte
2c8c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b 65  );.      if( nKe
2c8d0 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69 4f  ep>buf1.n || (iO
2c8e0 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66 2d  ff+nByte)>pLeaf-
2c8f0 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 20  >szLeaf ){.     
2c900 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f     p->rc = FTS5_
2c910 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 7d  CORRUPT;.      }
2c920 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62 75  else{.        bu
2c930 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20  f1.n = nKeep;.  
2c940 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
2c950 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
2c960 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65 2c  c, &buf1, nByte,
2c970 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d   &pLeaf->p[iOff]
2c980 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
2c990 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
2c9a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c9b0 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66    res = fts5Buff
2c9c0 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66 31 2c  erCompare(&buf1,
2c9d0 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20 20 20   &buf2);.       
2c9e0 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20 70 2d   if( res<=0 ) p-
2c9f0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2ca00 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
2ca10 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72  }.    fts5Buffer
2ca20 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66  Set(&p->rc, &buf
2ca30 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66 31 2e  2, buf1.n, buf1.
2ca40 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35 42  p);.  }..  fts5B
2ca50 75 66 66 65 72 46 72 65 65 28 26 62 75 66 31 29  ufferFree(&buf1)
2ca60 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46 72  ;.  fts5BufferFr
2ca70 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73 74  ee(&buf2);.}..st
2ca80 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e  atic void fts5In
2ca90 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65 63  dexIntegrityChec
2caa0 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73 35  kSegment(.  Fts5
2cab0 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20  Index *p,       
2cac0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2cad0 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65  TS5 backend obje
2cae0 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75  ct */.  Fts5Stru
2caf0 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
2cb00 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65  eg      /* Segme
2cb10 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74 65  nt to check inte
2cb20 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63 79  rnal consistency
2cb30 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f 6e   */.){.  Fts5Con
2cb40 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20 70  fig *pConfig = p
2cb50 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71 6c  ->pConfig;.  sql
2cb60 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2cb70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32 3b   = 0;.  int rc2;
2cb80 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65 76 4c  .  int iIdxPrevL
2cb90 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  eaf = pSeg->pgno
2cba0 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20 69  First-1;.  int i
2cbb0 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20  DlidxPrevLeaf = 
2cbc0 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a  pSeg->pgnoLast;.
2cbd0 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67 6e  .  if( pSeg->pgn
2cbe0 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74 75  oFirst==0 ) retu
2cbf0 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65 78  rn;..  fts5Index
2cc00 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20 26  PrepareStmt(p, &
2cc10 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f 6d  pStmt, sqlite3_m
2cc20 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22 53  printf(.      "S
2cc30 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65 72  ELECT segid, ter
2cc40 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28 70  m, (pgno>>1), (p
2cc50 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e 27  gno&1) FROM %Q.'
2cc60 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73 65  %q_idx' WHERE se
2cc70 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20 70  gid=%d",.      p
2cc80 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43 6f  Config->zDb, pCo
2cc90 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53 65  nfig->zName, pSe
2cca0 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29 3b 0a  g->iSegid.  ));.
2ccb0 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74 68  .  /* Iterate th
2ccc0 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65 65  rough the b-tree
2ccd0 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f 0a   hierarchy.  */.
2cce0 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
2ccf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
2cd00 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2cd10 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
2cd20 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20 20      i64 iRow;   
2cd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd40 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 74    /* Rowid for t
2cd50 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20 20  his leaf */.    
2cd60 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66 3b  Fts5Data *pLeaf;
2cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2cd80 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20 6c   Data for this l
2cd90 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74 20  eaf */..    int 
2cda0 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c 69 74  nIdxTerm = sqlit
2cdb0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
2cdc0 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 63  pStmt, 1);.    c
2cdd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 54  onst char *zIdxT
2cde0 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  erm = (const cha
2cdf0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
2ce00 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
2ce10 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 4c 65  ;.    int iIdxLe
2ce20 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  af = sqlite3_col
2ce30 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 32  umn_int(pStmt, 2
2ce40 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64 78 44  );.    int bIdxD
2ce50 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 63  lidx = sqlite3_c
2ce60 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2ce70 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20   3);..    /* If 
2ce80 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65 73  the leaf in ques
2ce90 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
2cea0 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66 72   been trimmed fr
2ceb0 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c 20  om the segment, 
2cec0 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20 74  .    ** ignore t
2ced0 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72 79  his b-tree entry
2cee0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f 61  . Otherwise, loa
2cef0 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  d it into memory
2cf00 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49 64  . */.    if( iId
2cf10 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e 6f  xLeaf<pSeg->pgno
2cf20 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75 65  First ) continue
2cf30 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54 53  ;.    iRow = FTS
2cf40 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
2cf50 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69 49  pSeg->iSegid, iI
2cf60 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c 65  dxLeaf);.    pLe
2cf70 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65 61  af = fts5LeafRea
2cf80 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20 20  d(p, iRow);.    
2cf90 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20 62  if( pLeaf==0 ) b
2cfa0 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  reak;..    /* Ch
2cfb0 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61  eck that the lea
2cfc0 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65  f contains at le
2cfd0 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61 6e  ast one term, an
2cfe0 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71 75  d that it is equ
2cff0 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72 20  al.    ** to or 
2d000 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
2d010 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49 64  split-key in zId
2d020 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68 65  xTerm.  Also che
2d030 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 72 65  ck that if there
2d040 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f 20  .    ** is also 
2d050 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72 20  a rowid pointer 
2d060 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66 20  within the leaf 
2d070 70 61 67 65 20 68 65 61 64 65 72 2c 20 69 74 20  page header, it 
2d080 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20 20  points to a.    
2d090 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66 6f  ** location befo
2d0a0 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a 2f  re the term.  */
2d0b0 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d 3e  .    if( pLeaf->
2d0c0 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  nn<=pLeaf->szLea
2d0d0 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  f ){.      p->rc
2d0e0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2d0f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2d100 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20 20    int iOff;     
2d110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d120 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
2d130 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a 2f   term on leaf */
2d140 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77 69  .      int iRowi
2d150 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  dOff;           
2d160 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
2d170 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 6c  first rowid on l
2d180 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  eaf */.      int
2d190 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   nTerm;         
2d1a0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2d1b0 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66   of term on leaf
2d1c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20   in bytes */.   
2d1d0 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20 20     int res;     
2d1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d1f0 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  * Comparison of 
2d200 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d 6b  term and split-k
2d210 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f 66  ey */..      iOf
2d220 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
2d230 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29 3b  tTermOff(pLeaf);
2d240 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
2d250 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
2d260 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b  RowidOff(pLeaf);
2d270 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77 69  .      if( iRowi
2d280 64 4f 66 66 3e 3d 69 4f 66 66 20 7c 7c 20 69 4f  dOff>=iOff || iO
2d290 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
2d2a0 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  f ){.        p->
2d2b0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2d2c0 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  T;.      }else{.
2d2d0 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
2d2e0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
2d2f0 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d 2c  &pLeaf->p[iOff],
2d300 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 20   nTerm);.       
2d310 20 72 65 73 20 3d 20 66 74 73 35 4d 65 6d 63 6d   res = fts5Memcm
2d320 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  p(&pLeaf->p[iOff
2d330 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49 4e  ], zIdxTerm, MIN
2d340 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72 6d  (nTerm, nIdxTerm
2d350 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
2d360 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20 6e  res==0 ) res = n
2d370 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d 3b  Term - nIdxTerm;
2d380 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73  .        if( res
2d390 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54 53  <0 ) p->rc = FTS
2d3a0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2d3b0 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49 6e   }..      fts5In
2d3c0 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69 64  tegrityCheckPgid
2d3d0 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20 20  x(p, pLeaf);.   
2d3e0 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61 52   }.    fts5DataR
2d3f0 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a 20  elease(pLeaf);. 
2d400 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20 62     if( p->rc ) b
2d410 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  reak;..    /* No
2d420 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  w check that the
2d430 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65 61   iter.nEmpty lea
2d440 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ves following th
2d450 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a 20  e current leaf. 
2d460 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74 20     ** (a) exist 
2d470 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e 20  and (b) contain 
2d480 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20 20  no terms. */.   
2d490 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
2d4a0 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20  ityCheckEmpty(. 
2d4b0 20 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c 20         p, pSeg, 
2d4c0 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c 20  iIdxPrevLeaf+1, 
2d4d0 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b 31  iDlidxPrevLeaf+1
2d4e0 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20 20  , iIdxLeaf-1.   
2d4f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   );.    if( p->r
2d500 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  c ) break;..    
2d510 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  /* If there is a
2d520 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c 20   doclist-index, 
2d530 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c 6f  check that it lo
2d540 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20 20  oks right. */.  
2d550 20 20 69 66 28 20 62 49 64 78 44 6c 69 64 78 20    if( bIdxDlidx 
2d560 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c 69  ){.      Fts5Dli
2d570 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  dxIter *pDlidx =
2d580 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65 72   0;  /* For iter
2d590 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64 6f  ating through do
2d5a0 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
2d5b0 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c 65       int iPrevLe
2d5c0 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a 20  af = iIdxLeaf;. 
2d5d0 20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64 20       int iSegid 
2d5e0 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b 0a  = pSeg->iSegid;.
2d5f0 20 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d 20        int iPg = 
2d600 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b 65  0;.      i64 iKe
2d610 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70 44  y;..      for(pD
2d620 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74  lidx=fts5DlidxIt
2d630 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65  erInit(p, 0, iSe
2d640 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b 0a  gid, iIdxLeaf);.
2d650 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44 6c            fts5Dl
2d660 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70 44  idxIterEof(p, pD
2d670 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20 20  lidx)==0;.      
2d680 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65      fts5DlidxIte
2d690 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29  rNext(p, pDlidx)
2d6a0 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20 20  .      ){..     
2d6b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79 20     /* Check any 
2d6c0 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65 73  rowid-less pages
2d6d0 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66 6f   that occur befo
2d6e0 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  re the current l
2d6f0 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  eaf. */.        
2d700 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65 61  for(iPg=iPrevLea
2d710 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c 69  f+1; iPg<fts5Dli
2d720 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64  dxIterPgno(pDlid
2d730 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  x); iPg++){.    
2d740 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54 53        iKey = FTS
2d750 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44 28  5_SEGMENT_ROWID(
2d760 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20 20  iSegid, iPg);.  
2d770 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d 20          pLeaf = 
2d780 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c 20  fts5DataRead(p, 
2d790 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20  iKey);.         
2d7a0 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20 20   if( pLeaf ){.  
2d7b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66 74            if( ft
2d7c0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2d7d0 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29 20  Off(pLeaf)!=0 ) 
2d7e0 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52  p->rc = FTS5_COR
2d7f0 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  RUPT;.          
2d800 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2d810 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
2d820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2d830 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65 61          iPrevLea
2d840 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  f = fts5DlidxIte
2d850 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
2d860 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
2d870 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20 70   that the leaf p
2d880 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62 79  age indicated by
2d890 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72 65   the iterator re
2d8a0 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20 20  ally does.      
2d8b0 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68 65    ** contain the
2d8c0 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65 64   rowid suggested
2d8d0 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a 2f   by the same. */
2d8e0 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20  .        iKey = 
2d8f0 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57  FTS5_SEGMENT_ROW
2d900 49 44 28 69 53 65 67 69 64 2c 20 69 50 72 65 76  ID(iSegid, iPrev
2d910 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20 70  Leaf);.        p
2d920 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61 52  Leaf = fts5DataR
2d930 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20 20  ead(p, iKey);.  
2d940 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66 20        if( pLeaf 
2d950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36 34  ){.          i64
2d960 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20   iRowid;.       
2d970 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
2d980 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73 74   = fts5LeafFirst
2d990 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29 3b  RowidOff(pLeaf);
2d9a0 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45 52  .          ASSER
2d9b0 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65 61  T_SZLEAF_OK(pLea
2d9c0 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
2d9d0 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c 65  ( iRowidOff>=pLe
2d9e0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
2d9f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
2da00 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2da10 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
2da20 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
2da30 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65 61  5GetVarint(&pLea
2da40 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d 2c  f->p[iRowidOff],
2da50 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29 3b   (u64*)&iRowid);
2da60 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2da70 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c 69   iRowid!=fts5Dli
2da80 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c 69  dxIterRowid(pDli
2da90 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  dx) ) p->rc = FT
2daa0 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2dab0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2dac0 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73    fts5DataReleas
2dad0 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20 20  e(pLeaf);.      
2dae0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
2daf0 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61     iDlidxPrevLea
2db00 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20 66  f = iPg;.      f
2db10 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65 65  ts5DlidxIterFree
2db20 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20  (pDlidx);.      
2db30 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76  fts5TestDlidxRev
2db40 65 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c 20  erse(p, iSegid, 
2db50 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 7d  iIdxLeaf);.    }
2db60 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c 69  else{.      iDli
2db70 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53 65  dxPrevLeaf = pSe
2db80 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20 20  g->pgnoLast;.   
2db90 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65 63     /* TODO: Chec
2dba0 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 6f  k there is no do
2dbb0 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a 20  clist index */. 
2dbc0 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50 72     }..    iIdxPr
2dbd0 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65 61  evLeaf = iIdxLea
2dbe0 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d 20  f;.  }..  rc2 = 
2dbf0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2dc00 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70  (pStmt);.  if( p
2dc10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2dc20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a 0a  ) p->rc = rc2;..
2dc30 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e 69    /* Page iter.i
2dc40 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62 65  Leaf must now be
2dc50 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 6c   the rightmost l
2dc60 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65 20  eaf-page in the 
2dc70 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20 30  segment */.#if 0
2dc80 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
2dc90 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72 2e  LITE_OK && iter.
2dca0 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67 6e  iLeaf!=pSeg->pgn
2dcb0 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  oLast ){.    p->
2dcc0 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2dcd0 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  T;.  }.#endif.}.
2dce0 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74 65  ../*.** Run inte
2dcf0 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20 65  rnal checks to e
2dd00 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 46  nsure that the F
2dd10 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73 20  TS index (a) is 
2dd20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20 63  internally .** c
2dd30 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28 62  onsistent and (b
2dd40 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72 69  ) contains entri
2dd50 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68 65  es for which the
2dd60 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65 63   XOR of the chec
2dd70 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c 63  ksums.** as calc
2dd80 75 6c 61 74 65 64 20 62 79 20 73 71 6c 69 74 65  ulated by sqlite
2dd90 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2dda0 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d 2e  ksum() is cksum.
2ddb0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
2ddc0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20  LITE_CORRUPT if 
2ddd0 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65 72  any of the inter
2dde0 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c 2c  nal checks fail,
2ddf0 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63 68   or if the.** ch
2de00 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74 20  ecksum does not 
2de10 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53 51  match. Return SQ
2de20 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20 63  LITE_OK if all c
2de30 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68 6f  hecks pass witho
2de40 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72 20  ut.** error, or 
2de50 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69 74  some other SQLit
2de60 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  e error code if 
2de70 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28 65  another error (e
2de80 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63 75  .g. OOM).** occu
2de90 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
2dea0 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65 67  e3Fts5IndexInteg
2deb0 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49 6e  rityCheck(Fts5In
2dec0 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73 75  dex *p, u64 cksu
2ded0 6d 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61 69  m){.  int eDetai
2dee0 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  l = p->pConfig->
2def0 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20 63  eDetail;.  u64 c
2df00 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20 20  ksum2 = 0;      
2df10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
2df20 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e 20  ecksum based on 
2df30 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64 65  contents of inde
2df40 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75 66  xes */.  Fts5Buf
2df50 66 65 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b 30  fer poslist = {0
2df60 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66 66  ,0,0};   /* Buff
2df70 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20  er used to hold 
2df80 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 46  a poslist */.  F
2df90 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 3b 20  ts5Iter *pIter; 
2dfa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2dfb0 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61 74  * Used to iterat
2dfc0 65 20 74 68 72 6f 75 67 68 20 65 6e 74 69 72 65  e through entire
2dfd0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73 35   index */.  Fts5
2dfe0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
2dff0 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ct;         /* I
2e000 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20 2a  ndex structure *
2e010 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
2e020 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 73 65 64  _DEBUG.  /* Used
2e030 20 62 79 20 65 78 74 72 61 20 69 6e 74 65 72 6e   by extra intern
2e040 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72 75  al tests only ru
2e050 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e  n if NDEBUG is n
2e060 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20 20  ot defined */.  
2e070 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b 20  u64 cksum3 = 0; 
2e080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e090 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73 65  /* Checksum base
2e0a0 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f 66  d on contents of
2e0b0 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46 74   indexes */.  Ft
2e0c0 73 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d 20  s5Buffer term = 
2e0d0 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f 2a  {0,0,0};      /*
2e0e0 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f 20   Buffer used to 
2e0f0 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e 74  hold most recent
2e100 20 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66 0a   term */.#endif.
2e110 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67    const int flag
2e120 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s = FTS5INDEX_QU
2e130 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20 20  ERY_NOOUTPUT;.  
2e140 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 46  .  /* Load the F
2e150 54 53 20 69 6e 64 65 78 20 73 74 72 75 63 74 75  TS index structu
2e160 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20  re */.  pStruct 
2e170 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65 52  = fts5StructureR
2e180 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43 68  ead(p);..  /* Ch
2e190 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e 74  eck that the int
2e1a0 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20 65  ernal nodes of e
2e1b0 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74 63  ach segment matc
2e1c0 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f 0a  h the leaves */.
2e1d0 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29 7b    if( pStruct ){
2e1e0 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20 69  .    int iLvl, i
2e1f0 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76  Seg;.    for(iLv
2e200 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63  l=0; iLvl<pStruc
2e210 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b  t->nLevel; iLvl+
2e220 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53  +){.      for(iS
2e230 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
2e240 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
2e250 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
2e260 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72 75          Fts5Stru
2e270 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53  ctureSegment *pS
2e280 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
2e290 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65 67  Level[iLvl].aSeg
2e2a0 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iSeg];.        
2e2b0 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69  fts5IndexIntegri
2e2c0 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28 70  tyCheckSegment(p
2e2d0 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20 7d  , pSeg);.      }
2e2e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
2e2f0 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75 6d   The cksum argum
2e300 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68  ent passed to th
2e310 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2e320 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75 6c   checksum calcul
2e330 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64 20  ated.  ** based 
2e340 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64 20  on all expected 
2e350 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 46  entries in the F
2e360 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75 64  TS index (includ
2e370 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65 78  ing prefix index
2e380 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e 20  .  ** entries). 
2e390 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63 6b  This block check
2e3a0 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 73 75  s that a checksu
2e3b0 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61 73  m calculated bas
2e3c0 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 61  ed on the.  ** a
2e3d0 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20 6f  ctual contents o
2e3e0 66 20 46 54 53 20 69 6e 64 65 78 20 69 73 20 69  f FTS index is i
2e3f0 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a 20  dentical..  **. 
2e400 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e 73   ** Two versions
2e410 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68 65   of the same che
2e420 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75 6c  cksum are calcul
2e430 61 74 65 64 2e 20 54 68 65 20 66 69 72 73 74 20  ated. The first 
2e440 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72 69  (stack.  ** vari
2e450 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61 73  able cksum2) bas
2e460 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65 78  ed on entries ex
2e470 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68 65  tracted from the
2e480 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65 78   full-text index
2e490 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69 6e  .  ** while doin
2e4a0 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  g a linear scan 
2e4b0 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  of each individu
2e4c0 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72 6e  al index in turn
2e4d0 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73 20  . .  **.  ** As 
2e4e0 65 61 63 68 20 74 65 72 6d 20 76 69 73 69 74 65  each term visite
2e4f0 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72 20  d by the linear 
2e500 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61 74  scans, a separat
2e510 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65 0a  e query for the.
2e520 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20 69    ** same term i
2e530 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b 73  s performed. cks
2e540 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74 65  um3 is calculate
2e550 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  d based on the e
2e560 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74 72  ntries.  ** extr
2e570 61 63 74 65 64 20 62 79 20 74 68 65 73 65 20 71  acted by these q
2e580 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20 66  ueries..  */.  f
2e590 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65 72  or(fts5MultiIter
2e5a0 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c 20  New(p, pStruct, 
2e5b0 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c 20  flags, 0, 0, 0, 
2e5c0 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b 0a  -1, 0, &pIter);.
2e5d0 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
2e5e0 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72 29  terEof(p, pIter)
2e5f0 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35 4d  ==0;.      fts5M
2e600 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20  ultiIterNext(p, 
2e610 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20 29  pIter, 0, 0).  )
2e620 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20 20  {.    int n;    
2e630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e640 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65 72    /* Size of ter
2e650 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  m in bytes */.  
2e660 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b 20    i64 iPos = 0; 
2e670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2e680 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20 66   Position read f
2e690 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20  rom poslist */. 
2e6a0 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b     int iOff = 0;
2e6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e6c0 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e 20  * Offset within 
2e6d0 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  poslist */.    i
2e6e0 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35  64 iRowid = fts5
2e6f0 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70  MultiIterRowid(p
2e700 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72 20  Iter);.    char 
2e710 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73 35  *z = (char*)fts5
2e720 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70 49  MultiIterTerm(pI
2e730 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20 2f  ter, &n);..    /
2e740 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 6e  * If this is a n
2e750 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20 66  ew term, query f
2e760 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20 63 6b  or it. Update ck
2e770 73 75 6d 33 20 77 69 74 68 20 74 68 65 20 72 65  sum3 with the re
2e780 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66 74  sults. */.    ft
2e790 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74  s5TestTerm(p, &t
2e7a0 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75 6d  erm, z, n, cksum
2e7b0 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20  2, &cksum3);..  
2e7c0 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46    if( eDetail==F
2e7d0 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
2e7e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
2e7f0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73 45  fts5MultiIterIsE
2e800 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20 29  mpty(p, pIter) )
2e810 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d 32  {.        cksum2
2e820 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35 49   ^= sqlite3Fts5I
2e830 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28 69  ndexEntryCksum(i
2e840 52 6f 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31 2c  Rowid, 0, 0, -1,
2e850 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
2e860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e870 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b 0a   poslist.n = 0;.
2e880 20 20 20 20 20 20 66 74 73 35 53 65 67 69 74 65        fts5Segite
2e890 72 50 6f 73 6c 69 73 74 28 70 2c 20 26 70 49 74  rPoslist(p, &pIt
2e8a0 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d 3e  er->aSeg[pIter->
2e8b0 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
2e8c0 5d 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29 3b  ], 0, &poslist);
2e8d0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 30 3d  .      while( 0=
2e8e0 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73 6c  =sqlite3Fts5Posl
2e8f0 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c 69 73  istNext64(poslis
2e900 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c 20  t.p, poslist.n, 
2e910 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29 7b  &iOff, &iPos) ){
2e920 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f  .        int iCo
2e930 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f 4c  l = FTS5_POS2COL
2e940 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20 20  UMN(iPos);.     
2e950 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20 3d     int iTokOff =
2e960 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45 54   FTS5_POS2OFFSET
2e970 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20  (iPos);.        
2e980 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74 65  cksum2 ^= sqlite
2e990 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2e9a0 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43 6f  ksum(iRowid, iCo
2e9b0 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c 20  l, iTokOff, -1, 
2e9c0 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  z, n);.      }. 
2e9d0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35 54     }.  }.  fts5T
2e9e0 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72 6d  estTerm(p, &term
2e9f0 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c 20  , 0, 0, cksum2, 
2ea00 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74 73  &cksum3);..  fts
2ea10 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28 70  5MultiIterFree(p
2ea20 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70 2d 3e  Iter);.  if( p->
2ea30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ea40 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20 29   cksum!=cksum2 )
2ea50 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2ea60 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35 53 74  RRUPT;..  fts5St
2ea70 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
2ea80 53 74 72 75 63 74 29 3b 0a 23 69 66 64 65 66 20  Struct);.#ifdef 
2ea90 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
2eaa0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
2eab0 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 66  erm);.#endif.  f
2eac0 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 70  ts5BufferFree(&p
2ead0 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  oslist);.  retur
2eae0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
2eaf0 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n(p);.}../******
2eb00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb40 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
2eb50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2eb80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
2eb90 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69  * Below this poi
2eba0 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d  nt is the implem
2ebb0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2ebc0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73 63  fts5_decode() sc
2ebd0 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  alar.** function
2ebe0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a   only..*/../*.**
2ebf0 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65 6e   Decode a segmen
2ec00 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72 6f  t-data rowid fro
2ec10 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61 62  m the %_data tab
2ec20 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
2ec30 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70 6f  n is.** the oppo
2ec40 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46 54  site of macro FT
2ec50 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2ec60 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
2ec70 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f 77  id fts5DecodeRow
2ec80 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69 64  id(.  i64 iRowid
2ec90 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2eca0 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20 66        /* Rowid f
2ecb0 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c 65  rom %_data table
2ecc0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65 67   */.  int *piSeg
2ecd0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2ece0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 65        /* OUT: Se
2ecf0 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69 6e  gment id */.  in
2ed00 74 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20 20  t *pbDlidx,     
2ed10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2ed20 20 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61 67   OUT: Dlidx flag
2ed30 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65 69   */.  int *piHei
2ed40 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ght,            
2ed50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48 65        /* OUT: He
2ed60 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ight */.  int *p
2ed70 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20 20  iPgno           
2ed80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
2ed90 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  : Page number */
2eda0 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d 20  .){.  *piPgno = 
2edb0 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20 28  (int)(iRowid & (
2edc0 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35 5f  ((i64)1 << FTS5_
2edd0 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20 31  DATA_PAGE_B) - 1
2ede0 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e 3d  ));.  iRowid >>=
2edf0 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45 5f   FTS5_DATA_PAGE_
2ee00 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74 20  B;..  *piHeight 
2ee10 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26  = (int)(iRowid &
2ee20 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53   (((i64)1 << FTS
2ee30 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42 29  5_DATA_HEIGHT_B)
2ee40 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69 64   - 1));.  iRowid
2ee50 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f 48   >>= FTS5_DATA_H
2ee60 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62 44  EIGHT_B;..  *pbD
2ee70 6c 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52 6f  lidx = (int)(iRo
2ee80 77 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a 20  wid & 0x0001);. 
2ee90 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53 35   iRowid >>= FTS5
2eea0 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20 20  _DATA_DLI_B;..  
2eeb0 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74 29  *piSegid = (int)
2eec0 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36 34  (iRowid & (((i64
2eed0 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41 5f  )1 << FTS5_DATA_
2eee0 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a 0a  ID_B) - 1));.}..
2eef0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2ef00 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20 2a  DebugRowid(int *
2ef10 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2ef20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79 29  *pBuf, i64 iKey)
2ef30 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c 20  {.  int iSegid, 
2ef40 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c 20  iHeight, iPgno, 
2ef50 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f 2a  bDlidx;       /*
2ef60 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e 74   Rowid compenent
2ef70 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f 64  s */.  fts5Decod
2ef80 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69 53  eRowid(iKey, &iS
2ef90 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20 26  egid, &bDlidx, &
2efa0 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f 29  iHeight, &iPgno)
2efb0 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64 3d  ;..  if( iSegid=
2efc0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4b  =0 ){.    if( iK
2efd0 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47 45  ey==FTS5_AVERAGE
2efe0 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20 20  S_ROWID ){.     
2eff0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f000 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f010 52 63 2c 20 70 42 75 66 2c 20 22 7b 61 76 65 72  Rc, pBuf, "{aver
2f020 61 67 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d 65  ages} ");.    }e
2f030 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2f040 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f050 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f060 75 66 2c 20 22 7b 73 74 72 75 63 74 75 72 65 7d  uf, "{structure}
2f070 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
2f080 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
2f090 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
2f0a0 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75  dPrintf(pRc, pBu
2f0b0 66 2c 20 22 7b 25 73 73 65 67 69 64 3d 25 64 20  f, "{%ssegid=%d 
2f0c0 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c 0a  h=%d pgno=%d}",.
2f0d0 20 20 20 20 20 20 20 20 62 44 6c 69 64 78 20 3f          bDlidx ?
2f0e0 20 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c 20   "dlidx " : "", 
2f0f0 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74 2c  iSegid, iHeight,
2f100 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20 20   iPgno.    );.  
2f110 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
2f120 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74   fts5DebugStruct
2f130 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ure(.  int *pRc,
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
2f160 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : error code */.
2f170 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
2f180 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63 74  uf,.  Fts5Struct
2f190 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74 20  ure *p.){.  int 
2f1a0 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20 20  iLvl, iSeg;     
2f1b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f1c0 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c  terate through l
2f1d0 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73 20  evels, segments 
2f1e0 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d 30  */..  for(iLvl=0
2f1f0 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65 6c  ; iLvl<p->nLevel
2f200 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20 46  ; iLvl++){.    F
2f210 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65  ts5StructureLeve
2f220 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61 4c  l *pLvl = &p->aL
2f230 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
2f240 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
2f250 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52  rAppendPrintf(pR
2f260 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20 20  c, pBuf, .      
2f270 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65 72    " {lvl=%d nMer
2f280 67 65 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c 20  ge=%d nSeg=%d", 
2f290 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65 72  iLvl, pLvl->nMer
2f2a0 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a 20  ge, pLvl->nSeg. 
2f2b0 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 53     );.    for(iS
2f2c0 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c 2d  eg=0; iSeg<pLvl-
2f2d0 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  >nSeg; iSeg++){.
2f2e0 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
2f2f0 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67  ureSegment *pSeg
2f300 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69   = &pLvl->aSeg[i
2f310 53 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  Seg];.      sqli
2f320 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f330 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f340 42 75 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c 65  Buf, " {id=%d le
2f350 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20 0a  aves=%d..%d}", .
2f360 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d 3e            pSeg->
2f370 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 70 67  iSegid, pSeg->pg
2f380 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d 3e 70  noFirst, pSeg->p
2f390 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20 29 3b  gnoLast.      );
2f3a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2f3b0 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2f3c0 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2f3d0 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d 0a  uf, "}");.  }.}.
2f3e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70  ./*.** This is p
2f3f0 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f  art of the fts5_
2f400 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69  decode() debuggi
2f410 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72  ng aid..**.** Ar
2f420 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42  guments pBlob/nB
2f430 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20 73 65  lob contain a se
2f440 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53 74 72  rialized Fts5Str
2f450 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e 20 54  ucture object. T
2f460 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
2f470 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d  appends a human-
2f480 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73 65  readable represe
2f490 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
2f4a0 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74 6f  ame object.** to
2f4b0 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73 73   the buffer pass
2f4c0 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2f4d0 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a 73   argument. .*/.s
2f4e0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 44  tatic void fts5D
2f4f0 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28 0a  ecodeStructure(.
2f500 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20 20    int *pRc,     
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f520 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72 72    /* IN/OUT: err
2f530 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73  or code */.  Fts
2f540 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a 20  5Buffer *pBuf,. 
2f550 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f 62   const u8 *pBlob
2f560 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a 20  , int nBlob.){. 
2f570 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2f580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f590 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2f5a0 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  */.  Fts5Structu
2f5b0 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  re *p = 0;      
2f5c0 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64 20       /* Decoded 
2f5d0 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
2f5e0 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73 35   */..  rc = fts5
2f5f0 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65 28  StructureDecode(
2f600 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30 2c  pBlob, nBlob, 0,
2f610 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
2f620 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f630 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
2f640 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
2f650 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75 72  ts5DebugStructur
2f660 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29 3b  e(pRc, pBuf, p);
2f670 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
2f680 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a 2f  Release(p);.}../
2f690 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61 72  *.** This is par
2f6a0 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64 65  t of the fts5_de
2f6b0 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e 67  code() debugging
2f6c0 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75   aid..**.** Argu
2f6d0 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c 6f  ments pBlob/nBlo
2f6e0 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61 76  b contain an "av
2f6f0 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 2e 20  erages" record. 
2f700 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a  This function .*
2f710 2a 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61  * appends a huma
2f720 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65  n-readable repre
2f730 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65 63  sentation of rec
2f740 6f 72 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  ord to the buffe
2f750 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73 20  r passed .** as 
2f760 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
2f770 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ent. .*/.static 
2f780 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 41  void fts5DecodeA
2f790 76 65 72 61 67 65 73 28 0a 20 20 69 6e 74 20 2a  verages(.  int *
2f7a0 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  pRc,            
2f7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
2f7c0 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64 65  /OUT: error code
2f7d0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
2f7e0 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74 20   *pBuf,.  const 
2f7f0 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e  u8 *pBlob, int n
2f800 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69 20  Blob.){.  int i 
2f810 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  = 0;.  const cha
2f820 72 20 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b 0a  r *zSpace = "";.
2f830 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c 6f  .  while( i<nBlo
2f840 62 20 29 7b 0a 20 20 20 20 75 36 34 20 69 56 61  b ){.    u64 iVa
2f850 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c 69  l;.    i += sqli
2f860 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e 74  te3Fts5GetVarint
2f870 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56 61  (&pBlob[i], &iVa
2f880 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  l);.    sqlite3F
2f890 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50  ts5BufferAppendP
2f8a0 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66 2c  rintf(pRc, pBuf,
2f8b0 20 22 25 73 25 64 22 2c 20 7a 53 70 61 63 65 2c   "%s%d", zSpace,
2f8c0 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20 20   (int)iVal);.   
2f8d0 20 7a 53 70 61 63 65 20 3d 20 22 20 22 3b 0a 20   zSpace = " ";. 
2f8e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66 66   }.}../*.** Buff
2f8f0 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73 75  er (a/n) is assu
2f900 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 61  med to contain a
2f910 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c 69   list of seriali
2f920 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65 61  zed varints. Rea
2f930 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e 74  d.** each varint
2f940 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73 20   and append its 
2f950 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
2f960 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72 20  ation to buffer 
2f970 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a 20  pBuf. Return.** 
2f980 61 66 74 65 72 20 65 69 74 68 65 72 20 74 68 65  after either the
2f990 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69 73   input buffer is
2f9a0 20 65 78 68 61 75 73 74 65 64 20 6f 72 20 61 20   exhausted or a 
2f9b0 30 20 76 61 6c 75 65 20 69 73 20 72 65 61 64 2e  0 value is read.
2f9c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
2f9d0 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 6e  n value is the n
2f9e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
2f9f0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 70  ead from the inp
2fa00 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ut buffer..*/.st
2fa10 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65 63  atic int fts5Dec
2fa20 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20 2a  odePoslist(int *
2fa30 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72 20  pRc, Fts5Buffer 
2fa40 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38 20  *pBuf, const u8 
2fa50 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *a, int n){.  in
2fa60 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77 68  t iOff = 0;.  wh
2fa70 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a 20  ile( iOff<n ){. 
2fa80 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20     int iVal;.   
2fa90 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74   iOff += fts5Get
2faa0 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66  Varint32(&a[iOff
2fab0 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73 71  ], iVal);.    sq
2fac0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
2fad0 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
2fae0 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69 56   pBuf, " %d", iV
2faf0 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  al);.  }.  retur
2fb00 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n iOff;.}../*.**
2fb10 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62 75   The start of bu
2fb20 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74 61  ffer (a/n) conta
2fb30 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f 66  ins the start of
2fb40 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65 20   a doclist. The 
2fb50 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20 6f  doclist.** may o
2fb60 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73 68  r may not finish
2fb70 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66 66   within the buff
2fb80 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
2fb90 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78 74  n appends a text
2fba0 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74 69  .** representati
2fbb0 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20 6f  on of the part o
2fbc0 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74 68  f the doclist th
2fbd0 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74 6f  at is present to
2fbe0 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66 2e   buffer.** pBuf.
2fbf0 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75   .**.** The retu
2fc00 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2fc10 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2fc20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
2fc30 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
2fc40 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
2fc50 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74 20  codeDoclist(int 
2fc60 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
2fc70 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
2fc80 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
2fc90 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a 20  64 iDocid = 0;. 
2fca0 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 0a   int iOff = 0;..
2fcb0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
2fcc0 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33 46   iOff = sqlite3F
2fcd0 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c 20  ts5GetVarint(a, 
2fce0 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b 0a  (u64*)&iDocid);.
2fcf0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42      sqlite3Fts5B
2fd00 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74  ufferAppendPrint
2fd10 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69  f(pRc, pBuf, " i
2fd20 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29  d=%lld", iDocid)
2fd30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 69  ;.  }.  while( i
2fd40 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e 74  Off<n ){.    int
2fd50 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20 62   nPos;.    int b
2fd60 44 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b 3d  Del;.    iOff +=
2fd70 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53   fts5GetPoslistS
2fd80 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26 6e  ize(&a[iOff], &n
2fd90 50 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20 20  Pos, &bDel);.   
2fda0 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2fdb0 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2fdc0 52 63 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f 73  Rc, pBuf, " nPos
2fdd0 3d 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62 44  =%d%s", nPos, bD
2fde0 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20 20  el?"*":"");.    
2fdf0 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63 6f  iOff += fts5Deco
2fe00 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20 70  dePoslist(pRc, p
2fe10 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20 4d  Buf, &a[iOff], M
2fe20 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73 29  IN(n-iOff, nPos)
2fe30 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66 3c  );.    if( iOff<
2fe40 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 69  n ){.      i64 i
2fe50 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f 66  Delta;.      iOf
2fe60 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  f += sqlite3Fts5
2fe70 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f 66  GetVarint(&a[iOf
2fe80 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c 74  f], (u64*)&iDelt
2fe90 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69 64  a);.      iDocid
2fea0 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20 20   += iDelta;.    
2feb0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2fec0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2fed0 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64 3d  pRc, pBuf, " id=
2fee0 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b 0a  %lld", iDocid);.
2fef0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
2ff00 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a  urn iOff;.}../*.
2ff10 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
2ff20 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   is part of the 
2ff30 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64 65  fts5_decode() de
2ff40 62 75 67 67 69 6e 67 20 66 75 6e 63 74 69 6f 6e  bugging function
2ff50 2e 20 49 74 20 69 73 20 0a 2a 2a 20 6f 6e 6c 79  . It is .** only
2ff60 20 65 76 65 72 20 75 73 65 64 20 77 69 74 68 20   ever used with 
2ff70 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62 6c  detail=none tabl
2ff80 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65 72  es..**.** Buffer
2ff90 20 28 70 44 61 74 61 2f 6e 44 61 74 61 29 20 63   (pData/nData) c
2ffa0 6f 6e 74 61 69 6e 73 20 61 20 64 6f 63 6c 69 73  ontains a doclis
2ffb0 74 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74 20  t in the format 
2ffc0 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d 6e  used by detail=n
2ffd0 6f 6e 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20 54  one.** tables. T
2ffe0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70  his function app
2fff0 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65 61  ends a human-rea
30000 64 61 62 6c 65 20 76 65 72 73 69 6f 6e 20 6f 66  dable version of
30010 20 74 68 61 74 20 6c 69 73 74 20 74 6f 0a 2a 2a   that list to.**
30020 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a   buffer pBuf..**
30030 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20 6f  .** If *pRc is o
30040 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
30050 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66 75  _OK when this fu
30060 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
30070 2c 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  , it is a.** no-
30080 6f 70 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 72  op. If an OOM or
30090 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63 63   other error occ
300a0 75 72 73 20 77 69 74 68 69 6e 20 74 68 69 73 20  urs within this 
300b0 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20 69  function, *pRc i
300c0 73 0a 2a 2a 20 73 65 74 20 74 6f 20 61 6e 20 53  s.** set to an S
300d0 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  QLite error code
300e0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
300f0 67 2e 20 54 68 65 20 66 69 6e 61 6c 20 73 74 61  g. The final sta
30100 74 65 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a 20  te of buffer.** 
30110 70 42 75 66 20 69 73 20 75 6e 64 65 66 69 6e 65  pBuf is undefine
30120 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
30130 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
30140 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69  ts5DecodeRowidLi
30150 73 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  st(.  int *pRc, 
30160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30170 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a        /* IN/OUT:
30180 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20   Error code */. 
30190 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75   Fts5Buffer *pBu
301a0 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
301b0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 61 70   /* Buffer to ap
301c0 70 65 6e 64 20 74 65 78 74 20 74 6f 20 2a 2f 0a  pend text to */.
301d0 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61 74    const u8 *pDat
301e0 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20 20 20  a, int nData    
301f0 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 64 65 63    /* Data to dec
30200 6f 64 65 20 6c 69 73 74 2d 6f 66 2d 72 6f 77 69  ode list-of-rowi
30210 64 73 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20 20  ds from */.){.  
30220 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 36 34  int i = 0;.  i64
30230 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20 20   iRowid = 0;..  
30240 77 68 69 6c 65 28 20 69 3c 6e 44 61 74 61 20 29  while( i<nData )
30250 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
30260 20 2a 7a 41 70 70 20 3d 20 22 22 3b 0a 20 20 20   *zApp = "";.   
30270 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20 69   u64 iVal;.    i
30280 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35 47   += sqlite3Fts5G
30290 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61 5b  etVarint(&pData[
302a0 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20 20  i], &iVal);.    
302b0 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b 0a  iRowid += iVal;.
302c0 0a 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74 61  .    if( i<nData
302d0 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30 78   && pData[i]==0x
302e0 30 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b  00 ){.      i++;
302f0 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 44 61  .      if( i<nDa
30300 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d  ta && pData[i]==
30310 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  0x00 ){.        
30320 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 41 70  i++;.        zAp
30330 70 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20 7d  p = "+";.      }
30340 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 41  else{.        zA
30350 70 70 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20 20  pp = "*";.      
30360 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  }.    }..    sql
30370 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
30380 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
30390 70 42 75 66 2c 20 22 20 25 6c 6c 64 25 73 22 2c  pBuf, " %lld%s",
303a0 20 69 52 6f 77 69 64 2c 20 7a 41 70 70 29 3b 0a   iRowid, zApp);.
303b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
303c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
303d0 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  of user-defined 
303e0 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20  scalar function 
303f0 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a 2a  fts5_decode()..*
30400 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
30410 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f 6e  s5DecodeFunction
30420 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
30430 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20  ext *pCtx,      
30440 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
30450 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  call context */.
30460 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
30470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30480 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
30490 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a  rgs (always 2) *
304a0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  /.  sqlite3_valu
304b0 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20  e **apVal       
304c0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
304d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
304e0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20 20    i64 iRowid;   
304f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30500 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20 72    /* Rowid for r
30510 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63 6f  ecord being deco
30520 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53 65  ded */.  int iSe
30530 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67 6e  gid,iHeight,iPgn
30540 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77 69  o,bDlidx;/* Rowi
30550 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f 0a  d components */.
30560 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c 6f    const u8 *aBlo
30570 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  b; int n;       
30580 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20 64    /* Record to d
30590 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a 61  ecode */.  u8 *a
305a0 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
305b0 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20 20  er s;           
305c0 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c 64          /* Build
305d0 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74 75   up text to retu
305e0 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  rn here */.  int
305f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
30600 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30610 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
30620 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e   sqlite3_int64 n
30630 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Space = 0;.  int
30640 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20 28   eDetailNone = (
30650 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
30660 61 28 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20 20  a(pCtx)!=0);..  
30670 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32 20  assert( nArg==2 
30680 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
30690 4d 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73 65  M(nArg);.  memse
306a0 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&s, 0, sizeof(
306b0 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20 20  Fts5Buffer));.  
306c0 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33  iRowid = sqlite3
306d0 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70 56  _value_int64(apV
306e0 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d 61  al[0]);..  /* Ma
306f0 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ke a copy of the
30700 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
30710 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42 6c   (a blob) in aBl
30720 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62 5b  ob[]. The aBlob[
30730 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20 66  ].  ** copy is f
30740 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35 5f  ollowed by FTS5_
30750 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49 4e  DATA_ZERO_PADDIN
30760 47 20 30 78 30 30 20 62 79 74 65 73 2c 20 77 68  G 0x00 bytes, wh
30770 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20 2a  ich prevents.  *
30780 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  * buffer overrea
30790 64 73 20 65 76 65 6e 20 69 66 20 74 68 65 20 72  ds even if the r
307a0 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70 74  ecord is corrupt
307b0 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c 69  .  */.  n = sqli
307c0 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
307d0 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42 6c  apVal[1]);.  aBl
307e0 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  ob = sqlite3_val
307f0 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31 5d  ue_blob(apVal[1]
30800 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e 20  );.  nSpace = n 
30810 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f  + FTS5_DATA_ZERO
30820 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d 20  _PADDING;.  a = 
30830 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73 35  (u8*)sqlite3Fts5
30840 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c 20  MallocZero(&rc, 
30850 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20 61  nSpace);.  if( a
30860 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f 64  ==0 ) goto decod
30870 65 5f 6f 75 74 3b 0a 20 20 69 66 28 20 6e 3e 30  e_out;.  if( n>0
30880 20 29 20 6d 65 6d 63 70 79 28 61 2c 20 61 42 6c   ) memcpy(a, aBl
30890 6f 62 2c 20 6e 29 3b 0a 0a 20 20 66 74 73 35 44  ob, n);..  fts5D
308a0 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77 69  ecodeRowid(iRowi
308b0 64 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44 6c  d, &iSegid, &bDl
308c0 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20 26  idx, &iHeight, &
308d0 69 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35 44  iPgno);..  fts5D
308e0 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20 26  ebugRowid(&rc, &
308f0 73 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69 66  s, iRowid);.  if
30900 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20 20  ( bDlidx ){.    
30910 46 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b 0a  Fts5Data dlidx;.
30920 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76 6c      Fts5DlidxLvl
30930 20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64 78   lvl;..    dlidx
30940 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69 64  .p = a;.    dlid
30950 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6d  x.nn = n;..    m
30960 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20 73  emset(&lvl, 0, s
30970 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78 4c  izeof(Fts5DlidxL
30980 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70 44  vl));.    lvl.pD
30990 61 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20 20  ata = &dlidx;.  
309a0 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f 20    lvl.iLeafPgno 
309b0 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66 6f  = iPgno;..    fo
309c0 72 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e 65  r(fts5DlidxLvlNe
309d0 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62 45  xt(&lvl); lvl.bE
309e0 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64 78  of==0; fts5Dlidx
309f0 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b 0a  LvlNext(&lvl)){.
30a00 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
30a10 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69  5BufferAppendPri
30a20 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20 20  ntf(&rc, &s, .  
30a30 20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c 6c          " %d(%ll
30a40 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50 67  d)", lvl.iLeafPg
30a50 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a 20  no, lvl.iRowid. 
30a60 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20       );.    }.  
30a70 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67 69 64  }else if( iSegid
30a80 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
30a90 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45 52  Rowid==FTS5_AVER
30aa0 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20  AGES_ROWID ){.  
30ab0 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 41 76      fts5DecodeAv
30ac0 65 72 61 67 65 73 28 26 72 63 2c 20 26 73 2c 20  erages(&rc, &s, 
30ad0 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  a, n);.    }else
30ae0 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63 6f  {.      fts5Deco
30af0 64 65 53 74 72 75 63 74 75 72 65 28 26 72 63 2c  deStructure(&rc,
30b00 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20 20   &s, a, n);.    
30b10 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 44  }.  }else if( eD
30b20 65 74 61 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20 20  etailNone ){.   
30b30 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d   Fts5Buffer term
30b40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
30b50 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72  * Current term r
30b60 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f  ead from page */
30b70 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b  .    int szLeaf;
30b80 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f  .    int iPgidxO
30b90 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66 74  ff = szLeaf = ft
30ba0 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29 3b  s5GetU16(&a[2]);
30bb0 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f 66  .    int iTermOf
30bc0 66 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65 70  f;.    int nKeep
30bd0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f   = 0;.    int iO
30be0 66 66 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74 28  ff;..    memset(
30bf0 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  &term, 0, sizeof
30c00 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 0a  (Fts5Buffer));..
30c10 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61 6e      /* Decode an
30c20 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20 6f  y entries that o
30c30 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65 20  ccur before the 
30c40 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a 20  first term. */. 
30c50 20 20 20 69 66 28 20 73 7a 4c 65 61 66 3c 6e 20     if( szLeaf<n 
30c60 29 7b 0a 20 20 20 20 20 20 69 50 67 69 64 78 4f  ){.      iPgidxO
30c70 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
30c80 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
30c90 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a  ff], iTermOff);.
30ca0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30cb0 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65   iTermOff = szLe
30cc0 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74  af;.    }.    ft
30cd0 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69 73  s5DecodeRowidLis
30ce0 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34 5d  t(&rc, &s, &a[4]
30cf0 2c 20 69 54 65 72 6d 4f 66 66 2d 34 29 3b 0a 0a  , iTermOff-4);..
30d00 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
30d10 4f 66 66 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  Off;.    while( 
30d20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a 20  iOff<szLeaf ){. 
30d30 20 20 20 20 20 69 6e 74 20 6e 41 70 70 65 6e 64       int nAppend
30d40 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 61 64  ;..      /* Read
30d50 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20 66   the term data f
30d60 6f 72 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d  or the next term
30d70 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  */.      iOff +=
30d80 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
30d90 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 41 70 70 65  (&a[iOff], nAppe
30da0 6e 64 29 3b 0a 20 20 20 20 20 20 74 65 72 6d 2e  nd);.      term.
30db0 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20 20  n = nKeep;.     
30dc0 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
30dd0 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72 6d  dBlob(&rc, &term
30de0 2c 20 6e 41 70 70 65 6e 64 2c 20 26 61 5b 69 4f  , nAppend, &a[iO
30df0 66 66 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ff]);.      sqli
30e00 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
30e10 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20 20  endPrintf(.     
30e20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22 20       &rc, &s, " 
30e30 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72 6d  term=%.*s", term
30e40 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  .n, (const char*
30e50 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29 3b  )term.p.      );
30e60 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
30e70 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20 2f  Append;..      /
30e80 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
30e90 72 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66  re the doclist f
30ea0 6f 72 20 74 68 69 73 20 74 65 72 6d 20 65 6e 64  or this term end
30eb0 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69  s */.      if( i
30ec0 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20  PgidxOff<n ){.  
30ed0 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 63 72 3b        int nIncr;
30ee0 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78 4f  .        iPgidxO
30ef0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
30f00 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f  int32(&a[iPgidxO
30f10 66 66 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20 20  ff], nIncr);.   
30f20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b 3d       iTermOff +=
30f30 20 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d 65   nIncr;.      }e
30f40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 65  lse{.        iTe
30f50 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b 0a  rmOff = szLeaf;.
30f60 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
30f70 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69  ts5DecodeRowidLi
30f80 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69  st(&rc, &s, &a[i
30f90 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 69  Off], iTermOff-i
30fa0 4f 66 66 29 3b 0a 20 20 20 20 20 20 69 4f 66 66  Off);.      iOff
30fb0 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20 20   = iTermOff;.   
30fc0 20 20 20 69 66 28 20 69 4f 66 66 3c 73 7a 4c 65     if( iOff<szLe
30fd0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  af ){.        iO
30fe0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
30ff0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
31000 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d 0a  nKeep);.      }.
31010 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35 42      }..    fts5B
31020 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d 29  ufferFree(&term)
31030 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 46  ;.  }else{.    F
31040 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b 20  ts5Buffer term; 
31050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31060 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65 61  Current term rea
31070 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a 20  d from page */. 
31080 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20 20     int szLeaf;  
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310a0 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70 67   /* Offset of pg
310b0 69 64 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20 20  idx in a[] */.  
310c0 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66 3b    int iPgidxOff;
310d0 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78 50  .    int iPgidxP
310e0 72 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20 20  rev = 0;        
310f0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 76     /* Previous v
31100 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 70  alue read from p
31110 67 69 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20  gidx */.    int 
31120 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20 20  iTermOff = 0;.  
31130 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66 20    int iRowidOff 
31140 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f 66  = 0;.    int iOf
31150 66 3b 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63 6c  f;.    int nDocl
31160 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  ist;..    memset
31170 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
31180 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
31190 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 7b 0a  .    if( n<4 ){.
311a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
311b0 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c 20  5BufferSet(&rc, 
311c0 26 73 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75 38  &s, 7, (const u8
311d0 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20 20  *)"corrupt");.  
311e0 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f      goto decode_
311f0 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  out;.    }else{.
31200 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66 20        iRowidOff 
31210 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b  = fts5GetU16(&a[
31220 30 5d 29 3b 0a 20 20 20 20 20 20 69 50 67 69 64  0]);.      iPgid
31230 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20  xOff = szLeaf = 
31240 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d  fts5GetU16(&a[2]
31250 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50 67  );.      if( iPg
31260 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20  idxOff<n ){.    
31270 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69 6e      fts5GetVarin
31280 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66 66  t32(&a[iPgidxOff
31290 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20 20  ], iTermOff);.  
312a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 50      }else if( iP
312b0 67 69 64 78 4f 66 66 3e 6e 20 29 7b 0a 20 20 20  gidxOff>n ){.   
312c0 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43       rc = FTS5_C
312d0 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20  ORRUPT;.        
312e0 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b  goto decode_out;
312f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
31300 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
31310 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  e position list 
31320 74 61 69 6c 20 61 74 20 74 68 65 20 73 74 61 72  tail at the star
31330 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  t of the page */
31340 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64 4f  .    if( iRowidO
31350 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ff!=0 ){.      i
31360 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66 3b  Off = iRowidOff;
31370 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
31380 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20 20  TermOff!=0 ){.  
31390 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
313a0 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Off;.    }else{.
313b0 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73 7a 4c        iOff = szL
313c0 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eaf;.    }.    i
313d0 66 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20 20  f( iOff>n ){.   
313e0 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52     rc = FTS5_COR
313f0 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  RUPT;.      goto
31400 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20 20   decode_out;.   
31410 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f 64   }.    fts5Decod
31420 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26 73  ePoslist(&rc, &s
31430 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34 29  , &a[4], iOff-4)
31440 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65  ;..    /* Decode
31450 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69 73   any more doclis
31460 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  t data that appe
31470 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ars on the page 
31480 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20 2a  before the.    *
31490 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f  * first term. */
314a0 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d 20  .    nDoclist = 
314b0 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65 72  (iTermOff ? iTer
314c0 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20 2d  mOff : szLeaf) -
314d0 20 69 4f 66 66 3b 0a 20 20 20 20 69 66 28 20 6e   iOff;.    if( n
314e0 44 6f 63 6c 69 73 74 2b 69 4f 66 66 3e 6e 20 29  Doclist+iOff>n )
314f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 46 54 53  {.      rc = FTS
31500 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
31510 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
31520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35  ;.    }.    fts5
31530 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
31540 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
31550 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20   nDoclist);..   
31560 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66   while( iPgidxOf
31570 66 3c 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  f<n && rc==SQLIT
31580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
31590 74 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69  t bFirst = (iPgi
315a0 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20  dxOff==szLeaf); 
315b0 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
315c0 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
315d0 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ge */.      int 
315e0 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31600 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61    /* Bytes of da
31610 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ta */.      int 
31620 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20  iEnd;.      .   
31630 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20     iPgidxOff += 
31640 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
31650 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
31660 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67  Byte);.      iPg
31670 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65  idxPrev += nByte
31680 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  ;.      iOff = i
31690 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20  PgidxPrev;..    
316a0 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c    if( iPgidxOff<
316b0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  n ){.        fts
316c0 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
316d0 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74  iPgidxOff], nByt
316e0 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  e);.        iEnd
316f0 20 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20   = iPgidxPrev + 
31700 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c  nByte;.      }el
31710 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  se{.        iEnd
31720 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
31730 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e   }.      if( iEn
31740 64 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  d>szLeaf ){.    
31750 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
31760 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 62  RRUPT;.        b
31770 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
31780 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
31790 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  =0 ){.        iO
317a0 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
317b0 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
317c0 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
317d0 69 66 28 20 6e 42 79 74 65 3e 74 65 72 6d 2e 6e  if( nByte>term.n
317e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
317f0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
31800 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
31810 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31820 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79      term.n = nBy
31830 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
31840 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
31850 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
31860 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
31870 20 20 69 66 28 20 69 4f 66 66 2b 6e 42 79 74 65    if( iOff+nByte
31880 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  >n ){.        rc
31890 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
318a0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
318b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
318c0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
318d0 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
318e0 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
318f0 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
31900 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Byte;..      sql
31910 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
31920 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
31930 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
31940 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
31950 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
31960 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
31970 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
31980 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
31990 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
319a0 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b  ff], iEnd-iOff);
319b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
319c0 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
319d0 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64  );.  }.  . decod
319e0 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
319f0 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
31a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31a10 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
31a20 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
31a30 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
31a40 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
31a50 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
31a60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
31a70 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
31a80 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
31a90 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
31aa0 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
31ab0 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
31ac0 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
31ad0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
31ae0 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
31af0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
31b00 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
31b10 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
31b20 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
31b30 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
31b40 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
31b50 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
31b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
31b80 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
31b90 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
31ba0 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
31bb0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
31bc0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
31bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
31be0 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
31bf0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31c00 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
31c10 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
31c20 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
31c30 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
31c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
31c50 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
31c60 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
31c70 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
31c80 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
31c90 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
31ca0 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
31cb0 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
31cc0 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c        int segid,
31cd0 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
31ce0 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
31cf0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31d00 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
31d10 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
31d20 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
31d30 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
31d40 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  gid, pgno))", -1
31d50 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
31d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31d70 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
31d80 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
31d90 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [1]);.        pg
31da0 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
31db0 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
31dc0 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
31dd0 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
31de0 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e  ROWID(segid, pgn
31df0 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
31e00 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
31e10 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
31e20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
31e30 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
31e40 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
31e50 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
31e60 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
31e70 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
31e80 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a  'segment'" , -1.
31e90 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
31ea0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
31eb0 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
31ec0 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
31ed0 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
31ee0 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
31ef0 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
31f00 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
31f10 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
31f20 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
31f30 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
31f40 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
31f50 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
31f60 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
31f70 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
31f80 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
31f90 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
31fa0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31fb0 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
31fc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
31fd0 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
31fe0 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
31ff0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
32000 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
32010 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
32020 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
32030 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
32040 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
32050 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  0.  );..  if( rc
32060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
32070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
32080 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
32090 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
320a0 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c  s5_decode_none",
320b0 20 32 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c   2, .        SQL
320c0 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
320d0 29 64 62 2c 20 66 74 73 35 44 65 63 6f 64 65 46  )db, fts5DecodeF
320e0 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
320f0 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
32100 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32110 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32120 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
32130 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  n(.        db, "
32140 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c  fts5_rowid", -1,
32150 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
32160 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
32170 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  on, 0, 0.    );.
32180 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32190 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
321a0 46 74 73 35 49 6e 64 65 78 52 65 73 65 74 28 46  Fts5IndexReset(F
321b0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
321c0 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75  assert( p->pStru
321d0 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72  ct==0 || p->iStr
321e0 75 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b  uctVersion!=0 );
321f0 0a 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78  .  if( fts5Index
32200 44 61 74 61 56 65 72 73 69 6f 6e 28 70 29 21 3d  DataVersion(p)!=
32210 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f  p->iStructVersio
32220 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72  n ){.    fts5Str
32230 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
32240 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
32250 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
32260 6e 28 70 29 3b 0a 7d 0a                          n(p);.}.