/ Hex Artifact Content
Login

Artifact 7e8e678f243f5b2be59e9543712a5797ff2006547bff5765c3f417fe9bfbf30e:


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 63 6f  ulate */.){.  co
13090 6e 73 74 20 75 38 20 2a 70 4c 69 73 74 20 3d 20  nst u8 *pList = 
130a0 30 3b 0a 20 20 69 6e 74 20 6e 4c 69 73 74 20 3d  0;.  int nList =
130b0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   0;.  const u8 *
130c0 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  z = 0;.  int n =
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 70 2d 3e 72 63 20 3d 20 73 71 6c 69 74 65    p->rc = sqlite
13150 33 46 74 73 35 48 61 73 68 53 63 61 6e 49 6e 69  3Fts5HashScanIni
13160 74 28 70 2d 3e 70 48 61 73 68 2c 20 28 63 6f 6e  t(p->pHash, (con
13170 73 74 20 63 68 61 72 2a 29 70 54 65 72 6d 2c 20  st char*)pTerm, 
13180 6e 54 65 72 6d 29 3b 0a 20 20 20 20 73 71 6c 69  nTerm);.    sqli
13190 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45  te3Fts5HashScanE
131a0 6e 74 72 79 28 70 2d 3e 70 48 61 73 68 2c 20 28  ntry(p->pHash, (
131b0 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 26 7a 2c  const char**)&z,
131c0 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74 29   &pList, &nList)
131d0 3b 0a 20 20 20 20 6e 20 3d 20 28 7a 20 3f 20 28  ;.    n = (z ? (
131e0 69 6e 74 29 73 74 72 6c 65 6e 28 28 63 6f 6e 73  int)strlen((cons
131f0 74 20 63 68 61 72 2a 29 7a 29 20 3a 20 30 29 3b  t char*)z) : 0);
13200 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49  .  }else{.    pI
13210 74 65 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54  ter->flags |= FT
13220 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45 54 45  S5_SEGITER_ONETE
13230 52 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  RM;.    sqlite3F
13240 74 73 35 48 61 73 68 51 75 65 72 79 28 70 2d 3e  ts5HashQuery(p->
13250 70 48 61 73 68 2c 20 28 63 6f 6e 73 74 20 63 68  pHash, (const ch
13260 61 72 2a 29 70 54 65 72 6d 2c 20 6e 54 65 72 6d  ar*)pTerm, nTerm
13270 2c 20 26 70 4c 69 73 74 2c 20 26 6e 4c 69 73 74  , &pList, &nList
13280 29 3b 0a 20 20 20 20 7a 20 3d 20 70 54 65 72 6d  );.    z = pTerm
13290 3b 0a 20 20 20 20 6e 20 3d 20 6e 54 65 72 6d 3b  ;.    n = nTerm;
132a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 69 73  .  }..  if( pLis
132b0 74 20 29 7b 0a 20 20 20 20 46 74 73 35 44 61 74  t ){.    Fts5Dat
132c0 61 20 2a 70 4c 65 61 66 3b 0a 20 20 20 20 73 71  a *pLeaf;.    sq
132d0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
132e0 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 49 74 65  et(&p->rc, &pIte
132f0 72 2d 3e 74 65 72 6d 2c 20 6e 2c 20 7a 29 3b 0a  r->term, n, z);.
13300 20 20 20 20 70 4c 65 61 66 20 3d 20 66 74 73 35      pLeaf = fts5
13310 49 64 78 4d 61 6c 6c 6f 63 28 70 2c 20 73 69 7a  IdxMalloc(p, siz
13320 65 6f 66 28 46 74 73 35 44 61 74 61 29 29 3b 0a  eof(Fts5Data));.
13330 20 20 20 20 69 66 28 20 70 4c 65 61 66 3d 3d 30      if( pLeaf==0
13340 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 70   ) return;.    p
13350 4c 65 61 66 2d 3e 70 20 3d 20 28 75 38 2a 29 70  Leaf->p = (u8*)p
13360 4c 69 73 74 3b 0a 20 20 20 20 70 4c 65 61 66 2d  List;.    pLeaf-
13370 3e 6e 6e 20 3d 20 70 4c 65 61 66 2d 3e 73 7a 4c  >nn = pLeaf->szL
13380 65 61 66 20 3d 20 6e 4c 69 73 74 3b 0a 20 20 20  eaf = nList;.   
13390 20 70 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20   pIter->pLeaf = 
133a0 70 4c 65 61 66 3b 0a 20 20 20 20 70 49 74 65 72  pLeaf;.    pIter
133b0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
133c0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 4c  fts5GetVarint(pL
133d0 65 61 66 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  eaf->p, (u64*)&p
133e0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
133f0 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64 6f 66     pIter->iEndof
13400 44 6f 63 6c 69 73 74 20 3d 20 70 4c 65 61 66 2d  Doclist = pLeaf-
13410 3e 6e 6e 3b 0a 0a 20 20 20 20 69 66 28 20 66 6c  >nn;..    if( fl
13420 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
13430 51 55 45 52 59 5f 44 45 53 43 20 29 7b 0a 20 20  QUERY_DESC ){.  
13440 20 20 20 20 70 49 74 65 72 2d 3e 66 6c 61 67 73      pIter->flags
13450 20 7c 3d 20 46 54 53 35 5f 53 45 47 49 54 45 52   |= FTS5_SEGITER
13460 5f 52 45 56 45 52 53 45 3b 0a 20 20 20 20 20 20  _REVERSE;.      
13470 66 74 73 35 53 65 67 49 74 65 72 52 65 76 65 72  fts5SegIterRever
13480 73 65 49 6e 69 74 50 61 67 65 28 70 2c 20 70 49  seInitPage(p, pI
13490 74 65 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ter);.    }else{
134a0 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 49 74  .      fts5SegIt
134b0 65 72 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49  erLoadNPos(p, pI
134c0 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ter);.    }.  }.
134d0 0a 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65  .  fts5SegIterSe
134e0 74 4e 65 78 74 28 70 2c 20 70 49 74 65 72 29 3b  tNext(p, pIter);
134f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 5a 65 72 6f 20 74  .}../*.** Zero t
13500 68 65 20 69 74 65 72 61 74 6f 72 20 70 61 73 73  he iterator pass
13510 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ed as the only a
13520 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
13530 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 49  ic void fts5SegI
13540 74 65 72 43 6c 65 61 72 28 46 74 73 35 53 65 67  terClear(Fts5Seg
13550 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
13560 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
13570 70 49 74 65 72 2d 3e 74 65 72 6d 29 3b 0a 20 20  pIter->term);.  
13580 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65 28  fts5DataRelease(
13590 70 49 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20  pIter->pLeaf);. 
135a0 20 66 74 73 35 44 61 74 61 52 65 6c 65 61 73 65   fts5DataRelease
135b0 28 70 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61  (pIter->pNextLea
135c0 66 29 3b 0a 20 20 66 74 73 35 44 6c 69 64 78 49  f);.  fts5DlidxI
135d0 74 65 72 46 72 65 65 28 70 49 74 65 72 2d 3e 70  terFree(pIter->p
135e0 44 6c 69 64 78 29 3b 0a 20 20 73 71 6c 69 74 65  Dlidx);.  sqlite
135f0 33 5f 66 72 65 65 28 70 49 74 65 72 2d 3e 61 52  3_free(pIter->aR
13600 6f 77 69 64 4f 66 66 73 65 74 29 3b 0a 20 20 6d  owidOffset);.  m
13610 65 6d 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20  emset(pIter, 0, 
13620 73 69 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74  sizeof(Fts5SegIt
13630 65 72 29 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  er));.}..#ifdef 
13640 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 0a 2f 2a  SQLITE_DEBUG../*
13650 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13660 6e 20 69 73 20 75 73 65 64 20 61 73 20 70 61 72  n is used as par
13670 74 20 6f 66 20 74 68 65 20 62 69 67 20 61 73 73  t of the big ass
13680 65 72 74 28 29 20 70 72 6f 63 65 64 75 72 65 20  ert() procedure 
13690 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 0a 2a  implemented by.*
136a0 2a 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74  * fts5AssertMult
136b0 69 49 74 65 72 53 65 74 75 70 28 29 2e 20 49 74  iIterSetup(). It
136c0 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
136d0 65 20 72 65 73 75 6c 74 20 63 75 72 72 65 6e 74  e result current
136e0 6c 79 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  ly stored.** in 
136f0 2a 70 52 65 73 20 69 73 20 74 68 65 20 63 6f 72  *pRes is the cor
13700 72 65 63 74 20 72 65 73 75 6c 74 20 6f 66 20 63  rect result of c
13710 6f 6d 70 61 72 69 6e 67 20 74 68 65 20 63 75 72  omparing the cur
13720 72 65 6e 74 20 70 6f 73 69 74 69 6f 6e 73 20 6f  rent positions o
13730 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 69 74 65  f the.** two ite
13740 72 61 74 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  rators..*/.stati
13750 63 20 76 6f 69 64 20 66 74 73 35 41 73 73 65 72  c void fts5Asser
13760 74 43 6f 6d 70 61 72 69 73 6f 6e 52 65 73 75 6c  tComparisonResul
13770 74 28 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  t(.  Fts5Iter *p
13780 49 74 65 72 2c 20 0a 20 20 46 74 73 35 53 65 67  Iter, .  Fts5Seg
13790 49 74 65 72 20 2a 70 31 2c 0a 20 20 46 74 73 35  Iter *p1,.  Fts5
137a0 53 65 67 49 74 65 72 20 2a 70 32 2c 0a 20 20 46  SegIter *p2,.  F
137b0 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
137c0 0a 29 7b 0a 20 20 69 6e 74 20 69 31 20 3d 20 70  .){.  int i1 = p
137d0 31 20 2d 20 70 49 74 65 72 2d 3e 61 53 65 67 3b  1 - pIter->aSeg;
137e0 0a 20 20 69 6e 74 20 69 32 20 3d 20 70 32 20 2d  .  int i2 = p2 -
137f0 20 70 49 74 65 72 2d 3e 61 53 65 67 3b 0a 0a 20   pIter->aSeg;.. 
13800 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66 20 7c   if( p1->pLeaf |
13810 7c 20 70 32 2d 3e 70 4c 65 61 66 20 29 7b 0a 20  | p2->pLeaf ){. 
13820 20 20 20 69 66 28 20 70 31 2d 3e 70 4c 65 61 66     if( p1->pLeaf
13830 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13840 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13850 74 3d 3d 69 32 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i2 );.    }el
13860 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
13870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
13880 65 72 74 28 20 70 52 65 73 2d 3e 69 46 69 72 73  ert( pRes->iFirs
13890 74 3d 3d 69 31 20 29 3b 0a 20 20 20 20 7d 65 6c  t==i1 );.    }el
138a0 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d  se{.      int nM
138b0 69 6e 20 3d 20 4d 49 4e 28 70 31 2d 3e 74 65 72  in = MIN(p1->ter
138c0 6d 2e 6e 2c 20 70 32 2d 3e 74 65 72 6d 2e 6e 29  m.n, p2->term.n)
138d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20  ;.      int res 
138e0 3d 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 31 2d  = fts5Memcmp(p1-
138f0 3e 74 65 72 6d 2e 70 2c 20 70 32 2d 3e 74 65 72  >term.p, p2->ter
13900 6d 2e 70 2c 20 6e 4d 69 6e 29 3b 0a 20 20 20 20  m.p, nMin);.    
13910 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72    if( res==0 ) r
13920 65 73 20 3d 20 70 31 2d 3e 74 65 72 6d 2e 6e 20  es = p1->term.n 
13930 2d 20 70 32 2d 3e 74 65 72 6d 2e 6e 3b 0a 0a 20  - p2->term.n;.. 
13940 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
13950 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
13960 74 28 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  t( pRes->bTermEq
13970 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20 61  ==1 );.        a
13980 73 73 65 72 74 28 20 70 31 2d 3e 69 52 6f 77 69  ssert( p1->iRowi
13990 64 21 3d 70 32 2d 3e 69 52 6f 77 69 64 20 29 3b  d!=p2->iRowid );
139a0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
139b0 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20 70 32  (p1->iRowid > p2
139c0 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72  ->iRowid)==pIter
139d0 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a 20 31  ->bRev) ? -1 : 1
139e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
139f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13a00 52 65 73 2d 3e 62 54 65 72 6d 45 71 3d 3d 30 20  Res->bTermEq==0 
13a10 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
13a20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20    if( res<0 ){. 
13a30 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13a40 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 31 20  Res->iFirst==i1 
13a50 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
13a60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13a70 70 52 65 73 2d 3e 69 46 69 72 73 74 3d 3d 69 32  pRes->iFirst==i2
13a80 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   );.      }.    
13a90 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
13aa0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13ab0 61 20 6e 6f 2d 6f 70 20 75 6e 6c 65 73 73 20 53  a no-op unless S
13ac0 51 4c 49 54 45 5f 44 45 42 55 47 20 69 73 20 64  QLITE_DEBUG is d
13ad0 65 66 69 6e 65 64 20 77 68 65 6e 20 74 68 69 73  efined when this
13ae0 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69 73 20 63 6f   module.** is co
13af0 6d 70 69 6c 65 64 2e 20 49 6e 20 74 68 61 74 20  mpiled. In that 
13b00 63 61 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74  case, this funct
13b10 69 6f 6e 20 69 73 20 65 73 73 65 6e 74 69 61 6c  ion is essential
13b20 6c 79 20 61 6e 20 61 73 73 65 72 74 28 29 20 0a  ly an assert() .
13b30 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 75 73 65  ** statement use
13b40 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
13b50 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
13b60 20 74 68 65 20 70 49 74 65 72 2d 3e 61 46 69 72   the pIter->aFir
13b70 73 74 5b 5d 20 61 72 72 61 79 0a 2a 2a 20 61 72  st[] array.** ar
13b80 65 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  e correct..*/.st
13b90 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 41 73  atic void fts5As
13ba0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
13bb0 75 70 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  up(Fts5Index *p,
13bc0 20 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72   Fts5Iter *pIter
13bd0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ){.  if( p->rc==
13be0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13bf0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 46   Fts5SegIter *pF
13c00 69 72 73 74 20 3d 20 26 70 49 74 65 72 2d 3e 61  irst = &pIter->a
13c10 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
13c20 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
13c30 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
13c40 61 73 73 65 72 74 28 20 28 70 46 69 72 73 74 2d  assert( (pFirst-
13c50 3e 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65  >pLeaf==0)==pIte
13c60 72 2d 3e 62 61 73 65 2e 62 45 6f 66 20 29 3b 0a  r->base.bEof );.
13c70 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  .    /* Check th
13c80 61 74 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63  at pIter->iSwitc
13c90 68 52 6f 77 69 64 20 69 73 20 73 65 74 20 63 6f  hRowid is set co
13ca0 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20  rrectly. */.    
13cb0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 49 74 65 72  for(i=0; i<pIter
13cc0 2d 3e 6e 53 65 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSeg; i++){.  
13cd0 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13ce0 2a 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p1 = &pIter->aS
13cf0 65 67 5b 69 5d 3b 0a 20 20 20 20 20 20 61 73 73  eg[i];.      ass
13d00 65 72 74 28 20 70 31 3d 3d 70 46 69 72 73 74 20  ert( p1==pFirst 
13d10 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70  .           || p
13d20 31 2d 3e 70 4c 65 61 66 3d 3d 30 20 0a 20 20 20  1->pLeaf==0 .   
13d30 20 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 42          || fts5B
13d40 75 66 66 65 72 43 6f 6d 70 61 72 65 28 26 70 46  ufferCompare(&pF
13d50 69 72 73 74 2d 3e 74 65 72 6d 2c 20 26 70 31 2d  irst->term, &p1-
13d60 3e 74 65 72 6d 29 20 0a 20 20 20 20 20 20 20 20  >term) .        
13d70 20 20 20 7c 7c 20 70 31 2d 3e 69 52 6f 77 69 64     || p1->iRowid
13d80 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68  ==pIter->iSwitch
13d90 52 6f 77 69 64 0a 20 20 20 20 20 20 20 20 20 20  Rowid.          
13da0 20 7c 7c 20 28 70 31 2d 3e 69 52 6f 77 69 64 3c   || (p1->iRowid<
13db0 70 49 74 65 72 2d 3e 69 53 77 69 74 63 68 52 6f  pIter->iSwitchRo
13dc0 77 69 64 29 3d 3d 70 49 74 65 72 2d 3e 62 52 65  wid)==pIter->bRe
13dd0 76 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  v.      );.    }
13de0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
13df0 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20 69 2b  <pIter->nSeg; i+
13e00 3d 32 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53  =2){.      Fts5S
13e10 65 67 49 74 65 72 20 2a 70 31 20 3d 20 26 70 49  egIter *p1 = &pI
13e20 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20 20  ter->aSeg[i];.  
13e30 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
13e40 2a 70 32 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  *p2 = &pIter->aS
13e50 65 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 46  eg[i+1];.      F
13e60 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13e70 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13e80 74 5b 28 70 49 74 65 72 2d 3e 6e 53 65 67 20 2b  t[(pIter->nSeg +
13e90 20 69 29 20 2f 20 32 5d 3b 0a 20 20 20 20 20 20   i) / 2];.      
13ea0 66 74 73 35 41 73 73 65 72 74 43 6f 6d 70 61 72  fts5AssertCompar
13eb0 69 73 6f 6e 52 65 73 75 6c 74 28 70 49 74 65 72  isonResult(pIter
13ec0 2c 20 70 31 2c 20 70 32 2c 20 70 52 65 73 29 3b  , p1, p2, pRes);
13ed0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 28  .    }..    for(
13ee0 69 3d 31 3b 20 69 3c 28 70 49 74 65 72 2d 3e 6e  i=1; i<(pIter->n
13ef0 53 65 67 20 2f 20 32 29 3b 20 69 2b 3d 32 29 7b  Seg / 2); i+=2){
13f00 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74  .      Fts5SegIt
13f10 65 72 20 2a 70 31 20 3d 20 26 70 49 74 65 72 2d  er *p1 = &pIter-
13f20 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
13f30 69 72 73 74 5b 69 2a 32 5d 2e 69 46 69 72 73 74  irst[i*2].iFirst
13f40 20 5d 3b 0a 20 20 20 20 20 20 46 74 73 35 53 65   ];.      Fts5Se
13f50 67 49 74 65 72 20 2a 70 32 20 3d 20 26 70 49 74  gIter *p2 = &pIt
13f60 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
13f70 3e 61 46 69 72 73 74 5b 69 2a 32 2b 31 5d 2e 69  >aFirst[i*2+1].i
13f80 46 69 72 73 74 20 5d 3b 0a 20 20 20 20 20 20 46  First ];.      F
13f90 74 73 35 43 52 65 73 75 6c 74 20 2a 70 52 65 73  ts5CResult *pRes
13fa0 20 3d 20 26 70 49 74 65 72 2d 3e 61 46 69 72 73   = &pIter->aFirs
13fb0 74 5b 69 5d 3b 0a 20 20 20 20 20 20 66 74 73 35  t[i];.      fts5
13fc0 41 73 73 65 72 74 43 6f 6d 70 61 72 69 73 6f 6e  AssertComparison
13fd0 52 65 73 75 6c 74 28 70 49 74 65 72 2c 20 70 31  Result(pIter, p1
13fe0 2c 20 70 32 2c 20 70 52 65 73 29 3b 0a 20 20 20  , p2, pRes);.   
13ff0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
14000 20 64 65 66 69 6e 65 20 66 74 73 35 41 73 73 65   define fts5Asse
14010 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70  rtMultiIterSetup
14020 28 78 2c 79 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  (x,y).#endif../*
14030 0a 2a 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61  .** Do the compa
14040 72 69 73 6f 6e 20 6e 65 63 65 73 73 61 72 79 20  rison necessary 
14050 74 6f 20 70 6f 70 75 6c 61 74 65 20 70 49 74 65  to populate pIte
14060 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75 74 5d 2e  r->aFirst[iOut].
14070 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
14080 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
14090 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 69  non-zero, then i
140a0 74 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  t is the index o
140b0 66 20 61 6e 20 65 6e 74 72 79 0a 2a 2a 20 69 6e  f an entry.** in
140c0 20 74 68 65 20 70 49 74 65 72 2d 3e 61 53 65 67   the pIter->aSeg
140d0 5b 5d 20 61 72 72 61 79 20 74 68 61 74 20 69 73  [] array that is
140e0 20 28 61 29 20 6e 6f 74 20 61 74 20 45 4f 46 2c   (a) not at EOF,
140f0 20 61 6e 64 20 28 62 29 20 70 6f 69 6e 74 69 6e   and (b) pointin
14100 67 0a 2a 2a 20 74 6f 20 61 20 6b 65 79 20 74 68  g.** to a key th
14110 61 74 20 69 73 20 61 20 64 75 70 6c 69 63 61 74  at is a duplicat
14120 65 20 6f 66 20 61 6e 6f 74 68 65 72 2c 20 68 69  e of another, hi
14130 67 68 65 72 20 70 72 69 6f 72 69 74 79 2c 20 0a  gher priority, .
14140 2a 2a 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 61  ** segment-itera
14150 74 6f 72 20 69 6e 20 74 68 65 20 70 53 65 67 2d  tor in the pSeg-
14160 3e 61 53 65 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aSeg[] array..*
14170 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
14180 35 4d 75 6c 74 69 49 74 65 72 44 6f 43 6f 6d 70  5MultiIterDoComp
14190 61 72 65 28 46 74 73 35 49 74 65 72 20 2a 70 49  are(Fts5Iter *pI
141a0 74 65 72 2c 20 69 6e 74 20 69 4f 75 74 29 7b 0a  ter, int iOut){.
141b0 20 20 69 6e 74 20 69 31 3b 20 20 20 20 20 20 20    int i1;       
141c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141d0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6c 65    /* Index of le
141e0 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67 49  ft-hand Fts5SegI
141f0 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 32 3b  ter */.  int i2;
14200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14210 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
14220 78 20 6f 66 20 72 69 67 68 74 2d 68 61 6e 64 20  x of right-hand 
14230 46 74 73 35 53 65 67 49 74 65 72 20 2a 2f 0a 20  Fts5SegIter */. 
14240 20 69 6e 74 20 69 52 65 73 3b 0a 20 20 46 74 73   int iRes;.  Fts
14250 35 53 65 67 49 74 65 72 20 2a 70 31 3b 20 20 20  5SegIter *p1;   
14260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14270 4c 65 66 74 2d 68 61 6e 64 20 46 74 73 35 53 65  Left-hand Fts5Se
14280 67 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 53  gIter */.  Fts5S
14290 65 67 49 74 65 72 20 2a 70 32 3b 20 20 20 20 20  egIter *p2;     
142a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69             /* Ri
142b0 67 68 74 2d 68 61 6e 64 20 46 74 73 35 53 65 67  ght-hand Fts5Seg
142c0 49 74 65 72 20 2a 2f 0a 20 20 46 74 73 35 43 52  Iter */.  Fts5CR
142d0 65 73 75 6c 74 20 2a 70 52 65 73 20 3d 20 26 70  esult *pRes = &p
142e0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69 4f 75  Iter->aFirst[iOu
142f0 74 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 69  t];..  assert( i
14300 4f 75 74 3c 70 49 74 65 72 2d 3e 6e 53 65 67 20  Out<pIter->nSeg 
14310 26 26 20 69 4f 75 74 3e 30 20 29 3b 0a 20 20 61  && iOut>0 );.  a
14320 73 73 65 72 74 28 20 70 49 74 65 72 2d 3e 62 52  ssert( pIter->bR
14330 65 76 3d 3d 30 20 7c 7c 20 70 49 74 65 72 2d 3e  ev==0 || pIter->
14340 62 52 65 76 3d 3d 31 20 29 3b 0a 0a 20 20 69 66  bRev==1 );..  if
14350 28 20 69 4f 75 74 3e 3d 28 70 49 74 65 72 2d 3e  ( iOut>=(pIter->
14360 6e 53 65 67 2f 32 29 20 29 7b 0a 20 20 20 20 69  nSeg/2) ){.    i
14370 31 20 3d 20 28 69 4f 75 74 20 2d 20 70 49 74 65  1 = (iOut - pIte
14380 72 2d 3e 6e 53 65 67 2f 32 29 20 2a 20 32 3b 0a  r->nSeg/2) * 2;.
14390 20 20 20 20 69 32 20 3d 20 69 31 20 2b 20 31 3b      i2 = i1 + 1;
143a0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 31  .  }else{.    i1
143b0 20 3d 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74   = pIter->aFirst
143c0 5b 69 4f 75 74 2a 32 5d 2e 69 46 69 72 73 74 3b  [iOut*2].iFirst;
143d0 0a 20 20 20 20 69 32 20 3d 20 70 49 74 65 72 2d  .    i2 = pIter-
143e0 3e 61 46 69 72 73 74 5b 69 4f 75 74 2a 32 2b 31  >aFirst[iOut*2+1
143f0 5d 2e 69 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20  ].iFirst;.  }.  
14400 70 31 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65  p1 = &pIter->aSe
14410 67 5b 69 31 5d 3b 0a 20 20 70 32 20 3d 20 26 70  g[i1];.  p2 = &p
14420 49 74 65 72 2d 3e 61 53 65 67 5b 69 32 5d 3b 0a  Iter->aSeg[i2];.
14430 0a 20 20 70 52 65 73 2d 3e 62 54 65 72 6d 45 71  .  pRes->bTermEq
14440 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 31 2d 3e   = 0;.  if( p1->
14450 70 4c 65 61 66 3d 3d 30 20 29 7b 20 20 20 20 20  pLeaf==0 ){     
14460 20 20 20 20 20 20 2f 2a 20 49 66 20 70 31 20 69        /* If p1 i
14470 73 20 61 74 20 45 4f 46 20 2a 2f 0a 20 20 20 20  s at EOF */.    
14480 69 52 65 73 20 3d 20 69 32 3b 0a 20 20 7d 65 6c  iRes = i2;.  }el
14490 73 65 20 69 66 28 20 70 32 2d 3e 70 4c 65 61 66  se if( p2->pLeaf
144a0 3d 3d 30 20 29 7b 20 20 20 20 20 2f 2a 20 49 66  ==0 ){     /* If
144b0 20 70 32 20 69 73 20 61 74 20 45 4f 46 20 2a 2f   p2 is at EOF */
144c0 0a 20 20 20 20 69 52 65 73 20 3d 20 69 31 3b 0a  .    iRes = i1;.
144d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
144e0 20 72 65 73 20 3d 20 66 74 73 35 42 75 66 66 65   res = fts5Buffe
144f0 72 43 6f 6d 70 61 72 65 28 26 70 31 2d 3e 74 65  rCompare(&p1->te
14500 72 6d 2c 20 26 70 32 2d 3e 74 65 72 6d 29 3b 0a  rm, &p2->term);.
14510 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
14520 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
14530 69 32 3e 69 31 20 29 3b 0a 20 20 20 20 20 20 61  i2>i1 );.      a
14540 73 73 65 72 74 28 20 69 32 21 3d 30 20 29 3b 0a  ssert( i2!=0 );.
14550 20 20 20 20 20 20 70 52 65 73 2d 3e 62 54 65 72        pRes->bTer
14560 6d 45 71 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  mEq = 1;.      i
14570 66 28 20 70 31 2d 3e 69 52 6f 77 69 64 3d 3d 70  f( p1->iRowid==p
14580 32 2d 3e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20  2->iRowid ){.   
14590 20 20 20 20 20 70 31 2d 3e 62 44 65 6c 20 3d 20       p1->bDel = 
145a0 70 32 2d 3e 62 44 65 6c 3b 0a 20 20 20 20 20 20  p2->bDel;.      
145b0 20 20 72 65 74 75 72 6e 20 69 32 3b 0a 20 20 20    return i2;.   
145c0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 73 20 3d     }.      res =
145d0 20 28 28 70 31 2d 3e 69 52 6f 77 69 64 20 3e 20   ((p1->iRowid > 
145e0 70 32 2d 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74  p2->iRowid)==pIt
145f0 65 72 2d 3e 62 52 65 76 29 20 3f 20 2d 31 20 3a  er->bRev) ? -1 :
14600 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   +1;.    }.    a
14610 73 73 65 72 74 28 20 72 65 73 21 3d 30 20 29 3b  ssert( res!=0 );
14620 0a 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29  .    if( res<0 )
14630 7b 0a 20 20 20 20 20 20 69 52 65 73 20 3d 20 69  {.      iRes = i
14640 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
14650 20 20 20 20 69 52 65 73 20 3d 20 69 32 3b 0a 20      iRes = i2;. 
14660 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52 65 73     }.  }..  pRes
14670 2d 3e 69 46 69 72 73 74 20 3d 20 28 75 31 36 29  ->iFirst = (u16)
14680 69 52 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 30  iRes;.  return 0
14690 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  ;.}../*.** Move 
146a0 74 68 65 20 73 65 67 2d 69 74 65 72 20 73 6f 20  the seg-iter so 
146b0 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
146c0 6f 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 69  o the first rowi
146d0 64 20 6f 6e 20 70 61 67 65 20 69 4c 65 61 66 50  d on page iLeafP
146e0 67 6e 6f 2e 0a 2a 2a 20 49 74 20 69 73 20 61 6e  gno..** It is an
146f0 20 65 72 72 6f 72 20 69 66 20 6c 65 61 66 20 69   error if leaf i
14700 4c 65 61 66 50 67 6e 6f 20 64 6f 65 73 20 6e 6f  LeafPgno does no
14710 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
14720 69 6e 73 20 6e 6f 20 72 6f 77 69 64 73 2e 0a 2a  ins no rowids..*
14730 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
14740 73 35 53 65 67 49 74 65 72 47 6f 74 6f 50 61 67  s5SegIterGotoPag
14750 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  e(.  Fts5Index *
14760 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14770 20 20 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63       /* FTS5 bac
14780 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  kend object */. 
14790 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 49   Fts5SegIter *pI
147a0 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ter,            
147b0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
147c0 61 64 76 61 6e 63 65 20 2a 2f 0a 20 20 69 6e 74  advance */.  int
147d0 20 69 4c 65 61 66 50 67 6e 6f 0a 29 7b 0a 20 20   iLeafPgno.){.  
147e0 61 73 73 65 72 74 28 20 69 4c 65 61 66 50 67 6e  assert( iLeafPgn
147f0 6f 3e 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67  o>pIter->iLeafPg
14800 6e 6f 20 29 3b 0a 0a 20 20 69 66 28 20 69 4c 65  no );..  if( iLe
14810 61 66 50 67 6e 6f 3e 70 49 74 65 72 2d 3e 70 53  afPgno>pIter->pS
14820 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 20 29 7b 0a  eg->pgnoLast ){.
14830 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
14840 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c 73  _CORRUPT;.  }els
14850 65 7b 0a 20 20 20 20 66 74 73 35 44 61 74 61 52  e{.    fts5DataR
14860 65 6c 65 61 73 65 28 70 49 74 65 72 2d 3e 70 4e  elease(pIter->pN
14870 65 78 74 4c 65 61 66 29 3b 0a 20 20 20 20 70 49  extLeaf);.    pI
14880 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 20 3d  ter->pNextLeaf =
14890 20 30 3b 0a 20 20 20 20 70 49 74 65 72 2d 3e 69   0;.    pIter->i
148a0 4c 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66  LeafPgno = iLeaf
148b0 50 67 6e 6f 2d 31 3b 0a 20 20 20 20 66 74 73 35  Pgno-1;.    fts5
148c0 53 65 67 49 74 65 72 4e 65 78 74 50 61 67 65 28  SegIterNextPage(
148d0 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
148e0 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
148f0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 49 74 65 72  LITE_OK || pIter
14900 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 69 4c 65  ->iLeafPgno==iLe
14910 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
14920 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14930 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  _OK ){.      int
14940 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 75 38 20   iOff;.      u8 
14950 2a 61 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61  *a = pIter->pLea
14960 66 2d 3e 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  f->p;.      int 
14970 6e 20 3d 20 70 49 74 65 72 2d 3e 70 4c 65 61 66  n = pIter->pLeaf
14980 2d 3e 73 7a 4c 65 61 66 3b 0a 0a 20 20 20 20 20  ->szLeaf;..     
14990 20 69 4f 66 66 20 3d 20 66 74 73 35 4c 65 61 66   iOff = fts5Leaf
149a0 46 69 72 73 74 52 6f 77 69 64 4f 66 66 28 70 49  FirstRowidOff(pI
149b0 74 65 72 2d 3e 70 4c 65 61 66 29 3b 0a 20 20 20  ter->pLeaf);.   
149c0 20 20 20 69 66 28 20 69 4f 66 66 3c 34 20 7c 7c     if( iOff<4 ||
149d0 20 69 4f 66 66 3e 3d 6e 20 29 7b 0a 20 20 20 20   iOff>=n ){.    
149e0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
149f0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
14a00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
14a10 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
14a20 72 69 6e 74 28 26 61 5b 69 4f 66 66 5d 2c 20 28  rint(&a[iOff], (
14a30 75 36 34 2a 29 26 70 49 74 65 72 2d 3e 69 52 6f  u64*)&pIter->iRo
14a40 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 70 49  wid);.        pI
14a50 74 65 72 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74  ter->iLeafOffset
14a60 20 3d 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20   = iOff;.       
14a70 20 66 74 73 35 53 65 67 49 74 65 72 4c 6f 61 64   fts5SegIterLoad
14a80 4e 50 6f 73 28 70 2c 20 70 49 74 65 72 29 3b 0a  NPos(p, pIter);.
14a90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14aa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  }.}../*.** Advan
14ab0 63 65 20 74 68 65 20 69 74 65 72 61 74 6f 72 20  ce the iterator 
14ac0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
14ad0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 75 6e  cond argument un
14ae0 74 69 6c 20 69 74 20 69 73 20 61 74 20 6f 72 20  til it is at or 
14af0 0a 2a 2a 20 70 61 73 74 20 72 6f 77 69 64 20 69  .** past rowid i
14b00 46 72 6f 6d 2e 20 52 65 67 61 72 64 6c 65 73 73  From. Regardless
14b10 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66   of the value of
14b20 20 69 46 72 6f 6d 2c 20 74 68 65 20 69 74 65 72   iFrom, the iter
14b30 61 74 6f 72 20 69 73 0a 2a 2a 20 61 6c 77 61 79  ator is.** alway
14b40 73 20 61 64 76 61 6e 63 65 64 20 61 74 20 6c 65  s advanced at le
14b50 61 73 74 20 6f 6e 63 65 2e 0a 2a 2f 0a 73 74 61  ast once..*/.sta
14b60 74 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67  tic void fts5Seg
14b70 49 74 65 72 4e 65 78 74 46 72 6f 6d 28 0a 20 20  IterNextFrom(.  
14b80 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20  Fts5Index *p,   
14b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ba0 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20  /* FTS5 backend 
14bb0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35  object */.  Fts5
14bc0 53 65 67 49 74 65 72 20 2a 70 49 74 65 72 2c 20  SegIter *pIter, 
14bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
14be0 74 65 72 61 74 6f 72 20 74 6f 20 61 64 76 61 6e  terator to advan
14bf0 63 65 20 2a 2f 0a 20 20 69 36 34 20 69 4d 61 74  ce */.  i64 iMat
14c00 63 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ch              
14c10 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61 6e          /* Advan
14c20 63 65 20 69 74 65 72 61 74 6f 72 20 61 74 20 6c  ce iterator at l
14c30 65 61 73 74 20 74 68 69 73 20 66 61 72 20 2a 2f  east this far */
14c40 0a 29 7b 0a 20 20 69 6e 74 20 62 52 65 76 20 3d  .){.  int bRev =
14c50 20 28 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26   (pIter->flags &
14c60 20 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45   FTS5_SEGITER_RE
14c70 56 45 52 53 45 29 3b 0a 20 20 46 74 73 35 44 6c  VERSE);.  Fts5Dl
14c80 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
14c90 3d 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 3b  = pIter->pDlidx;
14ca0 0a 20 20 69 6e 74 20 69 4c 65 61 66 50 67 6e 6f  .  int iLeafPgno
14cb0 20 3d 20 70 49 74 65 72 2d 3e 69 4c 65 61 66 50   = pIter->iLeafP
14cc0 67 6e 6f 3b 0a 20 20 69 6e 74 20 62 4d 6f 76 65  gno;.  int bMove
14cd0 20 3d 20 31 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 1;..  assert(
14ce0 20 70 49 74 65 72 2d 3e 66 6c 61 67 73 20 26 20   pIter->flags & 
14cf0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 4f 4e 45  FTS5_SEGITER_ONE
14d00 54 45 52 4d 20 29 3b 0a 20 20 61 73 73 65 72 74  TERM );.  assert
14d10 28 20 70 49 74 65 72 2d 3e 70 44 6c 69 64 78 20  ( pIter->pDlidx 
14d20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
14d30 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20  er->pLeaf );..  
14d40 69 66 28 20 62 52 65 76 3d 3d 30 20 29 7b 0a 20  if( bRev==0 ){. 
14d50 20 20 20 77 68 69 6c 65 28 20 21 66 74 73 35 44     while( !fts5D
14d60 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
14d70 44 6c 69 64 78 29 20 26 26 20 69 4d 61 74 63 68  Dlidx) && iMatch
14d80 3e 66 74 73 35 44 6c 69 64 78 49 74 65 72 52 6f  >fts5DlidxIterRo
14d90 77 69 64 28 70 44 6c 69 64 78 29 20 29 7b 0a 20  wid(pDlidx) ){. 
14da0 20 20 20 20 20 69 4c 65 61 66 50 67 6e 6f 20 3d       iLeafPgno =
14db0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
14dc0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
14dd0 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 4e    fts5DlidxIterN
14de0 65 78 74 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a  ext(p, pDlidx);.
14df0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
14e00 5f 6e 63 28 20 69 4c 65 61 66 50 67 6e 6f 3e 3d  _nc( iLeafPgno>=
14e10 70 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f  pIter->iLeafPgno
14e20 20 7c 7c 20 70 2d 3e 72 63 20 29 3b 0a 20 20 20   || p->rc );.   
14e30 20 69 66 28 20 69 4c 65 61 66 50 67 6e 6f 3e 70   if( iLeafPgno>p
14e40 49 74 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20  Iter->iLeafPgno 
14e50 29 7b 0a 20 20 20 20 20 20 66 74 73 35 53 65 67  ){.      fts5Seg
14e60 49 74 65 72 47 6f 74 6f 50 61 67 65 28 70 2c 20  IterGotoPage(p, 
14e70 70 49 74 65 72 2c 20 69 4c 65 61 66 50 67 6e 6f  pIter, iLeafPgno
14e80 29 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d  );.      bMove =
14e90 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
14ea0 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
14eb0 49 74 65 72 2d 3e 70 4e 65 78 74 4c 65 61 66 3d  Iter->pNextLeaf=
14ec0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
14ed0 28 20 69 4d 61 74 63 68 3c 70 49 74 65 72 2d 3e  ( iMatch<pIter->
14ee0 69 52 6f 77 69 64 20 29 3b 0a 20 20 20 20 77 68  iRowid );.    wh
14ef0 69 6c 65 28 20 21 66 74 73 35 44 6c 69 64 78 49  ile( !fts5DlidxI
14f00 74 65 72 45 6f 66 28 70 2c 20 70 44 6c 69 64 78  terEof(p, pDlidx
14f10 29 20 26 26 20 69 4d 61 74 63 68 3c 66 74 73 35  ) && iMatch<fts5
14f20 44 6c 69 64 78 49 74 65 72 52 6f 77 69 64 28 70  DlidxIterRowid(p
14f30 44 6c 69 64 78 29 20 29 7b 0a 20 20 20 20 20 20  Dlidx) ){.      
14f40 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 72 65  fts5DlidxIterPre
14f50 76 28 70 2c 20 70 44 6c 69 64 78 29 3b 0a 20 20  v(p, pDlidx);.  
14f60 20 20 7d 0a 20 20 20 20 69 4c 65 61 66 50 67 6e    }.    iLeafPgn
14f70 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74 65  o = fts5DlidxIte
14f80 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 0a  rPgno(pDlidx);..
14f90 20 20 20 20 61 73 73 65 72 74 28 20 66 74 73 35      assert( fts5
14fa0 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20  DlidxIterEof(p, 
14fb0 70 44 6c 69 64 78 29 20 7c 7c 20 69 4c 65 61 66  pDlidx) || iLeaf
14fc0 50 67 6e 6f 3c 3d 70 49 74 65 72 2d 3e 69 4c 65  Pgno<=pIter->iLe
14fd0 61 66 50 67 6e 6f 20 29 3b 0a 0a 20 20 20 20 69  afPgno );..    i
14fe0 66 28 20 69 4c 65 61 66 50 67 6e 6f 3c 70 49 74  f( iLeafPgno<pIt
14ff0 65 72 2d 3e 69 4c 65 61 66 50 67 6e 6f 20 29 7b  er->iLeafPgno ){
15000 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 69 4c  .      pIter->iL
15010 65 61 66 50 67 6e 6f 20 3d 20 69 4c 65 61 66 50  eafPgno = iLeafP
15020 67 6e 6f 2b 31 3b 0a 20 20 20 20 20 20 66 74 73  gno+1;.      fts
15030 35 53 65 67 49 74 65 72 52 65 76 65 72 73 65 4e  5SegIterReverseN
15040 65 77 50 61 67 65 28 70 2c 20 70 49 74 65 72 29  ewPage(p, pIter)
15050 3b 0a 20 20 20 20 20 20 62 4d 6f 76 65 20 3d 20  ;.      bMove = 
15060 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
15070 64 6f 7b 0a 20 20 20 20 69 66 28 20 62 4d 6f 76  do{.    if( bMov
15080 65 20 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  e && p->rc==SQLI
15090 54 45 5f 4f 4b 20 29 20 70 49 74 65 72 2d 3e 78  TE_OK ) pIter->x
150a0 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20 30  Next(p, pIter, 0
150b0 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74 65 72  );.    if( pIter
150c0 2d 3e 70 4c 65 61 66 3d 3d 30 20 29 20 62 72 65  ->pLeaf==0 ) bre
150d0 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52 65 76  ak;.    if( bRev
150e0 3d 3d 30 20 26 26 20 70 49 74 65 72 2d 3e 69 52  ==0 && pIter->iR
150f0 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20 62  owid>=iMatch ) b
15100 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 62 52  reak;.    if( bR
15110 65 76 21 3d 30 20 26 26 20 70 49 74 65 72 2d 3e  ev!=0 && pIter->
15120 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20 29  iRowid<=iMatch )
15130 20 62 72 65 61 6b 3b 0a 20 20 20 20 62 4d 6f 76   break;.    bMov
15140 65 20 3d 20 31 3b 0a 20 20 7d 77 68 69 6c 65 28  e = 1;.  }while(
15150 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
15160 4b 20 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46  K );.}.../*.** F
15170 72 65 65 20 74 68 65 20 69 74 65 72 61 74 6f 72  ree the iterator
15180 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
15190 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
151a0 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
151b0 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
151c0 74 65 72 46 72 65 65 28 46 74 73 35 49 74 65 72  terFree(Fts5Iter
151d0 20 2a 70 49 74 65 72 29 7b 0a 20 20 69 66 28 20   *pIter){.  if( 
151e0 70 49 74 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  pIter ){.    int
151f0 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
15200 20 69 3c 70 49 74 65 72 2d 3e 6e 53 65 67 3b 20   i<pIter->nSeg; 
15210 69 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35  i++){.      fts5
15220 53 65 67 49 74 65 72 43 6c 65 61 72 28 26 70 49  SegIterClear(&pI
15230 74 65 72 2d 3e 61 53 65 67 5b 69 5d 29 3b 0a 20  ter->aSeg[i]);. 
15240 20 20 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66     }.    fts5Buf
15250 66 65 72 46 72 65 65 28 26 70 49 74 65 72 2d 3e  ferFree(&pIter->
15260 70 6f 73 6c 69 73 74 29 3b 0a 20 20 20 20 73 71  poslist);.    sq
15270 6c 69 74 65 33 5f 66 72 65 65 28 70 49 74 65 72  lite3_free(pIter
15280 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
15290 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74 69 49   void fts5MultiI
152a0 74 65 72 41 64 76 61 6e 63 65 64 28 0a 20 20 46  terAdvanced(.  F
152b0 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
152d0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 74  * FTS5 backend t
152e0 6f 20 69 74 65 72 61 74 65 20 77 69 74 68 69 6e  o iterate within
152f0 20 2a 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a   */.  Fts5Iter *
15300 70 49 74 65 72 2c 20 20 20 20 20 20 20 20 20 20  pIter,          
15310 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f        /* Iterato
15320 72 20 74 6f 20 75 70 64 61 74 65 20 61 46 69 72  r to update aFir
15330 73 74 5b 5d 20 61 72 72 61 79 20 66 6f 72 20 2a  st[] array for *
15340 2f 0a 20 20 69 6e 74 20 69 43 68 61 6e 67 65 64  /.  int iChanged
15350 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15360 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
15370 73 75 62 2d 69 74 65 72 61 74 6f 72 20 6a 75 73  sub-iterator jus
15380 74 20 61 64 76 61 6e 63 65 64 20 2a 2f 0a 20 20  t advanced */.  
15390 69 6e 74 20 69 4d 69 6e 73 65 74 20 20 20 20 20  int iMinset     
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153b0 2f 2a 20 4d 69 6e 69 6d 75 6d 20 65 6e 74 72 79  /* Minimum entry
153c0 20 69 6e 20 61 46 69 72 73 74 5b 5d 20 74 6f 20   in aFirst[] to 
153d0 73 65 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  set */.){.  int 
153e0 69 3b 0a 20 20 66 6f 72 28 69 3d 28 70 49 74 65  i;.  for(i=(pIte
153f0 72 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64  r->nSeg+iChanged
15400 29 2f 32 3b 20 69 3e 3d 69 4d 69 6e 73 65 74 20  )/2; i>=iMinset 
15410 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
15420 5f 4f 4b 3b 20 69 3d 69 2f 32 29 7b 0a 20 20 20  _OK; i=i/2){.   
15430 20 69 6e 74 20 69 45 71 3b 0a 20 20 20 20 69 66   int iEq;.    if
15440 28 20 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c  ( (iEq = fts5Mul
15450 74 69 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28  tiIterDoCompare(
15460 70 49 74 65 72 2c 20 69 29 29 20 29 7b 0a 20 20  pIter, i)) ){.  
15470 20 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20      Fts5SegIter 
15480 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d 3e  *pSeg = &pIter->
15490 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20 20 20  aSeg[iEq];.     
154a0 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
154b0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
154c0 20 20 20 70 53 65 67 2d 3e 78 4e 65 78 74 28 70     pSeg->xNext(p
154d0 2c 20 70 53 65 67 2c 20 30 29 3b 0a 20 20 20 20  , pSeg, 0);.    
154e0 20 20 69 20 3d 20 70 49 74 65 72 2d 3e 6e 53 65    i = pIter->nSe
154f0 67 20 2b 20 69 45 71 3b 0a 20 20 20 20 7d 0a 20  g + iEq;.    }. 
15500 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 2d   }.}../*.** Sub-
15510 69 74 65 72 61 74 6f 72 20 69 43 68 61 6e 67 65  iterator iChange
15520 64 20 6f 66 20 69 74 65 72 61 74 6f 72 20 70 49  d of iterator pI
15530 74 65 72 20 68 61 73 20 6a 75 73 74 20 62 65 65  ter has just bee
15540 6e 20 61 64 76 61 6e 63 65 64 2e 20 49 74 20 73  n advanced. It s
15550 74 69 6c 6c 0a 2a 2a 20 70 6f 69 6e 74 73 20 74  till.** points t
15560 6f 20 74 68 65 20 73 61 6d 65 20 74 65 72 6d 20  o the same term 
15570 74 68 6f 75 67 68 20 2d 20 6a 75 73 74 20 61 20  though - just a 
15580 64 69 66 66 65 72 65 6e 74 20 72 6f 77 69 64 2e  different rowid.
15590 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a   This function.*
155a0 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 70  * attempts to up
155b0 64 61 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  date the content
155c0 73 20 6f 66 20 74 68 65 20 70 49 74 65 72 2d 3e  s of the pIter->
155d0 61 46 69 72 73 74 5b 5d 20 61 63 63 6f 72 64 69  aFirst[] accordi
155e0 6e 67 6c 79 2e 0a 2a 2a 20 49 66 20 69 74 20 64  ngly..** If it d
155f0 6f 65 73 20 73 6f 20 73 75 63 63 65 73 73 66 75  oes so successfu
15600 6c 6c 79 2c 20 30 20 69 73 20 72 65 74 75 72 6e  lly, 0 is return
15610 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 31 2e  ed. Otherwise 1.
15620 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 6e 2d 7a 65  .**.** If non-ze
15630 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20  ro is returned, 
15640 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  the caller shoul
15650 64 20 63 61 6c 6c 20 66 74 73 35 4d 75 6c 74 69  d call fts5Multi
15660 49 74 65 72 41 64 76 61 6e 63 65 64 28 29 0a 2a  IterAdvanced().*
15670 2a 20 6f 6e 20 74 68 65 20 69 74 65 72 61 74 6f  * on the iterato
15680 72 20 69 6e 73 74 65 61 64 2e 20 54 68 61 74 20  r instead. That 
15690 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68  function does th
156a0 65 20 73 61 6d 65 20 61 73 20 74 68 69 73 20 6f  e same as this o
156b0 6e 65 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  ne, except.** th
156c0 61 74 20 69 74 20 64 65 61 6c 73 20 77 69 74 68  at it deals with
156d0 20 6d 6f 72 65 20 63 6f 6d 70 6c 69 63 61 74 65   more complicate
156e0 64 20 63 61 73 65 73 20 61 73 20 77 65 6c 6c 2e  d cases as well.
156f0 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/ .static int 
15700 66 74 73 35 4d 75 6c 74 69 49 74 65 72 41 64 76  fts5MultiIterAdv
15710 61 6e 63 65 52 6f 77 69 64 28 0a 20 20 46 74 73  anceRowid(.  Fts
15720 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 20 20  5Iter *pIter,   
15730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15740 49 74 65 72 61 74 6f 72 20 74 6f 20 75 70 64 61  Iterator to upda
15750 74 65 20 61 46 69 72 73 74 5b 5d 20 61 72 72 61  te aFirst[] arra
15760 79 20 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 69  y for */.  int i
15770 43 68 61 6e 67 65 64 2c 20 20 20 20 20 20 20 20  Changed,        
15780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
15790 64 65 78 20 6f 66 20 73 75 62 2d 69 74 65 72 61  dex of sub-itera
157a0 74 6f 72 20 6a 75 73 74 20 61 64 76 61 6e 63 65  tor just advance
157b0 64 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 49 74  d */.  Fts5SegIt
157c0 65 72 20 2a 2a 70 70 46 69 72 73 74 0a 29 7b 0a  er **ppFirst.){.
157d0 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70    Fts5SegIter *p
157e0 4e 65 77 20 3d 20 26 70 49 74 65 72 2d 3e 61 53  New = &pIter->aS
157f0 65 67 5b 69 43 68 61 6e 67 65 64 5d 3b 0a 0a 20  eg[iChanged];.. 
15800 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69   if( pNew->iRowi
15810 64 3d 3d 70 49 74 65 72 2d 3e 69 53 77 69 74 63  d==pIter->iSwitc
15820 68 52 6f 77 69 64 0a 20 20 20 7c 7c 20 28 70 4e  hRowid.   || (pN
15830 65 77 2d 3e 69 52 6f 77 69 64 3c 70 49 74 65 72  ew->iRowid<pIter
15840 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 29 3d  ->iSwitchRowid)=
15850 3d 70 49 74 65 72 2d 3e 62 52 65 76 0a 20 20 29  =pIter->bRev.  )
15860 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
15870 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 4f   Fts5SegIter *pO
15880 74 68 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  ther = &pIter->a
15890 53 65 67 5b 69 43 68 61 6e 67 65 64 20 5e 20 30  Seg[iChanged ^ 0
158a0 78 30 30 30 31 5d 3b 0a 20 20 20 20 70 49 74 65  x0001];.    pIte
158b0 72 2d 3e 69 53 77 69 74 63 68 52 6f 77 69 64 20  r->iSwitchRowid 
158c0 3d 20 70 49 74 65 72 2d 3e 62 52 65 76 20 3f 20  = pIter->bRev ? 
158d0 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 3a  SMALLEST_INT64 :
158e0 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 3b 0a   LARGEST_INT64;.
158f0 20 20 20 20 66 6f 72 28 69 3d 28 70 49 74 65 72      for(i=(pIter
15900 2d 3e 6e 53 65 67 2b 69 43 68 61 6e 67 65 64 29  ->nSeg+iChanged)
15910 2f 32 3b 20 31 3b 20 69 3d 69 2f 32 29 7b 0a 20  /2; 1; i=i/2){. 
15920 20 20 20 20 20 46 74 73 35 43 52 65 73 75 6c 74       Fts5CResult
15930 20 2a 70 52 65 73 20 3d 20 26 70 49 74 65 72 2d   *pRes = &pIter-
15940 3e 61 46 69 72 73 74 5b 69 5d 3b 0a 0a 20 20 20  >aFirst[i];..   
15950 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
15960 3e 70 4c 65 61 66 20 29 3b 0a 20 20 20 20 20 20  >pLeaf );.      
15970 61 73 73 65 72 74 28 20 70 52 65 73 2d 3e 62 54  assert( pRes->bT
15980 65 72 6d 45 71 3d 3d 30 20 7c 7c 20 70 4f 74 68  ermEq==0 || pOth
15990 65 72 2d 3e 70 4c 65 61 66 20 29 3b 0a 0a 20 20  er->pLeaf );..  
159a0 20 20 20 20 69 66 28 20 70 52 65 73 2d 3e 62 54      if( pRes->bT
159b0 65 72 6d 45 71 20 29 7b 0a 20 20 20 20 20 20 20  ermEq ){.       
159c0 20 69 66 28 20 70 4e 65 77 2d 3e 69 52 6f 77 69   if( pNew->iRowi
159d0 64 3d 3d 70 4f 74 68 65 72 2d 3e 69 52 6f 77 69  d==pOther->iRowi
159e0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  d ){.          r
159f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
15a00 20 7d 65 6c 73 65 20 69 66 28 20 28 70 4f 74 68   }else if( (pOth
15a10 65 72 2d 3e 69 52 6f 77 69 64 3e 70 4e 65 77 2d  er->iRowid>pNew-
15a20 3e 69 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  >iRowid)==pIter-
15a30 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
15a40 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
15a50 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d  hRowid = pOther-
15a60 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  >iRowid;.       
15a70 20 20 20 70 4e 65 77 20 3d 20 70 4f 74 68 65 72     pNew = pOther
15a80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
15a90 69 66 28 20 28 70 4f 74 68 65 72 2d 3e 69 52 6f  if( (pOther->iRo
15aa0 77 69 64 3e 70 49 74 65 72 2d 3e 69 53 77 69 74  wid>pIter->iSwit
15ab0 63 68 52 6f 77 69 64 29 3d 3d 70 49 74 65 72 2d  chRowid)==pIter-
15ac0 3e 62 52 65 76 20 29 7b 0a 20 20 20 20 20 20 20  >bRev ){.       
15ad0 20 20 20 70 49 74 65 72 2d 3e 69 53 77 69 74 63     pIter->iSwitc
15ae0 68 52 6f 77 69 64 20 3d 20 70 4f 74 68 65 72 2d  hRowid = pOther-
15af0 3e 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 20  >iRowid;.       
15b00 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
15b10 20 70 52 65 73 2d 3e 69 46 69 72 73 74 20 3d 20   pRes->iFirst = 
15b20 28 75 31 36 29 28 70 4e 65 77 20 2d 20 70 49 74  (u16)(pNew - pIt
15b30 65 72 2d 3e 61 53 65 67 29 3b 0a 20 20 20 20 20  er->aSeg);.     
15b40 20 69 66 28 20 69 3d 3d 31 20 29 20 62 72 65 61   if( i==1 ) brea
15b50 6b 3b 0a 0a 20 20 20 20 20 20 70 4f 74 68 65 72  k;..      pOther
15b60 20 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b   = &pIter->aSeg[
15b70 20 70 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 69   pIter->aFirst[i
15b80 20 5e 20 30 78 30 30 30 31 5d 2e 69 46 69 72 73   ^ 0x0001].iFirs
15b90 74 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  t ];.    }.  }..
15ba0 20 20 2a 70 70 46 69 72 73 74 20 3d 20 70 4e 65    *ppFirst = pNe
15bb0 77 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  w;.  return 0;.}
15bc0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
15bd0 70 49 74 65 72 2d 3e 62 45 6f 66 20 76 61 72 69  pIter->bEof vari
15be0 61 62 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68  able based on th
15bf0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 73  e state of the s
15c00 75 62 2d 69 74 65 72 61 74 6f 72 73 2e 0a 2a 2f  ub-iterators..*/
15c10 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
15c20 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66  5MultiIterSetEof
15c30 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72  (Fts5Iter *pIter
15c40 29 7b 0a 20 20 46 74 73 35 53 65 67 49 74 65 72  ){.  Fts5SegIter
15c50 20 2a 70 53 65 67 20 3d 20 26 70 49 74 65 72 2d   *pSeg = &pIter-
15c60 3e 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46  >aSeg[ pIter->aF
15c70 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d  irst[1].iFirst ]
15c80 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  ;.  pIter->base.
15c90 62 45 6f 66 20 3d 20 70 53 65 67 2d 3e 70 4c 65  bEof = pSeg->pLe
15ca0 61 66 3d 3d 30 3b 0a 20 20 70 49 74 65 72 2d 3e  af==0;.  pIter->
15cb0 69 53 77 69 74 63 68 52 6f 77 69 64 20 3d 20 70  iSwitchRowid = p
15cc0 53 65 67 2d 3e 69 52 6f 77 69 64 3b 0a 7d 0a 0a  Seg->iRowid;.}..
15cd0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 69  /*.** Move the i
15ce0 74 65 72 61 74 6f 72 20 74 6f 20 74 68 65 20 6e  terator to the n
15cf0 65 78 74 20 65 6e 74 72 79 2e 20 0a 2a 2a 0a 2a  ext entry. .**.*
15d00 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
15d10 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63  curs, an error c
15d20 6f 64 65 20 69 73 20 6c 65 66 74 20 69 6e 20 46  ode is left in F
15d30 74 73 35 49 6e 64 65 78 2e 72 63 2e 20 49 74 20  ts5Index.rc. It 
15d40 69 73 20 6e 6f 74 20 0a 2a 2a 20 63 6f 6e 73 69  is not .** consi
15d50 64 65 72 65 64 20 61 6e 20 65 72 72 6f 72 20 69  dered an error i
15d60 66 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  f the iterator r
15d70 65 61 63 68 65 73 20 45 4f 46 2c 20 6f 72 20 69  eaches EOF, or i
15d80 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20  f it is already 
15d90 61 74 20 0a 2a 2a 20 45 4f 46 20 77 68 65 6e 20  at .** EOF when 
15da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
15db0 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
15dc0 69 63 20 76 6f 69 64 20 66 74 73 35 4d 75 6c 74  ic void fts5Mult
15dd0 69 49 74 65 72 4e 65 78 74 28 0a 20 20 46 74 73  iIterNext(.  Fts
15de0 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
15df0 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 0a 20  s5Iter *pIter,. 
15e00 20 69 6e 74 20 62 46 72 6f 6d 2c 20 20 20 20 20   int bFrom,     
15e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 72 67 75   /* True if argu
15e30 6d 65 6e 74 20 69 46 72 6f 6d 20 69 73 20 76 61  ment iFrom is va
15e40 6c 69 64 20 2a 2f 0a 20 20 69 36 34 20 69 46 72  lid */.  i64 iFr
15e50 6f 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  om              
15e60 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 76 61           /* Adva
15e70 6e 63 65 20 61 74 20 6c 65 61 73 74 20 61 73 20  nce at least as 
15e80 66 61 72 20 61 73 20 74 68 69 73 20 2a 2f 0a 29  far as this */.)
15e90 7b 0a 20 20 69 6e 74 20 62 55 73 65 46 72 6f 6d  {.  int bUseFrom
15ea0 20 3d 20 62 46 72 6f 6d 3b 0a 20 20 61 73 73 65   = bFrom;.  asse
15eb0 72 74 28 20 70 49 74 65 72 2d 3e 62 61 73 65 2e  rt( pIter->base.
15ec0 62 45 6f 66 3d 3d 30 20 29 3b 0a 20 20 77 68 69  bEof==0 );.  whi
15ed0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
15ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
15ef0 69 46 69 72 73 74 20 3d 20 70 49 74 65 72 2d 3e  iFirst = pIter->
15f00 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73 74  aFirst[1].iFirst
15f10 3b 0a 20 20 20 20 69 6e 74 20 62 4e 65 77 54 65  ;.    int bNewTe
15f20 72 6d 20 3d 20 30 3b 0a 20 20 20 20 46 74 73 35  rm = 0;.    Fts5
15f30 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20  SegIter *pSeg = 
15f40 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69 46 69  &pIter->aSeg[iFi
15f50 72 73 74 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  rst];.    assert
15f60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
15f70 4f 4b 20 29 3b 0a 20 20 20 20 69 66 28 20 62 55  OK );.    if( bU
15f80 73 65 46 72 6f 6d 20 26 26 20 70 53 65 67 2d 3e  seFrom && pSeg->
15f90 70 44 6c 69 64 78 20 29 7b 0a 20 20 20 20 20 20  pDlidx ){.      
15fa0 66 74 73 35 53 65 67 49 74 65 72 4e 65 78 74 46  fts5SegIterNextF
15fb0 72 6f 6d 28 70 2c 20 70 53 65 67 2c 20 69 46 72  rom(p, pSeg, iFr
15fc0 6f 6d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  om);.    }else{.
15fd0 20 20 20 20 20 20 70 53 65 67 2d 3e 78 4e 65 78        pSeg->xNex
15fe0 74 28 70 2c 20 70 53 65 67 2c 20 26 62 4e 65 77  t(p, pSeg, &bNew
15ff0 54 65 72 6d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Term);.    }..  
16000 20 20 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61    if( pSeg->pLea
16010 66 3d 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d  f==0 || bNewTerm
16020 20 0a 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75   .     || fts5Mu
16030 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
16040 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73  wid(pIter, iFirs
16050 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 29 7b  t, &pSeg).    ){
16060 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
16070 49 74 65 72 41 64 76 61 6e 63 65 64 28 70 2c 20  IterAdvanced(p, 
16080 70 49 74 65 72 2c 20 69 46 69 72 73 74 2c 20 31  pIter, iFirst, 1
16090 29 3b 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c  );.      fts5Mul
160a0 74 69 49 74 65 72 53 65 74 45 6f 66 28 70 49 74  tiIterSetEof(pIt
160b0 65 72 29 3b 0a 20 20 20 20 20 20 70 53 65 67 20  er);.      pSeg 
160c0 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 70  = &pIter->aSeg[p
160d0 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
160e0 69 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69  iFirst];.      i
160f0 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d 3d  f( pSeg->pLeaf==
16100 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  0 ) return;.    
16110 7d 0a 0a 20 20 20 20 66 74 73 35 41 73 73 65 72  }..    fts5Asser
16120 74 4d 75 6c 74 69 49 74 65 72 53 65 74 75 70 28  tMultiIterSetup(
16130 70 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20 61  p, pIter);.    a
16140 73 73 65 72 74 28 20 70 53 65 67 3d 3d 26 70 49  ssert( pSeg==&pI
16150 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
16160 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
16170 74 5d 20 26 26 20 70 53 65 67 2d 3e 70 4c 65 61  t] && pSeg->pLea
16180 66 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  f );.    if( pIt
16190 65 72 2d 3e 62 53 6b 69 70 45 6d 70 74 79 3d 3d  er->bSkipEmpty==
161a0 30 20 7c 7c 20 70 53 65 67 2d 3e 6e 50 6f 73 20  0 || pSeg->nPos 
161b0 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
161c0 78 53 65 74 4f 75 74 70 75 74 73 28 70 49 74 65  xSetOutputs(pIte
161d0 72 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  r, pSeg);.      
161e0 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
161f0 20 20 62 55 73 65 46 72 6f 6d 20 3d 20 30 3b 0a    bUseFrom = 0;.
16200 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
16210 69 64 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  id fts5MultiIter
16220 4e 65 78 74 32 28 0a 20 20 46 74 73 35 49 6e 64  Next2(.  Fts5Ind
16230 65 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 49 74  ex *p, .  Fts5It
16240 65 72 20 2a 70 49 74 65 72 2c 0a 20 20 69 6e 74  er *pIter,.  int
16250 20 2a 70 62 4e 65 77 54 65 72 6d 20 20 20 20 20   *pbNewTerm     
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16270 4f 55 54 3a 20 54 72 75 65 20 69 66 20 2a 6d 69  OUT: True if *mi
16280 67 68 74 2a 20 62 65 20 6e 65 77 20 74 65 72 6d  ght* be new term
16290 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
162a0 20 70 49 74 65 72 2d 3e 62 53 6b 69 70 45 6d 70   pIter->bSkipEmp
162b0 74 79 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  ty );.  if( p->r
162c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
162d0 20 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d      *pbNewTerm =
162e0 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   0;.    do{.    
162f0 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d 20 70    int iFirst = p
16300 49 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e  Iter->aFirst[1].
16310 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20 46 74  iFirst;.      Ft
16320 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
16330 3d 20 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 69  = &pIter->aSeg[i
16340 46 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 69 6e  First];.      in
16350 74 20 62 4e 65 77 54 65 72 6d 20 3d 20 30 3b 0a  t bNewTerm = 0;.
16360 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
16370 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
16380 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e 78  );.      pSeg->x
16390 4e 65 78 74 28 70 2c 20 70 53 65 67 2c 20 26 62  Next(p, pSeg, &b
163a0 4e 65 77 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  NewTerm);.      
163b0 69 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 3d  if( pSeg->pLeaf=
163c0 3d 30 20 7c 7c 20 62 4e 65 77 54 65 72 6d 20 0a  =0 || bNewTerm .
163d0 20 20 20 20 20 20 20 7c 7c 20 66 74 73 35 4d 75         || fts5Mu
163e0 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 52 6f  ltiIterAdvanceRo
163f0 77 69 64 28 70 49 74 65 72 2c 20 69 46 69 72 73  wid(pIter, iFirs
16400 74 2c 20 26 70 53 65 67 29 0a 20 20 20 20 20 20  t, &pSeg).      
16410 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73 35 4d  ){.        fts5M
16420 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63 65 64  ultiIterAdvanced
16430 28 70 2c 20 70 49 74 65 72 2c 20 69 46 69 72 73  (p, pIter, iFirs
16440 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 66  t, 1);.        f
16450 74 73 35 4d 75 6c 74 69 49 74 65 72 53 65 74 45  ts5MultiIterSetE
16460 6f 66 28 70 49 74 65 72 29 3b 0a 20 20 20 20 20  of(pIter);.     
16470 20 20 20 2a 70 62 4e 65 77 54 65 72 6d 20 3d 20     *pbNewTerm = 
16480 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
16490 20 66 74 73 35 41 73 73 65 72 74 4d 75 6c 74 69   fts5AssertMulti
164a0 49 74 65 72 53 65 74 75 70 28 70 2c 20 70 49 74  IterSetup(p, pIt
164b0 65 72 29 3b 0a 0a 20 20 20 20 7d 77 68 69 6c 65  er);..    }while
164c0 28 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49  ( fts5MultiIterI
164d0 73 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29  sEmpty(p, pIter)
164e0 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69   );.  }.}..stati
164f0 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53  c void fts5IterS
16500 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6f 70 28 46  etOutputs_Noop(F
16510 74 73 35 49 74 65 72 20 2a 70 55 6e 75 73 65 64  ts5Iter *pUnused
16520 31 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  1, Fts5SegIter *
16530 70 55 6e 75 73 65 64 32 29 7b 0a 20 20 55 4e 55  pUnused2){.  UNU
16540 53 45 44 5f 50 41 52 41 4d 32 28 70 55 6e 75 73  SED_PARAM2(pUnus
16550 65 64 31 2c 20 70 55 6e 75 73 65 64 32 29 3b 0a  ed1, pUnused2);.
16560 7d 0a 0a 73 74 61 74 69 63 20 46 74 73 35 49 74  }..static Fts5It
16570 65 72 20 2a 66 74 73 35 4d 75 6c 74 69 49 74 65  er *fts5MultiIte
16580 72 41 6c 6c 6f 63 28 0a 20 20 46 74 73 35 49 6e  rAlloc(.  Fts5In
16590 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
165a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
165b0 35 20 62 61 63 6b 65 6e 64 20 74 6f 20 69 74 65  5 backend to ite
165c0 72 61 74 65 20 77 69 74 68 69 6e 20 2a 2f 0a 20  rate within */. 
165d0 20 69 6e 74 20 6e 53 65 67 0a 29 7b 0a 20 20 46   int nSeg.){.  F
165e0 74 73 35 49 74 65 72 20 2a 70 4e 65 77 3b 0a 20  ts5Iter *pNew;. 
165f0 20 69 6e 74 20 6e 53 6c 6f 74 3b 20 20 20 20 20   int nSlot;     
16600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16610 20 2f 2a 20 50 6f 77 65 72 20 6f 66 20 74 77 6f   /* Power of two
16620 20 3e 3d 20 6e 53 65 67 20 2a 2f 0a 0a 20 20 66   >= nSeg */..  f
16630 6f 72 28 6e 53 6c 6f 74 3d 32 3b 20 6e 53 6c 6f  or(nSlot=2; nSlo
16640 74 3c 6e 53 65 67 3b 20 6e 53 6c 6f 74 3d 6e 53  t<nSeg; nSlot=nS
16650 6c 6f 74 2a 32 29 3b 0a 20 20 70 4e 65 77 20 3d  lot*2);.  pNew =
16660 20 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63 28 70   fts5IdxMalloc(p
16670 2c 20 0a 20 20 20 20 20 20 73 69 7a 65 6f 66 28  , .      sizeof(
16680 46 74 73 35 49 74 65 72 29 20 2b 20 20 20 20 20  Fts5Iter) +     
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
166a0 70 4e 65 77 20 2a 2f 0a 20 20 20 20 20 20 73 69  pNew */.      si
166b0 7a 65 6f 66 28 46 74 73 35 53 65 67 49 74 65 72  zeof(Fts5SegIter
166c0 29 20 2a 20 28 6e 53 6c 6f 74 2d 31 29 20 2b 20  ) * (nSlot-1) + 
166d0 20 20 2f 2a 20 70 4e 65 77 2d 3e 61 53 65 67 5b    /* pNew->aSeg[
166e0 5d 20 2a 2f 0a 20 20 20 20 20 20 73 69 7a 65 6f  ] */.      sizeo
166f0 66 28 46 74 73 35 43 52 65 73 75 6c 74 29 20 2a  f(Fts5CResult) *
16700 20 6e 53 6c 6f 74 20 20 20 20 20 20 20 20 20 2f   nSlot         /
16710 2a 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 5b 5d  * pNew->aFirst[]
16720 20 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 70   */.  );.  if( p
16730 4e 65 77 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  New ){.    pNew-
16740 3e 6e 53 65 67 20 3d 20 6e 53 6c 6f 74 3b 0a 20  >nSeg = nSlot;. 
16750 20 20 20 70 4e 65 77 2d 3e 61 46 69 72 73 74 20     pNew->aFirst 
16760 3d 20 28 46 74 73 35 43 52 65 73 75 6c 74 2a 29  = (Fts5CResult*)
16770 26 70 4e 65 77 2d 3e 61 53 65 67 5b 6e 53 6c 6f  &pNew->aSeg[nSlo
16780 74 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 70 49  t];.    pNew->pI
16790 6e 64 65 78 20 3d 20 70 3b 0a 20 20 20 20 70 4e  ndex = p;.    pN
167a0 65 77 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  ew->xSetOutputs 
167b0 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
167c0 70 75 74 73 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 20  puts_Noop;.  }. 
167d0 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
167e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
167f0 35 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b  5PoslistCallback
16800 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
16810 55 6e 75 73 65 64 2c 20 0a 20 20 76 6f 69 64 20  Unused, .  void 
16820 2a 70 43 6f 6e 74 65 78 74 2c 20 0a 20 20 63 6f  *pContext, .  co
16830 6e 73 74 20 75 38 20 2a 70 43 68 75 6e 6b 2c 20  nst u8 *pChunk, 
16840 69 6e 74 20 6e 43 68 75 6e 6b 0a 29 7b 0a 20 20  int nChunk.){.  
16850 55 4e 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e  UNUSED_PARAM(pUn
16860 75 73 65 64 29 3b 0a 20 20 61 73 73 65 72 74 5f  used);.  assert_
16870 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30 20 29 3b  nc( nChunk>=0 );
16880 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b 3e 30 20  .  if( nChunk>0 
16890 29 7b 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ){.    fts5Buffe
168a0 72 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28  rSafeAppendBlob(
168b0 28 46 74 73 35 42 75 66 66 65 72 2a 29 70 43 6f  (Fts5Buffer*)pCo
168c0 6e 74 65 78 74 2c 20 70 43 68 75 6e 6b 2c 20 6e  ntext, pChunk, n
168d0 43 68 75 6e 6b 29 3b 0a 20 20 7d 0a 7d 0a 0a 74  Chunk);.  }.}..t
168e0 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 6f  ypedef struct Po
168f0 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
16900 20 50 6f 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b   PoslistCallback
16910 43 74 78 3b 0a 73 74 72 75 63 74 20 50 6f 73 6c  Ctx;.struct Posl
16920 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78 20 7b  istCallbackCtx {
16930 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
16940 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Buf;            
16950 20 20 20 2f 2a 20 41 70 70 65 6e 64 20 74 6f 20     /* Append to 
16960 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 0a 20  this buffer */. 
16970 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
16980 6c 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  lset;           
16990 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
169a0 63 68 65 73 20 74 6f 20 74 68 69 73 20 63 6f 6c  ches to this col
169b0 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 53 74  umn */.  int eSt
169c0 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
169d0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 65 20           /* See 
169e0 61 62 6f 76 65 20 2a 2f 0a 7d 3b 0a 0a 74 79 70  above */.};..typ
169f0 65 64 65 66 20 73 74 72 75 63 74 20 50 6f 73 6c  edef struct Posl
16a00 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 50 6f  istOffsetsCtx Po
16a10 73 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 3b  slistOffsetsCtx;
16a20 0a 73 74 72 75 63 74 20 50 6f 73 6c 69 73 74 4f  .struct PoslistO
16a30 66 66 73 65 74 73 43 74 78 20 7b 0a 20 20 46 74  ffsetsCtx {.  Ft
16a40 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 3b 20  s5Buffer *pBuf; 
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16a60 20 41 70 70 65 6e 64 20 74 6f 20 74 68 69 73 20   Append to this 
16a70 62 75 66 66 65 72 20 2a 2f 0a 20 20 46 74 73 35  buffer */.  Fts5
16a80 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73 65 74 3b  Colset *pColset;
16a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16aa0 65 73 74 72 69 63 74 20 6d 61 74 63 68 65 73 20  estrict matches 
16ab0 74 6f 20 74 68 69 73 20 63 6f 6c 75 6d 6e 20 2a  to this column *
16ac0 2f 0a 20 20 69 6e 74 20 69 52 65 61 64 3b 0a 20  /.  int iRead;. 
16ad0 20 69 6e 74 20 69 57 72 69 74 65 3b 0a 7d 3b 0a   int iWrite;.};.
16ae0 0a 2f 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 4d 61 6b  ./*.** TODO: Mak
16af0 65 20 74 68 69 73 20 6d 6f 72 65 20 65 66 66 69  e this more effi
16b00 63 69 65 6e 74 21 0a 2a 2f 0a 73 74 61 74 69 63  cient!.*/.static
16b10 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 43 6f   int fts5IndexCo
16b20 6c 73 65 74 54 65 73 74 28 46 74 73 35 43 6f 6c  lsetTest(Fts5Col
16b30 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 69 6e  set *pColset, in
16b40 74 20 69 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69  t iCol){.  int i
16b50 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
16b60 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b  Colset->nCol; i+
16b70 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  +){.    if( pCol
16b80 73 65 74 2d 3e 61 69 43 6f 6c 5b 69 5d 3d 3d 69  set->aiCol[i]==i
16b90 43 6f 6c 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  Col ) return 1;.
16ba0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
16bb0 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  }..static void f
16bc0 74 73 35 50 6f 73 6c 69 73 74 4f 66 66 73 65 74  ts5PoslistOffset
16bd0 73 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  sCallback(.  Fts
16be0 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
16bf0 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65   .  void *pConte
16c00 78 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20  xt, .  const u8 
16c10 2a 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68  *pChunk, int nCh
16c20 75 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74  unk.){.  Poslist
16c30 4f 66 66 73 65 74 73 43 74 78 20 2a 70 43 74 78  OffsetsCtx *pCtx
16c40 20 3d 20 28 50 6f 73 6c 69 73 74 4f 66 66 73 65   = (PoslistOffse
16c50 74 73 43 74 78 2a 29 70 43 6f 6e 74 65 78 74 3b  tsCtx*)pContext;
16c60 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 28  .  UNUSED_PARAM(
16c70 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73 65  pUnused);.  asse
16c80 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d 30  rt_nc( nChunk>=0
16c90 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e 6b   );.  if( nChunk
16ca0 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 20  >0 ){.    int i 
16cb0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
16cc0 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  i<nChunk ){.    
16cd0 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20 20 20    int iVal;.    
16ce0 20 20 69 20 2b 3d 20 66 74 73 35 47 65 74 56 61    i += fts5GetVa
16cf0 72 69 6e 74 33 32 28 26 70 43 68 75 6e 6b 5b 69  rint32(&pChunk[i
16d00 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 20 20  ], iVal);.      
16d10 69 56 61 6c 20 2b 3d 20 70 43 74 78 2d 3e 69 52  iVal += pCtx->iR
16d20 65 61 64 20 2d 20 32 3b 0a 20 20 20 20 20 20 70  ead - 2;.      p
16d30 43 74 78 2d 3e 69 52 65 61 64 20 3d 20 69 56 61  Ctx->iRead = iVa
16d40 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73  l;.      if( fts
16d50 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65 73 74  5IndexColsetTest
16d60 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74 2c 20  (pCtx->pColset, 
16d70 69 56 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iVal) ){.       
16d80 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
16d90 70 70 65 6e 64 56 61 72 69 6e 74 28 70 43 74 78  ppendVarint(pCtx
16da0 2d 3e 70 42 75 66 2c 20 69 56 61 6c 20 2b 20 32  ->pBuf, iVal + 2
16db0 20 2d 20 70 43 74 78 2d 3e 69 57 72 69 74 65 29   - pCtx->iWrite)
16dc0 3b 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e  ;.        pCtx->
16dd0 69 57 72 69 74 65 20 3d 20 69 56 61 6c 3b 0a 20  iWrite = iVal;. 
16de0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
16df0 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16e00 66 74 73 35 50 6f 73 6c 69 73 74 46 69 6c 74 65  fts5PoslistFilte
16e10 72 43 61 6c 6c 62 61 63 6b 28 0a 20 20 46 74 73  rCallback(.  Fts
16e20 35 49 6e 64 65 78 20 2a 70 55 6e 75 73 65 64 2c  5Index *pUnused,
16e30 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6e 74 65 78  .  void *pContex
16e40 74 2c 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  t, .  const u8 *
16e50 70 43 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75  pChunk, int nChu
16e60 6e 6b 0a 29 7b 0a 20 20 50 6f 73 6c 69 73 74 43  nk.){.  PoslistC
16e70 61 6c 6c 62 61 63 6b 43 74 78 20 2a 70 43 74 78  allbackCtx *pCtx
16e80 20 3d 20 28 50 6f 73 6c 69 73 74 43 61 6c 6c 62   = (PoslistCallb
16e90 61 63 6b 43 74 78 2a 29 70 43 6f 6e 74 65 78 74  ackCtx*)pContext
16ea0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
16eb0 28 70 55 6e 75 73 65 64 29 3b 0a 20 20 61 73 73  (pUnused);.  ass
16ec0 65 72 74 5f 6e 63 28 20 6e 43 68 75 6e 6b 3e 3d  ert_nc( nChunk>=
16ed0 30 20 29 3b 0a 20 20 69 66 28 20 6e 43 68 75 6e  0 );.  if( nChun
16ee0 6b 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  k>0 ){.    /* Se
16ef0 61 72 63 68 20 74 68 72 6f 75 67 68 20 74 6f 20  arch through to 
16f00 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 76  find the first v
16f10 61 72 69 6e 74 20 77 69 74 68 20 76 61 6c 75 65  arint with value
16f20 20 31 2e 20 54 68 69 73 20 69 73 20 74 68 65 0a   1. This is the.
16f30 20 20 20 20 2a 2a 20 73 74 61 72 74 20 6f 66 20      ** start of 
16f40 74 68 65 20 6e 65 78 74 20 63 6f 6c 75 6d 6e 73  the next columns
16f50 20 68 69 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e   hits. */.    in
16f60 74 20 69 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  t i = 0;.    int
16f70 20 69 53 74 61 72 74 20 3d 20 30 3b 0a 0a 20 20   iStart = 0;..  
16f80 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53 74 61    if( pCtx->eSta
16f90 74 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  te==2 ){.      i
16fa0 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 66  nt iCol;.      f
16fb0 74 73 35 46 61 73 74 47 65 74 56 61 72 69 6e 74  ts5FastGetVarint
16fc0 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20 69 43  32(pChunk, i, iC
16fd0 6f 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ol);.      if( f
16fe0 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54 65  ts5IndexColsetTe
16ff0 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65 74  st(pCtx->pColset
17000 2c 20 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20  , iCol) ){.     
17010 20 20 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20     pCtx->eState 
17020 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 66 74 73  = 1;.        fts
17030 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
17040 64 56 61 72 69 6e 74 28 70 43 74 78 2d 3e 70 42  dVarint(pCtx->pB
17050 75 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65  uf, 1);.      }e
17060 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 74  lse{.        pCt
17070 78 2d 3e 65 53 74 61 74 65 20 3d 20 30 3b 0a 20  x->eState = 0;. 
17080 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
17090 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 77 68 69    do {.      whi
170a0 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20 26 26 20  le( i<nChunk && 
170b0 70 43 68 75 6e 6b 5b 69 5d 21 3d 30 78 30 31 20  pChunk[i]!=0x01 
170c0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
170d0 28 20 70 43 68 75 6e 6b 5b 69 5d 20 26 20 30 78  ( pChunk[i] & 0x
170e0 38 30 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20  80 ) i++;.      
170f0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20    i++;.      }. 
17100 20 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65       if( pCtx->e
17110 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20  State ){.       
17120 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
17130 70 70 65 6e 64 42 6c 6f 62 28 70 43 74 78 2d 3e  ppendBlob(pCtx->
17140 70 42 75 66 2c 20 26 70 43 68 75 6e 6b 5b 69 53  pBuf, &pChunk[iS
17150 74 61 72 74 5d 2c 20 69 2d 69 53 74 61 72 74 29  tart], i-iStart)
17160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17170 69 66 28 20 69 3c 6e 43 68 75 6e 6b 20 29 7b 0a  if( i<nChunk ){.
17180 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
17190 3b 0a 20 20 20 20 20 20 20 20 69 53 74 61 72 74  ;.        iStart
171a0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 69 2b   = i;.        i+
171b0 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  +;.        if( i
171c0 3e 3d 6e 43 68 75 6e 6b 20 29 7b 0a 20 20 20 20  >=nChunk ){.    
171d0 20 20 20 20 20 20 70 43 74 78 2d 3e 65 53 74 61        pCtx->eSta
171e0 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
171f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17200 20 66 74 73 35 46 61 73 74 47 65 74 56 61 72 69   fts5FastGetVari
17210 6e 74 33 32 28 70 43 68 75 6e 6b 2c 20 69 2c 20  nt32(pChunk, i, 
17220 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  iCol);.         
17230 20 70 43 74 78 2d 3e 65 53 74 61 74 65 20 3d 20   pCtx->eState = 
17240 66 74 73 35 49 6e 64 65 78 43 6f 6c 73 65 74 54  fts5IndexColsetT
17250 65 73 74 28 70 43 74 78 2d 3e 70 43 6f 6c 73 65  est(pCtx->pColse
17260 74 2c 20 69 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, iCol);.      
17270 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e 65 53      if( pCtx->eS
17280 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  tate ){.        
17290 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61      fts5BufferSa
172a0 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 70 43 74  feAppendBlob(pCt
172b0 78 2d 3e 70 42 75 66 2c 20 26 70 43 68 75 6e 6b  x->pBuf, &pChunk
172c0 5b 69 53 74 61 72 74 5d 2c 20 69 2d 69 53 74 61  [iStart], i-iSta
172d0 72 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rt);.           
172e0 20 69 53 74 61 72 74 20 3d 20 69 3b 0a 20 20 20   iStart = i;.   
172f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17300 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
17310 77 68 69 6c 65 28 20 69 3c 6e 43 68 75 6e 6b 20  while( i<nChunk 
17320 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  );.  }.}..static
17330 20 76 6f 69 64 20 66 74 73 35 43 68 75 6e 6b 49   void fts5ChunkI
17340 74 65 72 61 74 65 28 0a 20 20 46 74 73 35 49 6e  terate(.  Fts5In
17350 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
17360 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
17370 65 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46  ex object */.  F
17380 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
17390 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
173a0 2a 20 50 6f 73 6c 69 73 74 20 6f 66 20 74 68 69  * Poslist of thi
173b0 73 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  s iterator */.  
173c0 76 6f 69 64 20 2a 70 43 74 78 2c 20 20 20 20 20  void *pCtx,     
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173e0 2f 2a 20 43 6f 6e 74 65 78 74 20 70 6f 69 6e 74  /* Context point
173f0 65 72 20 66 6f 72 20 78 43 68 75 6e 6b 20 63 61  er for xChunk ca
17400 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f 69 64  llback */.  void
17410 20 28 2a 78 43 68 75 6e 6b 29 28 46 74 73 35 49   (*xChunk)(Fts5I
17420 6e 64 65 78 2a 2c 20 76 6f 69 64 2a 2c 20 63 6f  ndex*, void*, co
17430 6e 73 74 20 75 38 2a 2c 20 69 6e 74 29 0a 29 7b  nst u8*, int).){
17440 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20 70 53  .  int nRem = pS
17450 65 67 2d 3e 6e 50 6f 73 3b 20 20 20 20 20 20 20  eg->nPos;       
17460 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
17470 62 79 74 65 73 20 73 74 69 6c 6c 20 74 6f 20 63  bytes still to c
17480 6f 6d 65 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  ome */.  Fts5Dat
17490 61 20 2a 70 44 61 74 61 20 3d 20 30 3b 0a 20 20  a *pData = 0;.  
174a0 75 38 20 2a 70 43 68 75 6e 6b 20 3d 20 26 70 53  u8 *pChunk = &pS
174b0 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b 70 53 65  eg->pLeaf->p[pSe
174c0 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 5d 3b  g->iLeafOffset];
174d0 0a 20 20 69 6e 74 20 6e 43 68 75 6e 6b 20 3d 20  .  int nChunk = 
174e0 4d 49 4e 28 6e 52 65 6d 2c 20 70 53 65 67 2d 3e  MIN(nRem, pSeg->
174f0 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 2d 20  pLeaf->szLeaf - 
17500 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
17510 74 29 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 20 3d  t);.  int pgno =
17520 20 70 53 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f   pSeg->iLeafPgno
17530 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 53 61 76 65  ;.  int pgnoSave
17540 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
17550 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
17560 6f 74 6d 77 6f 72 6b 20 77 69 74 68 20 64 65 74  otmwork with det
17570 61 69 6c 3d 6e 6f 6e 65 20 64 61 74 61 62 61 73  ail=none databas
17580 65 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  es. */.  assert(
17590 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
175a0 74 61 69 6c 21 3d 46 54 53 35 5f 44 45 54 41 49  tail!=FTS5_DETAI
175b0 4c 5f 4e 4f 4e 45 20 29 3b 0a 0a 20 20 69 66 28  L_NONE );..  if(
175c0 20 28 70 53 65 67 2d 3e 66 6c 61 67 73 20 26 20   (pSeg->flags & 
175d0 46 54 53 35 5f 53 45 47 49 54 45 52 5f 52 45 56  FTS5_SEGITER_REV
175e0 45 52 53 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ERSE)==0 ){.    
175f0 70 67 6e 6f 53 61 76 65 20 3d 20 70 67 6e 6f 2b  pgnoSave = pgno+
17600 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  1;.  }..  while(
17610 20 31 20 29 7b 0a 20 20 20 20 78 43 68 75 6e 6b   1 ){.    xChunk
17620 28 70 2c 20 70 43 74 78 2c 20 70 43 68 75 6e 6b  (p, pCtx, pChunk
17630 2c 20 6e 43 68 75 6e 6b 29 3b 0a 20 20 20 20 6e  , nChunk);.    n
17640 52 65 6d 20 2d 3d 20 6e 43 68 75 6e 6b 3b 0a 20  Rem -= nChunk;. 
17650 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
17660 73 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 69  se(pData);.    i
17670 66 28 20 6e 52 65 6d 3c 3d 30 20 29 7b 0a 20 20  f( nRem<=0 ){.  
17680 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
17690 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 67 6e 6f  else{.      pgno
176a0 2b 2b 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20  ++;.      pData 
176b0 3d 20 66 74 73 35 4c 65 61 66 52 65 61 64 28 70  = fts5LeafRead(p
176c0 2c 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52  , FTS5_SEGMENT_R
176d0 4f 57 49 44 28 70 53 65 67 2d 3e 70 53 65 67 2d  OWID(pSeg->pSeg-
176e0 3e 69 53 65 67 69 64 2c 20 70 67 6e 6f 29 29 3b  >iSegid, pgno));
176f0 0a 20 20 20 20 20 20 69 66 28 20 70 44 61 74 61  .      if( pData
17700 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
17710 20 20 20 70 43 68 75 6e 6b 20 3d 20 26 70 44 61     pChunk = &pDa
17720 74 61 2d 3e 70 5b 34 5d 3b 0a 20 20 20 20 20 20  ta->p[4];.      
17730 6e 43 68 75 6e 6b 20 3d 20 4d 49 4e 28 6e 52 65  nChunk = MIN(nRe
17740 6d 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  m, pData->szLeaf
17750 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28   - 4);.      if(
17760 20 70 67 6e 6f 3d 3d 70 67 6e 6f 53 61 76 65 20   pgno==pgnoSave 
17770 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
17780 74 28 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65  t( pSeg->pNextLe
17790 61 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  af==0 );.       
177a0 20 70 53 65 67 2d 3e 70 4e 65 78 74 4c 65 61 66   pSeg->pNextLeaf
177b0 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 20 20   = pData;.      
177c0 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
177d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
177e0 0a 0a 2f 2a 0a 2a 2a 20 49 74 65 72 61 74 6f 72  ../*.** Iterator
177f0 20 70 49 74 65 72 20 63 75 72 72 65 6e 74 6c 79   pIter currently
17800 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 76 61 6c   points to a val
17810 69 64 20 65 6e 74 72 79 20 28 6e 6f 74 20 45 4f  id entry (not EO
17820 46 29 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63  F). This.** func
17830 74 69 6f 6e 20 61 70 70 65 6e 64 73 20 74 68 65  tion appends the
17840 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
17850 61 74 61 20 66 6f 72 20 74 68 65 20 63 75 72 72  ata for the curr
17860 65 6e 74 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20  ent entry to.** 
17870 62 75 66 66 65 72 20 70 42 75 66 2e 20 49 74 20  buffer pBuf. It 
17880 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20  does not make a 
17890 63 6f 70 79 20 6f 66 20 74 68 65 20 70 6f 73 69  copy of the posi
178a0 74 69 6f 6e 2d 6c 69 73 74 20 73 69 7a 65 0a 2a  tion-list size.*
178b0 2a 20 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74  * field..*/.stat
178c0 69 63 20 76 6f 69 64 20 66 74 73 35 53 65 67 69  ic void fts5Segi
178d0 74 65 72 50 6f 73 6c 69 73 74 28 0a 20 20 46 74  terPoslist(.  Ft
178e0 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74  s5Index *p,.  Ft
178f0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 2c  s5SegIter *pSeg,
17900 0a 20 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70  .  Fts5Colset *p
17910 43 6f 6c 73 65 74 2c 0a 20 20 46 74 73 35 42 75  Colset,.  Fts5Bu
17920 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20  ffer *pBuf.){.  
17930 69 66 28 20 30 3d 3d 66 74 73 35 42 75 66 66 65  if( 0==fts5Buffe
17940 72 47 72 6f 77 28 26 70 2d 3e 72 63 2c 20 70 42  rGrow(&p->rc, pB
17950 75 66 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2b 46  uf, pSeg->nPos+F
17960 54 53 35 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41  TS5_DATA_ZERO_PA
17970 44 44 49 4e 47 29 20 29 7b 0a 20 20 20 20 6d 65  DDING) ){.    me
17980 6d 73 65 74 28 26 70 42 75 66 2d 3e 70 5b 70 42  mset(&pBuf->p[pB
17990 75 66 2d 3e 6e 2b 70 53 65 67 2d 3e 6e 50 6f 73  uf->n+pSeg->nPos
179a0 5d 2c 20 30 2c 20 46 54 53 35 5f 44 41 54 41 5f  ], 0, FTS5_DATA_
179b0 5a 45 52 4f 5f 50 41 44 44 49 4e 47 29 3b 0a 20  ZERO_PADDING);. 
179c0 20 20 20 69 66 28 20 70 43 6f 6c 73 65 74 3d 3d     if( pColset==
179d0 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73 35 43  0 ){.      fts5C
179e0 68 75 6e 6b 49 74 65 72 61 74 65 28 70 2c 20 70  hunkIterate(p, p
179f0 53 65 67 2c 20 28 76 6f 69 64 2a 29 70 42 75 66  Seg, (void*)pBuf
17a00 2c 20 66 74 73 35 50 6f 73 6c 69 73 74 43 61 6c  , fts5PoslistCal
17a10 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  lback);.    }els
17a20 65 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  e{.      if( p->
17a30 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
17a40 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46 55  ==FTS5_DETAIL_FU
17a50 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 6f  LL ){.        Po
17a60 73 6c 69 73 74 43 61 6c 6c 62 61 63 6b 43 74 78  slistCallbackCtx
17a70 20 73 43 74 78 3b 0a 20 20 20 20 20 20 20 20 73   sCtx;.        s
17a80 43 74 78 2e 70 42 75 66 20 3d 20 70 42 75 66 3b  Ctx.pBuf = pBuf;
17a90 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 70 43  .        sCtx.pC
17aa0 6f 6c 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b  olset = pColset;
17ab0 0a 20 20 20 20 20 20 20 20 73 43 74 78 2e 65 53  .        sCtx.eS
17ac0 74 61 74 65 20 3d 20 66 74 73 35 49 6e 64 65 78  tate = fts5Index
17ad0 43 6f 6c 73 65 74 54 65 73 74 28 70 43 6f 6c 73  ColsetTest(pCols
17ae0 65 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  et, 0);.        
17af0 61 73 73 65 72 74 28 20 73 43 74 78 2e 65 53 74  assert( sCtx.eSt
17b00 61 74 65 3d 3d 30 20 7c 7c 20 73 43 74 78 2e 65  ate==0 || sCtx.e
17b10 53 74 61 74 65 3d 3d 31 20 29 3b 0a 20 20 20 20  State==1 );.    
17b20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49 74 65      fts5ChunkIte
17b30 72 61 74 65 28 70 2c 20 70 53 65 67 2c 20 28 76  rate(p, pSeg, (v
17b40 6f 69 64 2a 29 26 73 43 74 78 2c 20 66 74 73 35  oid*)&sCtx, fts5
17b50 50 6f 73 6c 69 73 74 46 69 6c 74 65 72 43 61 6c  PoslistFilterCal
17b60 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 7d 65  lback);.      }e
17b70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50 6f 73  lse{.        Pos
17b80 6c 69 73 74 4f 66 66 73 65 74 73 43 74 78 20 73  listOffsetsCtx s
17b90 43 74 78 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  Ctx;.        mem
17ba0 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73 69  set(&sCtx, 0, si
17bb0 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20 20  zeof(sCtx));.   
17bc0 20 20 20 20 20 73 43 74 78 2e 70 42 75 66 20 3d       sCtx.pBuf =
17bd0 20 70 42 75 66 3b 0a 20 20 20 20 20 20 20 20 73   pBuf;.        s
17be0 43 74 78 2e 70 43 6f 6c 73 65 74 20 3d 20 70 43  Ctx.pColset = pC
17bf0 6f 6c 73 65 74 3b 0a 20 20 20 20 20 20 20 20 66  olset;.        f
17c00 74 73 35 43 68 75 6e 6b 49 74 65 72 61 74 65 28  ts5ChunkIterate(
17c10 70 2c 20 70 53 65 67 2c 20 28 76 6f 69 64 2a 29  p, pSeg, (void*)
17c20 26 73 43 74 78 2c 20 66 74 73 35 50 6f 73 6c 69  &sCtx, fts5Posli
17c30 73 74 4f 66 66 73 65 74 73 43 61 6c 6c 62 61 63  stOffsetsCallbac
17c40 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  k);.      }.    
17c50 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  }.  }.}../*.** I
17c60 4e 2f 4f 55 54 20 70 61 72 61 6d 65 74 65 72 20  N/OUT parameter 
17c70 28 2a 70 61 29 20 70 6f 69 6e 74 73 20 74 6f 20  (*pa) points to 
17c80 61 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20  a position list 
17c90 6e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e  n bytes in size.
17ca0 20 49 66 0a 2a 2a 20 74 68 65 20 70 6f 73 69 74   If.** the posit
17cb0 69 6f 6e 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e  ion list contain
17cc0 73 20 65 6e 74 72 69 65 73 20 66 6f 72 20 63 6f  s entries for co
17cd0 6c 75 6d 6e 20 69 43 6f 6c 2c 20 74 68 65 6e 20  lumn iCol, then 
17ce0 28 2a 70 61 29 20 69 73 20 73 65 74 0a 2a 2a 20  (*pa) is set.** 
17cf0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  to point to the 
17d00 73 75 62 2d 70 6f 73 69 74 69 6f 6e 2d 6c 69 73  sub-position-lis
17d10 74 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d  t for that colum
17d20 6e 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72  n and the number
17d30 20 6f 66 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20   of.** bytes in 
17d40 69 74 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c  it returned. Or,
17d50 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
17d60 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74 20 64   position list d
17d70 6f 65 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6e 74 61  oes not.** conta
17d80 69 6e 20 61 6e 79 20 65 6e 74 72 69 65 73 20 66  in any entries f
17d90 6f 72 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 2c 20  or column iCol, 
17da0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 73 74 61  return 0..*/.sta
17db0 74 69 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65  tic int fts5Inde
17dc0 78 45 78 74 72 61 63 74 43 6f 6c 28 0a 20 20 63  xExtractCol(.  c
17dd0 6f 6e 73 74 20 75 38 20 2a 2a 70 61 2c 20 20 20  onst u8 **pa,   
17de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
17df0 2a 20 49 4e 2f 4f 55 54 3a 20 50 6f 69 6e 74 65  * IN/OUT: Pointe
17e00 72 20 74 6f 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  r to poslist */.
17e10 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20    int n,        
17e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e30 20 20 2f 2a 20 49 4e 3a 20 53 69 7a 65 20 6f 66    /* IN: Size of
17e40 20 70 6f 73 6c 69 73 74 20 69 6e 20 62 79 74 65   poslist in byte
17e50 73 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 20  s */.  int iCol 
17e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e70 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e         /* Column
17e80 20 74 6f 20 65 78 74 72 61 63 74 20 66 72 6f 6d   to extract from
17e90 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 29 7b 0a 20   poslist */.){. 
17ea0 20 69 6e 74 20 69 43 75 72 72 65 6e 74 20 3d 20   int iCurrent = 
17eb0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17ec0 20 2f 2a 20 41 6e 79 74 68 69 6e 67 20 62 65 66   /* Anything bef
17ed0 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 30 78  ore the first 0x
17ee0 30 31 20 69 73 20 63 6f 6c 20 30 20 2a 2f 0a 20  01 is col 0 */. 
17ef0 20 63 6f 6e 73 74 20 75 38 20 2a 70 20 3d 20 2a   const u8 *p = *
17f00 70 61 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  pa;.  const u8 *
17f10 70 45 6e 64 20 3d 20 26 70 5b 6e 5d 3b 20 20 20  pEnd = &p[n];   
17f20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 79 74        /* One byt
17f30 65 20 70 61 73 74 20 65 6e 64 20 6f 66 20 70 6f  e past end of po
17f40 73 69 74 69 6f 6e 20 6c 69 73 74 20 2a 2f 0a 0a  sition list */..
17f50 20 20 77 68 69 6c 65 28 20 69 43 6f 6c 3e 69 43    while( iCol>iC
17f60 75 72 72 65 6e 74 20 29 7b 0a 20 20 20 20 2f 2a  urrent ){.    /*
17f70 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72   Advance pointer
17f80 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69 6e   p until it poin
17f90 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61 6e  ts to pEnd or an
17fa0 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74 20   0x01 byte that 
17fb0 69 73 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 70 61  is.    ** not pa
17fc0 72 74 20 6f 66 20 61 20 76 61 72 69 6e 74 2e 20  rt of a varint. 
17fd0 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
17fe0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f 72  not possible for
17ff0 20 61 20 6e 65 67 61 74 69 76 65 0a 20 20 20 20   a negative.    
18000 2a 2a 20 6f 72 20 65 78 74 72 65 6d 65 6c 79 20  ** or extremely 
18010 6c 61 72 67 65 20 76 61 72 69 6e 74 20 74 6f 20  large varint to 
18020 6f 63 63 75 72 20 77 69 74 68 69 6e 20 61 6e 20  occur within an 
18030 75 6e 63 6f 72 72 75 70 74 65 64 20 70 6f 73 69  uncorrupted posi
18040 74 69 6f 6e 20 0a 20 20 20 20 2a 2a 20 6c 69 73  tion .    ** lis
18050 74 2e 20 53 6f 20 74 68 65 20 6c 61 73 74 20 62  t. So the last b
18060 79 74 65 20 6f 66 20 65 61 63 68 20 76 61 72 69  yte of each vari
18070 6e 74 20 6d 61 79 20 62 65 20 61 73 73 75 6d 65  nt may be assume
18080 64 20 74 6f 20 68 61 76 65 20 61 20 63 6c 65 61  d to have a clea
18090 72 0a 20 20 20 20 2a 2a 20 30 78 38 30 20 62 69  r.    ** 0x80 bi
180a0 74 2e 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65  t.  */.    while
180b0 28 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a 20 20  ( *p!=0x01 ){.  
180c0 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20      while( *p++ 
180d0 26 20 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  & 0x80 );.      
180e0 69 66 28 20 70 3e 3d 70 45 6e 64 20 29 20 72 65  if( p>=pEnd ) re
180f0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
18100 20 20 2a 70 61 20 3d 20 70 2b 2b 3b 0a 20 20 20    *pa = p++;.   
18110 20 69 43 75 72 72 65 6e 74 20 3d 20 2a 70 2b 2b   iCurrent = *p++
18120 3b 0a 20 20 20 20 69 66 28 20 69 43 75 72 72 65  ;.    if( iCurre
18130 6e 74 20 26 20 30 78 38 30 20 29 7b 0a 20 20 20  nt & 0x80 ){.   
18140 20 20 20 70 2d 2d 3b 0a 20 20 20 20 20 20 70 20     p--;.      p 
18150 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74  += fts5GetVarint
18160 33 32 28 70 2c 20 69 43 75 72 72 65 6e 74 29 3b  32(p, iCurrent);
18170 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
18180 20 69 43 6f 6c 21 3d 69 43 75 72 72 65 6e 74 20   iCol!=iCurrent 
18190 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
181a0 2a 20 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65  * Advance pointe
181b0 72 20 70 20 75 6e 74 69 6c 20 69 74 20 70 6f 69  r p until it poi
181c0 6e 74 73 20 74 6f 20 70 45 6e 64 20 6f 72 20 61  nts to pEnd or a
181d0 6e 20 30 78 30 31 20 62 79 74 65 20 74 68 61 74  n 0x01 byte that
181e0 20 69 73 0a 20 20 2a 2a 20 6e 6f 74 20 70 61 72   is.  ** not par
181f0 74 20 6f 66 20 61 20 76 61 72 69 6e 74 20 2a 2f  t of a varint */
18200 0a 20 20 77 68 69 6c 65 28 20 70 3c 70 45 6e 64  .  while( p<pEnd
18210 20 26 26 20 2a 70 21 3d 30 78 30 31 20 29 7b 0a   && *p!=0x01 ){.
18220 20 20 20 20 77 68 69 6c 65 28 20 2a 70 2b 2b 20      while( *p++ 
18230 26 20 30 78 38 30 20 29 3b 0a 20 20 7d 0a 0a 20  & 0x80 );.  }.. 
18240 20 72 65 74 75 72 6e 20 70 20 2d 20 28 2a 70 61   return p - (*pa
18250 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
18260 64 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61  d fts5IndexExtra
18270 63 74 43 6f 6c 73 65 74 28 0a 20 20 69 6e 74 20  ctColset(.  int 
18280 2a 70 52 63 2c 0a 20 20 46 74 73 35 43 6f 6c 73  *pRc,.  Fts5Cols
18290 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20 20  et *pColset,    
182a0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 73 65          /* Colse
182b0 74 20 74 6f 20 66 69 6c 74 65 72 20 6f 6e 20 2a  t to filter on *
182c0 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50  /.  const u8 *pP
182d0 6f 73 2c 20 69 6e 74 20 6e 50 6f 73 2c 20 20 20  os, int nPos,   
182e0 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e 20      /* Position 
182f0 6c 69 73 74 20 2a 2f 0a 20 20 46 74 73 35 42 75  list */.  Fts5Bu
18300 66 66 65 72 20 2a 70 42 75 66 20 20 20 20 20 20  ffer *pBuf      
18310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
18320 70 75 74 20 62 75 66 66 65 72 20 2a 2f 0a 29 7b  put buffer */.){
18330 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
18340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
18350 74 20 69 3b 0a 20 20 20 20 66 74 73 35 42 75 66  t i;.    fts5Buf
18360 66 65 72 5a 65 72 6f 28 70 42 75 66 29 3b 0a 20  ferZero(pBuf);. 
18370 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
18380 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3b 20 69 2b 2b  olset->nCol; i++
18390 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75  ){.      const u
183a0 38 20 2a 70 53 75 62 20 3d 20 70 50 6f 73 3b 0a  8 *pSub = pPos;.
183b0 20 20 20 20 20 20 69 6e 74 20 6e 53 75 62 20 3d        int nSub =
183c0 20 66 74 73 35 49 6e 64 65 78 45 78 74 72 61 63   fts5IndexExtrac
183d0 74 43 6f 6c 28 26 70 53 75 62 2c 20 6e 50 6f 73  tCol(&pSub, nPos
183e0 2c 20 70 43 6f 6c 73 65 74 2d 3e 61 69 43 6f 6c  , pColset->aiCol
183f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
18400 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20  nSub ){.        
18410 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
18420 42 6c 6f 62 28 70 52 63 2c 20 70 42 75 66 2c 20  Blob(pRc, pBuf, 
18430 6e 53 75 62 2c 20 70 53 75 62 29 3b 0a 20 20 20  nSub, pSub);.   
18440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
18450 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74 70  ../*.** xSetOutp
18460 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73 65  uts callback use
18470 64 20 62 79 20 64 65 74 61 69 6c 3d 6e 6f 6e 65  d by detail=none
18480 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
18490 69 63 20 76 6f 69 64 20 66 74 73 35 49 74 65 72  ic void fts5Iter
184a0 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e 65 28  SetOutputs_None(
184b0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c  Fts5Iter *pIter,
184c0 20 46 74 73 35 53 65 67 49 74 65 72 20 2a 70 53   Fts5SegIter *pS
184d0 65 67 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  eg){.  assert( p
184e0 49 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43  Iter->pIndex->pC
184f0 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d  onfig->eDetail==
18500 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
18510 20 29 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73   );.  pIter->bas
18520 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67 2d  e.iRowid = pSeg-
18530 3e 69 52 6f 77 69 64 3b 0a 20 20 70 49 74 65 72  >iRowid;.  pIter
18540 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d 20 70  ->base.nData = p
18550 53 65 67 2d 3e 6e 50 6f 73 3b 0a 7d 0a 0a 2f 2a  Seg->nPos;.}../*
18560 0a 2a 2a 20 78 53 65 74 4f 75 74 70 75 74 73 20  .** xSetOutputs 
18570 63 61 6c 6c 62 61 63 6b 20 75 73 65 64 20 62 79  callback used by
18580 20 64 65 74 61 69 6c 3d 66 75 6c 6c 20 61 6e 64   detail=full and
18590 20 64 65 74 61 69 6c 3d 63 6f 6c 20 74 61 62 6c   detail=col tabl
185a0 65 73 20 77 68 65 6e 20 6e 6f 0a 2a 2a 20 63 6f  es when no.** co
185b0 6c 75 6d 6e 20 66 69 6c 74 65 72 73 20 61 72 65  lumn filters are
185c0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 73   specified..*/.s
185d0 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
185e0 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f  terSetOutputs_No
185f0 63 6f 6c 73 65 74 28 46 74 73 35 49 74 65 72 20  colset(Fts5Iter 
18600 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67 49  *pIter, Fts5SegI
18610 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 70 49  ter *pSeg){.  pI
18620 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77 69 64  ter->base.iRowid
18630 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69 64 3b   = pSeg->iRowid;
18640 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e  .  pIter->base.n
18650 44 61 74 61 20 3d 20 70 53 65 67 2d 3e 6e 50 6f  Data = pSeg->nPo
18660 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  s;..  assert( pI
18670 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
18680 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 21 3d 46  nfig->eDetail!=F
18690 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20  TS5_DETAIL_NONE 
186a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74  );.  assert( pIt
186b0 65 72 2d 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29  er->pColset==0 )
186c0 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69  ;..  if( pSeg->i
186d0 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
186e0 3e 6e 50 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65  >nPos<=pSeg->pLe
186f0 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20  af->szLeaf ){.  
18700 20 20 2f 2a 20 41 6c 6c 20 64 61 74 61 20 69 73    /* All data is
18710 20 73 74 6f 72 65 64 20 6f 6e 20 74 68 65 20 63   stored on the c
18720 75 72 72 65 6e 74 20 70 61 67 65 2e 20 50 6f 70  urrent page. Pop
18730 75 6c 61 74 65 20 74 68 65 20 6f 75 74 70 75 74  ulate the output
18740 20 0a 20 20 20 20 2a 2a 20 76 61 72 69 61 62 6c   .    ** variabl
18750 65 73 20 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f  es to point into
18760 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
18770 20 70 61 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f   page object. */
18780 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
18790 2e 70 44 61 74 61 20 3d 20 26 70 53 65 67 2d 3e  .pData = &pSeg->
187a0 70 4c 65 61 66 2d 3e 70 5b 70 53 65 67 2d 3e 69  pLeaf->p[pSeg->i
187b0 4c 65 61 66 4f 66 66 73 65 74 5d 3b 0a 20 20 7d  LeafOffset];.  }
187c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
187d0 20 64 61 74 61 20 69 73 20 64 69 73 74 72 69 62   data is distrib
187e0 75 74 65 64 20 6f 76 65 72 20 74 77 6f 20 6f 72  uted over two or
187f0 20 6d 6f 72 65 20 70 61 67 65 73 2e 20 43 6f 70   more pages. Cop
18800 79 20 69 74 20 69 6e 74 6f 20 74 68 65 0a 20 20  y it into the.  
18810 20 20 2a 2a 20 46 74 73 35 49 74 65 72 2e 70 6f    ** Fts5Iter.po
18820 73 6c 69 73 74 20 62 75 66 66 65 72 20 61 6e 64  slist buffer and
18830 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6f 75   then set the ou
18840 74 70 75 74 20 70 6f 69 6e 74 65 72 20 74 6f 20  tput pointer to 
18850 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74 6f 20  point.    ** to 
18860 74 68 69 73 20 62 75 66 66 65 72 2e 20 20 2a 2f  this buffer.  */
18870 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a  .    fts5BufferZ
18880 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c  ero(&pIter->posl
18890 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35 53 65  ist);.    fts5Se
188a0 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70 49 74  giterPoslist(pIt
188b0 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53 65 67  er->pIndex, pSeg
188c0 2c 20 30 2c 20 26 70 49 74 65 72 2d 3e 70 6f 73  , 0, &pIter->pos
188d0 6c 69 73 74 29 3b 0a 20 20 20 20 70 49 74 65 72  list);.    pIter
188e0 2d 3e 62 61 73 65 2e 70 44 61 74 61 20 3d 20 70  ->base.pData = p
188f0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b  Iter->poslist.p;
18900 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53  .  }.}../*.** xS
18910 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61  etOutputs callba
18920 63 6b 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  ck used when the
18930 20 46 74 73 35 43 6f 6c 73 65 74 20 6f 62 6a 65   Fts5Colset obje
18940 63 74 20 68 61 73 20 6e 43 6f 6c 3d 3d 30 20 28  ct has nCol==0 (
18950 6d 61 74 63 68 0a 2a 2a 20 61 67 61 69 6e 73 74  match.** against
18960 20 6e 6f 20 63 6f 6c 75 6d 6e 73 20 61 74 20 61   no columns at a
18970 6c 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ll)..*/.static v
18980 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
18990 75 74 70 75 74 73 5f 5a 65 72 6f 43 6f 6c 73 65  utputs_ZeroColse
189a0 74 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  t(Fts5Iter *pIte
189b0 72 2c 20 46 74 73 35 53 65 67 49 74 65 72 20 2a  r, Fts5SegIter *
189c0 70 53 65 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f  pSeg){.  UNUSED_
189d0 50 41 52 41 4d 28 70 53 65 67 29 3b 0a 20 20 70  PARAM(pSeg);.  p
189e0 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
189f0 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78   = 0;.}../*.** x
18a00 53 65 74 4f 75 74 70 75 74 73 20 63 61 6c 6c 62  SetOutputs callb
18a10 61 63 6b 20 75 73 65 64 20 62 79 20 64 65 74 61  ack used by deta
18a20 69 6c 3d 63 6f 6c 20 77 68 65 6e 20 74 68 65 72  il=col when ther
18a30 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69  e is a column fi
18a40 6c 74 65 72 0a 2a 2a 20 61 6e 64 20 74 68 65 72  lter.** and ther
18a50 65 20 61 72 65 20 31 30 30 20 6f 72 20 6d 6f 72  e are 100 or mor
18a60 65 20 63 6f 6c 75 6d 6e 73 2e 20 41 6c 73 6f 20  e columns. Also 
18a70 63 61 6c 6c 65 64 20 61 73 20 61 20 66 61 6c 6c  called as a fall
18a80 62 61 63 6b 20 66 72 6f 6d 0a 2a 2a 20 66 74 73  back from.** fts
18a90 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73 5f  5IterSetOutputs_
18aa0 43 6f 6c 31 30 30 20 69 66 20 74 68 65 20 63 6f  Col100 if the co
18ab0 6c 75 6d 6e 2d 6c 69 73 74 20 73 70 61 6e 73 20  lumn-list spans 
18ac0 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 70 61  more than one pa
18ad0 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
18ae0 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f 75  id fts5IterSetOu
18af0 74 70 75 74 73 5f 43 6f 6c 28 46 74 73 35 49 74  tputs_Col(Fts5It
18b00 65 72 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53  er *pIter, Fts5S
18b10 65 67 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20  egIter *pSeg){. 
18b20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28   fts5BufferZero(
18b30 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29  &pIter->poslist)
18b40 3b 0a 20 20 66 74 73 35 53 65 67 69 74 65 72 50  ;.  fts5SegiterP
18b50 6f 73 6c 69 73 74 28 70 49 74 65 72 2d 3e 70 49  oslist(pIter->pI
18b60 6e 64 65 78 2c 20 70 53 65 67 2c 20 70 49 74 65  ndex, pSeg, pIte
18b70 72 2d 3e 70 43 6f 6c 73 65 74 2c 20 26 70 49 74  r->pColset, &pIt
18b80 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20 20  er->poslist);.  
18b90 70 49 74 65 72 2d 3e 62 61 73 65 2e 69 52 6f 77  pIter->base.iRow
18ba0 69 64 20 3d 20 70 53 65 67 2d 3e 69 52 6f 77 69  id = pSeg->iRowi
18bb0 64 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61 73 65  d;.  pIter->base
18bc0 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
18bd0 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 70 49 74  poslist.p;.  pIt
18be0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
18bf0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
18c00 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74  n;.}../*.** xSet
18c10 4f 75 74 70 75 74 73 20 63 61 6c 6c 62 61 63 6b  Outputs callback
18c20 20 75 73 65 64 20 77 68 65 6e 3a 20 0a 2a 2a 0a   used when: .**.
18c30 2a 2a 20 20 20 2a 20 64 65 74 61 69 6c 3d 63 6f  **   * detail=co
18c40 6c 2c 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  l,.**   * there 
18c50 69 73 20 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74  is a column filt
18c60 65 72 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 74  er, and.**   * t
18c70 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  he table contain
18c80 73 20 31 30 30 20 6f 72 20 66 65 77 65 72 20 63  s 100 or fewer c
18c90 6f 6c 75 6d 6e 73 2e 20 0a 2a 2a 0a 2a 2a 20 54  olumns. .**.** T
18ca0 68 65 20 6c 61 73 74 20 70 6f 69 6e 74 20 69 73  he last point is
18cb0 20 74 6f 20 65 6e 73 75 72 65 20 61 6c 6c 20 63   to ensure all c
18cc0 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 73 20 61 72  olumn numbers ar
18cd0 65 20 73 74 6f 72 65 64 20 61 73 20 0a 2a 2a 20  e stored as .** 
18ce0 73 69 6e 67 6c 65 2d 62 79 74 65 20 76 61 72 69  single-byte vari
18cf0 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nts..*/.static v
18d00 6f 69 64 20 66 74 73 35 49 74 65 72 53 65 74 4f  oid fts5IterSetO
18d10 75 74 70 75 74 73 5f 43 6f 6c 31 30 30 28 46 74  utputs_Col100(Ft
18d20 73 35 49 74 65 72 20 2a 70 49 74 65 72 2c 20 46  s5Iter *pIter, F
18d30 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
18d40 29 7b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 49  ){..  assert( pI
18d50 74 65 72 2d 3e 70 49 6e 64 65 78 2d 3e 70 43 6f  ter->pIndex->pCo
18d60 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46  nfig->eDetail==F
18d70 54 53 35 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d  TS5_DETAIL_COLUM
18d80 4e 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  NS );.  assert( 
18d90 70 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 20 29  pIter->pColset )
18da0 3b 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 69  ;..  if( pSeg->i
18db0 4c 65 61 66 4f 66 66 73 65 74 2b 70 53 65 67 2d  LeafOffset+pSeg-
18dc0 3e 6e 50 6f 73 3e 70 53 65 67 2d 3e 70 4c 65 61  >nPos>pSeg->pLea
18dd0 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20  f->szLeaf ){.   
18de0 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70   fts5IterSetOutp
18df0 75 74 73 5f 43 6f 6c 28 70 49 74 65 72 2c 20 70  uts_Col(pIter, p
18e00 53 65 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Seg);.  }else{. 
18e10 20 20 20 75 38 20 2a 61 20 3d 20 28 75 38 2a 29     u8 *a = (u8*)
18e20 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
18e30 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
18e40 74 5d 3b 0a 20 20 20 20 75 38 20 2a 70 45 6e 64  t];.    u8 *pEnd
18e50 20 3d 20 28 75 38 2a 29 26 61 5b 70 53 65 67 2d   = (u8*)&a[pSeg-
18e60 3e 6e 50 6f 73 5d 3b 20 0a 20 20 20 20 69 6e 74  >nPos]; .    int
18e70 20 69 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20   iPrev = 0;.    
18e80 69 6e 74 20 2a 61 69 43 6f 6c 20 3d 20 70 49 74  int *aiCol = pIt
18e90 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 61 69 43  er->pColset->aiC
18ea0 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 2a 61 69 43  ol;.    int *aiC
18eb0 6f 6c 45 6e 64 20 3d 20 26 61 69 43 6f 6c 5b 70  olEnd = &aiCol[p
18ec0 49 74 65 72 2d 3e 70 43 6f 6c 73 65 74 2d 3e 6e  Iter->pColset->n
18ed0 43 6f 6c 5d 3b 0a 0a 20 20 20 20 75 38 20 2a 61  Col];..    u8 *a
18ee0 4f 75 74 20 3d 20 70 49 74 65 72 2d 3e 70 6f 73  Out = pIter->pos
18ef0 6c 69 73 74 2e 70 3b 0a 20 20 20 20 69 6e 74 20  list.p;.    int 
18f00 69 50 72 65 76 4f 75 74 20 3d 20 30 3b 0a 0a 20  iPrevOut = 0;.. 
18f10 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 69     pIter->base.i
18f20 52 6f 77 69 64 20 3d 20 70 53 65 67 2d 3e 69 52  Rowid = pSeg->iR
18f30 6f 77 69 64 3b 0a 0a 20 20 20 20 77 68 69 6c 65  owid;..    while
18f40 28 20 61 3c 70 45 6e 64 20 29 7b 0a 20 20 20 20  ( a<pEnd ){.    
18f50 20 20 69 50 72 65 76 20 2b 3d 20 28 69 6e 74 29    iPrev += (int)
18f60 61 2b 2b 5b 30 5d 20 2d 20 32 3b 0a 20 20 20 20  a++[0] - 2;.    
18f70 20 20 77 68 69 6c 65 28 20 2a 61 69 43 6f 6c 3c    while( *aiCol<
18f80 69 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  iPrev ){.       
18f90 20 61 69 43 6f 6c 2b 2b 3b 0a 20 20 20 20 20 20   aiCol++;.      
18fa0 20 20 69 66 28 20 61 69 43 6f 6c 3d 3d 61 69 43    if( aiCol==aiC
18fb0 6f 6c 45 6e 64 20 29 20 67 6f 74 6f 20 73 65 74  olEnd ) goto set
18fc0 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3b  outputs_col_out;
18fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
18fe0 66 28 20 2a 61 69 43 6f 6c 3d 3d 69 50 72 65 76  f( *aiCol==iPrev
18ff0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 61 4f 75   ){.        *aOu
19000 74 2b 2b 20 3d 20 28 75 38 29 28 28 69 50 72 65  t++ = (u8)((iPre
19010 76 20 2d 20 69 50 72 65 76 4f 75 74 29 20 2b 20  v - iPrevOut) + 
19020 32 29 3b 0a 20 20 20 20 20 20 20 20 69 50 72 65  2);.        iPre
19030 76 4f 75 74 20 3d 20 69 50 72 65 76 3b 0a 20 20  vOut = iPrev;.  
19040 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 73 65 74      }.    }..set
19050 6f 75 74 70 75 74 73 5f 63 6f 6c 5f 6f 75 74 3a  outputs_col_out:
19060 0a 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65  .    pIter->base
19070 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e  .pData = pIter->
19080 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70  poslist.p;.    p
19090 49 74 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61  Iter->base.nData
190a0 20 3d 20 61 4f 75 74 20 2d 20 70 49 74 65 72 2d   = aOut - pIter-
190b0 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 7d 0a  >poslist.p;.  }.
190c0 7d 0a 0a 2f 2a 0a 2a 2a 20 78 53 65 74 4f 75 74  }../*.** xSetOut
190d0 70 75 74 73 20 63 61 6c 6c 62 61 63 6b 20 75 73  puts callback us
190e0 65 64 20 62 79 20 64 65 74 61 69 6c 3d 66 75 6c  ed by detail=ful
190f0 6c 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20  l when there is 
19100 61 20 63 6f 6c 75 6d 6e 20 66 69 6c 74 65 72 2e  a column filter.
19110 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19120 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
19130 74 73 5f 46 75 6c 6c 28 46 74 73 35 49 74 65 72  ts_Full(Fts5Iter
19140 20 2a 70 49 74 65 72 2c 20 46 74 73 35 53 65 67   *pIter, Fts5Seg
19150 49 74 65 72 20 2a 70 53 65 67 29 7b 0a 20 20 46  Iter *pSeg){.  F
19160 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c 73  ts5Colset *pCols
19170 65 74 20 3d 20 70 49 74 65 72 2d 3e 70 43 6f 6c  et = pIter->pCol
19180 73 65 74 3b 0a 20 20 70 49 74 65 72 2d 3e 62 61  set;.  pIter->ba
19190 73 65 2e 69 52 6f 77 69 64 20 3d 20 70 53 65 67  se.iRowid = pSeg
191a0 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 61 73 73  ->iRowid;..  ass
191b0 65 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64  ert( pIter->pInd
191c0 65 78 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65  ex->pConfig->eDe
191d0 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
191e0 4c 5f 46 55 4c 4c 20 29 3b 0a 20 20 61 73 73 65  L_FULL );.  asse
191f0 72 74 28 20 70 43 6f 6c 73 65 74 20 29 3b 0a 0a  rt( pColset );..
19200 20 20 69 66 28 20 70 53 65 67 2d 3e 69 4c 65 61    if( pSeg->iLea
19210 66 4f 66 66 73 65 74 2b 70 53 65 67 2d 3e 6e 50  fOffset+pSeg->nP
19220 6f 73 3c 3d 70 53 65 67 2d 3e 70 4c 65 61 66 2d  os<=pSeg->pLeaf-
19230 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20 2f  >szLeaf ){.    /
19240 2a 20 41 6c 6c 20 64 61 74 61 20 69 73 20 73 74  * All data is st
19250 6f 72 65 64 20 6f 6e 20 74 68 65 20 63 75 72 72  ored on the curr
19260 65 6e 74 20 70 61 67 65 2e 20 50 6f 70 75 6c 61  ent page. Popula
19270 74 65 20 74 68 65 20 6f 75 74 70 75 74 20 0a 20  te the output . 
19280 20 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 20     ** variables 
19290 74 6f 20 70 6f 69 6e 74 20 69 6e 74 6f 20 74 68  to point into th
192a0 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20 70 61  e body of the pa
192b0 67 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  ge object. */.  
192c0 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 20 3d 20    const u8 *a = 
192d0 26 70 53 65 67 2d 3e 70 4c 65 61 66 2d 3e 70 5b  &pSeg->pLeaf->p[
192e0 70 53 65 67 2d 3e 69 4c 65 61 66 4f 66 66 73 65  pSeg->iLeafOffse
192f0 74 5d 3b 0a 20 20 20 20 69 66 28 20 70 43 6f 6c  t];.    if( pCol
19300 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 31 20 29 7b 0a  set->nCol==1 ){.
19310 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61 73        pIter->bas
19320 65 2e 6e 44 61 74 61 20 3d 20 66 74 73 35 49 6e  e.nData = fts5In
19330 64 65 78 45 78 74 72 61 63 74 43 6f 6c 28 26 61  dexExtractCol(&a
19340 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 70 43 6f  , pSeg->nPos,pCo
19350 6c 73 65 74 2d 3e 61 69 43 6f 6c 5b 30 5d 29 3b  lset->aiCol[0]);
19360 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
19370 73 65 2e 70 44 61 74 61 20 3d 20 61 3b 0a 20 20  se.pData = a;.  
19380 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
19390 6e 74 20 2a 70 52 63 20 3d 20 26 70 49 74 65 72  nt *pRc = &pIter
193a0 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3b 0a 20 20  ->pIndex->rc;.  
193b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65      fts5BufferZe
193c0 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f 73 6c 69  ro(&pIter->posli
193d0 73 74 29 3b 0a 20 20 20 20 20 20 66 74 73 35 49  st);.      fts5I
193e0 6e 64 65 78 45 78 74 72 61 63 74 43 6f 6c 73 65  ndexExtractColse
193f0 74 28 70 52 63 2c 20 70 43 6f 6c 73 65 74 2c 20  t(pRc, pColset, 
19400 61 2c 20 70 53 65 67 2d 3e 6e 50 6f 73 2c 20 26  a, pSeg->nPos, &
19410 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b  pIter->poslist);
19420 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 62 61  .      pIter->ba
19430 73 65 2e 70 44 61 74 61 20 3d 20 70 49 74 65 72  se.pData = pIter
19440 2d 3e 70 6f 73 6c 69 73 74 2e 70 3b 0a 20 20 20  ->poslist.p;.   
19450 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 6e     pIter->base.n
19460 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
19470 73 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 7d 0a 20  slist.n;.    }. 
19480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
19490 68 65 20 64 61 74 61 20 69 73 20 64 69 73 74 72  he data is distr
194a0 69 62 75 74 65 64 20 6f 76 65 72 20 74 77 6f 20  ibuted over two 
194b0 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 2e 20 43  or more pages. C
194c0 6f 70 79 20 69 74 20 69 6e 74 6f 20 74 68 65 0a  opy it into the.
194d0 20 20 20 20 2a 2a 20 46 74 73 35 49 74 65 72 2e      ** Fts5Iter.
194e0 70 6f 73 6c 69 73 74 20 62 75 66 66 65 72 20 61  poslist buffer a
194f0 6e 64 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  nd then set the 
19500 6f 75 74 70 75 74 20 70 6f 69 6e 74 65 72 20 74  output pointer t
19510 6f 20 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 20 74  o point.    ** t
19520 6f 20 74 68 69 73 20 62 75 66 66 65 72 2e 20 20  o this buffer.  
19530 2a 2f 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  */.    fts5Buffe
19540 72 5a 65 72 6f 28 26 70 49 74 65 72 2d 3e 70 6f  rZero(&pIter->po
19550 73 6c 69 73 74 29 3b 0a 20 20 20 20 66 74 73 35  slist);.    fts5
19560 53 65 67 69 74 65 72 50 6f 73 6c 69 73 74 28 70  SegiterPoslist(p
19570 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70 53  Iter->pIndex, pS
19580 65 67 2c 20 70 43 6f 6c 73 65 74 2c 20 26 70 49  eg, pColset, &pI
19590 74 65 72 2d 3e 70 6f 73 6c 69 73 74 29 3b 0a 20  ter->poslist);. 
195a0 20 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 70     pIter->base.p
195b0 44 61 74 61 20 3d 20 70 49 74 65 72 2d 3e 70 6f  Data = pIter->po
195c0 73 6c 69 73 74 2e 70 3b 0a 20 20 20 20 70 49 74  slist.p;.    pIt
195d0 65 72 2d 3e 62 61 73 65 2e 6e 44 61 74 61 20 3d  er->base.nData =
195e0 20 70 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2e   pIter->poslist.
195f0 6e 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63  n;.  }.}..static
19600 20 76 6f 69 64 20 66 74 73 35 49 74 65 72 53 65   void fts5IterSe
19610 74 4f 75 74 70 75 74 43 62 28 69 6e 74 20 2a 70  tOutputCb(int *p
19620 52 63 2c 20 46 74 73 35 49 74 65 72 20 2a 70 49  Rc, Fts5Iter *pI
19630 74 65 72 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  ter){.  if( *pRc
19640 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
19650 20 20 20 46 74 73 35 43 6f 6e 66 69 67 20 2a 70     Fts5Config *p
19660 43 6f 6e 66 69 67 20 3d 20 70 49 74 65 72 2d 3e  Config = pIter->
19670 70 49 6e 64 65 78 2d 3e 70 43 6f 6e 66 69 67 3b  pIndex->pConfig;
19680 0a 20 20 20 20 69 66 28 20 70 43 6f 6e 66 69 67  .    if( pConfig
19690 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ->eDetail==FTS5_
196a0 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
196b0 20 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74       pIter->xSet
196c0 4f 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74  Outputs = fts5It
196d0 65 72 53 65 74 4f 75 74 70 75 74 73 5f 4e 6f 6e  erSetOutputs_Non
196e0 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65 6c  e;.    }..    el
196f0 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70 43  se if( pIter->pC
19700 6f 6c 73 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20  olset==0 ){.    
19710 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f 75 74    pIter->xSetOut
19720 70 75 74 73 20 3d 20 66 74 73 35 49 74 65 72 53  puts = fts5IterS
19730 65 74 4f 75 74 70 75 74 73 5f 4e 6f 63 6f 6c 73  etOutputs_Nocols
19740 65 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 65  et;.    }..    e
19750 6c 73 65 20 69 66 28 20 70 49 74 65 72 2d 3e 70  lse if( pIter->p
19760 43 6f 6c 73 65 74 2d 3e 6e 43 6f 6c 3d 3d 30 20  Colset->nCol==0 
19770 29 7b 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e  ){.      pIter->
19780 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20 66 74  xSetOutputs = ft
19790 73 35 49 74 65 72 53 65 74 4f 75 74 70 75 74 73  s5IterSetOutputs
197a0 5f 5a 65 72 6f 43 6f 6c 73 65 74 3b 0a 20 20 20  _ZeroColset;.   
197b0 20 7d 0a 0a 20 20 20 20 65 6c 73 65 20 69 66 28   }..    else if(
197c0 20 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69   pConfig->eDetai
197d0 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 46  l==FTS5_DETAIL_F
197e0 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 70 49 74  ULL ){.      pIt
197f0 65 72 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20  er->xSetOutputs 
19800 3d 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74  = fts5IterSetOut
19810 70 75 74 73 5f 46 75 6c 6c 3b 0a 20 20 20 20 7d  puts_Full;.    }
19820 0a 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  ..    else{.    
19830 20 20 61 73 73 65 72 74 28 20 70 43 6f 6e 66 69    assert( pConfi
19840 67 2d 3e 65 44 65 74 61 69 6c 3d 3d 46 54 53 35  g->eDetail==FTS5
19850 5f 44 45 54 41 49 4c 5f 43 4f 4c 55 4d 4e 53 20  _DETAIL_COLUMNS 
19860 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  );.      if( pCo
19870 6e 66 69 67 2d 3e 6e 43 6f 6c 3c 3d 31 30 30 20  nfig->nCol<=100 
19880 29 7b 0a 20 20 20 20 20 20 20 20 70 49 74 65 72  ){.        pIter
19890 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 20 3d 20  ->xSetOutputs = 
198a0 66 74 73 35 49 74 65 72 53 65 74 4f 75 74 70 75  fts5IterSetOutpu
198b0 74 73 5f 43 6f 6c 31 30 30 3b 0a 20 20 20 20 20  ts_Col100;.     
198c0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
198d0 66 66 65 72 53 69 7a 65 28 70 52 63 2c 20 26 70  fferSize(pRc, &p
198e0 49 74 65 72 2d 3e 70 6f 73 6c 69 73 74 2c 20 70  Iter->poslist, p
198f0 43 6f 6e 66 69 67 2d 3e 6e 43 6f 6c 29 3b 0a 20  Config->nCol);. 
19900 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
19910 20 20 20 20 70 49 74 65 72 2d 3e 78 53 65 74 4f      pIter->xSetO
19920 75 74 70 75 74 73 20 3d 20 66 74 73 35 49 74 65  utputs = fts5Ite
19930 72 53 65 74 4f 75 74 70 75 74 73 5f 43 6f 6c 3b  rSetOutputs_Col;
19940 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
19950 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c   }.}.../*.** All
19960 6f 63 61 74 65 20 61 20 6e 65 77 20 46 74 73 35  ocate a new Fts5
19970 49 74 65 72 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a  Iter object..**.
19980 2a 2a 20 54 68 65 20 6e 65 77 20 6f 62 6a 65 63  ** The new objec
19990 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74  t will be used t
199a0 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
199b0 68 20 64 61 74 61 20 69 6e 20 73 74 72 75 63 74  h data in struct
199c0 75 72 65 20 70 53 74 72 75 63 74 2e 0a 2a 2a 20  ure pStruct..** 
199d0 49 66 20 69 4c 65 76 65 6c 20 69 73 20 2d 76 65  If iLevel is -ve
199e0 2c 20 74 68 65 6e 20 61 6c 6c 20 64 61 74 61 20  , then all data 
199f0 69 6e 20 61 6c 6c 20 73 65 67 6d 65 6e 74 73 20  in all segments 
19a00 69 73 20 6d 65 72 67 65 64 2e 20 4f 72 2c 20 69  is merged. Or, i
19a10 66 20 69 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 7a  f iLevel.** is z
19a20 65 72 6f 20 6f 72 20 67 72 65 61 74 65 72 2c 20  ero or greater, 
19a30 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 66 69  data from the fi
19a40 72 73 74 20 6e 53 65 67 6d 65 6e 74 20 73 65 67  rst nSegment seg
19a50 6d 65 6e 74 73 20 6f 6e 20 6c 65 76 65 6c 20 69  ments on level i
19a60 4c 65 76 65 6c 0a 2a 2a 20 69 73 20 6d 65 72 67  Level.** is merg
19a70 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 74  ed..**.** The it
19a80 65 72 61 74 6f 72 20 69 6e 69 74 69 61 6c 6c 79  erator initially
19a90 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66   points to the f
19aa0 69 72 73 74 20 74 65 72 6d 2f 72 6f 77 69 64 20  irst term/rowid 
19ab0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 0a 2a 2a  entry in the .**
19ac0 20 69 74 65 72 61 74 65 64 20 64 61 74 61 2e 0a   iterated data..
19ad0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
19ae0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 28  ts5MultiIterNew(
19af0 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  .  Fts5Index *p,
19b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b10 20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65     /* FTS5 backe
19b20 6e 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69  nd to iterate wi
19b30 74 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 53 74  thin */.  Fts5St
19b40 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74  ructure *pStruct
19b50 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  ,         /* Str
19b60 75 63 74 75 72 65 20 6f 66 20 73 70 65 63 69 66  ucture of specif
19b70 69 63 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e  ic index */.  in
19b80 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19ba0 20 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59   FTS5INDEX_QUERY
19bb0 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20  _XXX flags */.  
19bc0 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f 6c  Fts5Colset *pCol
19bd0 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  set,            
19be0 2f 2a 20 43 6f 6c 73 65 74 20 74 6f 20 66 69 6c  /* Colset to fil
19bf0 74 65 72 20 6f 6e 20 28 6f 72 20 4e 55 4c 4c 29  ter on (or NULL)
19c00 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a   */.  const u8 *
19c10 70 54 65 72 6d 2c 20 69 6e 74 20 6e 54 65 72 6d  pTerm, int nTerm
19c20 2c 20 20 20 20 20 2f 2a 20 54 65 72 6d 20 74 6f  ,     /* Term to
19c30 20 73 65 65 6b 20 74 6f 20 28 6f 72 20 4e 55 4c   seek to (or NUL
19c40 4c 2f 30 29 20 2a 2f 0a 20 20 69 6e 74 20 69 4c  L/0) */.  int iL
19c50 65 76 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20  evel,           
19c60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 76            /* Lev
19c70 65 6c 20 74 6f 20 69 74 65 72 61 74 65 20 28 2d  el to iterate (-
19c80 31 20 66 6f 72 20 61 6c 6c 29 20 2a 2f 0a 20 20  1 for all) */.  
19c90 69 6e 74 20 6e 53 65 67 6d 65 6e 74 2c 20 20 20  int nSegment,   
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 65 67  /* Number of seg
19cc0 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67 65 20 28  ments to merge (
19cd0 69 4c 65 76 65 6c 3e 3d 30 29 20 2a 2f 0a 20 20  iLevel>=0) */.  
19ce0 46 74 73 35 49 74 65 72 20 2a 2a 70 70 4f 75 74  Fts5Iter **ppOut
19cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d00 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
19d10 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 65 67 20 3d  .){.  int nSeg =
19d20 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
19d30 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
19d40 6f 66 20 73 65 67 6d 65 6e 74 2d 69 74 65 72 73  of segment-iters
19d50 20 69 6e 20 75 73 65 20 2a 2f 0a 20 20 69 6e 74   in use */.  int
19d60 20 69 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20   iIter = 0;     
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19d80 2a 2f 0a 20 20 69 6e 74 20 69 53 65 67 3b 20 20  */.  int iSeg;  
19d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19da0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
19db0 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
19dc0 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
19dd0 73 35 53 74 72 75 63 74 75 72 65 4c 65 76 65 6c  s5StructureLevel
19de0 20 2a 70 4c 76 6c 3b 0a 20 20 46 74 73 35 49 74   *pLvl;.  Fts5It
19df0 65 72 20 2a 70 4e 65 77 3b 0a 0a 20 20 61 73 73  er *pNew;..  ass
19e00 65 72 74 28 20 28 70 54 65 72 6d 3d 3d 30 20 26  ert( (pTerm==0 &
19e10 26 20 6e 54 65 72 6d 3d 3d 30 29 20 7c 7c 20 69  & nTerm==0) || i
19e20 4c 65 76 65 6c 3c 30 20 29 3b 0a 0a 20 20 2f 2a  Level<0 );..  /*
19e30 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
19e40 66 6f 72 20 74 68 65 20 6e 65 77 20 6d 75 6c 74  for the new mult
19e50 69 2d 73 65 67 2d 69 74 65 72 61 74 6f 72 2e 20  i-seg-iterator. 
19e60 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  */.  if( p->rc==
19e70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19e80 20 69 66 28 20 69 4c 65 76 65 6c 3c 30 20 29 7b   if( iLevel<0 ){
19e90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19ea0 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74  Struct->nSegment
19eb0 3d 3d 66 74 73 35 53 74 72 75 63 74 75 72 65 43  ==fts5StructureC
19ec0 6f 75 6e 74 53 65 67 6d 65 6e 74 73 28 70 53 74  ountSegments(pSt
19ed0 72 75 63 74 29 20 29 3b 0a 20 20 20 20 20 20 6e  ruct) );.      n
19ee0 53 65 67 20 3d 20 70 53 74 72 75 63 74 2d 3e 6e  Seg = pStruct->n
19ef0 53 65 67 6d 65 6e 74 3b 0a 20 20 20 20 20 20 6e  Segment;.      n
19f00 53 65 67 20 2b 3d 20 28 70 2d 3e 70 48 61 73 68  Seg += (p->pHash
19f10 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 7d   ? 1 : 0);.    }
19f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 53 65 67  else{.      nSeg
19f30 20 3d 20 4d 49 4e 28 70 53 74 72 75 63 74 2d 3e   = MIN(pStruct->
19f40 61 4c 65 76 65 6c 5b 69 4c 65 76 65 6c 5d 2e 6e  aLevel[iLevel].n
19f50 53 65 67 2c 20 6e 53 65 67 6d 65 6e 74 29 3b 0a  Seg, nSegment);.
19f60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 70 4f      }.  }.  *ppO
19f70 75 74 20 3d 20 70 4e 65 77 20 3d 20 66 74 73 35  ut = pNew = fts5
19f80 4d 75 6c 74 69 49 74 65 72 41 6c 6c 6f 63 28 70  MultiIterAlloc(p
19f90 2c 20 6e 53 65 67 29 3b 0a 20 20 69 66 28 20 70  , nSeg);.  if( p
19fa0 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  New==0 ) return;
19fb0 0a 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d 20  .  pNew->bRev = 
19fc0 28 30 21 3d 28 66 6c 61 67 73 20 26 20 46 54 53  (0!=(flags & FTS
19fd0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53  5INDEX_QUERY_DES
19fe0 43 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 62 53 6b  C));.  pNew->bSk
19ff0 69 70 45 6d 70 74 79 20 3d 20 28 30 21 3d 28 66  ipEmpty = (0!=(f
1a000 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58  lags & FTS5INDEX
1a010 5f 51 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59  _QUERY_SKIPEMPTY
1a020 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 43 6f 6c  ));.  pNew->pCol
1a030 73 65 74 20 3d 20 70 43 6f 6c 73 65 74 3b 0a 20  set = pColset;. 
1a040 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 46 54   if( (flags & FT
1a050 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f  S5INDEX_QUERY_NO
1a060 4f 55 54 50 55 54 29 3d 3d 30 20 29 7b 0a 20 20  OUTPUT)==0 ){.  
1a070 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
1a080 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 4e  putCb(&p->rc, pN
1a090 65 77 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  ew);.  }..  /* I
1a0a0 6e 69 74 69 61 6c 69 7a 65 20 65 61 63 68 20 6f  nitialize each o
1a0b0 66 20 74 68 65 20 63 6f 6d 70 6f 6e 65 6e 74 20  f the component 
1a0c0 73 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72  segment iterator
1a0d0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 72  s. */.  if( p->r
1a0e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1a0f0 20 20 20 20 69 66 28 20 69 4c 65 76 65 6c 3c 30      if( iLevel<0
1a100 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74   ){.      Fts5St
1a110 72 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 45  ructureLevel *pE
1a120 6e 64 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  nd = &pStruct->a
1a130 4c 65 76 65 6c 5b 70 53 74 72 75 63 74 2d 3e 6e  Level[pStruct->n
1a140 4c 65 76 65 6c 5d 3b 0a 20 20 20 20 20 20 69 66  Level];.      if
1a150 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
1a160 20 20 20 20 20 20 2f 2a 20 41 64 64 20 61 20 73        /* Add a s
1a170 65 67 6d 65 6e 74 20 69 74 65 72 61 74 6f 72 20  egment iterator 
1a180 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
1a190 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a1a0 68 61 73 68 20 74 61 62 6c 65 2e 20 2a 2f 0a 20  hash table. */. 
1a1b0 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a1c0 65 72 20 2a 70 49 74 65 72 20 3d 20 26 70 4e 65  er *pIter = &pNe
1a1d0 77 2d 3e 61 53 65 67 5b 69 49 74 65 72 2b 2b 5d  w->aSeg[iIter++]
1a1e0 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1a1f0 67 49 74 65 72 48 61 73 68 49 6e 69 74 28 70 2c  gIterHashInit(p,
1a200 20 70 54 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 66   pTerm, nTerm, f
1a210 6c 61 67 73 2c 20 70 49 74 65 72 29 3b 0a 20 20  lags, pIter);.  
1a220 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
1a230 70 4c 76 6c 3d 26 70 53 74 72 75 63 74 2d 3e 61  pLvl=&pStruct->a
1a240 4c 65 76 65 6c 5b 30 5d 3b 20 70 4c 76 6c 3c 70  Level[0]; pLvl<p
1a250 45 6e 64 3b 20 70 4c 76 6c 2b 2b 29 7b 0a 20 20  End; pLvl++){.  
1a260 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d 70        for(iSeg=p
1a270 4c 76 6c 2d 3e 6e 53 65 67 2d 31 3b 20 69 53 65  Lvl->nSeg-1; iSe
1a280 67 3e 3d 30 3b 20 69 53 65 67 2d 2d 29 7b 0a 20  g>=0; iSeg--){. 
1a290 20 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72           Fts5Str
1a2a0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
1a2b0 53 65 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65  Seg = &pLvl->aSe
1a2c0 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
1a2d0 20 20 20 46 74 73 35 53 65 67 49 74 65 72 20 2a     Fts5SegIter *
1a2e0 70 49 74 65 72 20 3d 20 26 70 4e 65 77 2d 3e 61  pIter = &pNew->a
1a2f0 53 65 67 5b 69 49 74 65 72 2b 2b 5d 3b 0a 20 20  Seg[iIter++];.  
1a300 20 20 20 20 20 20 20 20 69 66 28 20 70 54 65 72          if( pTer
1a310 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
1a320 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72 49      fts5SegIterI
1a330 6e 69 74 28 70 2c 20 70 53 65 67 2c 20 70 49 74  nit(p, pSeg, pIt
1a340 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  er);.          }
1a350 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1a360 20 20 66 74 73 35 53 65 67 49 74 65 72 53 65 65    fts5SegIterSee
1a370 6b 49 6e 69 74 28 70 2c 20 70 54 65 72 6d 2c 20  kInit(p, pTerm, 
1a380 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 70 53  nTerm, flags, pS
1a390 65 67 2c 20 70 49 74 65 72 29 3b 0a 20 20 20 20  eg, pIter);.    
1a3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1a3b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  }.      }.    }e
1a3c0 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 76 6c 20  lse{.      pLvl 
1a3d0 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c 65 76  = &pStruct->aLev
1a3e0 65 6c 5b 69 4c 65 76 65 6c 5d 3b 0a 20 20 20 20  el[iLevel];.    
1a3f0 20 20 66 6f 72 28 69 53 65 67 3d 6e 53 65 67 2d    for(iSeg=nSeg-
1a400 31 3b 20 69 53 65 67 3e 3d 30 3b 20 69 53 65 67  1; iSeg>=0; iSeg
1a410 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  --){.        fts
1a420 35 53 65 67 49 74 65 72 49 6e 69 74 28 70 2c 20  5SegIterInit(p, 
1a430 26 70 4c 76 6c 2d 3e 61 53 65 67 5b 69 53 65 67  &pLvl->aSeg[iSeg
1a440 5d 2c 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 69  ], &pNew->aSeg[i
1a450 49 74 65 72 2b 2b 5d 29 3b 0a 20 20 20 20 20 20  Iter++]);.      
1a460 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
1a470 72 74 28 20 69 49 74 65 72 3d 3d 6e 53 65 67 20  rt( iIter==nSeg 
1a480 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1a490 74 68 65 20 61 62 6f 76 65 20 77 61 73 20 73 75  the above was su
1a4a0 63 63 65 73 73 66 75 6c 2c 20 65 61 63 68 20 63  ccessful, each c
1a4b0 6f 6d 70 6f 6e 65 6e 74 20 69 74 65 72 61 74 6f  omponent iterato
1a4c0 72 73 20 6e 6f 77 20 70 6f 69 6e 74 73 20 0a 20  rs now points . 
1a4d0 20 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74   ** to the first
1a4e0 20 65 6e 74 72 79 20 69 6e 20 69 74 73 20 73 65   entry in its se
1a4f0 67 6d 65 6e 74 2e 20 49 6e 20 74 68 69 73 20 63  gment. In this c
1a500 61 73 65 20 69 6e 69 74 69 61 6c 69 7a 65 20 74  ase initialize t
1a510 68 65 20 0a 20 20 2a 2a 20 61 46 69 72 73 74 5b  he .  ** aFirst[
1a520 5d 20 61 72 72 61 79 2e 20 4f 72 2c 20 69 66 20  ] array. Or, if 
1a530 61 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  an error has occ
1a540 75 72 72 65 64 2c 20 66 72 65 65 20 74 68 65 20  urred, free the 
1a550 69 74 65 72 61 74 6f 72 0a 20 20 2a 2a 20 6f 62  iterator.  ** ob
1a560 6a 65 63 74 20 61 6e 64 20 73 65 74 20 74 68 65  ject and set the
1a570 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65   output variable
1a580 20 74 6f 20 4e 55 4c 4c 2e 20 20 2a 2f 0a 20 20   to NULL.  */.  
1a590 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
1a5a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 6f 72 28  E_OK ){.    for(
1a5b0 69 49 74 65 72 3d 70 4e 65 77 2d 3e 6e 53 65 67  iIter=pNew->nSeg
1a5c0 2d 31 3b 20 69 49 74 65 72 3e 30 3b 20 69 49 74  -1; iIter>0; iIt
1a5d0 65 72 2d 2d 29 7b 0a 20 20 20 20 20 20 69 6e 74  er--){.      int
1a5e0 20 69 45 71 3b 0a 20 20 20 20 20 20 69 66 28 20   iEq;.      if( 
1a5f0 28 69 45 71 20 3d 20 66 74 73 35 4d 75 6c 74 69  (iEq = fts5Multi
1a600 49 74 65 72 44 6f 43 6f 6d 70 61 72 65 28 70 4e  IterDoCompare(pN
1a610 65 77 2c 20 69 49 74 65 72 29 29 20 29 7b 0a 20  ew, iIter)) ){. 
1a620 20 20 20 20 20 20 20 46 74 73 35 53 65 67 49 74         Fts5SegIt
1a630 65 72 20 2a 70 53 65 67 20 3d 20 26 70 4e 65 77  er *pSeg = &pNew
1a640 2d 3e 61 53 65 67 5b 69 45 71 5d 3b 0a 20 20 20  ->aSeg[iEq];.   
1a650 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
1a660 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 53 65 67  SQLITE_OK ) pSeg
1a670 2d 3e 78 4e 65 78 74 28 70 2c 20 70 53 65 67 2c  ->xNext(p, pSeg,
1a680 20 30 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73   0);.        fts
1a690 35 4d 75 6c 74 69 49 74 65 72 41 64 76 61 6e 63  5MultiIterAdvanc
1a6a0 65 64 28 70 2c 20 70 4e 65 77 2c 20 69 45 71 2c  ed(p, pNew, iEq,
1a6b0 20 69 49 74 65 72 29 3b 0a 20 20 20 20 20 20 7d   iIter);.      }
1a6c0 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 4d  .    }.    fts5M
1a6d0 75 6c 74 69 49 74 65 72 53 65 74 45 6f 66 28 70  ultiIterSetEof(p
1a6e0 4e 65 77 29 3b 0a 20 20 20 20 66 74 73 35 41 73  New);.    fts5As
1a6f0 73 65 72 74 4d 75 6c 74 69 49 74 65 72 53 65 74  sertMultiIterSet
1a700 75 70 28 70 2c 20 70 4e 65 77 29 3b 0a 0a 20 20  up(p, pNew);..  
1a710 20 20 69 66 28 20 70 4e 65 77 2d 3e 62 53 6b 69    if( pNew->bSki
1a720 70 45 6d 70 74 79 20 26 26 20 66 74 73 35 4d 75  pEmpty && fts5Mu
1a730 6c 74 69 49 74 65 72 49 73 45 6d 70 74 79 28 70  ltiIterIsEmpty(p
1a740 2c 20 70 4e 65 77 29 20 29 7b 0a 20 20 20 20 20  , pNew) ){.     
1a750 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
1a760 78 74 28 70 2c 20 70 4e 65 77 2c 20 30 2c 20 30  xt(p, pNew, 0, 0
1a770 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
1a780 20 70 4e 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66   pNew->base.bEof
1a790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46 74 73  ==0 ){.      Fts
1a7a0 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20 3d  5SegIter *pSeg =
1a7b0 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b 70 4e 65   &pNew->aSeg[pNe
1a7c0 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1a7d0 72 73 74 5d 3b 0a 20 20 20 20 20 20 70 4e 65 77  rst];.      pNew
1a7e0 2d 3e 78 53 65 74 4f 75 74 70 75 74 73 28 70 4e  ->xSetOutputs(pN
1a7f0 65 77 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 7d  ew, pSeg);.    }
1a800 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ..  }else{.    f
1a810 74 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65  ts5MultiIterFree
1a820 28 70 4e 65 77 29 3b 0a 20 20 20 20 2a 70 70 4f  (pNew);.    *ppO
1a830 75 74 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ut = 0;.  }.}../
1a840 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 6e 20 46  *.** Create an F
1a850 74 73 35 49 74 65 72 20 74 68 61 74 20 69 74 65  ts5Iter that ite
1a860 72 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68  rates through th
1a870 65 20 64 6f 63 6c 69 73 74 20 70 72 6f 76 69 64  e doclist provid
1a880 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 73 65 63  ed.** as the sec
1a890 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
1a8a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
1a8b0 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32 28 0a  5MultiIterNew2(.
1a8c0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8e0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1a8f0 64 20 74 6f 20 69 74 65 72 61 74 65 20 77 69 74  d to iterate wit
1a900 68 69 6e 20 2a 2f 0a 20 20 46 74 73 35 44 61 74  hin */.  Fts5Dat
1a910 61 20 2a 70 44 61 74 61 2c 20 20 20 20 20 20 20  a *pData,       
1a920 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 63 6c           /* Docl
1a930 69 73 74 20 74 6f 20 69 74 65 72 61 74 65 20 74  ist to iterate t
1a940 68 72 6f 75 67 68 20 2a 2f 0a 20 20 69 6e 74 20  hrough */.  int 
1a950 62 44 65 73 63 2c 20 20 20 20 20 20 20 20 20 20  bDesc,          
1a960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1a970 72 75 65 20 66 6f 72 20 64 65 73 63 65 6e 64 69  rue for descendi
1a980 6e 67 20 72 6f 77 69 64 20 6f 72 64 65 72 20 2a  ng rowid order *
1a990 2f 0a 20 20 46 74 73 35 49 74 65 72 20 2a 2a 70  /.  Fts5Iter **p
1a9a0 70 4f 75 74 20 20 20 20 20 20 20 20 20 20 20 20  pOut            
1a9b0 20 20 20 20 2f 2a 20 4e 65 77 20 6f 62 6a 65 63      /* New objec
1a9c0 74 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 49 74  t */.){.  Fts5It
1a9d0 65 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77  er *pNew;.  pNew
1a9e0 20 3d 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72   = fts5MultiIter
1a9f0 41 6c 6c 6f 63 28 70 2c 20 32 29 3b 0a 20 20 69  Alloc(p, 2);.  i
1aa00 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 46  f( pNew ){.    F
1aa10 74 73 35 53 65 67 49 74 65 72 20 2a 70 49 74 65  ts5SegIter *pIte
1aa20 72 20 3d 20 26 70 4e 65 77 2d 3e 61 53 65 67 5b  r = &pNew->aSeg[
1aa30 31 5d 3b 0a 0a 20 20 20 20 70 49 74 65 72 2d 3e  1];..    pIter->
1aa40 66 6c 61 67 73 20 3d 20 46 54 53 35 5f 53 45 47  flags = FTS5_SEG
1aa50 49 54 45 52 5f 4f 4e 45 54 45 52 4d 3b 0a 20 20  ITER_ONETERM;.  
1aa60 20 20 69 66 28 20 70 44 61 74 61 2d 3e 73 7a 4c    if( pData->szL
1aa70 65 61 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  eaf>0 ){.      p
1aa80 49 74 65 72 2d 3e 70 4c 65 61 66 20 3d 20 70 44  Iter->pLeaf = pD
1aa90 61 74 61 3b 0a 20 20 20 20 20 20 70 49 74 65 72  ata;.      pIter
1aaa0 2d 3e 69 4c 65 61 66 4f 66 66 73 65 74 20 3d 20  ->iLeafOffset = 
1aab0 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 70 44  fts5GetVarint(pD
1aac0 61 74 61 2d 3e 70 2c 20 28 75 36 34 2a 29 26 70  ata->p, (u64*)&p
1aad0 49 74 65 72 2d 3e 69 52 6f 77 69 64 29 3b 0a 20  Iter->iRowid);. 
1aae0 20 20 20 20 20 70 49 74 65 72 2d 3e 69 45 6e 64       pIter->iEnd
1aaf0 6f 66 44 6f 63 6c 69 73 74 20 3d 20 70 44 61 74  ofDoclist = pDat
1ab00 61 2d 3e 6e 6e 3b 0a 20 20 20 20 20 20 70 4e 65  a->nn;.      pNe
1ab10 77 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  w->aFirst[1].iFi
1ab20 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  rst = 1;.      i
1ab30 66 28 20 62 44 65 73 63 20 29 7b 0a 20 20 20 20  f( bDesc ){.    
1ab40 20 20 20 20 70 4e 65 77 2d 3e 62 52 65 76 20 3d      pNew->bRev =
1ab50 20 31 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65   1;.        pIte
1ab60 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 46 54 53 35  r->flags |= FTS5
1ab70 5f 53 45 47 49 54 45 52 5f 52 45 56 45 52 53 45  _SEGITER_REVERSE
1ab80 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 53 65  ;.        fts5Se
1ab90 67 49 74 65 72 52 65 76 65 72 73 65 49 6e 69 74  gIterReverseInit
1aba0 50 61 67 65 28 70 2c 20 70 49 74 65 72 29 3b 0a  Page(p, pIter);.
1abb0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1abc0 20 20 20 20 20 66 74 73 35 53 65 67 49 74 65 72       fts5SegIter
1abd0 4c 6f 61 64 4e 50 6f 73 28 70 2c 20 70 49 74 65  LoadNPos(p, pIte
1abe0 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
1abf0 20 20 70 44 61 74 61 20 3d 20 30 3b 0a 20 20 20    pData = 0;.   
1ac00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e   }else{.      pN
1ac10 65 77 2d 3e 62 61 73 65 2e 62 45 6f 66 20 3d 20  ew->base.bEof = 
1ac20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  1;.    }.    fts
1ac30 35 53 65 67 49 74 65 72 53 65 74 4e 65 78 74 28  5SegIterSetNext(
1ac40 70 2c 20 70 49 74 65 72 29 3b 0a 0a 20 20 20 20  p, pIter);..    
1ac50 2a 70 70 4f 75 74 20 3d 20 70 4e 65 77 3b 0a 20  *ppOut = pNew;. 
1ac60 20 7d 0a 0a 20 20 66 74 73 35 44 61 74 61 52 65   }..  fts5DataRe
1ac70 6c 65 61 73 65 28 70 44 61 74 61 29 3b 0a 7d 0a  lease(pData);.}.
1ac80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
1ac90 75 65 20 69 66 20 74 68 65 20 69 74 65 72 61 74  ue if the iterat
1aca0 6f 72 20 69 73 20 61 74 20 45 4f 46 20 6f 72 20  or is at EOF or 
1acb0 69 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  if an error has 
1acc0 6f 63 63 75 72 72 65 64 2e 20 0a 2a 2a 20 46 61  occurred. .** Fa
1acd0 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  lse otherwise..*
1ace0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 74 73  /.static int fts
1acf0 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28 46 74  5MultiIterEof(Ft
1ad00 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74 73 35  s5Index *p, Fts5
1ad10 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a 20 20  Iter *pIter){.  
1ad20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 20 0a 20  assert( p->rc . 
1ad30 20 20 20 20 20 7c 7c 20 28 70 49 74 65 72 2d 3e       || (pIter->
1ad40 61 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69  aSeg[ pIter->aFi
1ad50 72 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e  rst[1].iFirst ].
1ad60 70 4c 65 61 66 3d 3d 30 29 3d 3d 70 49 74 65 72  pLeaf==0)==pIter
1ad70 2d 3e 62 61 73 65 2e 62 45 6f 66 20 0a 20 20 29  ->base.bEof .  )
1ad80 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
1ad90 63 20 7c 7c 20 70 49 74 65 72 2d 3e 62 61 73 65  c || pIter->base
1ada0 2e 62 45 6f 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  .bEof);.}../*.**
1adb0 20 52 65 74 75 72 6e 20 74 68 65 20 72 6f 77 69   Return the rowi
1adc0 64 20 6f 66 20 74 68 65 20 65 6e 74 72 79 20 74  d of the entry t
1add0 68 61 74 20 74 68 65 20 69 74 65 72 61 74 6f 72  hat the iterator
1ade0 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1adf0 73 0a 2a 2a 20 74 6f 2e 20 49 66 20 74 68 65 20  s.** to. If the 
1ae00 69 74 65 72 61 74 6f 72 20 70 6f 69 6e 74 73 20  iterator points 
1ae10 74 6f 20 45 4f 46 20 77 68 65 6e 20 74 68 69 73  to EOF when this
1ae20 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1ae30 6c 65 64 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c  led the.** resul
1ae40 74 73 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  ts are undefined
1ae50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20  ..*/.static i64 
1ae60 66 74 73 35 4d 75 6c 74 69 49 74 65 72 52 6f 77  fts5MultiIterRow
1ae70 69 64 28 46 74 73 35 49 74 65 72 20 2a 70 49 74  id(Fts5Iter *pIt
1ae80 65 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  er){.  assert( p
1ae90 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65  Iter->aSeg[ pIte
1aea0 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69  r->aFirst[1].iFi
1aeb0 72 73 74 20 5d 2e 70 4c 65 61 66 20 29 3b 0a 20  rst ].pLeaf );. 
1aec0 20 72 65 74 75 72 6e 20 70 49 74 65 72 2d 3e 61   return pIter->a
1aed0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
1aee0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 2e 69  st[1].iFirst ].i
1aef0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1af00 4d 6f 76 65 20 74 68 65 20 69 74 65 72 61 74 6f  Move the iterato
1af10 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1af20 74 72 79 20 61 74 20 6f 72 20 66 6f 6c 6c 6f 77  try at or follow
1af30 69 6e 67 20 69 4d 61 74 63 68 2e 0a 2a 2f 0a 73  ing iMatch..*/.s
1af40 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d  tatic void fts5M
1af50 75 6c 74 69 49 74 65 72 4e 65 78 74 46 72 6f 6d  ultiIterNextFrom
1af60 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
1af70 2c 20 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70  , .  Fts5Iter *p
1af80 49 74 65 72 2c 20 0a 20 20 69 36 34 20 69 4d 61  Iter, .  i64 iMa
1af90 74 63 68 0a 29 7b 0a 20 20 77 68 69 6c 65 28 20  tch.){.  while( 
1afa0 31 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f  1 ){.    i64 iRo
1afb0 77 69 64 3b 0a 20 20 20 20 66 74 73 35 4d 75 6c  wid;.    fts5Mul
1afc0 74 69 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49  tiIterNext(p, pI
1afd0 74 65 72 2c 20 31 2c 20 69 4d 61 74 63 68 29 3b  ter, 1, iMatch);
1afe0 0a 20 20 20 20 69 66 28 20 66 74 73 35 4d 75 6c  .    if( fts5Mul
1aff0 74 69 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74  tiIterEof(p, pIt
1b000 65 72 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  er) ) break;.   
1b010 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 4d 75   iRowid = fts5Mu
1b020 6c 74 69 49 74 65 72 52 6f 77 69 64 28 70 49 74  ltiIterRowid(pIt
1b030 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 49 74  er);.    if( pIt
1b040 65 72 2d 3e 62 52 65 76 3d 3d 30 20 26 26 20 69  er->bRev==0 && i
1b050 52 6f 77 69 64 3e 3d 69 4d 61 74 63 68 20 29 20  Rowid>=iMatch ) 
1b060 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70  break;.    if( p
1b070 49 74 65 72 2d 3e 62 52 65 76 21 3d 30 20 26 26  Iter->bRev!=0 &&
1b080 20 69 52 6f 77 69 64 3c 3d 69 4d 61 74 63 68 20   iRowid<=iMatch 
1b090 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a  ) break;.  }.}..
1b0a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
1b0b0 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66  ointer to a buff
1b0c0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  er containing th
1b0d0 65 20 74 65 72 6d 20 61 73 73 6f 63 69 61 74 65  e term associate
1b0e0 64 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 65  d with the .** e
1b0f0 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 69 74  ntry that the it
1b100 65 72 61 74 6f 72 20 63 75 72 72 65 6e 74 6c 79  erator currently
1b110 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 73   points to..*/.s
1b120 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 2a  tatic const u8 *
1b130 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65 72  fts5MultiIterTer
1b140 6d 28 46 74 73 35 49 74 65 72 20 2a 70 49 74 65  m(Fts5Iter *pIte
1b150 72 2c 20 69 6e 74 20 2a 70 6e 29 7b 0a 20 20 46  r, int *pn){.  F
1b160 74 73 35 53 65 67 49 74 65 72 20 2a 70 20 3d 20  ts5SegIter *p = 
1b170 26 70 49 74 65 72 2d 3e 61 53 65 67 5b 20 70 49  &pIter->aSeg[ pI
1b180 74 65 72 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69  ter->aFirst[1].i
1b190 46 69 72 73 74 20 5d 3b 0a 20 20 2a 70 6e 20 3d  First ];.  *pn =
1b1a0 20 70 2d 3e 74 65 72 6d 2e 6e 3b 0a 20 20 72 65   p->term.n;.  re
1b1b0 74 75 72 6e 20 70 2d 3e 74 65 72 6d 2e 70 3b 0a  turn p->term.p;.
1b1c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1b1d0 65 20 61 20 6e 65 77 20 73 65 67 6d 65 6e 74 2d  e a new segment-
1b1e0 69 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  id for the struc
1b1f0 74 75 72 65 20 70 53 74 72 75 63 74 2e 20 54 68  ture pStruct. Th
1b200 65 20 6e 65 77 20 73 65 67 6d 65 6e 74 0a 2a 2a  e new segment.**
1b210 20 69 64 20 6d 75 73 74 20 62 65 20 62 65 74 77   id must be betw
1b220 65 65 6e 20 31 20 61 6e 64 20 36 35 33 33 35 20  een 1 and 65335 
1b230 69 6e 63 6c 75 73 69 76 65 2c 20 61 6e 64 20 6d  inclusive, and m
1b240 75 73 74 20 6e 6f 74 20 62 65 20 75 73 65 64 20  ust not be used 
1b250 62 79 20 0a 2a 2a 20 61 6e 79 20 63 75 72 72 65  by .** any curre
1b260 6e 74 6c 79 20 65 78 69 73 74 69 6e 67 20 73 65  ntly existing se
1b270 67 6d 65 6e 74 2e 20 49 66 20 61 20 66 72 65 65  gment. If a free
1b280 20 73 65 67 6d 65 6e 74 20 69 64 20 63 61 6e 6e   segment id cann
1b290 6f 74 20 62 65 20 66 6f 75 6e 64 2c 0a 2a 2a 20  ot be found,.** 
1b2a0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 69 73 20 72  SQLITE_FULL is r
1b2b0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1b2c0 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20 61  f an error has a
1b2d0 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65 64 2c  lready occurred,
1b2e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b2f0 73 20 61 20 6e 6f 2d 6f 70 2e 20 30 20 69 73 20  s a no-op. 0 is 
1b300 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 69 6e 20  .** returned in 
1b310 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74  this case..*/.st
1b320 61 74 69 63 20 69 6e 74 20 66 74 73 35 41 6c 6c  atic int fts5All
1b330 6f 63 61 74 65 53 65 67 69 64 28 46 74 73 35 49  ocateSegid(Fts5I
1b340 6e 64 65 78 20 2a 70 2c 20 46 74 73 35 53 74 72  ndex *p, Fts5Str
1b350 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 29  ucture *pStruct)
1b360 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 20 3d  {.  int iSegid =
1b370 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
1b380 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1b390 20 20 20 69 66 28 20 70 53 74 72 75 63 74 2d 3e     if( pStruct->
1b3a0 6e 53 65 67 6d 65 6e 74 3e 3d 46 54 53 35 5f 4d  nSegment>=FTS5_M
1b3b0 41 58 5f 53 45 47 4d 45 4e 54 20 29 7b 0a 20 20  AX_SEGMENT ){.  
1b3c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
1b3d0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 65 6c  TE_FULL;.    }el
1b3e0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 54 53  se{.      /* FTS
1b3f0 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 69 73  5_MAX_SEGMENT is
1b400 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
1b410 65 64 20 61 73 20 32 30 30 30 2e 20 53 6f 20 74  ed as 2000. So t
1b420 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
1b430 20 20 20 2a 2a 20 61 72 72 61 79 20 69 73 20 36     ** array is 6
1b440 33 20 65 6c 65 6d 65 6e 74 73 2c 20 6f 72 20 32  3 elements, or 2
1b450 35 32 20 62 79 74 65 73 2c 20 69 6e 20 73 69 7a  52 bytes, in siz
1b460 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 75 33 32  e.  */.      u32
1b470 20 61 55 73 65 64 5b 28 46 54 53 35 5f 4d 41 58   aUsed[(FTS5_MAX
1b480 5f 53 45 47 4d 45 4e 54 2b 33 31 29 20 2f 20 33  _SEGMENT+31) / 3
1b490 32 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c  2];.      int iL
1b4a0 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20 20 20  vl, iSeg;.      
1b4b0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 33 32  int i;.      u32
1b4c0 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 6d 65 6d   mask;.      mem
1b4d0 73 65 74 28 61 55 73 65 64 2c 20 30 2c 20 73 69  set(aUsed, 0, si
1b4e0 7a 65 6f 66 28 61 55 73 65 64 29 29 3b 0a 20 20  zeof(aUsed));.  
1b4f0 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 30 3b 20      for(iLvl=0; 
1b500 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d 3e 6e 4c  iLvl<pStruct->nL
1b510 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20  evel; iLvl++){. 
1b520 20 20 20 20 20 20 20 66 6f 72 28 69 53 65 67 3d         for(iSeg=
1b530 30 3b 20 69 53 65 67 3c 70 53 74 72 75 63 74 2d  0; iSeg<pStruct-
1b540 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53  >aLevel[iLvl].nS
1b550 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a 20 20 20  eg; iSeg++){.   
1b560 20 20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d         int iId =
1b570 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
1b580 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
1b590 5d 2e 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20  ].iSegid;.      
1b5a0 20 20 20 20 69 66 28 20 69 49 64 3c 3d 46 54 53      if( iId<=FTS
1b5b0 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20 26 26  5_MAX_SEGMENT &&
1b5c0 20 69 49 64 3e 30 20 29 7b 0a 20 20 20 20 20 20   iId>0 ){.      
1b5d0 20 20 20 20 20 20 61 55 73 65 64 5b 28 69 49 64        aUsed[(iId
1b5e0 2d 31 29 20 2f 20 33 32 5d 20 7c 3d 20 28 75 33  -1) / 32] |= (u3
1b5f0 32 29 31 20 3c 3c 20 28 28 69 49 64 2d 31 29 20  2)1 << ((iId-1) 
1b600 25 20 33 32 29 3b 0a 20 20 20 20 20 20 20 20 20  % 32);.         
1b610 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
1b620 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
1b630 69 3d 30 3b 20 61 55 73 65 64 5b 69 5d 3d 3d 30  i=0; aUsed[i]==0
1b640 78 46 46 46 46 46 46 46 46 3b 20 69 2b 2b 29 3b  xFFFFFFFF; i++);
1b650 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 55  .      mask = aU
1b660 73 65 64 5b 69 5d 3b 0a 20 20 20 20 20 20 66 6f  sed[i];.      fo
1b670 72 28 69 53 65 67 69 64 3d 30 3b 20 6d 61 73 6b  r(iSegid=0; mask
1b680 20 26 20 28 28 75 33 32 29 31 20 3c 3c 20 69 53   & ((u32)1 << iS
1b690 65 67 69 64 29 3b 20 69 53 65 67 69 64 2b 2b 29  egid); iSegid++)
1b6a0 3b 0a 20 20 20 20 20 20 69 53 65 67 69 64 20 2b  ;.      iSegid +
1b6b0 3d 20 31 20 2b 20 69 2a 33 32 3b 0a 0a 23 69 66  = 1 + i*32;..#if
1b6c0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
1b6d0 0a 20 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d  .      for(iLvl=
1b6e0 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  0; iLvl<pStruct-
1b6f0 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
1b700 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 53  {.        for(iS
1b710 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72 75  eg=0; iSeg<pStru
1b720 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d  ct->aLevel[iLvl]
1b730 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b 0a  .nSeg; iSeg++){.
1b740 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b750 5f 6e 63 28 20 69 53 65 67 69 64 21 3d 70 53 74  _nc( iSegid!=pSt
1b760 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76  ruct->aLevel[iLv
1b770 6c 5d 2e 61 53 65 67 5b 69 53 65 67 5d 2e 69 53  l].aSeg[iSeg].iS
1b780 65 67 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  egid );.        
1b790 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
1b7a0 61 73 73 65 72 74 5f 6e 63 28 20 69 53 65 67 69  assert_nc( iSegi
1b7b0 64 3e 30 20 26 26 20 69 53 65 67 69 64 3c 3d 46  d>0 && iSegid<=F
1b7c0 54 53 35 5f 4d 41 58 5f 53 45 47 4d 45 4e 54 20  TS5_MAX_SEGMENT 
1b7d0 29 3b 0a 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  );..      {.    
1b7e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
1b7f0 20 2a 70 49 64 78 53 65 6c 65 63 74 20 3d 20 66   *pIdxSelect = f
1b800 74 73 35 49 64 78 53 65 6c 65 63 74 53 74 6d 74  ts5IdxSelectStmt
1b810 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
1b820 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1b830 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  K ){.          u
1b840 38 20 61 42 6c 6f 62 5b 32 5d 20 3d 20 7b 30 78  8 aBlob[2] = {0x
1b850 66 66 2c 20 30 78 66 66 7d 3b 0a 20 20 20 20 20  ff, 0xff};.     
1b860 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1b870 64 5f 69 6e 74 28 70 49 64 78 53 65 6c 65 63 74  d_int(pIdxSelect
1b880 2c 20 31 2c 20 69 53 65 67 69 64 29 3b 0a 20 20  , 1, iSegid);.  
1b890 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b8a0 62 69 6e 64 5f 62 6c 6f 62 28 70 49 64 78 53 65  bind_blob(pIdxSe
1b8b0 6c 65 63 74 2c 20 32 2c 20 61 42 6c 6f 62 2c 20  lect, 2, aBlob, 
1b8c0 32 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  2, SQLITE_STATIC
1b8d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
1b8e0 65 72 74 5f 6e 63 28 20 73 71 6c 69 74 65 33 5f  ert_nc( sqlite3_
1b8f0 73 74 65 70 28 70 49 64 78 53 65 6c 65 63 74 29  step(pIdxSelect)
1b900 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a  !=SQLITE_ROW );.
1b910 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
1b920 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
1b930 70 49 64 78 53 65 6c 65 63 74 29 3b 0a 20 20 20  pIdxSelect);.   
1b940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b950 69 6e 64 5f 6e 75 6c 6c 28 70 49 64 78 53 65 6c  ind_null(pIdxSel
1b960 65 63 74 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  ect, 2);.       
1b970 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
1b980 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  f.    }.  }..  r
1b990 65 74 75 72 6e 20 69 53 65 67 69 64 3b 0a 7d 0a  eturn iSegid;.}.
1b9a0 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72 64 20 61  ./*.** Discard a
1b9b0 6c 6c 20 64 61 74 61 20 63 75 72 72 65 6e 74 6c  ll data currentl
1b9c0 79 20 63 61 63 68 65 64 20 69 6e 20 74 68 65 20  y cached in the 
1b9d0 68 61 73 68 2d 74 61 62 6c 65 73 2e 0a 2a 2f 0a  hash-tables..*/.
1b9e0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
1b9f0 49 6e 64 65 78 44 69 73 63 61 72 64 44 61 74 61  IndexDiscardData
1ba00 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a  (Fts5Index *p){.
1ba10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 48 61    assert( p->pHa
1ba20 73 68 20 7c 7c 20 70 2d 3e 6e 50 65 6e 64 69 6e  sh || p->nPendin
1ba30 67 44 61 74 61 3d 3d 30 20 29 3b 0a 20 20 69 66  gData==0 );.  if
1ba40 28 20 70 2d 3e 70 48 61 73 68 20 29 7b 0a 20 20  ( p->pHash ){.  
1ba50 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61 73    sqlite3Fts5Has
1ba60 68 43 6c 65 61 72 28 70 2d 3e 70 48 61 73 68 29  hClear(p->pHash)
1ba70 3b 0a 20 20 20 20 70 2d 3e 6e 50 65 6e 64 69 6e  ;.    p->nPendin
1ba80 67 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 0a 7d  gData = 0;.  }.}
1ba90 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1baa0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
1bab0 72 65 66 69 78 2c 20 69 6e 20 62 79 74 65 73 2c  refix, in bytes,
1bac0 20 74 68 61 74 20 62 75 66 66 65 72 20 0a 2a 2a   that buffer .**
1bad0 20 28 70 4e 65 77 2f 3c 6c 65 6e 67 74 68 2d 75   (pNew/<length-u
1bae0 6e 6b 6e 6f 77 6e 3e 29 20 73 68 61 72 65 73 20  nknown>) shares 
1baf0 77 69 74 68 20 62 75 66 66 65 72 20 28 70 4f 6c  with buffer (pOl
1bb00 64 2f 6e 4f 6c 64 29 2e 0a 2a 2a 0a 2a 2a 20 42  d/nOld)..**.** B
1bb10 75 66 66 65 72 20 28 70 4e 65 77 2f 3c 6c 65 6e  uffer (pNew/<len
1bb20 67 74 68 2d 75 6e 6b 6e 6f 77 6e 3e 29 20 69 73  gth-unknown>) is
1bb30 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1bb40 65 20 67 72 65 61 74 65 72 20 0a 2a 2a 20 74 68  e greater .** th
1bb50 61 6e 20 62 75 66 66 65 72 20 28 70 4f 6c 64 2f  an buffer (pOld/
1bb60 6e 4f 6c 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  nOld)..*/.static
1bb70 20 69 6e 74 20 66 74 73 35 50 72 65 66 69 78 43   int fts5PrefixC
1bb80 6f 6d 70 72 65 73 73 28 69 6e 74 20 6e 4f 6c 64  ompress(int nOld
1bb90 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4f 6c 64  , const u8 *pOld
1bba0 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70 4e 65 77  , const u8 *pNew
1bbb0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1bbc0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
1bbd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 6c  ++){.    if( pOl
1bbe0 64 5b 69 5d 21 3d 70 4e 65 77 5b 69 5d 20 29 20  d[i]!=pNew[i] ) 
1bbf0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
1bc00 75 72 6e 20 69 3b 0a 7d 0a 0a 73 74 61 74 69 63  urn i;.}..static
1bc10 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 44   void fts5WriteD
1bc20 6c 69 64 78 43 6c 65 61 72 28 0a 20 20 46 74 73  lidxClear(.  Fts
1bc30 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20 46 74  5Index *p, .  Ft
1bc40 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1bc50 69 74 65 72 2c 0a 20 20 69 6e 74 20 62 46 6c 75  iter,.  int bFlu
1bc60 73 68 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sh              
1bc70 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72          /* If tr
1bc80 75 65 2c 20 77 72 69 74 65 20 64 6c 69 64 78 20  ue, write dlidx 
1bc90 74 6f 20 64 69 73 6b 20 2a 2f 0a 29 7b 0a 20 20  to disk */.){.  
1bca0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
1bcb0 20 62 46 6c 75 73 68 3d 3d 30 20 7c 7c 20 28 70   bFlush==0 || (p
1bcc0 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3e 30  Writer->nDlidx>0
1bcd0 20 26 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c   && pWriter->aDl
1bce0 69 64 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 29 20  idx[0].buf.n>0) 
1bcf0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1bd00 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 3b  pWriter->nDlidx;
1bd10 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 44   i++){.    Fts5D
1bd20 6c 69 64 78 57 72 69 74 65 72 20 2a 70 44 6c 69  lidxWriter *pDli
1bd30 64 78 20 3d 20 26 70 57 72 69 74 65 72 2d 3e 61  dx = &pWriter->a
1bd40 44 6c 69 64 78 5b 69 5d 3b 0a 20 20 20 20 69 66  Dlidx[i];.    if
1bd50 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3d  ( pDlidx->buf.n=
1bd60 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1bd70 69 66 28 20 62 46 6c 75 73 68 20 29 7b 0a 20 20  if( bFlush ){.  
1bd80 20 20 20 20 61 73 73 65 72 74 28 20 70 44 6c 69      assert( pDli
1bd90 64 78 2d 3e 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  dx->pgno!=0 );. 
1bda0 20 20 20 20 20 66 74 73 35 44 61 74 61 57 72 69       fts5DataWri
1bdb0 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20 20 20  te(p, .         
1bdc0 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f 57 49   FTS5_DLIDX_ROWI
1bdd0 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69  D(pWriter->iSegi
1bde0 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e 70 67  d, i, pDlidx->pg
1bdf0 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70  no),.          p
1be00 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20 70 44  Dlidx->buf.p, pD
1be10 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20 20 20  lidx->buf.n.    
1be20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73    );.    }.    s
1be30 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
1be40 5a 65 72 6f 28 26 70 44 6c 69 64 78 2d 3e 62 75  Zero(&pDlidx->bu
1be50 66 29 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e  f);.    pDlidx->
1be60 62 50 72 65 76 56 61 6c 69 64 20 3d 20 30 3b 0a  bPrevValid = 0;.
1be70 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 72 6f    }.}../*.** Gro
1be80 77 20 74 68 65 20 70 57 72 69 74 65 72 2d 3e 61  w the pWriter->a
1be90 44 6c 69 64 78 5b 5d 20 61 72 72 61 79 20 74 6f  Dlidx[] array to
1bea0 20 61 74 20 6c 65 61 73 74 20 6e 4c 76 6c 20 65   at least nLvl e
1beb0 6c 65 6d 65 6e 74 73 20 69 6e 20 73 69 7a 65 2e  lements in size.
1bec0 0a 2a 2a 20 41 6e 79 20 6e 65 77 20 61 72 72 61  .** Any new arra
1bed0 79 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 7a  y elements are z
1bee0 65 72 6f 65 64 20 62 65 66 6f 72 65 20 72 65 74  eroed before ret
1bef0 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  urning..*/.stati
1bf00 63 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 44  c int fts5WriteD
1bf10 6c 69 64 78 47 72 6f 77 28 0a 20 20 46 74 73 35  lidxGrow(.  Fts5
1bf20 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46 74 73 35  Index *p,.  Fts5
1bf30 53 65 67 57 72 69 74 65 72 20 2a 70 57 72 69 74  SegWriter *pWrit
1bf40 65 72 2c 0a 20 20 69 6e 74 20 6e 4c 76 6c 0a 29  er,.  int nLvl.)
1bf50 7b 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  {.  if( p->rc==S
1bf60 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 4c 76 6c  QLITE_OK && nLvl
1bf70 3e 3d 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64  >=pWriter->nDlid
1bf80 78 20 29 7b 0a 20 20 20 20 46 74 73 35 44 6c 69  x ){.    Fts5Dli
1bf90 64 78 57 72 69 74 65 72 20 2a 61 44 6c 69 64 78  dxWriter *aDlidx
1bfa0 20 3d 20 28 46 74 73 35 44 6c 69 64 78 57 72 69   = (Fts5DlidxWri
1bfb0 74 65 72 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  ter*)sqlite3_rea
1bfc0 6c 6c 6f 63 36 34 28 0a 20 20 20 20 20 20 20 20  lloc64(.        
1bfd0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 2c  pWriter->aDlidx,
1bfe0 20 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64   sizeof(Fts5Dlid
1bff0 78 57 72 69 74 65 72 29 20 2a 20 6e 4c 76 6c 0a  xWriter) * nLvl.
1c000 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 61      );.    if( a
1c010 44 6c 69 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Dlidx==0 ){.    
1c020 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
1c030 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
1c040 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79  e{.      int nBy
1c050 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
1c060 44 6c 69 64 78 57 72 69 74 65 72 29 20 2a 20 28  DlidxWriter) * (
1c070 6e 4c 76 6c 20 2d 20 70 57 72 69 74 65 72 2d 3e  nLvl - pWriter->
1c080 6e 44 6c 69 64 78 29 3b 0a 20 20 20 20 20 20 6d  nDlidx);.      m
1c090 65 6d 73 65 74 28 26 61 44 6c 69 64 78 5b 70 57  emset(&aDlidx[pW
1c0a0 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78 5d 2c 20  riter->nDlidx], 
1c0b0 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20  0, nByte);.     
1c0c0 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78   pWriter->aDlidx
1c0d0 20 3d 20 61 44 6c 69 64 78 3b 0a 20 20 20 20 20   = aDlidx;.     
1c0e0 20 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78   pWriter->nDlidx
1c0f0 20 3d 20 6e 4c 76 6c 3b 0a 20 20 20 20 7d 0a 20   = nLvl;.    }. 
1c100 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72   }.  return p->r
1c110 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  c;.}../*.** If t
1c120 68 65 20 63 75 72 72 65 6e 74 20 64 6f 63 6c 69  he current docli
1c130 73 74 2d 69 6e 64 65 78 20 61 63 63 75 6d 75 6c  st-index accumul
1c140 61 74 69 6e 67 20 69 6e 20 70 57 72 69 74 65 72  ating in pWriter
1c150 2d 3e 61 44 6c 69 64 78 5b 5d 20 69 73 20 6c 61  ->aDlidx[] is la
1c160 72 67 65 0a 2a 2a 20 65 6e 6f 75 67 68 2c 20 66  rge.** enough, f
1c170 6c 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 20  lush it to disk 
1c180 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 20 4f 74  and return 1. Ot
1c190 68 65 72 77 69 73 65 20 64 69 73 63 61 72 64 20  herwise discard 
1c1a0 69 74 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  it and return.**
1c1b0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
1c1c0 20 69 6e 74 20 66 74 73 35 57 72 69 74 65 46 6c   int fts5WriteFl
1c1d0 75 73 68 44 6c 69 64 78 28 46 74 73 35 49 6e 64  ushDlidx(Fts5Ind
1c1e0 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57 72  ex *p, Fts5SegWr
1c1f0 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b 0a  iter *pWriter){.
1c200 20 20 69 6e 74 20 62 46 6c 61 67 20 3d 20 30 3b    int bFlag = 0;
1c210 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
1c220 77 65 72 65 20 46 54 53 35 5f 4d 49 4e 5f 44 4c  were FTS5_MIN_DL
1c230 49 44 58 5f 53 49 5a 45 20 6f 72 20 6d 6f 72 65  IDX_SIZE or more
1c240 20 65 6d 70 74 79 20 6c 65 61 66 20 70 61 67 65   empty leaf page
1c250 73 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  s written.  ** t
1c260 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  o the database, 
1c270 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 64  also write the d
1c280 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 74 6f 20  oclist-index to 
1c290 64 69 73 6b 2e 20 20 2a 2f 0a 20 20 69 66 28 20  disk.  */.  if( 
1c2a0 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b  pWriter->aDlidx[
1c2b0 30 5d 2e 62 75 66 2e 6e 3e 30 20 26 26 20 70 57  0].buf.n>0 && pW
1c2c0 72 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3e 3d 46  riter->nEmpty>=F
1c2d0 54 53 35 5f 4d 49 4e 5f 44 4c 49 44 58 5f 53 49  TS5_MIN_DLIDX_SI
1c2e0 5a 45 20 29 7b 0a 20 20 20 20 62 46 6c 61 67 20  ZE ){.    bFlag 
1c2f0 3d 20 31 3b 0a 20 20 7d 0a 20 20 66 74 73 35 57  = 1;.  }.  fts5W
1c300 72 69 74 65 44 6c 69 64 78 43 6c 65 61 72 28 70  riteDlidxClear(p
1c310 2c 20 70 57 72 69 74 65 72 2c 20 62 46 6c 61 67  , pWriter, bFlag
1c320 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45  );.  pWriter->nE
1c330 6d 70 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75  mpty = 0;.  retu
1c340 72 6e 20 62 46 6c 61 67 3b 0a 7d 0a 0a 2f 2a 0a  rn bFlag;.}../*.
1c350 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1c360 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 65   is called whene
1c370 76 65 72 20 70 72 6f 63 65 73 73 69 6e 67 20 6f  ver processing o
1c380 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 66 6f  f the doclist fo
1c390 72 20 74 68 65 20 0a 2a 2a 20 6c 61 73 74 20 74  r the .** last t
1c3a0 65 72 6d 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  erm on leaf page
1c3b0 20 28 70 57 72 69 74 65 72 2d 3e 69 42 74 50 61   (pWriter->iBtPa
1c3c0 67 65 29 20 69 73 20 63 6f 6d 70 6c 65 74 65 64  ge) is completed
1c3d0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 63  . .**.** The doc
1c3e0 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f 72 20 74  list-index for t
1c3f0 68 61 74 20 74 65 72 6d 20 69 73 20 63 75 72 72  hat term is curr
1c400 65 6e 74 6c 79 20 73 74 6f 72 65 64 20 69 6e 2d  ently stored in-
1c410 6d 65 6d 6f 72 79 20 77 69 74 68 69 6e 20 74 68  memory within th
1c420 65 0a 2a 2a 20 46 74 73 35 53 65 67 57 72 69 74  e.** Fts5SegWrit
1c430 65 72 2e 61 44 6c 69 64 78 5b 5d 20 61 72 72 61  er.aDlidx[] arra
1c440 79 2e 20 49 66 20 69 74 20 69 73 20 6c 61 72 67  y. If it is larg
1c450 65 20 65 6e 6f 75 67 68 2c 20 74 68 69 73 20 66  e enough, this f
1c460 75 6e 63 74 69 6f 6e 0a 2a 2a 20 77 72 69 74 65  unction.** write
1c470 73 20 69 74 20 6f 75 74 20 74 6f 20 64 69 73 6b  s it out to disk
1c480 2e 20 4f 72 2c 20 69 66 20 69 74 20 69 73 20 74  . Or, if it is t
1c490 6f 6f 20 73 6d 61 6c 6c 20 74 6f 20 62 6f 74 68  oo small to both
1c4a0 65 72 20 77 69 74 68 2c 20 64 69 73 63 61 72 64  er with, discard
1c4b0 73 0a 2a 2a 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 46  s.** it..**.** F
1c4c0 74 73 35 53 65 67 57 72 69 74 65 72 2e 62 74 74  ts5SegWriter.btt
1c4d0 65 72 6d 20 63 75 72 72 65 6e 74 6c 79 20 63 6f  erm currently co
1c4e0 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72 73 74  ntains the first
1c4f0 20 74 65 72 6d 20 6f 6e 20 70 61 67 65 20 69 42   term on page iB
1c500 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
1c510 20 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 46   void fts5WriteF
1c520 6c 75 73 68 42 74 72 65 65 28 46 74 73 35 49 6e  lushBtree(Fts5In
1c530 64 65 78 20 2a 70 2c 20 46 74 73 35 53 65 67 57  dex *p, Fts5SegW
1c540 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 29 7b  riter *pWriter){
1c550 0a 20 20 69 6e 74 20 62 46 6c 61 67 3b 0a 0a 20  .  int bFlag;.. 
1c560 20 61 73 73 65 72 74 28 20 70 57 72 69 74 65 72   assert( pWriter
1c570 2d 3e 69 42 74 50 61 67 65 20 7c 7c 20 70 57 72  ->iBtPage || pWr
1c580 69 74 65 72 2d 3e 6e 45 6d 70 74 79 3d 3d 30 20  iter->nEmpty==0 
1c590 29 3b 0a 20 20 69 66 28 20 70 57 72 69 74 65 72  );.  if( pWriter
1c5a0 2d 3e 69 42 74 50 61 67 65 3d 3d 30 20 29 20 72  ->iBtPage==0 ) r
1c5b0 65 74 75 72 6e 3b 0a 20 20 62 46 6c 61 67 20 3d  eturn;.  bFlag =
1c5c0 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68 44   fts5WriteFlushD
1c5d0 6c 69 64 78 28 70 2c 20 70 57 72 69 74 65 72 29  lidx(p, pWriter)
1c5e0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
1c5f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1c610 20 28 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72   (pWriter->btter
1c620 6d 2e 6e 3e 30 3f 28 63 6f 6e 73 74 20 63 68 61  m.n>0?(const cha
1c630 72 2a 29 70 57 72 69 74 65 72 2d 3e 62 74 74 65  r*)pWriter->btte
1c640 72 6d 2e 70 3a 22 22 29 3b 0a 20 20 20 20 2f 2a  rm.p:"");.    /*
1c650 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   The following w
1c660 61 73 20 61 6c 72 65 61 64 79 20 64 6f 6e 65 20  as already done 
1c670 69 6e 20 66 74 73 35 57 72 69 74 65 49 6e 69 74  in fts5WriteInit
1c680 28 29 3a 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 71  (): */.    /* sq
1c690 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
1c6a0 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20 31 2c  ->pIdxWriter, 1,
1c6b0 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67 69 64   pWriter->iSegid
1c6c0 29 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ); */.    sqlite
1c6d0 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 2d 3e 70  3_bind_blob(p->p
1c6e0 49 64 78 57 72 69 74 65 72 2c 20 32 2c 20 7a 2c  IdxWriter, 2, z,
1c6f0 20 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d   pWriter->btterm
1c700 2e 6e 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  .n, SQLITE_STATI
1c710 43 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  C);.    sqlite3_
1c720 62 69 6e 64 5f 69 6e 74 36 34 28 70 2d 3e 70 49  bind_int64(p->pI
1c730 64 78 57 72 69 74 65 72 2c 20 33 2c 20 62 46 6c  dxWriter, 3, bFl
1c740 61 67 20 2b 20 28 28 69 36 34 29 70 57 72 69 74  ag + ((i64)pWrit
1c750 65 72 2d 3e 69 42 74 50 61 67 65 3c 3c 31 29 29  er->iBtPage<<1))
1c760 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
1c770 65 70 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ep(p->pIdxWriter
1c780 29 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 73  );.    p->rc = s
1c790 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 2d 3e  qlite3_reset(p->
1c7a0 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
1c7b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
1c7c0 6c 6c 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72  ll(p->pIdxWriter
1c7d0 2c 20 32 29 3b 0a 20 20 7d 0a 20 20 70 57 72 69  , 2);.  }.  pWri
1c7e0 74 65 72 2d 3e 69 42 74 50 61 67 65 20 3d 20 30  ter->iBtPage = 0
1c7f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1c800 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 66  is called once f
1c810 6f 72 20 65 61 63 68 20 6c 65 61 66 20 70 61 67  or each leaf pag
1c820 65 20 65 78 63 65 70 74 20 74 68 65 20 66 69 72  e except the fir
1c830 73 74 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  st that contains
1c840 0a 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  .** at least one
1c850 20 74 65 72 6d 2e 20 41 72 67 75 6d 65 6e 74 20   term. Argument 
1c860 28 6e 54 65 72 6d 2f 70 54 65 72 6d 29 20 69 73  (nTerm/pTerm) is
1c870 20 74 68 65 20 73 70 6c 69 74 2d 6b 65 79 20 2d   the split-key -
1c880 20 61 20 74 65 72 6d 20 74 68 61 74 0a 2a 2a 20   a term that.** 
1c890 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 61  is larger than a
1c8a0 6c 6c 20 74 65 72 6d 73 20 77 72 69 74 74 65 6e  ll terms written
1c8b0 20 74 6f 20 65 61 72 6c 69 65 72 20 6c 65 61 76   to earlier leav
1c8c0 65 73 2c 20 61 6e 64 20 65 71 75 61 6c 20 74 6f  es, and equal to
1c8d0 20 6f 72 0a 2a 2a 20 73 6d 61 6c 6c 65 72 20 74   or.** smaller t
1c8e0 68 61 6e 20 74 68 65 20 66 69 72 73 74 20 74 65  han the first te
1c8f0 72 6d 20 6f 6e 20 74 68 65 20 6e 65 77 20 6c 65  rm on the new le
1c900 61 66 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  af..**.** If an 
1c910 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
1c920 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 6c   error code is l
1c930 65 66 74 20 69 6e 20 46 74 73 35 49 6e 64 65 78  eft in Fts5Index
1c940 2e 72 63 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  .rc. If an error
1c950 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20  .** has already 
1c960 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 74 68  occurred when th
1c970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
1c980 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
1c990 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
1c9a0 76 6f 69 64 20 66 74 73 35 57 72 69 74 65 42 74  void fts5WriteBt
1c9b0 72 65 65 54 65 72 6d 28 0a 20 20 46 74 73 35 49  reeTerm(.  Fts5I
1c9c0 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
1c9d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54             /* FT
1c9e0 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63  S5 backend objec
1c9f0 74 20 2a 2f 0a 20 20 46 74 73 35 53 65 67 57 72  t */.  Fts5SegWr
1ca00 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 20 20  iter *pWriter,  
1ca10 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 72         /* Writer
1ca20 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
1ca30 20 6e 54 65 72 6d 2c 20 63 6f 6e 73 74 20 75 38   nTerm, const u8
1ca40 20 2a 70 54 65 72 6d 20 20 20 20 20 20 2f 2a 20   *pTerm      /* 
1ca50 46 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 6e 65  First term on ne
1ca60 77 20 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 66  w page */.){.  f
1ca70 74 73 35 57 72 69 74 65 46 6c 75 73 68 42 74 72  ts5WriteFlushBtr
1ca80 65 65 28 70 2c 20 70 57 72 69 74 65 72 29 3b 0a  ee(p, pWriter);.
1ca90 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1caa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 74  ITE_OK ){.    ft
1cab0 73 35 42 75 66 66 65 72 53 65 74 28 26 70 2d 3e  s5BufferSet(&p->
1cac0 72 63 2c 20 26 70 57 72 69 74 65 72 2d 3e 62 74  rc, &pWriter->bt
1cad0 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20 70 54 65  term, nTerm, pTe
1cae0 72 6d 29 3b 0a 20 20 20 20 70 57 72 69 74 65 72  rm);.    pWriter
1caf0 2d 3e 69 42 74 50 61 67 65 20 3d 20 70 57 72 69  ->iBtPage = pWri
1cb00 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f  ter->writer.pgno
1cb10 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1cb20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1cb30 63 61 6c 6c 65 64 20 77 68 65 6e 20 66 6c 75 73  called when flus
1cb40 68 69 6e 67 20 61 20 6c 65 61 66 20 70 61 67 65  hing a leaf page
1cb50 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 6e   that contains n
1cb60 6f 0a 2a 2a 20 74 65 72 6d 73 20 61 74 20 61 6c  o.** terms at al
1cb70 6c 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74  l to disk..*/.st
1cb80 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72  atic void fts5Wr
1cb90 69 74 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 0a  iteBtreeNoTerm(.
1cba0 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
1cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbc0 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
1cbd0 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
1cbe0 73 35 53 65 67 57 72 69 74 65 72 20 2a 70 57 72  s5SegWriter *pWr
1cbf0 69 74 65 72 20 20 20 20 20 20 20 20 20 20 2f 2a  iter          /*
1cc00 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
1cc10 2f 0a 29 7b 0a 20 20 2f 2a 20 49 66 20 74 68 65  /.){.  /* If the
1cc20 72 65 20 77 65 72 65 20 6e 6f 20 72 6f 77 69 64  re were no rowid
1cc30 73 20 6f 6e 20 74 68 65 20 6c 65 61 66 20 70 61  s on the leaf pa
1cc40 67 65 20 65 69 74 68 65 72 20 61 6e 64 20 74 68  ge either and th
1cc50 65 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 0a  e doclist-index.
1cc60 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79    ** has already
1cc70 20 62 65 65 6e 20 73 74 61 72 74 65 64 2c 20 61   been started, a
1cc80 70 70 65 6e 64 20 61 6e 20 30 78 30 30 20 62 79  ppend an 0x00 by
1cc90 74 65 20 74 6f 20 69 74 2e 20 20 2a 2f 0a 20 20  te to it.  */.  
1cca0 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1ccb0 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 26  rstRowidInPage &
1ccc0 26 20 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64  & pWriter->aDlid
1ccd0 78 5b 30 5d 2e 62 75 66 2e 6e 3e 30 20 29 7b 0a  x[0].buf.n>0 ){.
1cce0 20 20 20 20 46 74 73 35 44 6c 69 64 78 57 72 69      Fts5DlidxWri
1ccf0 74 65 72 20 2a 70 44 6c 69 64 78 20 3d 20 26 70  ter *pDlidx = &p
1cd00 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30  Writer->aDlidx[0
1cd10 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ];.    assert( p
1cd20 44 6c 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69  Dlidx->bPrevVali
1cd30 64 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  d );.    sqlite3
1cd40 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
1cd50 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
1cd60 70 44 6c 69 64 78 2d 3e 62 75 66 2c 20 30 29 3b  pDlidx->buf, 0);
1cd70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
1cd80 6d 65 6e 74 20 74 68 65 20 22 6e 75 6d 62 65 72  ment the "number
1cd90 20 6f 66 20 73 65 71 75 65 6e 74 69 61 6c 20 6c   of sequential l
1cda0 65 61 76 65 73 20 77 69 74 68 6f 75 74 20 61 20  eaves without a 
1cdb0 74 65 72 6d 22 20 63 6f 75 6e 74 65 72 2e 20 2a  term" counter. *
1cdc0 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e 6e 45 6d  /.  pWriter->nEm
1cdd0 70 74 79 2b 2b 3b 0a 7d 0a 0a 73 74 61 74 69 63  pty++;.}..static
1cde0 20 69 36 34 20 66 74 73 35 44 6c 69 64 78 45 78   i64 fts5DlidxEx
1cdf0 74 72 61 63 74 46 69 72 73 74 52 6f 77 69 64 28  tractFirstRowid(
1ce00 46 74 73 35 42 75 66 66 65 72 20 2a 70 42 75 66  Fts5Buffer *pBuf
1ce10 29 7b 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b  ){.  i64 iRowid;
1ce20 0a 20 20 69 6e 74 20 69 4f 66 66 3b 0a 0a 20 20  .  int iOff;..  
1ce30 69 4f 66 66 20 3d 20 31 20 2b 20 66 74 73 35 47  iOff = 1 + fts5G
1ce40 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
1ce50 70 5b 31 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  p[1], (u64*)&iRo
1ce60 77 69 64 29 3b 0a 20 20 66 74 73 35 47 65 74 56  wid);.  fts5GetV
1ce70 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 69  arint(&pBuf->p[i
1ce80 4f 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 52 6f  Off], (u64*)&iRo
1ce90 77 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  wid);.  return i
1cea0 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
1ceb0 52 6f 77 69 64 20 69 52 6f 77 69 64 20 68 61 73  Rowid iRowid has
1cec0 20 6a 75 73 74 20 62 65 65 6e 20 61 70 70 65 6e   just been appen
1ced0 64 65 64 20 74 6f 20 74 68 65 20 63 75 72 72 65  ded to the curre
1cee0 6e 74 20 6c 65 61 66 20 70 61 67 65 2e 20 49 74  nt leaf page. It
1cef0 20 69 73 20 74 68 65 0a 2a 2a 20 66 69 72 73 74   is the.** first
1cf00 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 54 68   on the page. Th
1cf10 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70 70 65  is function appe
1cf20 6e 64 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61  nds an appropria
1cf30 74 65 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  te entry to the 
1cf40 63 75 72 72 65 6e 74 0a 2a 2a 20 64 6f 63 6c 69  current.** docli
1cf50 73 74 2d 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61  st-index..*/.sta
1cf60 74 69 63 20 76 6f 69 64 20 66 74 73 35 57 72 69  tic void fts5Wri
1cf70 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28 0a 20  teDlidxAppend(. 
1cf80 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1cf90 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1cfa0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 36 34  *pWriter, .  i64
1cfb0 20 69 52 6f 77 69 64 0a 29 7b 0a 20 20 69 6e 74   iRowid.){.  int
1cfc0 20 69 3b 0a 20 20 69 6e 74 20 62 44 6f 6e 65 20   i;.  int bDone 
1cfd0 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  = 0;..  for(i=0;
1cfe0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
1cff0 4b 20 26 26 20 62 44 6f 6e 65 3d 3d 30 3b 20 69  K && bDone==0; i
1d000 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 69 56 61  ++){.    i64 iVa
1d010 6c 3b 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78  l;.    Fts5Dlidx
1d020 57 72 69 74 65 72 20 2a 70 44 6c 69 64 78 20 3d  Writer *pDlidx =
1d030 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1d040 78 5b 69 5d 3b 0a 0a 20 20 20 20 69 66 28 20 70  x[i];..    if( p
1d050 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 3e 3d 70 2d  Dlidx->buf.n>=p-
1d060 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 29  >pConfig->pgsz )
1d070 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
1d080 75 72 72 65 6e 74 20 64 6f 63 6c 69 73 74 2d 69  urrent doclist-i
1d090 6e 64 65 78 20 70 61 67 65 20 69 73 20 66 75 6c  ndex page is ful
1d0a0 6c 2e 20 57 72 69 74 65 20 69 74 20 74 6f 20 64  l. Write it to d
1d0b0 69 73 6b 20 61 6e 64 20 70 75 73 68 0a 20 20 20  isk and push.   
1d0c0 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20     ** a copy of 
1d0d0 69 52 6f 77 69 64 20 28 77 68 69 63 68 20 77 69  iRowid (which wi
1d0e0 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 66 69  ll become the fi
1d0f0 72 73 74 20 72 6f 77 69 64 20 6f 6e 20 74 68 65  rst rowid on the
1d100 20 6e 65 78 74 0a 20 20 20 20 20 20 2a 2a 20 64   next.      ** d
1d110 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 6c 65 61  oclist-index lea
1d120 66 20 70 61 67 65 29 20 75 70 20 69 6e 74 6f 20  f page) up into 
1d130 74 68 65 20 6e 65 78 74 20 6c 65 76 65 6c 20 6f  the next level o
1d140 66 20 74 68 65 20 62 2d 74 72 65 65 20 0a 20 20  f the b-tree .  
1d150 20 20 20 20 2a 2a 20 68 69 65 72 61 72 63 68 79      ** hierarchy
1d160 2e 20 49 66 20 74 68 65 20 6e 6f 64 65 20 62 65  . If the node be
1d170 69 6e 67 20 66 6c 75 73 68 65 64 20 69 73 20 63  ing flushed is c
1d180 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 6f 6f  urrently the roo
1d190 74 20 6e 6f 64 65 2c 0a 20 20 20 20 20 20 2a 2a  t node,.      **
1d1a0 20 61 6c 73 6f 20 70 75 73 68 20 69 74 73 20 66   also push its f
1d1b0 69 72 73 74 20 72 6f 77 69 64 20 75 70 77 61 72  irst rowid upwar
1d1c0 64 73 2e 20 2a 2f 0a 20 20 20 20 20 20 70 44 6c  ds. */.      pDl
1d1d0 69 64 78 2d 3e 62 75 66 2e 70 5b 30 5d 20 3d 20  idx->buf.p[0] = 
1d1e0 30 78 30 31 3b 20 20 20 20 2f 2a 20 4e 6f 74 20  0x01;    /* Not 
1d1f0 74 68 65 20 72 6f 6f 74 20 6e 6f 64 65 20 2a 2f  the root node */
1d200 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 57  .      fts5DataW
1d210 72 69 74 65 28 70 2c 20 0a 20 20 20 20 20 20 20  rite(p, .       
1d220 20 20 20 46 54 53 35 5f 44 4c 49 44 58 5f 52 4f     FTS5_DLIDX_RO
1d230 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1d240 67 69 64 2c 20 69 2c 20 70 44 6c 69 64 78 2d 3e  gid, i, pDlidx->
1d250 70 67 6e 6f 29 2c 0a 20 20 20 20 20 20 20 20 20  pgno),.         
1d260 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e 70 2c 20   pDlidx->buf.p, 
1d270 70 44 6c 69 64 78 2d 3e 62 75 66 2e 6e 0a 20 20  pDlidx->buf.n.  
1d280 20 20 20 20 29 3b 0a 20 20 20 20 20 20 66 74 73      );.      fts
1d290 35 57 72 69 74 65 44 6c 69 64 78 47 72 6f 77 28  5WriteDlidxGrow(
1d2a0 70 2c 20 70 57 72 69 74 65 72 2c 20 69 2b 32 29  p, pWriter, i+2)
1d2b0 3b 0a 20 20 20 20 20 20 70 44 6c 69 64 78 20 3d  ;.      pDlidx =
1d2c0 20 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69 64   &pWriter->aDlid
1d2d0 78 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  x[i];.      if( 
1d2e0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1d2f0 20 26 26 20 70 44 6c 69 64 78 5b 31 5d 2e 62 75   && pDlidx[1].bu
1d300 66 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f.n==0 ){.      
1d310 20 20 69 36 34 20 69 46 69 72 73 74 20 3d 20 66    i64 iFirst = f
1d320 74 73 35 44 6c 69 64 78 45 78 74 72 61 63 74 46  ts5DlidxExtractF
1d330 69 72 73 74 52 6f 77 69 64 28 26 70 44 6c 69 64  irstRowid(&pDlid
1d340 78 2d 3e 62 75 66 29 3b 0a 0a 20 20 20 20 20 20  x->buf);..      
1d350 20 20 2f 2a 20 54 68 69 73 20 77 61 73 20 74 68    /* This was th
1d360 65 20 72 6f 6f 74 20 6e 6f 64 65 2e 20 50 75 73  e root node. Pus
1d370 68 20 69 74 73 20 66 69 72 73 74 20 72 6f 77 69  h its first rowi
1d380 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65 77 20  d up to the new 
1d390 72 6f 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20  root. */.       
1d3a0 20 70 44 6c 69 64 78 5b 31 5d 2e 70 67 6e 6f 20   pDlidx[1].pgno 
1d3b0 3d 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 3b 0a  = pDlidx->pgno;.
1d3c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46          sqlite3F
1d3d0 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56  ts5BufferAppendV
1d3e0 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70  arint(&p->rc, &p
1d3f0 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 30 29  Dlidx[1].buf, 0)
1d400 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1d410 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e  3Fts5BufferAppen
1d420 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20  dVarint(&p->rc, 
1d430 26 70 44 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20  &pDlidx[1].buf, 
1d440 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 29 3b 0a 20  pDlidx->pgno);. 
1d450 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74         sqlite3Ft
1d460 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1d470 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 44  rint(&p->rc, &pD
1d480 6c 69 64 78 5b 31 5d 2e 62 75 66 2c 20 69 46 69  lidx[1].buf, iFi
1d490 72 73 74 29 3b 0a 20 20 20 20 20 20 20 20 70 44  rst);.        pD
1d4a0 6c 69 64 78 5b 31 5d 2e 62 50 72 65 76 56 61 6c  lidx[1].bPrevVal
1d4b0 69 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  id = 1;.        
1d4c0 70 44 6c 69 64 78 5b 31 5d 2e 69 50 72 65 76 20  pDlidx[1].iPrev 
1d4d0 3d 20 69 46 69 72 73 74 3b 0a 20 20 20 20 20 20  = iFirst;.      
1d4e0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
1d4f0 46 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  Fts5BufferZero(&
1d500 70 44 6c 69 64 78 2d 3e 62 75 66 29 3b 0a 20 20  pDlidx->buf);.  
1d510 20 20 20 20 70 44 6c 69 64 78 2d 3e 62 50 72 65      pDlidx->bPre
1d520 76 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 20 20  vValid = 0;.    
1d530 20 20 70 44 6c 69 64 78 2d 3e 70 67 6e 6f 2b 2b    pDlidx->pgno++
1d540 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d550 20 20 20 62 44 6f 6e 65 20 3d 20 31 3b 0a 20 20     bDone = 1;.  
1d560 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 44 6c    }..    if( pDl
1d570 69 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20  idx->bPrevValid 
1d580 29 7b 0a 20 20 20 20 20 20 69 56 61 6c 20 3d 20  ){.      iVal = 
1d590 69 52 6f 77 69 64 20 2d 20 70 44 6c 69 64 78 2d  iRowid - pDlidx-
1d5a0 3e 69 50 72 65 76 3b 0a 20 20 20 20 7d 65 6c 73  >iPrev;.    }els
1d5b0 65 7b 0a 20 20 20 20 20 20 69 36 34 20 69 50 67  e{.      i64 iPg
1d5c0 6e 6f 20 3d 20 28 69 3d 3d 30 20 3f 20 70 57 72  no = (i==0 ? pWr
1d5d0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 6e  iter->writer.pgn
1d5e0 6f 20 3a 20 70 44 6c 69 64 78 5b 2d 31 5d 2e 70  o : pDlidx[-1].p
1d5f0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65  gno);.      asse
1d600 72 74 28 20 70 44 6c 69 64 78 2d 3e 62 75 66 2e  rt( pDlidx->buf.
1d610 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  n==0 );.      sq
1d620 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
1d630 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e  ppendVarint(&p->
1d640 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66  rc, &pDlidx->buf
1d650 2c 20 21 62 44 6f 6e 65 29 3b 0a 20 20 20 20 20  , !bDone);.     
1d660 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
1d670 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1d680 70 2d 3e 72 63 2c 20 26 70 44 6c 69 64 78 2d 3e  p->rc, &pDlidx->
1d690 62 75 66 2c 20 69 50 67 6e 6f 29 3b 0a 20 20 20  buf, iPgno);.   
1d6a0 20 20 20 69 56 61 6c 20 3d 20 69 52 6f 77 69 64     iVal = iRowid
1d6b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71 6c  ;.    }..    sql
1d6c0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
1d6d0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1d6e0 63 2c 20 26 70 44 6c 69 64 78 2d 3e 62 75 66 2c  c, &pDlidx->buf,
1d6f0 20 69 56 61 6c 29 3b 0a 20 20 20 20 70 44 6c 69   iVal);.    pDli
1d700 64 78 2d 3e 62 50 72 65 76 56 61 6c 69 64 20 3d  dx->bPrevValid =
1d710 20 31 3b 0a 20 20 20 20 70 44 6c 69 64 78 2d 3e   1;.    pDlidx->
1d720 69 50 72 65 76 20 3d 20 69 52 6f 77 69 64 3b 0a  iPrev = iRowid;.
1d730 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1d740 69 64 20 66 74 73 35 57 72 69 74 65 46 6c 75 73  id fts5WriteFlus
1d750 68 4c 65 61 66 28 46 74 73 35 49 6e 64 65 78 20  hLeaf(Fts5Index 
1d760 2a 70 2c 20 46 74 73 35 53 65 67 57 72 69 74 65  *p, Fts5SegWrite
1d770 72 20 2a 70 57 72 69 74 65 72 29 7b 0a 20 20 73  r *pWriter){.  s
1d780 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a  tatic const u8 z
1d790 65 72 6f 5b 5d 20 3d 20 7b 20 30 78 30 30 2c 20  ero[] = { 0x00, 
1d7a0 30 78 30 30 2c 20 30 78 30 30 2c 20 30 78 30 30  0x00, 0x00, 0x00
1d7b0 20 7d 3b 0a 20 20 46 74 73 35 50 61 67 65 57 72   };.  Fts5PageWr
1d7c0 69 74 65 72 20 2a 70 50 61 67 65 20 3d 20 26 70  iter *pPage = &p
1d7d0 57 72 69 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a  Writer->writer;.
1d7e0 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a 0a 20    i64 iRowid;.. 
1d7f0 20 61 73 73 65 72 74 28 20 28 70 50 61 67 65 2d   assert( (pPage-
1d800 3e 70 67 69 64 78 2e 6e 3d 3d 30 29 3d 3d 28 70  >pgidx.n==0)==(p
1d810 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 54 65  Writer->bFirstTe
1d820 72 6d 49 6e 50 61 67 65 29 20 29 3b 0a 0a 20 20  rmInPage) );..  
1d830 2f 2a 20 53 65 74 20 74 68 65 20 73 7a 4c 65 61  /* Set the szLea
1d840 66 20 68 65 61 64 65 72 20 66 69 65 6c 64 2e 20  f header field. 
1d850 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  */.  assert( 0==
1d860 66 74 73 35 47 65 74 55 31 36 28 26 70 50 61 67  fts5GetU16(&pPag
1d870 65 2d 3e 62 75 66 2e 70 5b 32 5d 29 20 29 3b 0a  e->buf.p[2]) );.
1d880 20 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50    fts5PutU16(&pP
1d890 61 67 65 2d 3e 62 75 66 2e 70 5b 32 5d 2c 20 28  age->buf.p[2], (
1d8a0 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66 2e 6e  u16)pPage->buf.n
1d8b0 29 3b 0a 0a 20 20 69 66 28 20 70 57 72 69 74 65  );..  if( pWrite
1d8c0 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1d8d0 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  age ){.    /* No
1d8e0 20 74 65 72 6d 20 77 61 73 20 77 72 69 74 74 65   term was writte
1d8f0 6e 20 74 6f 20 74 68 69 73 20 70 61 67 65 2e 20  n to this page. 
1d900 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d910 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e 3d 3d 30  Page->pgidx.n==0
1d920 20 29 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74   );.    fts5Writ
1d930 65 42 74 72 65 65 4e 6f 54 65 72 6d 28 70 2c 20  eBtreeNoTerm(p, 
1d940 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 65 6c 73  pWriter);.  }els
1d950 65 7b 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e 64  e{.    /* Append
1d960 20 74 68 65 20 70 67 69 64 78 20 74 6f 20 74 68   the pgidx to th
1d970 65 20 70 61 67 65 20 62 75 66 66 65 72 2e 20 53  e page buffer. S
1d980 65 74 20 74 68 65 20 73 7a 4c 65 61 66 20 68 65  et the szLeaf he
1d990 61 64 65 72 20 66 69 65 6c 64 2e 20 2a 2f 0a 20  ader field. */. 
1d9a0 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1d9b0 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1d9c0 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 70 50 61  &pPage->buf, pPa
1d9d0 67 65 2d 3e 70 67 69 64 78 2e 6e 2c 20 70 50 61  ge->pgidx.n, pPa
1d9e0 67 65 2d 3e 70 67 69 64 78 2e 70 29 3b 0a 20 20  ge->pgidx.p);.  
1d9f0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  }..  /* Write th
1da00 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 64 69  e page out to di
1da10 73 6b 20 2a 2f 0a 20 20 69 52 6f 77 69 64 20 3d  sk */.  iRowid =
1da20 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
1da30 57 49 44 28 70 57 72 69 74 65 72 2d 3e 69 53 65  WID(pWriter->iSe
1da40 67 69 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  gid, pPage->pgno
1da50 29 3b 0a 20 20 66 74 73 35 44 61 74 61 57 72 69  );.  fts5DataWri
1da60 74 65 28 70 2c 20 69 52 6f 77 69 64 2c 20 70 50  te(p, iRowid, pP
1da70 61 67 65 2d 3e 62 75 66 2e 70 2c 20 70 50 61 67  age->buf.p, pPag
1da80 65 2d 3e 62 75 66 2e 6e 29 3b 0a 0a 20 20 2f 2a  e->buf.n);..  /*
1da90 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
1daa0 6e 65 78 74 20 70 61 67 65 2e 20 2a 2f 0a 20 20  next page. */.  
1dab0 66 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26  fts5BufferZero(&
1dac0 70 50 61 67 65 2d 3e 62 75 66 29 3b 0a 20 20 66  pPage->buf);.  f
1dad0 74 73 35 42 75 66 66 65 72 5a 65 72 6f 28 26 70  ts5BufferZero(&p
1dae0 50 61 67 65 2d 3e 70 67 69 64 78 29 3b 0a 20 20  Page->pgidx);.  
1daf0 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1db00 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70 50  Blob(&p->rc, &pP
1db10 61 67 65 2d 3e 62 75 66 2c 20 34 2c 20 7a 65 72  age->buf, 4, zer
1db20 6f 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50 72  o);.  pPage->iPr
1db30 65 76 50 67 69 64 78 20 3d 20 30 3b 0a 20 20 70  evPgidx = 0;.  p
1db40 50 61 67 65 2d 3e 70 67 6e 6f 2b 2b 3b 0a 0a 20  Page->pgno++;.. 
1db50 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 74 68 65   /* Increase the
1db60 20 6c 65 61 76 65 73 20 77 72 69 74 74 65 6e 20   leaves written 
1db70 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 70 57 72  counter */.  pWr
1db80 69 74 65 72 2d 3e 6e 4c 65 61 66 57 72 69 74 74  iter->nLeafWritt
1db90 65 6e 2b 2b 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  en++;..  /* The 
1dba0 6e 65 77 20 6c 65 61 66 20 68 6f 6c 64 73 20 6e  new leaf holds n
1dbb0 6f 20 74 65 72 6d 73 20 6f 72 20 72 6f 77 69 64  o terms or rowid
1dbc0 73 20 2a 2f 0a 20 20 70 57 72 69 74 65 72 2d 3e  s */.  pWriter->
1dbd0 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65  bFirstTermInPage
1dbe0 20 3d 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d   = 1;.  pWriter-
1dbf0 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 50 61  >bFirstRowidInPa
1dc00 67 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ge = 1;.}../*.**
1dc10 20 41 70 70 65 6e 64 20 74 65 72 6d 20 70 54 65   Append term pTe
1dc20 72 6d 2f 6e 54 65 72 6d 20 74 6f 20 74 68 65 20  rm/nTerm to the 
1dc30 73 65 67 6d 65 6e 74 20 62 65 69 6e 67 20 77 72  segment being wr
1dc40 69 74 74 65 6e 20 62 79 20 74 68 65 20 77 72 69  itten by the wri
1dc50 74 65 72 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  ter passed.** as
1dc60 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
1dc70 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ment..**.** If a
1dc80 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
1dc90 73 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65  set the Fts5Inde
1dca0 78 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e  x.rc error code.
1dcb0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73   If an error has
1dcc0 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63   .** already occ
1dcd0 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
1dce0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
1dcf0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1dd00 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 54  fts5WriteAppendT
1dd10 65 72 6d 28 0a 20 20 46 74 73 35 49 6e 64 65 78  erm(.  Fts5Index
1dd20 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67 57   *p, .  Fts5SegW
1dd30 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c 0a  riter *pWriter,.
1dd40 20 20 69 6e 74 20 6e 54 65 72 6d 2c 20 63 6f 6e    int nTerm, con
1dd50 73 74 20 75 38 20 2a 70 54 65 72 6d 20 0a 29 7b  st u8 *pTerm .){
1dd60 0a 20 20 69 6e 74 20 6e 50 72 65 66 69 78 3b 20  .  int nPrefix; 
1dd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd80 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 70     /* Bytes of p
1dd90 72 65 66 69 78 20 63 6f 6d 70 72 65 73 73 69 6f  refix compressio
1dda0 6e 20 66 6f 72 20 74 65 72 6d 20 2a 2f 0a 20 20  n for term */.  
1ddb0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1ddc0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1ddd0 2d 3e 77 72 69 74 65 72 3b 0a 20 20 46 74 73 35  ->writer;.  Fts5
1dde0 42 75 66 66 65 72 20 2a 70 50 67 69 64 78 20 3d  Buffer *pPgidx =
1ddf0 20 26 70 57 72 69 74 65 72 2d 3e 77 72 69 74 65   &pWriter->write
1de00 72 2e 70 67 69 64 78 3b 0a 20 20 69 6e 74 20 6e  r.pgidx;.  int n
1de10 4d 69 6e 20 3d 20 4d 49 4e 28 70 50 61 67 65 2d  Min = MIN(pPage-
1de20 3e 74 65 72 6d 2e 6e 2c 20 6e 54 65 72 6d 29 3b  >term.n, nTerm);
1de30 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1de40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
1de50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1de60 3e 62 75 66 2e 6e 3e 3d 34 20 29 3b 0a 20 20 61  >buf.n>=4 );.  a
1de70 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 62 75  ssert( pPage->bu
1de80 66 2e 6e 3e 34 20 7c 7c 20 70 57 72 69 74 65 72  f.n>4 || pWriter
1de90 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50 61  ->bFirstTermInPa
1dea0 67 65 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ge );..  /* If t
1deb0 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 20  he current leaf 
1dec0 70 61 67 65 20 69 73 20 66 75 6c 6c 2c 20 66 6c  page is full, fl
1ded0 75 73 68 20 69 74 20 74 6f 20 64 69 73 6b 2e 20  ush it to disk. 
1dee0 2a 2f 0a 20 20 69 66 28 20 28 70 50 61 67 65 2d  */.  if( (pPage-
1def0 3e 62 75 66 2e 6e 20 2b 20 70 50 67 69 64 78 2d  >buf.n + pPgidx-
1df00 3e 6e 20 2b 20 6e 54 65 72 6d 20 2b 20 32 29 3e  >n + nTerm + 2)>
1df10 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73  =p->pConfig->pgs
1df20 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  z ){.    if( pPa
1df30 67 65 2d 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20  ge->buf.n>4 ){. 
1df40 20 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c       fts5WriteFl
1df50 75 73 68 4c 65 61 66 28 70 2c 20 70 57 72 69 74  ushLeaf(p, pWrit
1df60 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
1df70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc!=SQLITE_OK 
1df80 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ) return;.    }.
1df90 20 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72      fts5BufferGr
1dfa0 6f 77 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  ow(&p->rc, &pPag
1dfb0 65 2d 3e 62 75 66 2c 20 6e 54 65 72 6d 2b 46 54  e->buf, nTerm+FT
1dfc0 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
1dfd0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 4f  ;.  }.  .  /* TO
1dfe0 44 4f 31 3a 20 55 70 64 61 74 69 6e 67 20 70 67  DO1: Updating pg
1dff0 69 64 78 20 68 65 72 65 2e 20 2a 2f 0a 20 20 70  idx here. */.  p
1e000 50 67 69 64 78 2d 3e 6e 20 2b 3d 20 73 71 6c 69  Pgidx->n += sqli
1e010 74 65 33 46 74 73 35 50 75 74 56 61 72 69 6e 74  te3Fts5PutVarint
1e020 28 0a 20 20 20 20 20 20 26 70 50 67 69 64 78 2d  (.      &pPgidx-
1e030 3e 70 5b 70 50 67 69 64 78 2d 3e 6e 5d 2c 20 70  >p[pPgidx->n], p
1e040 50 61 67 65 2d 3e 62 75 66 2e 6e 20 2d 20 70 50  Page->buf.n - pP
1e050 61 67 65 2d 3e 69 50 72 65 76 50 67 69 64 78 0a  age->iPrevPgidx.
1e060 20 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 50    );.  pPage->iP
1e070 72 65 76 50 67 69 64 78 20 3d 20 70 50 61 67 65  revPgidx = pPage
1e080 2d 3e 62 75 66 2e 6e 3b 0a 23 69 66 20 30 0a 20  ->buf.n;.#if 0. 
1e090 20 66 74 73 35 50 75 74 55 31 36 28 26 70 50 67   fts5PutU16(&pPg
1e0a0 69 64 78 2d 3e 70 5b 70 50 67 69 64 78 2d 3e 6e  idx->p[pPgidx->n
1e0b0 5d 2c 20 70 50 61 67 65 2d 3e 62 75 66 2e 6e 29  ], pPage->buf.n)
1e0c0 3b 0a 20 20 70 50 67 69 64 78 2d 3e 6e 20 2b 3d  ;.  pPgidx->n +=
1e0d0 20 32 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66   2;.#endif..  if
1e0e0 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73  ( pWriter->bFirs
1e0f0 74 54 65 72 6d 49 6e 50 61 67 65 20 29 7b 0a 20  tTermInPage ){. 
1e100 20 20 20 6e 50 72 65 66 69 78 20 3d 20 30 3b 0a     nPrefix = 0;.
1e110 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
1e120 67 6e 6f 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno!=1 ){.      
1e130 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 66  /* This is the f
1e140 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 61 20 6c  irst term on a l
1e150 65 61 66 20 74 68 61 74 20 69 73 20 6e 6f 74 20  eaf that is not 
1e160 74 68 65 20 6c 65 66 74 6d 6f 73 74 20 6c 65 61  the leftmost lea
1e170 66 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68  f in.      ** th
1e180 65 20 73 65 67 6d 65 6e 74 20 62 2d 74 72 65 65  e segment b-tree
1e190 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69  . In this case i
1e1a0 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
1e1b0 6f 20 61 64 64 20 61 20 74 65 72 6d 20 74 6f 0a  o add a term to.
1e1c0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 62 2d 74        ** the b-t
1e1d0 72 65 65 20 68 69 65 72 61 72 63 68 79 20 74 68  ree hierarchy th
1e1e0 61 74 20 69 73 20 28 61 29 20 6c 61 72 67 65 72  at is (a) larger
1e1f0 20 74 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73   than the larges
1e200 74 20 74 65 72 6d 20 0a 20 20 20 20 20 20 2a 2a  t term .      **
1e210 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
1e220 20 74 6f 20 74 68 65 20 73 65 67 6d 65 6e 74 20   to the segment 
1e230 61 6e 64 20 28 62 29 20 73 6d 61 6c 6c 65 72 20  and (b) smaller 
1e240 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
1e250 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 74  .      ** this t
1e260 65 72 6d 2e 20 49 6e 20 6f 74 68 65 72 20 77 6f  erm. In other wo
1e270 72 64 73 2c 20 61 20 70 72 65 66 69 78 20 6f 66  rds, a prefix of
1e280 20 28 70 54 65 72 6d 2f 6e 54 65 72 6d 29 20 74   (pTerm/nTerm) t
1e290 68 61 74 20 69 73 20 6f 6e 65 0a 20 20 20 20 20  hat is one.     
1e2a0 20 2a 2a 20 62 79 74 65 20 6c 6f 6e 67 65 72 20   ** byte longer 
1e2b0 74 68 61 6e 20 74 68 65 20 6c 6f 6e 67 65 73 74  than the longest
1e2c0 20 70 72 65 66 69 78 20 28 70 54 65 72 6d 2f 6e   prefix (pTerm/n
1e2d0 54 65 72 6d 29 20 73 68 61 72 65 73 20 77 69 74  Term) shares wit
1e2e0 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  h the.      ** p
1e2f0 72 65 76 69 6f 75 73 20 74 65 72 6d 2e 20 0a 20  revious term. . 
1e300 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1e310 20 55 73 75 61 6c 6c 79 2c 20 74 68 65 20 70 72   Usually, the pr
1e320 65 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 61  evious term is a
1e330 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 50 61 67  vailable in pPag
1e340 65 2d 3e 74 65 72 6d 2e 20 54 68 65 20 65 78 63  e->term. The exc
1e350 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  eption.      ** 
1e360 69 73 20 69 66 20 74 68 69 73 20 69 73 20 74 68  is if this is th
1e370 65 20 66 69 72 73 74 20 74 65 72 6d 20 77 72 69  e first term wri
1e380 74 74 65 6e 20 69 6e 20 61 6e 20 69 6e 63 72 65  tten in an incre
1e390 6d 65 6e 74 61 6c 2d 6d 65 72 67 65 20 73 74 65  mental-merge ste
1e3a0 70 2e 0a 20 20 20 20 20 20 2a 2a 20 49 6e 20 74  p..      ** In t
1e3b0 68 69 73 20 63 61 73 65 20 74 68 65 20 70 72 65  his case the pre
1e3c0 76 69 6f 75 73 20 74 65 72 6d 20 69 73 20 6e 6f  vious term is no
1e3d0 74 20 61 76 61 69 6c 61 62 6c 65 2c 20 73 6f 20  t available, so 
1e3e0 6a 75 73 74 20 77 72 69 74 65 20 61 0a 20 20 20  just write a.   
1e3f0 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 28 70     ** copy of (p
1e400 54 65 72 6d 2f 6e 54 65 72 6d 29 20 69 6e 74 6f  Term/nTerm) into
1e410 20 74 68 65 20 70 61 72 65 6e 74 20 6e 6f 64 65   the parent node
1e420 2e 20 54 68 69 73 20 69 73 20 73 6c 69 67 68 74  . This is slight
1e430 6c 79 0a 20 20 20 20 20 20 2a 2a 20 69 6e 65 66  ly.      ** inef
1e440 66 69 63 69 65 6e 74 2c 20 62 75 74 20 73 74 69  ficient, but sti
1e450 6c 6c 20 63 6f 72 72 65 63 74 2e 20 20 2a 2f 0a  ll correct.  */.
1e460 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 6e 54        int n = nT
1e470 65 72 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  erm;.      if( p
1e480 50 61 67 65 2d 3e 74 65 72 6d 2e 6e 20 29 7b 0a  Page->term.n ){.
1e490 20 20 20 20 20 20 20 20 6e 20 3d 20 31 20 2b 20          n = 1 + 
1e4a0 66 74 73 35 50 72 65 66 69 78 43 6f 6d 70 72 65  fts5PrefixCompre
1e4b0 73 73 28 6e 4d 69 6e 2c 20 70 50 61 67 65 2d 3e  ss(nMin, pPage->
1e4c0 74 65 72 6d 2e 70 2c 20 70 54 65 72 6d 29 3b 0a  term.p, pTerm);.
1e4d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
1e4e0 73 35 57 72 69 74 65 42 74 72 65 65 54 65 72 6d  s5WriteBtreeTerm
1e4f0 28 70 2c 20 70 57 72 69 74 65 72 2c 20 6e 2c 20  (p, pWriter, n, 
1e500 70 54 65 72 6d 29 3b 0a 20 20 20 20 20 20 69 66  pTerm);.      if
1e510 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f  ( p->rc!=SQLITE_
1e520 4f 4b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  OK ) return;.   
1e530 20 20 20 70 50 61 67 65 20 3d 20 26 70 57 72 69     pPage = &pWri
1e540 74 65 72 2d 3e 77 72 69 74 65 72 3b 0a 20 20 20  ter->writer;.   
1e550 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1e560 6e 50 72 65 66 69 78 20 3d 20 66 74 73 35 50 72  nPrefix = fts5Pr
1e570 65 66 69 78 43 6f 6d 70 72 65 73 73 28 6e 4d 69  efixCompress(nMi
1e580 6e 2c 20 70 50 61 67 65 2d 3e 74 65 72 6d 2e 70  n, pPage->term.p
1e590 2c 20 70 54 65 72 6d 29 3b 0a 20 20 20 20 66 74  , pTerm);.    ft
1e5a0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 56 61  s5BufferAppendVa
1e5b0 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26 70 50  rint(&p->rc, &pP
1e5c0 61 67 65 2d 3e 62 75 66 2c 20 6e 50 72 65 66 69  age->buf, nPrefi
1e5d0 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 70  x);.  }..  /* Ap
1e5e0 70 65 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20  pend the number 
1e5f0 6f 66 20 62 79 74 65 73 20 6f 66 20 6e 65 77 20  of bytes of new 
1e600 64 61 74 61 2c 20 74 68 65 6e 20 74 68 65 20 74  data, then the t
1e610 65 72 6d 20 64 61 74 61 20 69 74 73 65 6c 66 0a  erm data itself.
1e620 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65    ** to the page
1e630 2e 20 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65  . */.  fts5Buffe
1e640 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1e650 2d 3e 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75  ->rc, &pPage->bu
1e660 66 2c 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66  f, nTerm - nPref
1e670 69 78 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ix);.  fts5Buffe
1e680 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
1e690 72 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c  rc, &pPage->buf,
1e6a0 20 6e 54 65 72 6d 20 2d 20 6e 50 72 65 66 69 78   nTerm - nPrefix
1e6b0 2c 20 26 70 54 65 72 6d 5b 6e 50 72 65 66 69 78  , &pTerm[nPrefix
1e6c0 5d 29 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  ]);..  /* Update
1e6d0 20 74 68 65 20 46 74 73 35 50 61 67 65 57 72 69   the Fts5PageWri
1e6e0 74 65 72 2e 74 65 72 6d 20 66 69 65 6c 64 2e 20  ter.term field. 
1e6f0 2a 2f 0a 20 20 66 74 73 35 42 75 66 66 65 72 53  */.  fts5BufferS
1e700 65 74 28 26 70 2d 3e 72 63 2c 20 26 70 50 61 67  et(&p->rc, &pPag
1e710 65 2d 3e 74 65 72 6d 2c 20 6e 54 65 72 6d 2c 20  e->term, nTerm, 
1e720 70 54 65 72 6d 29 3b 0a 20 20 70 57 72 69 74 65  pTerm);.  pWrite
1e730 72 2d 3e 62 46 69 72 73 74 54 65 72 6d 49 6e 50  r->bFirstTermInP
1e740 61 67 65 20 3d 20 30 3b 0a 0a 20 20 70 57 72 69  age = 0;..  pWri
1e750 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77 69 64  ter->bFirstRowid
1e760 49 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 57  InPage = 0;.  pW
1e770 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f 77  riter->bFirstRow
1e780 69 64 49 6e 44 6f 63 6c 69 73 74 20 3d 20 31 3b  idInDoclist = 1;
1e790 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  ..  assert( p->r
1e7a0 63 20 7c 7c 20 28 70 57 72 69 74 65 72 2d 3e 6e  c || (pWriter->n
1e7b0 44 6c 69 64 78 3e 30 20 26 26 20 70 57 72 69 74  Dlidx>0 && pWrit
1e7c0 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e 62 75  er->aDlidx[0].bu
1e7d0 66 2e 6e 3d 3d 30 29 20 29 3b 0a 20 20 70 57 72  f.n==0) );.  pWr
1e7e0 69 74 65 72 2d 3e 61 44 6c 69 64 78 5b 30 5d 2e  iter->aDlidx[0].
1e7f0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
1e800 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70  no;.}../*.** App
1e810 65 6e 64 20 61 20 72 6f 77 69 64 20 61 6e 64 20  end a rowid and 
1e820 70 6f 73 69 74 69 6f 6e 2d 6c 69 73 74 20 73 69  position-list si
1e830 7a 65 20 66 69 65 6c 64 20 74 6f 20 74 68 65 20  ze field to the 
1e840 77 72 69 74 65 72 73 20 6f 75 74 70 75 74 2e 20  writers output. 
1e850 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1e860 66 74 73 35 57 72 69 74 65 41 70 70 65 6e 64 52  fts5WriteAppendR
1e870 6f 77 69 64 28 0a 20 20 46 74 73 35 49 6e 64 65  owid(.  Fts5Inde
1e880 78 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 65 67  x *p, .  Fts5Seg
1e890 57 72 69 74 65 72 20 2a 70 57 72 69 74 65 72 2c  Writer *pWriter,
1e8a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 0a 29 7b  .  i64 iRowid.){
1e8b0 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
1e8c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 46  LITE_OK ){.    F
1e8d0 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a 70  ts5PageWriter *p
1e8e0 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72 2d  Page = &pWriter-
1e8f0 3e 77 72 69 74 65 72 3b 0a 0a 20 20 20 20 69 66  >writer;..    if
1e900 28 20 28 70 50 61 67 65 2d 3e 62 75 66 2e 6e 20  ( (pPage->buf.n 
1e910 2b 20 70 50 61 67 65 2d 3e 70 67 69 64 78 2e 6e  + pPage->pgidx.n
1e920 29 3e 3d 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70  )>=p->pConfig->p
1e930 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 66 74 73  gsz ){.      fts
1e940 35 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28  5WriteFlushLeaf(
1e950 70 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 20  p, pWriter);.   
1e960 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
1e970 69 73 20 69 73 20 74 6f 20 62 65 20 74 68 65 20  is is to be the 
1e980 66 69 72 73 74 20 72 6f 77 69 64 20 77 72 69 74  first rowid writ
1e990 74 65 6e 20 74 6f 20 74 68 65 20 70 61 67 65 2c  ten to the page,
1e9a0 20 73 65 74 20 74 68 65 20 0a 20 20 20 20 2a 2a   set the .    **
1e9b0 20 72 6f 77 69 64 2d 70 6f 69 6e 74 65 72 20 69   rowid-pointer i
1e9c0 6e 20 74 68 65 20 70 61 67 65 2d 68 65 61 64 65  n the page-heade
1e9d0 72 2e 20 41 6c 73 6f 20 61 70 70 65 6e 64 20 61  r. Also append a
1e9e0 20 76 61 6c 75 65 20 74 6f 20 74 68 65 20 64 6c   value to the dl
1e9f0 69 64 78 0a 20 20 20 20 2a 2a 20 62 75 66 66 65  idx.    ** buffe
1ea00 72 2c 20 69 6e 20 63 61 73 65 20 61 20 64 6f 63  r, in case a doc
1ea10 6c 69 73 74 2d 69 6e 64 65 78 20 69 73 20 72 65  list-index is re
1ea20 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20  quired.  */.    
1ea30 69 66 28 20 70 57 72 69 74 65 72 2d 3e 62 46 69  if( pWriter->bFi
1ea40 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
1ea50 7b 0a 20 20 20 20 20 20 66 74 73 35 50 75 74 55  {.      fts5PutU
1ea60 31 36 28 70 50 61 67 65 2d 3e 62 75 66 2e 70 2c  16(pPage->buf.p,
1ea70 20 28 75 31 36 29 70 50 61 67 65 2d 3e 62 75 66   (u16)pPage->buf
1ea80 2e 6e 29 3b 0a 20 20 20 20 20 20 66 74 73 35 57  .n);.      fts5W
1ea90 72 69 74 65 44 6c 69 64 78 41 70 70 65 6e 64 28  riteDlidxAppend(
1eaa0 70 2c 20 70 57 72 69 74 65 72 2c 20 69 52 6f 77  p, pWriter, iRow
1eab0 69 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  id);.    }..    
1eac0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 72 6f 77  /* Write the row
1ead0 69 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  id. */.    if( p
1eae0 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52 6f  Writer->bFirstRo
1eaf0 77 69 64 49 6e 44 6f 63 6c 69 73 74 20 7c 7c 20  widInDoclist || 
1eb00 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1eb10 6f 77 69 64 49 6e 50 61 67 65 20 29 7b 0a 20 20  owidInPage ){.  
1eb20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
1eb30 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
1eb40 63 2c 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20  c, &pPage->buf, 
1eb50 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 7d 65 6c  iRowid);.    }el
1eb60 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
1eb70 5f 6e 63 28 20 70 2d 3e 72 63 20 7c 7c 20 69 52  _nc( p->rc || iR
1eb80 6f 77 69 64 3e 70 57 72 69 74 65 72 2d 3e 69 50  owid>pWriter->iP
1eb90 72 65 76 52 6f 77 69 64 20 29 3b 0a 20 20 20 20  revRowid );.    
1eba0 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
1ebb0 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c  ndVarint(&p->rc,
1ebc0 20 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 69 52   &pPage->buf, iR
1ebd0 6f 77 69 64 20 2d 20 70 57 72 69 74 65 72 2d 3e  owid - pWriter->
1ebe0 69 50 72 65 76 52 6f 77 69 64 29 3b 0a 20 20 20  iPrevRowid);.   
1ebf0 20 7d 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e   }.    pWriter->
1ec00 69 50 72 65 76 52 6f 77 69 64 20 3d 20 69 52 6f  iPrevRowid = iRo
1ec10 77 69 64 3b 0a 20 20 20 20 70 57 72 69 74 65 72  wid;.    pWriter
1ec20 2d 3e 62 46 69 72 73 74 52 6f 77 69 64 49 6e 44  ->bFirstRowidInD
1ec30 6f 63 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20  oclist = 0;.    
1ec40 70 57 72 69 74 65 72 2d 3e 62 46 69 72 73 74 52  pWriter->bFirstR
1ec50 6f 77 69 64 49 6e 50 61 67 65 20 3d 20 30 3b 0a  owidInPage = 0;.
1ec60 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f    }.}..static vo
1ec70 69 64 20 66 74 73 35 57 72 69 74 65 41 70 70 65  id fts5WriteAppe
1ec80 6e 64 50 6f 73 6c 69 73 74 44 61 74 61 28 0a 20  ndPoslistData(. 
1ec90 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1eca0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1ecb0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 63 6f 6e  *pWriter, .  con
1ecc0 73 74 20 75 38 20 2a 61 44 61 74 61 2c 20 0a 20  st u8 *aData, . 
1ecd0 20 69 6e 74 20 6e 44 61 74 61 0a 29 7b 0a 20 20   int nData.){.  
1ece0 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1ecf0 70 50 61 67 65 20 3d 20 26 70 57 72 69 74 65 72  pPage = &pWriter
1ed00 2d 3e 77 72 69 74 65 72 3b 0a 20 20 63 6f 6e 73  ->writer;.  cons
1ed10 74 20 75 38 20 2a 61 20 3d 20 61 44 61 74 61 3b  t u8 *a = aData;
1ed20 0a 20 20 69 6e 74 20 6e 20 3d 20 6e 44 61 74 61  .  int n = nData
1ed30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
1ed40 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 3e  ->pConfig->pgsz>
1ed50 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d  0 );.  while( p-
1ed60 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a  >rc==SQLITE_OK .
1ed70 20 20 20 20 20 26 26 20 28 70 50 61 67 65 2d 3e       && (pPage->
1ed80 62 75 66 2e 6e 20 2b 20 70 50 61 67 65 2d 3e 70  buf.n + pPage->p
1ed90 67 69 64 78 2e 6e 20 2b 20 6e 29 3e 3d 70 2d 3e  gidx.n + n)>=p->
1eda0 70 43 6f 6e 66 69 67 2d 3e 70 67 73 7a 20 0a 20  pConfig->pgsz . 
1edb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 52 65 71   ){.    int nReq
1edc0 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70   = p->pConfig->p
1edd0 67 73 7a 20 2d 20 70 50 61 67 65 2d 3e 62 75 66  gsz - pPage->buf
1ede0 2e 6e 20 2d 20 70 50 61 67 65 2d 3e 70 67 69 64  .n - pPage->pgid
1edf0 78 2e 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f  x.n;.    int nCo
1ee00 70 79 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c  py = 0;.    whil
1ee10 65 28 20 6e 43 6f 70 79 3c 6e 52 65 71 20 29 7b  e( nCopy<nReq ){
1ee20 0a 20 20 20 20 20 20 69 36 34 20 64 75 6d 6d 79  .      i64 dummy
1ee30 3b 0a 20 20 20 20 20 20 6e 43 6f 70 79 20 2b 3d  ;.      nCopy +=
1ee40 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28 26   fts5GetVarint(&
1ee50 61 5b 6e 43 6f 70 79 5d 2c 20 28 75 36 34 2a 29  a[nCopy], (u64*)
1ee60 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 7d 0a 20  &dummy);.    }. 
1ee70 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
1ee80 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20  endBlob(&p->rc, 
1ee90 26 70 50 61 67 65 2d 3e 62 75 66 2c 20 6e 43 6f  &pPage->buf, nCo
1eea0 70 79 2c 20 61 29 3b 0a 20 20 20 20 61 20 2b 3d  py, a);.    a +=
1eeb0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 6e 20 2d 3d   nCopy;.    n -=
1eec0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 66 74 73 35   nCopy;.    fts5
1eed0 57 72 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70  WriteFlushLeaf(p
1eee0 2c 20 70 57 72 69 74 65 72 29 3b 0a 20 20 7d 0a  , pWriter);.  }.
1eef0 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20 20    if( n>0 ){.   
1ef00 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e   fts5BufferAppen
1ef10 64 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 70  dBlob(&p->rc, &p
1ef20 50 61 67 65 2d 3e 62 75 66 2c 20 6e 2c 20 61 29  Page->buf, n, a)
1ef30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
1ef40 6c 75 73 68 20 61 6e 79 20 64 61 74 61 20 63 61  lush any data ca
1ef50 63 68 65 64 20 62 79 20 74 68 65 20 77 72 69 74  ched by the writ
1ef60 65 72 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65  er object to the
1ef70 20 64 61 74 61 62 61 73 65 2e 20 46 72 65 65 20   database. Free 
1ef80 61 6e 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  any.** allocatio
1ef90 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
1efa0 74 68 20 74 68 65 20 77 72 69 74 65 72 2e 0a 2a  th the writer..*
1efb0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
1efc0 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 0a 20  s5WriteFinish(. 
1efd0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1efe0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1eff0 2a 70 57 72 69 74 65 72 2c 20 20 20 20 20 20 20  *pWriter,       
1f000 20 20 2f 2a 20 57 72 69 74 65 72 20 6f 62 6a 65    /* Writer obje
1f010 63 74 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ct */.  int *pnL
1f020 65 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20  eaf             
1f030 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1f040 4e 75 6d 62 65 72 20 6f 66 20 6c 65 61 66 20 70  Number of leaf p
1f050 61 67 65 73 20 69 6e 20 62 2d 74 72 65 65 20 2a  ages in b-tree *
1f060 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
1f070 46 74 73 35 50 61 67 65 57 72 69 74 65 72 20 2a  Fts5PageWriter *
1f080 70 4c 65 61 66 20 3d 20 26 70 57 72 69 74 65 72  pLeaf = &pWriter
1f090 2d 3e 77 72 69 74 65 72 3b 0a 20 20 69 66 28 20  ->writer;.  if( 
1f0a0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
1f0b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1f0c0 70 4c 65 61 66 2d 3e 70 67 6e 6f 3e 3d 31 20 29  pLeaf->pgno>=1 )
1f0d0 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  ;.    if( pLeaf-
1f0e0 3e 62 75 66 2e 6e 3e 34 20 29 7b 0a 20 20 20 20  >buf.n>4 ){.    
1f0f0 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
1f100 4c 65 61 66 28 70 2c 20 70 57 72 69 74 65 72 29  Leaf(p, pWriter)
1f110 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 6e 4c  ;.    }.    *pnL
1f120 65 61 66 20 3d 20 70 4c 65 61 66 2d 3e 70 67 6e  eaf = pLeaf->pgn
1f130 6f 2d 31 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  o-1;.    if( pLe
1f140 61 66 2d 3e 70 67 6e 6f 3e 31 20 29 7b 0a 20 20  af->pgno>1 ){.  
1f150 20 20 20 20 66 74 73 35 57 72 69 74 65 46 6c 75      fts5WriteFlu
1f160 73 68 42 74 72 65 65 28 70 2c 20 70 57 72 69 74  shBtree(p, pWrit
1f170 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
1f180 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1f190 26 70 4c 65 61 66 2d 3e 74 65 72 6d 29 3b 0a 20  &pLeaf->term);. 
1f1a0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1f1b0 26 70 4c 65 61 66 2d 3e 62 75 66 29 3b 0a 20 20  &pLeaf->buf);.  
1f1c0 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
1f1d0 70 4c 65 61 66 2d 3e 70 67 69 64 78 29 3b 0a 20  pLeaf->pgidx);. 
1f1e0 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
1f1f0 26 70 57 72 69 74 65 72 2d 3e 62 74 74 65 72 6d  &pWriter->btterm
1f200 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
1f210 3c 70 57 72 69 74 65 72 2d 3e 6e 44 6c 69 64 78  <pWriter->nDlidx
1f220 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
1f230 74 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65  te3Fts5BufferFre
1f240 65 28 26 70 57 72 69 74 65 72 2d 3e 61 44 6c 69  e(&pWriter->aDli
1f250 64 78 5b 69 5d 2e 62 75 66 29 3b 0a 20 20 7d 0a  dx[i].buf);.  }.
1f260 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1f270 57 72 69 74 65 72 2d 3e 61 44 6c 69 64 78 29 3b  Writer->aDlidx);
1f280 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1f290 66 74 73 35 57 72 69 74 65 49 6e 69 74 28 0a 20  fts5WriteInit(. 
1f2a0 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a   Fts5Index *p, .
1f2b0 20 20 46 74 73 35 53 65 67 57 72 69 74 65 72 20    Fts5SegWriter 
1f2c0 2a 70 57 72 69 74 65 72 2c 20 0a 20 20 69 6e 74  *pWriter, .  int
1f2d0 20 69 53 65 67 69 64 0a 29 7b 0a 20 20 63 6f 6e   iSegid.){.  con
1f2e0 73 74 20 69 6e 74 20 6e 42 75 66 66 65 72 20 3d  st int nBuffer =
1f2f0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 70 67 73   p->pConfig->pgs
1f300 7a 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 50 41  z + FTS5_DATA_PA
1f310 44 44 49 4e 47 3b 0a 0a 20 20 6d 65 6d 73 65 74  DDING;..  memset
1f320 28 70 57 72 69 74 65 72 2c 20 30 2c 20 73 69 7a  (pWriter, 0, siz
1f330 65 6f 66 28 46 74 73 35 53 65 67 57 72 69 74 65  eof(Fts5SegWrite
1f340 72 29 29 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e  r));.  pWriter->
1f350 69 53 65 67 69 64 20 3d 20 69 53 65 67 69 64 3b  iSegid = iSegid;
1f360 0a 0a 20 20 66 74 73 35 57 72 69 74 65 44 6c 69  ..  fts5WriteDli
1f370 64 78 47 72 6f 77 28 70 2c 20 70 57 72 69 74 65  dxGrow(p, pWrite
1f380 72 2c 20 31 29 3b 0a 20 20 70 57 72 69 74 65 72  r, 1);.  pWriter
1f390 2d 3e 77 72 69 74 65 72 2e 70 67 6e 6f 20 3d 20  ->writer.pgno = 
1f3a0 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 62 46  1;.  pWriter->bF
1f3b0 69 72 73 74 54 65 72 6d 49 6e 50 61 67 65 20 3d  irstTermInPage =
1f3c0 20 31 3b 0a 20 20 70 57 72 69 74 65 72 2d 3e 69   1;.  pWriter->i
1f3d0 42 74 50 61 67 65 20 3d 20 31 3b 0a 0a 20 20 61  BtPage = 1;..  a
1f3e0 73 73 65 72 74 28 20 70 57 72 69 74 65 72 2d 3e  ssert( pWriter->
1f3f0 77 72 69 74 65 72 2e 62 75 66 2e 6e 3d 3d 30 20  writer.buf.n==0 
1f400 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 57 72  );.  assert( pWr
1f410 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69  iter->writer.pgi
1f420 64 78 2e 6e 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  dx.n==0 );..  /*
1f430 20 47 72 6f 77 20 74 68 65 20 74 77 6f 20 62 75   Grow the two bu
1f440 66 66 65 72 73 20 74 6f 20 70 67 73 7a 20 2b 20  ffers to pgsz + 
1f450 70 61 64 64 69 6e 67 20 62 79 74 65 73 20 69 6e  padding bytes in
1f460 20 73 69 7a 65 2e 20 2a 2f 0a 20 20 73 71 6c 69   size. */.  sqli
1f470 74 65 33 46 74 73 35 42 75 66 66 65 72 53 69 7a  te3Fts5BufferSiz
1f480 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72 69 74  e(&p->rc, &pWrit
1f490 65 72 2d 3e 77 72 69 74 65 72 2e 70 67 69 64 78  er->writer.pgidx
1f4a0 2c 20 6e 42 75 66 66 65 72 29 3b 0a 20 20 73 71  , nBuffer);.  sq
1f4b0 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 53  lite3Fts5BufferS
1f4c0 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 70 57 72  ize(&p->rc, &pWr
1f4d0 69 74 65 72 2d 3e 77 72 69 74 65 72 2e 62 75 66  iter->writer.buf
1f4e0 2c 20 6e 42 75 66 66 65 72 29 3b 0a 0a 20 20 69  , nBuffer);..  i
1f4f0 66 28 20 70 2d 3e 70 49 64 78 57 72 69 74 65 72  f( p->pIdxWriter
1f500 3d 3d 30 20 29 7b 0a 20 20 20 20 46 74 73 35 43  ==0 ){.    Fts5C
1f510 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d  onfig *pConfig =
1f520 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 20   p->pConfig;.   
1f530 20 66 74 73 35 49 6e 64 65 78 50 72 65 70 61 72   fts5IndexPrepar
1f540 65 53 74 6d 74 28 70 2c 20 26 70 2d 3e 70 49 64  eStmt(p, &p->pId
1f550 78 57 72 69 74 65 72 2c 20 73 71 6c 69 74 65 33  xWriter, sqlite3
1f560 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
1f570 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1f580 20 27 25 71 27 2e 27 25 71 5f 69 64 78 27 28 73   '%q'.'%q_idx'(s
1f590 65 67 69 64 2c 74 65 72 6d 2c 70 67 6e 6f 29 20  egid,term,pgno) 
1f5a0 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 29 22 2c 20  VALUES(?,?,?)", 
1f5b0 0a 20 20 20 20 20 20 20 20 20 20 70 43 6f 6e 66  .          pConf
1f5c0 69 67 2d 3e 7a 44 62 2c 20 70 43 6f 6e 66 69 67  ig->zDb, pConfig
1f5d0 2d 3e 7a 4e 61 6d 65 0a 20 20 20 20 29 29 3b 0a  ->zName.    ));.
1f5e0 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63    }..  if( p->rc
1f5f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f600 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
1f610 20 74 68 65 20 34 2d 62 79 74 65 20 6c 65 61 66   the 4-byte leaf
1f620 2d 70 61 67 65 20 68 65 61 64 65 72 20 74 6f 20  -page header to 
1f630 30 78 30 30 2e 20 2a 2f 0a 20 20 20 20 6d 65 6d  0x00. */.    mem
1f640 73 65 74 28 70 57 72 69 74 65 72 2d 3e 77 72 69  set(pWriter->wri
1f650 74 65 72 2e 62 75 66 2e 70 2c 20 30 2c 20 34 29  ter.buf.p, 0, 4)
1f660 3b 0a 20 20 20 20 70 57 72 69 74 65 72 2d 3e 77  ;.    pWriter->w
1f670 72 69 74 65 72 2e 62 75 66 2e 6e 20 3d 20 34 3b  riter.buf.n = 4;
1f680 0a 0a 20 20 20 20 2f 2a 20 42 69 6e 64 20 74 68  ..    /* Bind th
1f690 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
1f6a0 20 73 65 67 6d 65 6e 74 20 69 64 20 74 6f 20 74   segment id to t
1f6b0 68 65 20 69 6e 64 65 78 2d 77 72 69 74 65 72 2e  he index-writer.
1f6c0 20 54 68 69 73 20 69 73 20 61 6e 0a 20 20 20 20   This is an.    
1f6d0 2a 2a 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ** optimization 
1f6e0 6f 76 65 72 20 62 69 6e 64 69 6e 67 20 74 68 65  over binding the
1f6f0 20 73 61 6d 65 20 76 61 6c 75 65 20 6f 76 65 72   same value over
1f700 20 61 6e 64 20 6f 76 65 72 20 61 73 20 72 6f 77   and over as row
1f710 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 69 6e 73  s are.    ** ins
1f720 65 72 74 65 64 20 69 6e 74 6f 20 25 5f 69 64 78  erted into %_idx
1f730 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1f740 77 72 69 74 65 72 2e 20 20 2a 2f 0a 20 20 20 20  writer.  */.    
1f750 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
1f760 28 70 2d 3e 70 49 64 78 57 72 69 74 65 72 2c 20  (p->pIdxWriter, 
1f770 31 2c 20 70 57 72 69 74 65 72 2d 3e 69 53 65 67  1, pWriter->iSeg
1f780 69 64 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  id);.  }.}../*.*
1f790 2a 20 49 74 65 72 61 74 6f 72 20 70 49 74 65 72  * Iterator pIter
1f7a0 20 77 61 73 20 75 73 65 64 20 74 6f 20 69 74 65   was used to ite
1f7b0 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65  rate through the
1f7c0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
1f7d0 6f 66 20 6f 6e 20 61 6e 0a 2a 2a 20 69 6e 63 72  of on an.** incr
1f7e0 65 6d 65 6e 74 61 6c 20 6d 65 72 67 65 20 6f 70  emental merge op
1f7f0 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 66 75  eration. This fu
1f800 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1f810 20 69 66 20 74 68 65 20 69 6e 63 72 65 6d 65 6e   if the incremen
1f820 74 61 6c 0a 2a 2a 20 6d 65 72 67 65 20 73 74 65  tal.** merge ste
1f830 70 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 62  p has finished b
1f840 75 74 20 74 68 65 20 69 6e 70 75 74 20 68 61 73  ut the input has
1f850 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6d 70 6c 65   not been comple
1f860 74 65 6c 79 20 65 78 68 61 75 73 74 65 64 2e 0a  tely exhausted..
1f870 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
1f880 74 73 35 54 72 69 6d 53 65 67 6d 65 6e 74 73 28  ts5TrimSegments(
1f890 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
1f8a0 73 35 49 74 65 72 20 2a 70 49 74 65 72 29 7b 0a  s5Iter *pIter){.
1f8b0 20 20 69 6e 74 20 69 3b 0a 20 20 46 74 73 35 42    int i;.  Fts5B
1f8c0 75 66 66 65 72 20 62 75 66 3b 0a 20 20 6d 65 6d  uffer buf;.  mem
1f8d0 73 65 74 28 26 62 75 66 2c 20 30 2c 20 73 69 7a  set(&buf, 0, siz
1f8e0 65 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29  eof(Fts5Buffer))
1f8f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1f900 49 74 65 72 2d 3e 6e 53 65 67 20 26 26 20 70 2d  Iter->nSeg && p-
1f910 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20  >rc==SQLITE_OK; 
1f920 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35 53 65  i++){.    Fts5Se
1f930 67 49 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70  gIter *pSeg = &p
1f940 49 74 65 72 2d 3e 61 53 65 67 5b 69 5d 3b 0a 20  Iter->aSeg[i];. 
1f950 20 20 20 69 66 28 20 70 53 65 67 2d 3e 70 53 65     if( pSeg->pSe
1f960 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  g==0 ){.      /*
1f970 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d 65   no-op */.    }e
1f980 6c 73 65 20 69 66 28 20 70 53 65 67 2d 3e 70 4c  lse if( pSeg->pL
1f990 65 61 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  eaf==0 ){.      
1f9a0 2f 2a 20 41 6c 6c 20 6b 65 79 73 20 66 72 6f 6d  /* All keys from
1f9b0 20 74 68 69 73 20 69 6e 70 75 74 20 73 65 67 6d   this input segm
1f9c0 65 6e 74 20 68 61 76 65 20 62 65 65 6e 20 74 72  ent have been tr
1f9d0 61 6e 73 66 65 72 65 64 20 74 6f 20 74 68 65 20  ansfered to the 
1f9e0 6f 75 74 70 75 74 2e 0a 20 20 20 20 20 20 2a 2a  output..      **
1f9f0 20 53 65 74 20 62 6f 74 68 20 74 68 65 20 66 69   Set both the fi
1fa00 72 73 74 20 61 6e 64 20 6c 61 73 74 20 70 61 67  rst and last pag
1fa10 65 2d 6e 75 6d 62 65 72 73 20 74 6f 20 30 20 74  e-numbers to 0 t
1fa20 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
1fa30 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 65 67  the.      ** seg
1fa40 6d 65 6e 74 20 69 73 20 6e 6f 77 20 65 6d 70 74  ment is now empt
1fa50 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 53 65 67  y. */.      pSeg
1fa60 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74  ->pSeg->pgnoLast
1fa70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 65 67   = 0;.      pSeg
1fa80 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73  ->pSeg->pgnoFirs
1fa90 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
1faa0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66  {.      int iOff
1fab0 20 3d 20 70 53 65 67 2d 3e 69 54 65 72 6d 4c 65   = pSeg->iTermLe
1fac0 61 66 4f 66 66 73 65 74 3b 20 20 20 20 20 2f 2a  afOffset;     /*
1fad0 20 4f 66 66 73 65 74 20 6f 6e 20 6e 65 77 20 66   Offset on new f
1fae0 69 72 73 74 20 6c 65 61 66 20 70 61 67 65 20 2a  irst leaf page *
1faf0 2f 0a 20 20 20 20 20 20 69 36 34 20 69 4c 65 61  /.      i64 iLea
1fb00 66 52 6f 77 69 64 3b 0a 20 20 20 20 20 20 46 74  fRowid;.      Ft
1fb10 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 20  s5Data *pData;. 
1fb20 20 20 20 20 20 69 6e 74 20 69 49 64 20 3d 20 70       int iId = p
1fb30 53 65 67 2d 3e 70 53 65 67 2d 3e 69 53 65 67 69  Seg->pSeg->iSegi
1fb40 64 3b 0a 20 20 20 20 20 20 75 38 20 61 48 64 72  d;.      u8 aHdr
1fb50 5b 34 5d 20 3d 20 7b 30 78 30 30 2c 20 30 78 30  [4] = {0x00, 0x0
1fb60 30 2c 20 30 78 30 30 2c 20 30 78 30 30 7d 3b 0a  0, 0x00, 0x00};.
1fb70 0a 20 20 20 20 20 20 69 4c 65 61 66 52 6f 77 69  .      iLeafRowi
1fb80 64 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54  d = FTS5_SEGMENT
1fb90 5f 52 4f 57 49 44 28 69 49 64 2c 20 70 53 65 67  _ROWID(iId, pSeg
1fba0 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67 6e 6f 29  ->iTermLeafPgno)
1fbb0 3b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  ;.      pData = 
1fbc0 66 74 73 35 4c 65 61 66 52 65 61 64 28 70 2c 20  fts5LeafRead(p, 
1fbd0 69 4c 65 61 66 52 6f 77 69 64 29 3b 0a 20 20 20  iLeafRowid);.   
1fbe0 20 20 20 69 66 28 20 70 44 61 74 61 20 29 7b 0a     if( pData ){.
1fbf0 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66 66          if( iOff
1fc00 3e 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 29  >pData->szLeaf )
1fc10 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
1fc20 68 69 73 20 63 61 6e 20 6f 63 63 75 72 20 69 66  his can occur if
1fc30 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
1fc40 74 68 65 20 73 65 67 6d 65 6e 74 73 20 6f 63 63  the segments occ
1fc50 75 70 79 20 6f 76 65 72 6c 61 70 20 2d 20 69 66  upy overlap - if
1fc60 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
1fc70 73 69 6e 67 6c 65 20 70 61 67 65 20 68 61 73 20  single page has 
1fc80 62 65 65 6e 20 61 73 73 69 67 6e 65 64 20 74 6f  been assigned to
1fc90 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 73   more than one s
1fca0 65 67 6d 65 6e 74 2e 20 49 6e 0a 20 20 20 20 20  egment. In.     
1fcb0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63 61 73       ** this cas
1fcc0 65 20 61 20 70 72 69 6f 72 20 69 74 65 72 61 74  e a prior iterat
1fcd0 69 6f 6e 20 6f 66 20 74 68 69 73 20 6c 6f 6f 70  ion of this loop
1fce0 20 6d 61 79 20 68 61 76 65 20 63 6f 72 72 75 70   may have corrup
1fcf0 74 65 64 20 74 68 65 0a 20 20 20 20 20 20 20 20  ted the.        
1fd00 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20 63 75 72    ** segment cur
1fd10 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 74 72 69  rently being tri
1fd20 6d 6d 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  mmed.  */.      
1fd30 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
1fd40 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
1fd50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1fd60 20 20 20 66 74 73 35 42 75 66 66 65 72 5a 65 72     fts5BufferZer
1fd70 6f 28 26 62 75 66 29 3b 0a 20 20 20 20 20 20 20  o(&buf);.       
1fd80 20 20 20 66 74 73 35 42 75 66 66 65 72 47 72 6f     fts5BufferGro
1fd90 77 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20  w(&p->rc, &buf, 
1fda0 70 44 61 74 61 2d 3e 6e 6e 29 3b 0a 20 20 20 20  pData->nn);.    
1fdb0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fdc0 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fdd0 63 2c 20 26 62 75 66 2c 20 73 69 7a 65 6f 66 28  c, &buf, sizeof(
1fde0 61 48 64 72 29 2c 20 61 48 64 72 29 3b 0a 20 20  aHdr), aHdr);.  
1fdf0 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66          fts5Buff
1fe00 65 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26  erAppendVarint(&
1fe10 70 2d 3e 72 63 2c 20 26 62 75 66 2c 20 70 53 65  p->rc, &buf, pSe
1fe20 67 2d 3e 74 65 72 6d 2e 6e 29 3b 0a 20 20 20 20  g->term.n);.    
1fe30 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
1fe40 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e 72  AppendBlob(&p->r
1fe50 63 2c 20 26 62 75 66 2c 20 70 53 65 67 2d 3e 74  c, &buf, pSeg->t
1fe60 65 72 6d 2e 6e 2c 20 70 53 65 67 2d 3e 74 65 72  erm.n, pSeg->ter
1fe70 6d 2e 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  m.p);.          
1fe80 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
1fe90 42 6c 6f 62 28 26 70 2d 3e 72 63 2c 20 26 62 75  Blob(&p->rc, &bu
1fea0 66 2c 20 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66  f, pData->szLeaf
1feb0 2d 69 4f 66 66 2c 26 70 44 61 74 61 2d 3e 70 5b  -iOff,&pData->p[
1fec0 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 20 20  iOff]);.        
1fed0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
1fee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1fef0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65        /* Set the
1ff00 20 73 7a 4c 65 61 66 20 66 69 65 6c 64 20 2a 2f   szLeaf field */
1ff10 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74 73  .            fts
1ff20 35 50 75 74 55 31 36 28 26 62 75 66 2e 70 5b 32  5PutU16(&buf.p[2
1ff30 5d 2c 20 28 75 31 36 29 62 75 66 2e 6e 29 3b 0a  ], (u16)buf.n);.
1ff40 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1ff50 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 75 70         /* Set up
1ff60 20 74 68 65 20 6e 65 77 20 70 61 67 65 2d 69 6e   the new page-in
1ff70 64 65 78 20 61 72 72 61 79 20 2a 2f 0a 20 20 20  dex array */.   
1ff80 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
1ff90 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
1ffa0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 34 29 3b 0a  ->rc, &buf, 4);.
1ffb0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
1ffc0 65 67 2d 3e 69 4c 65 61 66 50 67 6e 6f 3d 3d 70  eg->iLeafPgno==p
1ffd0 53 65 67 2d 3e 69 54 65 72 6d 4c 65 61 66 50 67  Seg->iTermLeafPg
1ffe0 6e 6f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  no .            
1fff0 20 20 26 26 20 70 53 65 67 2d 3e 69 45 6e 64 6f    && pSeg->iEndo
20000 66 44 6f 63 6c 69 73 74 3c 70 44 61 74 61 2d 3e  fDoclist<pData->
20010 73 7a 4c 65 61 66 20 0a 20 20 20 20 20 20 20 20  szLeaf .        
20020 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
20030 20 20 20 69 6e 74 20 6e 44 69 66 66 20 3d 20 70     int nDiff = p
20040 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 2d 20 70  Data->szLeaf - p
20050 53 65 67 2d 3e 69 45 6e 64 6f 66 44 6f 63 6c 69  Seg->iEndofDocli
20060 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  st;.            
20070 66 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  fts5BufferAppend
20080 56 61 72 69 6e 74 28 26 70 2d 3e 72 63 2c 20 26  Varint(&p->rc, &
20090 62 75 66 2c 20 62 75 66 2e 6e 20 2d 20 31 20 2d  buf, buf.n - 1 -
200a0 20 6e 44 69 66 66 20 2d 20 34 29 3b 0a 20 20 20   nDiff - 4);.   
200b0 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
200c0 66 65 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70  ferAppendBlob(&p
200d0 2d 3e 72 63 2c 20 26 62 75 66 2c 20 0a 20 20 20  ->rc, &buf, .   
200e0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 61               pDa
200f0 74 61 2d 3e 6e 6e 20 2d 20 70 53 65 67 2d 3e 69  ta->nn - pSeg->i
20100 50 67 69 64 78 4f 66 66 2c 20 26 70 44 61 74 61  PgidxOff, &pData
20110 2d 3e 70 5b 70 53 65 67 2d 3e 69 50 67 69 64 78  ->p[pSeg->iPgidx
20120 4f 66 66 5d 0a 20 20 20 20 20 20 20 20 20 20 20  Off].           
20130 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
20140 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
20150 53 65 67 2d 3e 70 53 65 67 2d 3e 70 67 6e 6f 46  Seg->pSeg->pgnoF
20160 69 72 73 74 20 3d 20 70 53 65 67 2d 3e 69 54 65  irst = pSeg->iTe
20170 72 6d 4c 65 61 66 50 67 6e 6f 3b 0a 20 20 20 20  rmLeafPgno;.    
20180 20 20 20 20 20 20 66 74 73 35 44 61 74 61 44 65        fts5DataDe
20190 6c 65 74 65 28 70 2c 20 46 54 53 35 5f 53 45 47  lete(p, FTS5_SEG
201a0 4d 45 4e 54 5f 52 4f 57 49 44 28 69 49 64 2c 20  MENT_ROWID(iId, 
201b0 31 29 2c 20 69 4c 65 61 66 52 6f 77 69 64 29 3b  1), iLeafRowid);
201c0 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
201d0 61 74 61 57 72 69 74 65 28 70 2c 20 69 4c 65 61  ataWrite(p, iLea
201e0 66 52 6f 77 69 64 2c 20 62 75 66 2e 70 2c 20 62  fRowid, buf.p, b
201f0 75 66 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 7d  uf.n);.        }
20200 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 61 74  .        fts5Dat
20210 61 52 65 6c 65 61 73 65 28 70 44 61 74 61 29 3b  aRelease(pData);
20220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
20230 20 7d 0a 20 20 66 74 73 35 42 75 66 66 65 72 46   }.  fts5BufferF
20240 72 65 65 28 26 62 75 66 29 3b 0a 7d 0a 0a 73 74  ree(&buf);.}..st
20250 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4d 65  atic void fts5Me
20260 72 67 65 43 68 75 6e 6b 43 61 6c 6c 62 61 63 6b  rgeChunkCallback
20270 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
20280 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  , .  void *pCtx,
20290 20 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 43   .  const u8 *pC
202a0 68 75 6e 6b 2c 20 69 6e 74 20 6e 43 68 75 6e 6b  hunk, int nChunk
202b0 0a 29 7b 0a 20 20 46 74 73 35 53 65 67 57 72 69  .){.  Fts5SegWri
202c0 74 65 72 20 2a 70 57 72 69 74 65 72 20 3d 20 28  ter *pWriter = (
202d0 46 74 73 35 53 65 67 57 72 69 74 65 72 2a 29 70  Fts5SegWriter*)p
202e0 43 74 78 3b 0a 20 20 66 74 73 35 57 72 69 74 65  Ctx;.  fts5Write
202f0 41 70 70 65 6e 64 50 6f 73 6c 69 73 74 44 61 74  AppendPoslistDat
20300 61 28 70 2c 20 70 57 72 69 74 65 72 2c 20 70 43  a(p, pWriter, pC
20310 68 75 6e 6b 2c 20 6e 43 68 75 6e 6b 29 3b 0a 7d  hunk, nChunk);.}
20320 0a 0a 2f 2a 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  ../*.**.*/.stati
20330 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
20340 4d 65 72 67 65 4c 65 76 65 6c 28 0a 20 20 46 74  MergeLevel(.  Ft
20350 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
20360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20370 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62   FTS5 backend ob
20380 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74  ject */.  Fts5St
20390 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72 75  ructure **ppStru
203a0 63 74 2c 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ct,       /* IN/
203b0 4f 55 54 3a 20 53 74 75 63 74 75 72 65 20 6f 66  OUT: Stucture of
203c0 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20   index */.  int 
203d0 69 4c 76 6c 2c 20 20 20 20 20 20 20 20 20 20 20  iLvl,           
203e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
203f0 65 76 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70  evel to read inp
20400 75 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ut from */.  int
20410 20 2a 70 6e 52 65 6d 20 20 20 20 20 20 20 20 20   *pnRem         
20420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20430 57 72 69 74 65 20 75 70 20 74 6f 20 74 68 69 73  Write up to this
20440 20 6d 61 6e 79 20 6f 75 74 70 75 74 20 6c 65 61   many output lea
20450 76 65 73 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35  ves */.){.  Fts5
20460 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
20470 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
20480 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65 4c    Fts5StructureL
20490 65 76 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 53  evel *pLvl = &pS
204a0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
204b0 76 6c 5d 3b 0a 20 20 46 74 73 35 53 74 72 75 63  vl];.  Fts5Struc
204c0 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76 6c 4f  tureLevel *pLvlO
204d0 75 74 3b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  ut;.  Fts5Iter *
204e0 70 49 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20  pIter = 0;      
204f0 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 74 6f 20   /* Iterator to 
20500 72 65 61 64 20 69 6e 70 75 74 20 64 61 74 61 20  read input data 
20510 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 6d 20 3d 20  */.  int nRem = 
20520 70 6e 52 65 6d 20 3f 20 2a 70 6e 52 65 6d 20 3a  pnRem ? *pnRem :
20530 20 30 3b 20 20 2f 2a 20 4f 75 74 70 75 74 20 6c   0;  /* Output l
20540 65 61 66 20 70 61 67 65 73 20 6c 65 66 74 20 74  eaf pages left t
20550 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20 69 6e 74  o write */.  int
20560 20 6e 49 6e 70 75 74 3b 20 20 20 20 20 20 20 20   nInput;        
20570 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20580 4e 75 6d 62 65 72 20 6f 66 20 69 6e 70 75 74 20  Number of input 
20590 73 65 67 6d 65 6e 74 73 20 2a 2f 0a 20 20 46 74  segments */.  Ft
205a0 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
205b0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  er;           /*
205c0 20 57 72 69 74 65 72 20 6f 62 6a 65 63 74 20 2a   Writer object *
205d0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
205e0 65 53 65 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20  eSegment *pSeg; 
205f0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 73 65      /* Output se
20600 67 6d 65 6e 74 20 2a 2f 0a 20 20 46 74 73 35 42  gment */.  Fts5B
20610 75 66 66 65 72 20 74 65 72 6d 3b 0a 20 20 69 6e  uffer term;.  in
20620 74 20 62 4f 6c 64 65 73 74 3b 20 20 20 20 20 20  t bOldest;      
20630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20640 20 54 72 75 65 20 69 66 20 74 68 65 20 6f 75 74   True if the out
20650 70 75 74 20 73 65 67 6d 65 6e 74 20 69 73 20 74  put segment is t
20660 68 65 20 6f 6c 64 65 73 74 20 2a 2f 0a 20 20 69  he oldest */.  i
20670 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
20680 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
20690 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c  ;.  const int fl
206a0 61 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f  ags = FTS5INDEX_
206b0 51 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a  QUERY_NOOUTPUT;.
206c0 20 20 69 6e 74 20 62 54 65 72 6d 57 72 69 74 74    int bTermWritt
206d0 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  en = 0;         
206e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 75 72    /* True if cur
206f0 72 65 6e 74 20 74 65 72 6d 20 61 6c 72 65 61 64  rent term alread
20700 79 20 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20 61  y output */..  a
20710 73 73 65 72 74 28 20 69 4c 76 6c 3c 70 53 74 72  ssert( iLvl<pStr
20720 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29 3b 0a 20  uct->nLevel );. 
20730 20 61 73 73 65 72 74 28 20 70 4c 76 6c 2d 3e 6e   assert( pLvl->n
20740 4d 65 72 67 65 3c 3d 70 4c 76 6c 2d 3e 6e 53 65  Merge<=pLvl->nSe
20750 67 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26  g );..  memset(&
20760 77 72 69 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  writer, 0, sizeo
20770 66 28 46 74 73 35 53 65 67 57 72 69 74 65 72 29  f(Fts5SegWriter)
20780 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 74 65 72  );.  memset(&ter
20790 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46 74 73  m, 0, sizeof(Fts
207a0 35 42 75 66 66 65 72 29 29 3b 0a 20 20 69 66 28  5Buffer));.  if(
207b0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 29 7b   pLvl->nMerge ){
207c0 0a 20 20 20 20 70 4c 76 6c 4f 75 74 20 3d 20 26  .    pLvlOut = &
207d0 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
207e0 69 4c 76 6c 2b 31 5d 3b 0a 20 20 20 20 61 73 73  iLvl+1];.    ass
207f0 65 72 74 28 20 70 4c 76 6c 4f 75 74 2d 3e 6e 53  ert( pLvlOut->nS
20800 65 67 3e 30 20 29 3b 0a 20 20 20 20 6e 49 6e 70  eg>0 );.    nInp
20810 75 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  ut = pLvl->nMerg
20820 65 3b 0a 20 20 20 20 70 53 65 67 20 3d 20 26 70  e;.    pSeg = &p
20830 4c 76 6c 4f 75 74 2d 3e 61 53 65 67 5b 70 4c 76  LvlOut->aSeg[pLv
20840 6c 4f 75 74 2d 3e 6e 53 65 67 2d 31 5d 3b 0a 0a  lOut->nSeg-1];..
20850 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
20860 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 70 53  t(p, &writer, pS
20870 65 67 2d 3e 69 53 65 67 69 64 29 3b 0a 20 20 20  eg->iSegid);.   
20880 20 77 72 69 74 65 72 2e 77 72 69 74 65 72 2e 70   writer.writer.p
20890 67 6e 6f 20 3d 20 70 53 65 67 2d 3e 70 67 6e 6f  gno = pSeg->pgno
208a0 4c 61 73 74 2b 31 3b 0a 20 20 20 20 77 72 69 74  Last+1;.    writ
208b0 65 72 2e 69 42 74 50 61 67 65 20 3d 20 30 3b 0a  er.iBtPage = 0;.
208c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
208d0 20 69 53 65 67 69 64 20 3d 20 66 74 73 35 41 6c   iSegid = fts5Al
208e0 6c 6f 63 61 74 65 53 65 67 69 64 28 70 2c 20 70  locateSegid(p, p
208f0 53 74 72 75 63 74 29 3b 0a 0a 20 20 20 20 2f 2a  Struct);..    /*
20900 20 45 78 74 65 6e 64 20 74 68 65 20 46 74 73 35   Extend the Fts5
20910 53 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  Structure object
20920 20 61 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   as required to 
20930 65 6e 73 75 72 65 20 74 68 65 20 6f 75 74 70 75  ensure the outpu
20940 74 0a 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74  t.    ** segment
20950 20 65 78 69 73 74 73 2e 20 2a 2f 0a 20 20 20 20   exists. */.    
20960 69 66 28 20 69 4c 76 6c 3d 3d 70 53 74 72 75 63  if( iLvl==pStruc
20970 74 2d 3e 6e 4c 65 76 65 6c 2d 31 20 29 7b 0a 20  t->nLevel-1 ){. 
20980 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
20990 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72  reAddLevel(&p->r
209a0 63 2c 20 70 70 53 74 72 75 63 74 29 3b 0a 20 20  c, ppStruct);.  
209b0 20 20 20 20 70 53 74 72 75 63 74 20 3d 20 2a 70      pStruct = *p
209c0 70 53 74 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20  pStruct;.    }. 
209d0 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
209e0 45 78 74 65 6e 64 4c 65 76 65 6c 28 26 70 2d 3e  ExtendLevel(&p->
209f0 72 63 2c 20 70 53 74 72 75 63 74 2c 20 69 4c 76  rc, pStruct, iLv
20a00 6c 2b 31 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  l+1, 1, 0);.    
20a10 69 66 28 20 70 2d 3e 72 63 20 29 20 72 65 74 75  if( p->rc ) retu
20a20 72 6e 3b 0a 20 20 20 20 70 4c 76 6c 20 3d 20 26  rn;.    pLvl = &
20a30 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
20a40 69 4c 76 6c 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f  iLvl];.    pLvlO
20a50 75 74 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  ut = &pStruct->a
20a60 4c 65 76 65 6c 5b 69 4c 76 6c 2b 31 5d 3b 0a 0a  Level[iLvl+1];..
20a70 20 20 20 20 66 74 73 35 57 72 69 74 65 49 6e 69      fts5WriteIni
20a80 74 28 70 2c 20 26 77 72 69 74 65 72 2c 20 69 53  t(p, &writer, iS
20a90 65 67 69 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 41  egid);..    /* A
20aa0 64 64 20 74 68 65 20 6e 65 77 20 73 65 67 6d 65  dd the new segme
20ab0 6e 74 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  nt to the output
20ac0 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 70 53   level */.    pS
20ad0 65 67 20 3d 20 26 70 4c 76 6c 4f 75 74 2d 3e 61  eg = &pLvlOut->a
20ae0 53 65 67 5b 70 4c 76 6c 4f 75 74 2d 3e 6e 53 65  Seg[pLvlOut->nSe
20af0 67 5d 3b 0a 20 20 20 20 70 4c 76 6c 4f 75 74 2d  g];.    pLvlOut-
20b00 3e 6e 53 65 67 2b 2b 3b 0a 20 20 20 20 70 53 65  >nSeg++;.    pSe
20b10 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d 20 31  g->pgnoFirst = 1
20b20 3b 0a 20 20 20 20 70 53 65 67 2d 3e 69 53 65 67  ;.    pSeg->iSeg
20b30 69 64 20 3d 20 69 53 65 67 69 64 3b 0a 20 20 20  id = iSegid;.   
20b40 20 70 53 74 72 75 63 74 2d 3e 6e 53 65 67 6d 65   pStruct->nSegme
20b50 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  nt++;..    /* Re
20b60 61 64 20 69 6e 70 75 74 20 66 72 6f 6d 20 61 6c  ad input from al
20b70 6c 20 73 65 67 6d 65 6e 74 73 20 69 6e 20 74 68  l segments in th
20b80 65 20 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f  e input level */
20b90 0a 20 20 20 20 6e 49 6e 70 75 74 20 3d 20 70 4c  .    nInput = pL
20ba0 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20 7d 0a 20 20  vl->nSeg;.  }.  
20bb0 62 4f 6c 64 65 73 74 20 3d 20 28 70 4c 76 6c 4f  bOldest = (pLvlO
20bc0 75 74 2d 3e 6e 53 65 67 3d 3d 31 20 26 26 20 70  ut->nSeg==1 && p
20bd0 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3d 3d  Struct->nLevel==
20be0 69 4c 76 6c 2b 32 29 3b 0a 0a 20 20 61 73 73 65  iLvl+2);..  asse
20bf0 72 74 28 20 69 4c 76 6c 3e 3d 30 20 29 3b 0a 20  rt( iLvl>=0 );. 
20c00 20 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74   for(fts5MultiIt
20c10 65 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74  erNew(p, pStruct
20c20 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30  , flags, 0, 0, 0
20c30 2c 20 69 4c 76 6c 2c 20 6e 49 6e 70 75 74 2c 20  , iLvl, nInput, 
20c40 26 70 49 74 65 72 29 3b 0a 20 20 20 20 20 20 66  &pIter);.      f
20c50 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66 28  ts5MultiIterEof(
20c60 70 2c 20 70 49 74 65 72 29 3d 3d 30 3b 0a 20 20  p, pIter)==0;.  
20c70 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
20c80 72 4e 65 78 74 28 70 2c 20 70 49 74 65 72 2c 20  rNext(p, pIter, 
20c90 30 2c 20 30 29 0a 20 20 29 7b 0a 20 20 20 20 46  0, 0).  ){.    F
20ca0 74 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67  ts5SegIter *pSeg
20cb0 49 74 65 72 20 3d 20 26 70 49 74 65 72 2d 3e 61  Iter = &pIter->a
20cc0 53 65 67 5b 20 70 49 74 65 72 2d 3e 61 46 69 72  Seg[ pIter->aFir
20cd0 73 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a  st[1].iFirst ];.
20ce0 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b 20 20 20      int nPos;   
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 2f 2a 20 70 6f 73 69 74 69 6f 6e 2d 6c 69    /* position-li
20d10 73 74 20 73 69 7a 65 20 66 69 65 6c 64 20 76 61  st size field va
20d20 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  lue */.    int n
20d30 54 65 72 6d 3b 0a 20 20 20 20 63 6f 6e 73 74 20  Term;.    const 
20d40 75 38 20 2a 70 54 65 72 6d 3b 0a 0a 20 20 20 20  u8 *pTerm;..    
20d50 70 54 65 72 6d 20 3d 20 66 74 73 35 4d 75 6c 74  pTerm = fts5Mult
20d60 69 49 74 65 72 54 65 72 6d 28 70 49 74 65 72 2c  iIterTerm(pIter,
20d70 20 26 6e 54 65 72 6d 29 3b 0a 20 20 20 20 69 66   &nTerm);.    if
20d80 28 20 6e 54 65 72 6d 21 3d 74 65 72 6d 2e 6e 20  ( nTerm!=term.n 
20d90 7c 7c 20 66 74 73 35 4d 65 6d 63 6d 70 28 70 54  || fts5Memcmp(pT
20da0 65 72 6d 2c 20 74 65 72 6d 2e 70 2c 20 6e 54 65  erm, term.p, nTe
20db0 72 6d 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  rm) ){.      if(
20dc0 20 70 6e 52 65 6d 20 26 26 20 77 72 69 74 65 72   pnRem && writer
20dd0 2e 6e 4c 65 61 66 57 72 69 74 74 65 6e 3e 6e 52  .nLeafWritten>nR
20de0 65 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  em ){.        br
20df0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20e00 20 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74     fts5BufferSet
20e10 28 26 70 2d 3e 72 63 2c 20 26 74 65 72 6d 2c 20  (&p->rc, &term, 
20e20 6e 54 65 72 6d 2c 20 70 54 65 72 6d 29 3b 0a 20  nTerm, pTerm);. 
20e30 20 20 20 20 20 62 54 65 72 6d 57 72 69 74 74 65       bTermWritte
20e40 6e 20 3d 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n =0;.    }..   
20e50 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6b 65   /* Check for ke
20e60 79 20 61 6e 6e 69 68 69 6c 61 74 69 6f 6e 2e 20  y annihilation. 
20e70 2a 2f 0a 20 20 20 20 69 66 28 20 70 53 65 67 49  */.    if( pSegI
20e80 74 65 72 2d 3e 6e 50 6f 73 3d 3d 30 20 26 26 20  ter->nPos==0 && 
20e90 28 62 4f 6c 64 65 73 74 20 7c 7c 20 70 53 65 67  (bOldest || pSeg
20ea0 49 74 65 72 2d 3e 62 44 65 6c 3d 3d 30 29 20 29  Iter->bDel==0) )
20eb0 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 20 20 20 20   continue;..    
20ec0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
20ed0 45 5f 4f 4b 20 26 26 20 62 54 65 72 6d 57 72 69  E_OK && bTermWri
20ee0 74 74 65 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tten==0 ){.     
20ef0 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 65   /* This is a ne
20f00 77 20 74 65 72 6d 2e 20 41 70 70 65 6e 64 20 61  w term. Append a
20f10 20 74 65 72 6d 20 74 6f 20 74 68 65 20 6f 75 74   term to the out
20f20 70 75 74 20 73 65 67 6d 65 6e 74 2e 20 2a 2f 0a  put segment. */.
20f30 20 20 20 20 20 20 66 74 73 35 57 72 69 74 65 41        fts5WriteA
20f40 70 70 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72  ppendTerm(p, &wr
20f50 69 74 65 72 2c 20 6e 54 65 72 6d 2c 20 70 54 65  iter, nTerm, pTe
20f60 72 6d 29 3b 0a 20 20 20 20 20 20 62 54 65 72 6d  rm);.      bTerm
20f70 57 72 69 74 74 65 6e 20 3d 20 31 3b 0a 20 20 20  Written = 1;.   
20f80 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 70 70 65 6e   }..    /* Appen
20f90 64 20 74 68 65 20 72 6f 77 69 64 20 74 6f 20 74  d the rowid to t
20fa0 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
20fb0 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53 54   /* WRITEPOSLIST
20fc0 53 49 5a 45 20 2a 2f 0a 20 20 20 20 66 74 73 35  SIZE */.    fts5
20fd0 57 72 69 74 65 41 70 70 65 6e 64 52 6f 77 69 64  WriteAppendRowid
20fe0 28 70 2c 20 26 77 72 69 74 65 72 2c 20 66 74 73  (p, &writer, fts
20ff0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
21000 70 49 74 65 72 29 29 3b 0a 0a 20 20 20 20 69 66  pIter));..    if
21010 28 20 65 44 65 74 61 69 6c 3d 3d 46 54 53 35 5f  ( eDetail==FTS5_
21020 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29 7b 0a 20  DETAIL_NONE ){. 
21030 20 20 20 20 20 69 66 28 20 70 53 65 67 49 74 65       if( pSegIte
21040 72 2d 3e 62 44 65 6c 20 29 7b 0a 20 20 20 20 20  r->bDel ){.     
21050 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70     fts5BufferApp
21060 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72 63  endVarint(&p->rc
21070 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65 72  , &writer.writer
21080 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20 20  .buf, 0);.      
21090 20 20 69 66 28 20 70 53 65 67 49 74 65 72 2d 3e    if( pSegIter->
210a0 6e 50 6f 73 3e 30 20 29 7b 0a 20 20 20 20 20 20  nPos>0 ){.      
210b0 20 20 20 20 66 74 73 35 42 75 66 66 65 72 41 70      fts5BufferAp
210c0 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d 3e 72  pendVarint(&p->r
210d0 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69 74 65  c, &writer.write
210e0 72 2e 62 75 66 2c 20 30 29 3b 0a 20 20 20 20 20  r.buf, 0);.     
210f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
21100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
21110 20 41 70 70 65 6e 64 20 74 68 65 20 70 6f 73 69   Append the posi
21120 74 69 6f 6e 2d 6c 69 73 74 20 64 61 74 61 20 74  tion-list data t
21130 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a  o the output */.
21140 20 20 20 20 20 20 6e 50 6f 73 20 3d 20 70 53 65        nPos = pSe
21150 67 49 74 65 72 2d 3e 6e 50 6f 73 2a 32 20 2b 20  gIter->nPos*2 + 
21160 70 53 65 67 49 74 65 72 2d 3e 62 44 65 6c 3b 0a  pSegIter->bDel;.
21170 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
21180 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70 2d  AppendVarint(&p-
21190 3e 72 63 2c 20 26 77 72 69 74 65 72 2e 77 72 69  >rc, &writer.wri
211a0 74 65 72 2e 62 75 66 2c 20 6e 50 6f 73 29 3b 0a  ter.buf, nPos);.
211b0 20 20 20 20 20 20 66 74 73 35 43 68 75 6e 6b 49        fts5ChunkI
211c0 74 65 72 61 74 65 28 70 2c 20 70 53 65 67 49 74  terate(p, pSegIt
211d0 65 72 2c 20 28 76 6f 69 64 2a 29 26 77 72 69 74  er, (void*)&writ
211e0 65 72 2c 20 66 74 73 35 4d 65 72 67 65 43 68 75  er, fts5MergeChu
211f0 6e 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  nkCallback);.   
21200 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 6c 75   }.  }..  /* Flu
21210 73 68 20 74 68 65 20 6c 61 73 74 20 6c 65 61 66  sh the last leaf
21220 20 70 61 67 65 20 74 6f 20 64 69 73 6b 2e 20 53   page to disk. S
21230 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 73 65  et the output se
21240 67 6d 65 6e 74 20 62 2d 74 72 65 65 20 68 65 69  gment b-tree hei
21250 67 68 74 0a 20 20 2a 2a 20 61 6e 64 20 6c 61 73  ght.  ** and las
21260 74 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62  t leaf page numb
21270 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
21280 69 6d 65 2e 20 20 2a 2f 0a 20 20 66 74 73 35 57  ime.  */.  fts5W
21290 72 69 74 65 46 69 6e 69 73 68 28 70 2c 20 26 77  riteFinish(p, &w
212a0 72 69 74 65 72 2c 20 26 70 53 65 67 2d 3e 70 67  riter, &pSeg->pg
212b0 6e 6f 4c 61 73 74 29 3b 0a 0a 20 20 69 66 28 20  noLast);..  if( 
212c0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45 6f 66  fts5MultiIterEof
212d0 28 70 2c 20 70 49 74 65 72 29 20 29 7b 0a 20 20  (p, pIter) ){.  
212e0 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 2f 2a    int i;..    /*
212f0 20 52 65 6d 6f 76 65 20 74 68 65 20 72 65 64 75   Remove the redu
21300 6e 64 61 6e 74 20 73 65 67 6d 65 6e 74 73 20 66  ndant segments f
21310 72 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74  rom the %_data t
21320 61 62 6c 65 20 2a 2f 0a 20 20 20 20 66 6f 72 28  able */.    for(
21330 69 3d 30 3b 20 69 3c 6e 49 6e 70 75 74 3b 20 69  i=0; i<nInput; i
21340 2b 2b 29 7b 0a 20 20 20 20 20 20 66 74 73 35 44  ++){.      fts5D
21350 61 74 61 52 65 6d 6f 76 65 53 65 67 6d 65 6e 74  ataRemoveSegment
21360 28 70 2c 20 70 4c 76 6c 2d 3e 61 53 65 67 5b 69  (p, pLvl->aSeg[i
21370 5d 2e 69 53 65 67 69 64 29 3b 0a 20 20 20 20 7d  ].iSegid);.    }
21380 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20  ..    /* Remove 
21390 74 68 65 20 72 65 64 75 6e 64 61 6e 74 20 73 65  the redundant se
213a0 67 6d 65 6e 74 73 20 66 72 6f 6d 20 74 68 65 20  gments from the 
213b0 69 6e 70 75 74 20 6c 65 76 65 6c 20 2a 2f 0a 20  input level */. 
213c0 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 53 65     if( pLvl->nSe
213d0 67 21 3d 6e 49 6e 70 75 74 20 29 7b 0a 20 20 20  g!=nInput ){.   
213e0 20 20 20 69 6e 74 20 6e 4d 6f 76 65 20 3d 20 28     int nMove = (
213f0 70 4c 76 6c 2d 3e 6e 53 65 67 20 2d 20 6e 49 6e  pLvl->nSeg - nIn
21400 70 75 74 29 20 2a 20 73 69 7a 65 6f 66 28 46 74  put) * sizeof(Ft
21410 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d 65  s5StructureSegme
21420 6e 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 6d 6f  nt);.      memmo
21430 76 65 28 70 4c 76 6c 2d 3e 61 53 65 67 2c 20 26  ve(pLvl->aSeg, &
21440 70 4c 76 6c 2d 3e 61 53 65 67 5b 6e 49 6e 70 75  pLvl->aSeg[nInpu
21450 74 5d 2c 20 6e 4d 6f 76 65 29 3b 0a 20 20 20 20  t], nMove);.    
21460 7d 0a 20 20 20 20 70 53 74 72 75 63 74 2d 3e 6e  }.    pStruct->n
21470 53 65 67 6d 65 6e 74 20 2d 3d 20 6e 49 6e 70 75  Segment -= nInpu
21480 74 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 53 65  t;.    pLvl->nSe
21490 67 20 2d 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 20  g -= nInput;.   
214a0 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 20 3d 20   pLvl->nMerge = 
214b0 30 3b 0a 20 20 20 20 69 66 28 20 70 53 65 67 2d  0;.    if( pSeg-
214c0 3e 70 67 6e 6f 4c 61 73 74 3d 3d 30 20 29 7b 0a  >pgnoLast==0 ){.
214d0 20 20 20 20 20 20 70 4c 76 6c 4f 75 74 2d 3e 6e        pLvlOut->n
214e0 53 65 67 2d 2d 3b 0a 20 20 20 20 20 20 70 53 74  Seg--;.      pSt
214f0 72 75 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2d 2d  ruct->nSegment--
21500 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
21510 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 65  .    assert( pSe
21520 67 2d 3e 70 67 6e 6f 4c 61 73 74 3e 30 20 29 3b  g->pgnoLast>0 );
21530 0a 20 20 20 20 66 74 73 35 54 72 69 6d 53 65 67  .    fts5TrimSeg
21540 6d 65 6e 74 73 28 70 2c 20 70 49 74 65 72 29 3b  ments(p, pIter);
21550 0a 20 20 20 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  .    pLvl->nMerg
21560 65 20 3d 20 6e 49 6e 70 75 74 3b 0a 20 20 7d 0a  e = nInput;.  }.
21570 0a 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72  .  fts5MultiIter
21580 46 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 66  Free(pIter);.  f
21590 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 74  ts5BufferFree(&t
215a0 65 72 6d 29 3b 0a 20 20 69 66 28 20 70 6e 52 65  erm);.  if( pnRe
215b0 6d 20 29 20 2a 70 6e 52 65 6d 20 2d 3d 20 77 72  m ) *pnRem -= wr
215c0 69 74 65 72 2e 6e 4c 65 61 66 57 72 69 74 74 65  iter.nLeafWritte
215d0 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 75  n;.}../*.** Do u
215e0 70 20 74 6f 20 6e 50 67 20 70 61 67 65 73 20 6f  p to nPg pages o
215f0 66 20 61 75 74 6f 6d 65 72 67 65 20 77 6f 72 6b  f automerge work
21600 20 6f 6e 20 74 68 65 20 69 6e 64 65 78 2e 0a 2a   on the index..*
21610 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
21620 20 69 66 20 61 6e 79 20 63 68 61 6e 67 65 73 20   if any changes 
21630 77 65 72 65 20 61 63 74 75 61 6c 6c 79 20 6d 61  were actually ma
21640 64 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  de, or false oth
21650 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
21660 63 20 69 6e 74 20 66 74 73 35 49 6e 64 65 78 4d  c int fts5IndexM
21670 65 72 67 65 28 0a 20 20 46 74 73 35 49 6e 64 65  erge(.  Fts5Inde
21680 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
21690 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
216a0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
216b0 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  /.  Fts5Structur
216c0 65 20 2a 2a 70 70 53 74 72 75 63 74 2c 20 20 20  e **ppStruct,   
216d0 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 43      /* IN/OUT: C
216e0 75 72 72 65 6e 74 20 73 74 72 75 63 74 75 72 65  urrent structure
216f0 20 6f 66 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69   of index */.  i
21700 6e 74 20 6e 50 67 2c 20 20 20 20 20 20 20 20 20  nt nPg,         
21710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21720 2a 20 50 61 67 65 73 20 6f 66 20 77 6f 72 6b 20  * Pages of work 
21730 74 6f 20 64 6f 20 2a 2f 0a 20 20 69 6e 74 20 6e  to do */.  int n
21740 4d 69 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  Min             
21750 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69             /* Mi
21760 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  nimum number of 
21770 73 65 67 6d 65 6e 74 73 20 74 6f 20 6d 65 72 67  segments to merg
21780 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52  e */.){.  int nR
21790 65 6d 20 3d 20 6e 50 67 3b 0a 20 20 69 6e 74 20  em = nPg;.  int 
217a0 62 52 65 74 20 3d 20 30 3b 0a 20 20 46 74 73 35  bRet = 0;.  Fts5
217b0 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75  Structure *pStru
217c0 63 74 20 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a  ct = *ppStruct;.
217d0 20 20 77 68 69 6c 65 28 20 6e 52 65 6d 3e 30 20    while( nRem>0 
217e0 26 26 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && p->rc==SQLITE
217f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  _OK ){.    int i
21800 4c 76 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Lvl;            
21810 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65         /* To ite
21820 72 61 74 65 20 74 68 72 6f 75 67 68 20 6c 65 76  rate through lev
21830 65 6c 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  els */.    int i
21840 42 65 73 74 4c 76 6c 20 3d 20 30 3b 20 20 20 20  BestLvl = 0;    
21850 20 20 20 20 20 20 20 2f 2a 20 4c 65 76 65 6c 20         /* Level 
21860 6f 66 66 65 72 69 6e 67 20 74 68 65 20 6d 6f 73  offering the mos
21870 74 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73  t input segments
21880 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 65 73   */.    int nBes
21890 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
218a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
218b0 20 69 6e 70 75 74 20 73 65 67 6d 65 6e 74 73 20   input segments 
218c0 6f 6e 20 62 65 73 74 20 6c 65 76 65 6c 20 2a 2f  on best level */
218d0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 69 42 65  ..    /* Set iBe
218e0 73 74 4c 76 6c 20 74 6f 20 74 68 65 20 6c 65 76  stLvl to the lev
218f0 65 6c 20 74 6f 20 72 65 61 64 20 69 6e 70 75 74  el to read input
21900 20 73 65 67 6d 65 6e 74 73 20 66 72 6f 6d 2e 20   segments from. 
21910 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
21920 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30  Struct->nLevel>0
21930 20 29 3b 0a 20 20 20 20 66 6f 72 28 69 4c 76 6c   );.    for(iLvl
21940 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75 63 74  =0; iLvl<pStruct
21950 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b  ->nLevel; iLvl++
21960 29 7b 0a 20 20 20 20 20 20 46 74 73 35 53 74 72  ){.      Fts5Str
21970 75 63 74 75 72 65 4c 65 76 65 6c 20 2a 70 4c 76  uctureLevel *pLv
21980 6c 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61 4c  l = &pStruct->aL
21990 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20 20  evel[iLvl];.    
219a0 20 20 69 66 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72    if( pLvl->nMer
219b0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ge ){.        if
219c0 28 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67 65 3e 6e  ( pLvl->nMerge>n
219d0 42 65 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Best ){.        
219e0 20 20 69 42 65 73 74 4c 76 6c 20 3d 20 69 4c 76    iBestLvl = iLv
219f0 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 42 65  l;.          nBe
21a00 73 74 20 3d 20 70 4c 76 6c 2d 3e 6e 4d 65 72 67  st = pLvl->nMerg
21a10 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
21a20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
21a30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c    }.      if( pL
21a40 76 6c 2d 3e 6e 53 65 67 3e 6e 42 65 73 74 20 29  vl->nSeg>nBest )
21a50 7b 0a 20 20 20 20 20 20 20 20 6e 42 65 73 74 20  {.        nBest 
21a60 3d 20 70 4c 76 6c 2d 3e 6e 53 65 67 3b 0a 20 20  = pLvl->nSeg;.  
21a70 20 20 20 20 20 20 69 42 65 73 74 4c 76 6c 20 3d        iBestLvl =
21a80 20 69 4c 76 6c 3b 0a 20 20 20 20 20 20 7d 0a 20   iLvl;.      }. 
21a90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
21aa0 6e 42 65 73 74 20 69 73 20 73 74 69 6c 6c 20 30  nBest is still 0
21ab0 2c 20 74 68 65 6e 20 74 68 65 20 69 6e 64 65 78  , then the index
21ac0 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20   must be empty. 
21ad0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
21ae0 5f 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 69  _DEBUG.    for(i
21af0 4c 76 6c 3d 30 3b 20 6e 42 65 73 74 3d 3d 30 20  Lvl=0; nBest==0 
21b00 26 26 20 69 4c 76 6c 3c 70 53 74 72 75 63 74 2d  && iLvl<pStruct-
21b10 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c 2b 2b 29  >nLevel; iLvl++)
21b20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21b30 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
21b40 69 4c 76 6c 5d 2e 6e 53 65 67 3d 3d 30 20 29 3b  iLvl].nSeg==0 );
21b50 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
21b60 20 20 20 69 66 28 20 6e 42 65 73 74 3c 6e 4d 69     if( nBest<nMi
21b70 6e 20 26 26 20 70 53 74 72 75 63 74 2d 3e 61 4c  n && pStruct->aL
21b80 65 76 65 6c 5b 69 42 65 73 74 4c 76 6c 5d 2e 6e  evel[iBestLvl].n
21b90 4d 65 72 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Merge==0 ){.    
21ba0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
21bb0 20 20 20 62 52 65 74 20 3d 20 31 3b 0a 20 20 20     bRet = 1;.   
21bc0 20 66 74 73 35 49 6e 64 65 78 4d 65 72 67 65 4c   fts5IndexMergeL
21bd0 65 76 65 6c 28 70 2c 20 26 70 53 74 72 75 63 74  evel(p, &pStruct
21be0 2c 20 69 42 65 73 74 4c 76 6c 2c 20 26 6e 52 65  , iBestLvl, &nRe
21bf0 6d 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72  m);.    if( p->r
21c00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21c10 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b  pStruct->aLevel[
21c20 69 42 65 73 74 4c 76 6c 5d 2e 6e 4d 65 72 67 65  iBestLvl].nMerge
21c30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 74 73  ==0 ){.      fts
21c40 35 53 74 72 75 63 74 75 72 65 50 72 6f 6d 6f 74  5StructurePromot
21c50 65 28 70 2c 20 69 42 65 73 74 4c 76 6c 2b 31 2c  e(p, iBestLvl+1,
21c60 20 70 53 74 72 75 63 74 29 3b 0a 20 20 20 20 7d   pStruct);.    }
21c70 0a 20 20 7d 0a 20 20 2a 70 70 53 74 72 75 63 74  .  }.  *ppStruct
21c80 20 3d 20 70 53 74 72 75 63 74 3b 0a 20 20 72 65   = pStruct;.  re
21c90 74 75 72 6e 20 62 52 65 74 3b 0a 7d 0a 0a 2f 2a  turn bRet;.}../*
21ca0 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 6e  .** A total of n
21cb0 4c 65 61 66 20 6c 65 61 66 20 70 61 67 65 73 20  Leaf leaf pages 
21cc0 6f 66 20 64 61 74 61 20 68 61 73 20 6a 75 73 74  of data has just
21cd0 20 62 65 65 6e 20 66 6c 75 73 68 65 64 20 74 6f   been flushed to
21ce0 20 61 20 6c 65 76 65 6c 2d 30 0a 2a 2a 20 73 65   a level-0.** se
21cf0 67 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e 63  gment. This func
21d00 74 69 6f 6e 20 75 70 64 61 74 65 73 20 74 68 65  tion updates the
21d10 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72 20 61   write-counter a
21d20 63 63 6f 72 64 69 6e 67 6c 79 20 61 6e 64 2c 20  ccordingly and, 
21d30 69 66 0a 2a 2a 20 6e 65 63 65 73 73 61 72 79 2c  if.** necessary,
21d40 20 70 65 72 66 6f 72 6d 73 20 69 6e 63 72 65 6d   performs increm
21d50 65 6e 74 61 6c 20 6d 65 72 67 65 20 77 6f 72 6b  ental merge work
21d60 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72  ..**.** If an er
21d70 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
21d80 74 68 65 20 46 74 73 35 49 6e 64 65 78 2e 72 63  the Fts5Index.rc
21d90 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 49 66 20   error code. If 
21da0 61 6e 20 65 72 72 6f 72 20 68 61 73 20 0a 2a 2a  an error has .**
21db0 20 61 6c 72 65 61 64 79 20 6f 63 63 75 72 72 65   already occurre
21dc0 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
21dd0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
21de0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
21df0 49 6e 64 65 78 41 75 74 6f 6d 65 72 67 65 28 0a  IndexAutomerge(.
21e00 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20    Fts5Index *p, 
21e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e20 20 20 2f 2a 20 46 54 53 35 20 62 61 63 6b 65 6e    /* FTS5 backen
21e30 64 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74  d object */.  Ft
21e40 73 35 53 74 72 75 63 74 75 72 65 20 2a 2a 70 70  s5Structure **pp
21e50 53 74 72 75 63 74 2c 20 20 20 20 20 20 20 2f 2a  Struct,       /*
21e60 20 49 4e 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74   IN/OUT: Current
21e70 20 73 74 72 75 63 74 75 72 65 20 6f 66 20 69 6e   structure of in
21e80 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 65  dex */.  int nLe
21e90 61 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  af              
21ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
21eb0 65 72 20 6f 66 20 6f 75 74 70 75 74 20 6c 65 61  er of output lea
21ec0 76 65 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ves just written
21ed0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 2d 3e   */.){.  if( p->
21ee0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
21ef0 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 6e 41 75   p->pConfig->nAu
21f00 74 6f 6d 65 72 67 65 3e 30 20 29 7b 0a 20 20 20  tomerge>0 ){.   
21f10 20 46 74 73 35 53 74 72 75 63 74 75 72 65 20 2a   Fts5Structure *
21f20 70 53 74 72 75 63 74 20 3d 20 2a 70 70 53 74 72  pStruct = *ppStr
21f30 75 63 74 3b 0a 20 20 20 20 75 36 34 20 6e 57 72  uct;.    u64 nWr
21f40 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ite;            
21f50 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
21f60 6c 20 76 61 6c 75 65 20 6f 66 20 77 72 69 74 65  l value of write
21f70 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20  -counter */.    
21f80 69 6e 74 20 6e 57 6f 72 6b 3b 20 20 20 20 20 20  int nWork;      
21f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21fa0 20 4e 75 6d 62 65 72 20 6f 66 20 77 6f 72 6b 2d   Number of work-
21fb0 71 75 61 6e 74 61 20 74 6f 20 70 65 72 66 6f 72  quanta to perfor
21fc0 6d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 52 65  m */.    int nRe
21fd0 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
21fe0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21ff0 20 6f 66 20 6c 65 61 66 20 70 61 67 65 73 20 6c   of leaf pages l
22000 65 66 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  eft to write */.
22010 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74  .    /* Update t
22020 68 65 20 77 72 69 74 65 2d 63 6f 75 6e 74 65 72  he write-counter
22030 2e 20 57 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f  . While doing so
22040 2c 20 73 65 74 20 6e 57 6f 72 6b 2e 20 2a 2f 0a  , set nWork. */.
22050 20 20 20 20 6e 57 72 69 74 65 20 3d 20 70 53 74      nWrite = pSt
22060 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f 75 6e  ruct->nWriteCoun
22070 74 65 72 3b 0a 20 20 20 20 6e 57 6f 72 6b 20 3d  ter;.    nWork =
22080 20 28 69 6e 74 29 28 28 28 6e 57 72 69 74 65 20   (int)(((nWrite 
22090 2b 20 6e 4c 65 61 66 29 20 2f 20 70 2d 3e 6e 57  + nLeaf) / p->nW
220a0 6f 72 6b 55 6e 69 74 29 20 2d 20 28 6e 57 72 69  orkUnit) - (nWri
220b0 74 65 20 2f 20 70 2d 3e 6e 57 6f 72 6b 55 6e 69  te / p->nWorkUni
220c0 74 29 29 3b 0a 20 20 20 20 70 53 74 72 75 63 74  t));.    pStruct
220d0 2d 3e 6e 57 72 69 74 65 43 6f 75 6e 74 65 72 20  ->nWriteCounter 
220e0 2b 3d 20 6e 4c 65 61 66 3b 0a 20 20 20 20 6e 52  += nLeaf;.    nR
220f0 65 6d 20 3d 20 28 69 6e 74 29 28 70 2d 3e 6e 57  em = (int)(p->nW
22100 6f 72 6b 55 6e 69 74 20 2a 20 6e 57 6f 72 6b 20  orkUnit * nWork 
22110 2a 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65  * pStruct->nLeve
22120 6c 29 3b 0a 0a 20 20 20 20 66 74 73 35 49 6e 64  l);..    fts5Ind
22130 65 78 4d 65 72 67 65 28 70 2c 20 70 70 53 74 72  exMerge(p, ppStr
22140 75 63 74 2c 20 6e 52 65 6d 2c 20 70 2d 3e 70 43  uct, nRem, p->pC
22150 6f 6e 66 69 67 2d 3e 6e 41 75 74 6f 6d 65 72 67  onfig->nAutomerg
22160 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  e);.  }.}..stati
22170 63 20 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78  c void fts5Index
22180 43 72 69 73 69 73 6d 65 72 67 65 28 0a 20 20 46  Crisismerge(.  F
22190 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
221a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
221b0 2a 20 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f  * FTS5 backend o
221c0 62 6a 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53  bject */.  Fts5S
221d0 74 72 75 63 74 75 72 65 20 2a 2a 70 70 53 74 72  tructure **ppStr
221e0 75 63 74 20 20 20 20 20 20 20 20 2f 2a 20 49 4e  uct        /* IN
221f0 2f 4f 55 54 3a 20 43 75 72 72 65 6e 74 20 73 74  /OUT: Current st
22200 72 75 63 74 75 72 65 20 6f 66 20 69 6e 64 65 78  ructure of index
22210 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 69   */.){.  const i
22220 6e 74 20 6e 43 72 69 73 69 73 20 3d 20 70 2d 3e  nt nCrisis = p->
22230 70 43 6f 6e 66 69 67 2d 3e 6e 43 72 69 73 69 73  pConfig->nCrisis
22240 4d 65 72 67 65 3b 0a 20 20 46 74 73 35 53 74 72  Merge;.  Fts5Str
22250 75 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 20  ucture *pStruct 
22260 3d 20 2a 70 70 53 74 72 75 63 74 3b 0a 20 20 69  = *ppStruct;.  i
22270 6e 74 20 69 4c 76 6c 20 3d 20 30 3b 0a 0a 20 20  nt iLvl = 0;..  
22280 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53  assert( p->rc!=S
22290 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 72  QLITE_OK || pStr
222a0 75 63 74 2d 3e 6e 4c 65 76 65 6c 3e 30 20 29 3b  uct->nLevel>0 );
222b0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
222c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 53  =SQLITE_OK && pS
222d0 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c  truct->aLevel[iL
222e0 76 6c 5d 2e 6e 53 65 67 3e 3d 6e 43 72 69 73 69  vl].nSeg>=nCrisi
222f0 73 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e 64  s ){.    fts5Ind
22300 65 78 4d 65 72 67 65 4c 65 76 65 6c 28 70 2c 20  exMergeLevel(p, 
22310 26 70 53 74 72 75 63 74 2c 20 69 4c 76 6c 2c 20  &pStruct, iLvl, 
22320 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
22330 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc!=SQLITE_OK
22340 20 7c 7c 20 70 53 74 72 75 63 74 2d 3e 6e 4c 65   || pStruct->nLe
22350 76 65 6c 3e 28 69 4c 76 6c 2b 31 29 20 29 3b 0a  vel>(iLvl+1) );.
22360 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72      fts5Structur
22370 65 50 72 6f 6d 6f 74 65 28 70 2c 20 69 4c 76 6c  ePromote(p, iLvl
22380 2b 31 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20  +1, pStruct);.  
22390 20 20 69 4c 76 6c 2b 2b 3b 0a 20 20 7d 0a 20 20    iLvl++;.  }.  
223a0 2a 70 70 53 74 72 75 63 74 20 3d 20 70 53 74 72  *ppStruct = pStr
223b0 75 63 74 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  uct;.}..static i
223c0 6e 74 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  nt fts5IndexRetu
223d0 72 6e 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  rn(Fts5Index *p)
223e0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  {.  int rc = p->
223f0 72 63 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  rc;.  p->rc = SQ
22400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72  LITE_OK;.  retur
22410 6e 20 72 63 3b 0a 7d 0a 0a 74 79 70 65 64 65 66  n rc;.}..typedef
22420 20 73 74 72 75 63 74 20 46 74 73 35 46 6c 75 73   struct Fts5Flus
22430 68 43 74 78 20 46 74 73 35 46 6c 75 73 68 43 74  hCtx Fts5FlushCt
22440 78 3b 0a 73 74 72 75 63 74 20 46 74 73 35 46 6c  x;.struct Fts5Fl
22450 75 73 68 43 74 78 20 7b 0a 20 20 46 74 73 35 49  ushCtx {.  Fts5I
22460 6e 64 65 78 20 2a 70 49 64 78 3b 0a 20 20 46 74  ndex *pIdx;.  Ft
22470 73 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74  s5SegWriter writ
22480 65 72 3b 20 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 42  er; .};../*.** B
22490 75 66 66 65 72 20 61 42 75 66 5b 5d 20 63 6f 6e  uffer aBuf[] con
224a0 74 61 69 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  tains a list of 
224b0 76 61 72 69 6e 74 73 2c 20 61 6c 6c 20 73 6d 61  varints, all sma
224c0 6c 6c 20 65 6e 6f 75 67 68 20 74 6f 20 66 69 74  ll enough to fit
224d0 0a 2a 2a 20 69 6e 20 61 20 33 32 2d 62 69 74 20  .** in a 32-bit 
224e0 69 6e 74 65 67 65 72 2e 20 52 65 74 75 72 6e 20  integer. Return 
224f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
22500 6c 61 72 67 65 73 74 20 70 72 65 66 69 78 20 6f  largest prefix o
22510 66 20 74 68 69 73 20 0a 2a 2a 20 6c 69 73 74 20  f this .** list 
22520 6e 4d 61 78 20 62 79 74 65 73 20 6f 72 20 6c 65  nMax bytes or le
22530 73 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  ss in size..*/.s
22540 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 50 6f  tatic int fts5Po
22550 73 6c 69 73 74 50 72 65 66 69 78 28 63 6f 6e 73  slistPrefix(cons
22560 74 20 75 38 20 2a 61 42 75 66 2c 20 69 6e 74 20  t u8 *aBuf, int 
22570 6e 4d 61 78 29 7b 0a 20 20 69 6e 74 20 72 65 74  nMax){.  int ret
22580 3b 0a 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20  ;.  u32 dummy;. 
22590 20 72 65 74 20 3d 20 66 74 73 35 47 65 74 56 61   ret = fts5GetVa
225a0 72 69 6e 74 33 32 28 61 42 75 66 2c 20 64 75 6d  rint32(aBuf, dum
225b0 6d 79 29 3b 0a 20 20 69 66 28 20 72 65 74 3c 6e  my);.  if( ret<n
225c0 4d 61 78 20 29 7b 0a 20 20 20 20 77 68 69 6c 65  Max ){.    while
225d0 28 20 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ( 1 ){.      int
225e0 20 69 20 3d 20 66 74 73 35 47 65 74 56 61 72 69   i = fts5GetVari
225f0 6e 74 33 32 28 26 61 42 75 66 5b 72 65 74 5d 2c  nt32(&aBuf[ret],
22600 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 69   dummy);.      i
22610 66 28 20 28 72 65 74 20 2b 20 69 29 20 3e 20 6e  f( (ret + i) > n
22620 4d 61 78 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  Max ) break;.   
22630 20 20 20 72 65 74 20 2b 3d 20 69 3b 0a 20 20 20     ret += i;.   
22640 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22650 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6c  ret;.}../*.** Fl
22660 75 73 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ush the contents
22670 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 68 61   of in-memory ha
22680 73 68 20 74 61 62 6c 65 20 69 48 61 73 68 20 74  sh table iHash t
22690 6f 20 61 20 6e 65 77 20 6c 65 76 65 6c 2d 30 20  o a new level-0 
226a0 0a 2a 2a 20 73 65 67 6d 65 6e 74 20 6f 6e 20 64  .** segment on d
226b0 69 73 6b 2e 20 41 6c 73 6f 20 75 70 64 61 74 65  isk. Also update
226c0 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
226d0 6e 67 20 73 74 72 75 63 74 75 72 65 20 72 65 63  ng structure rec
226e0 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ord..**.** If an
226f0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73   error occurs, s
22700 65 74 20 74 68 65 20 46 74 73 35 49 6e 64 65 78  et the Fts5Index
22710 2e 72 63 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .rc error code. 
22720 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61 73 20  If an error has 
22730 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63 75  .** already occu
22740 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63 74  rred, this funct
22750 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
22760 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
22770 74 73 35 46 6c 75 73 68 4f 6e 65 48 61 73 68 28  ts5FlushOneHash(
22780 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
22790 20 46 74 73 35 48 61 73 68 20 2a 70 48 61 73 68   Fts5Hash *pHash
227a0 20 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 46   = p->pHash;.  F
227b0 74 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 53  ts5Structure *pS
227c0 74 72 75 63 74 3b 0a 20 20 69 6e 74 20 69 53 65  truct;.  int iSe
227d0 67 69 64 3b 0a 20 20 69 6e 74 20 70 67 6e 6f 4c  gid;.  int pgnoL
227e0 61 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ast = 0;        
227f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74           /* Last
22800 20 6c 65 61 66 20 70 61 67 65 20 6e 75 6d 62 65   leaf page numbe
22810 72 20 69 6e 20 73 65 67 6d 65 6e 74 20 2a 2f 0a  r in segment */.
22820 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 72  .  /* Obtain a r
22830 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
22840 69 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  index structure 
22850 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  and allocate a n
22860 65 77 20 73 65 67 6d 65 6e 74 2d 69 64 0a 20 20  ew segment-id.  
22870 2a 2a 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6c  ** for the new l
22880 65 76 65 6c 2d 30 20 73 65 67 6d 65 6e 74 2e 20  evel-0 segment. 
22890 20 2a 2f 0a 20 20 70 53 74 72 75 63 74 20 3d 20   */.  pStruct = 
228a0 66 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61  fts5StructureRea
228b0 64 28 70 29 3b 0a 20 20 69 53 65 67 69 64 20 3d  d(p);.  iSegid =
228c0 20 66 74 73 35 41 6c 6c 6f 63 61 74 65 53 65 67   fts5AllocateSeg
228d0 69 64 28 70 2c 20 70 53 74 72 75 63 74 29 3b 0a  id(p, pStruct);.
228e0 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49    fts5StructureI
228f0 6e 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20  nvalidate(p);.. 
22900 20 69 66 28 20 69 53 65 67 69 64 20 29 7b 0a 20   if( iSegid ){. 
22910 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
22920 7a 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  z = p->pConfig->
22930 70 67 73 7a 3b 0a 20 20 20 20 69 6e 74 20 65 44  pgsz;.    int eD
22940 65 74 61 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66  etail = p->pConf
22950 69 67 2d 3e 65 44 65 74 61 69 6c 3b 0a 20 20 20  ig->eDetail;.   
22960 20 46 74 73 35 53 74 72 75 63 74 75 72 65 53 65   Fts5StructureSe
22970 67 6d 65 6e 74 20 2a 70 53 65 67 3b 20 20 20 2f  gment *pSeg;   /
22980 2a 20 4e 65 77 20 73 65 67 6d 65 6e 74 20 77 69  * New segment wi
22990 74 68 69 6e 20 70 53 74 72 75 63 74 20 2a 2f 0a  thin pStruct */.
229a0 20 20 20 20 46 74 73 35 42 75 66 66 65 72 20 2a      Fts5Buffer *
229b0 70 42 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  pBuf;           
229c0 20 20 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77    /* Buffer in w
229d0 68 69 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65  hich to assemble
229e0 20 6c 65 61 66 20 70 61 67 65 20 2a 2f 0a 20 20   leaf page */.  
229f0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 50    Fts5Buffer *pP
22a00 67 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  gidx;           
22a10 2f 2a 20 42 75 66 66 65 72 20 69 6e 20 77 68 69  /* Buffer in whi
22a20 63 68 20 74 6f 20 61 73 73 65 6d 62 6c 65 20 70  ch to assemble p
22a30 67 69 64 78 20 2a 2f 0a 0a 20 20 20 20 46 74 73  gidx */..    Fts
22a40 35 53 65 67 57 72 69 74 65 72 20 77 72 69 74 65  5SegWriter write
22a50 72 3b 0a 20 20 20 20 66 74 73 35 57 72 69 74 65  r;.    fts5Write
22a60 49 6e 69 74 28 70 2c 20 26 77 72 69 74 65 72 2c  Init(p, &writer,
22a70 20 69 53 65 67 69 64 29 3b 0a 0a 20 20 20 20 70   iSegid);..    p
22a80 42 75 66 20 3d 20 26 77 72 69 74 65 72 2e 77 72  Buf = &writer.wr
22a90 69 74 65 72 2e 62 75 66 3b 0a 20 20 20 20 70 50  iter.buf;.    pP
22aa0 67 69 64 78 20 3d 20 26 77 72 69 74 65 72 2e 77  gidx = &writer.w
22ab0 72 69 74 65 72 2e 70 67 69 64 78 3b 0a 0a 20 20  riter.pgidx;..  
22ac0 20 20 2f 2a 20 66 74 73 35 57 72 69 74 65 49 6e    /* fts5WriteIn
22ad0 69 74 28 29 20 73 68 6f 75 6c 64 20 68 61 76 65  it() should have
22ae0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 68 65   initialized the
22af0 20 62 75 66 66 65 72 73 20 74 6f 20 28 6d 6f 73   buffers to (mos
22b00 74 20 6c 69 6b 65 6c 79 29 0a 20 20 20 20 2a 2a  t likely).    **
22b10 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70 61   the maximum spa
22b20 63 65 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a  ce required. */.
22b30 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72      assert( p->r
22b40 63 20 7c 7c 20 70 42 75 66 2d 3e 6e 53 70 61 63  c || pBuf->nSpac
22b50 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54 53 35 5f  e>=(pgsz + FTS5_
22b60 44 41 54 41 5f 50 41 44 44 49 4e 47 29 20 29 3b  DATA_PADDING) );
22b70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
22b80 72 63 20 7c 7c 20 70 50 67 69 64 78 2d 3e 6e 53  rc || pPgidx->nS
22b90 70 61 63 65 3e 3d 28 70 67 73 7a 20 2b 20 46 54  pace>=(pgsz + FT
22ba0 53 35 5f 44 41 54 41 5f 50 41 44 44 49 4e 47 29  S5_DATA_PADDING)
22bb0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 67 69   );..    /* Begi
22bc0 6e 20 73 63 61 6e 6e 69 6e 67 20 74 68 72 6f 75  n scanning throu
22bd0 67 68 20 68 61 73 68 20 74 61 62 6c 65 20 65 6e  gh hash table en
22be0 74 72 69 65 73 2e 20 54 68 69 73 20 6c 6f 6f 70  tries. This loop
22bf0 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65   runs once for e
22c00 61 63 68 0a 20 20 20 20 2a 2a 20 74 65 72 6d 2f  ach.    ** term/
22c10 64 6f 63 6c 69 73 74 20 63 75 72 72 65 6e 74 6c  doclist currentl
22c20 79 20 73 74 6f 72 65 64 20 77 69 74 68 69 6e 20  y stored within 
22c30 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 20  the hash table. 
22c40 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
22c50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22c60 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 73 71 6c       p->rc = sql
22c70 69 74 65 33 46 74 73 35 48 61 73 68 53 63 61 6e  ite3Fts5HashScan
22c80 49 6e 69 74 28 70 48 61 73 68 2c 20 30 2c 20 30  Init(pHash, 0, 0
22c90 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  );.    }.    whi
22ca0 6c 65 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  le( p->rc==SQLIT
22cb0 45 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74  E_OK && 0==sqlit
22cc0 65 33 46 74 73 35 48 61 73 68 53 63 61 6e 45 6f  e3Fts5HashScanEo
22cd0 66 28 70 48 61 73 68 29 20 29 7b 0a 20 20 20 20  f(pHash) ){.    
22ce0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
22cf0 65 72 6d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  erm;          /*
22d00 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   Buffer containi
22d10 6e 67 20 74 65 72 6d 20 2a 2f 0a 20 20 20 20 20  ng term */.     
22d20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 6f 63 6c   const u8 *pDocl
22d30 69 73 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ist;         /* 
22d40 50 6f 69 6e 74 65 72 20 74 6f 20 64 6f 63 6c 69  Pointer to docli
22d50 73 74 20 66 6f 72 20 74 68 69 73 20 74 65 72 6d  st for this term
22d60 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 44   */.      int nD
22d70 6f 63 6c 69 73 74 3b 20 20 20 20 20 20 20 20 20  oclist;         
22d80 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
22d90 20 64 6f 63 6c 69 73 74 20 69 6e 20 62 79 74 65   doclist in byte
22da0 73 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 57  s */..      /* W
22db0 72 69 74 65 20 74 68 65 20 74 65 72 6d 20 66 6f  rite the term fo
22dc0 72 20 74 68 69 73 20 65 6e 74 72 79 20 74 6f 20  r this entry to 
22dd0 64 69 73 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 73  disk. */.      s
22de0 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 53 63  qlite3Fts5HashSc
22df0 61 6e 45 6e 74 72 79 28 70 48 61 73 68 2c 20 26  anEntry(pHash, &
22e00 7a 54 65 72 6d 2c 20 26 70 44 6f 63 6c 69 73 74  zTerm, &pDoclist
22e10 2c 20 26 6e 44 6f 63 6c 69 73 74 29 3b 0a 20 20  , &nDoclist);.  
22e20 20 20 20 20 66 74 73 35 57 72 69 74 65 41 70 70      fts5WriteApp
22e30 65 6e 64 54 65 72 6d 28 70 2c 20 26 77 72 69 74  endTerm(p, &writ
22e40 65 72 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  er, (int)strlen(
22e50 7a 54 65 72 6d 29 2c 20 28 63 6f 6e 73 74 20 75  zTerm), (const u
22e60 38 2a 29 7a 54 65 72 6d 29 3b 0a 20 20 20 20 20  8*)zTerm);.     
22e70 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49   if( p->rc!=SQLI
22e80 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a  TE_OK ) break;..
22e90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 77 72        assert( wr
22ea0 69 74 65 72 2e 62 46 69 72 73 74 52 6f 77 69 64  iter.bFirstRowid
22eb0 49 6e 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 20  InPage==0 );.   
22ec0 20 20 20 69 66 28 20 70 67 73 7a 3e 3d 28 70 42     if( pgsz>=(pB
22ed0 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
22ee0 6e 20 2b 20 6e 44 6f 63 6c 69 73 74 20 2b 20 31  n + nDoclist + 1
22ef0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
22f00 54 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69  The entire docli
22f10 73 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74  st will fit on t
22f20 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 2e  he current leaf.
22f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 74 73 35   */.        fts5
22f40 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
22f50 42 6c 6f 62 28 70 42 75 66 2c 20 70 44 6f 63 6c  Blob(pBuf, pDocl
22f60 69 73 74 2c 20 6e 44 6f 63 6c 69 73 74 29 3b 0a  ist, nDoclist);.
22f70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
22f80 20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 20       i64 iRowid 
22f90 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 36 34  = 0;.        i64
22fa0 20 69 44 65 6c 74 61 20 3d 20 30 3b 0a 20 20 20   iDelta = 0;.   
22fb0 20 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20       int iOff = 
22fc0 30 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  0;..        /* T
22fd0 68 65 20 65 6e 74 69 72 65 20 64 6f 63 6c 69 73  he entire doclis
22fe0 74 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f  t will not fit o
22ff0 6e 20 74 68 69 73 20 6c 65 61 66 2e 20 54 68 65  n this leaf. The
23000 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 20 20 20 20   following .    
23010 20 20 20 20 2a 2a 20 6c 6f 6f 70 20 69 74 65 72      ** loop iter
23020 61 74 65 73 20 74 68 72 6f 75 67 68 20 74 68 65  ates through the
23030 20 70 6f 73 6c 69 73 74 73 20 74 68 61 74 20 6d   poslists that m
23040 61 6b 65 20 75 70 20 74 68 65 20 63 75 72 72 65  ake up the curre
23050 6e 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64  nt .        ** d
23060 6f 63 6c 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20  oclist.  */.    
23070 20 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63      while( p->rc
23080 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
23090 4f 66 66 3c 6e 44 6f 63 6c 69 73 74 20 29 7b 0a  Off<nDoclist ){.
230a0 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b            iOff +
230b0 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 28  = fts5GetVarint(
230c0 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d 2c  &pDoclist[iOff],
230d0 20 28 75 36 34 2a 29 26 69 44 65 6c 74 61 29 3b   (u64*)&iDelta);
230e0 0a 20 20 20 20 20 20 20 20 20 20 69 52 6f 77 69  .          iRowi
230f0 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
23100 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
23110 20 20 69 66 28 20 77 72 69 74 65 72 2e 62 46 69    if( writer.bFi
23120 72 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 29  rstRowidInPage )
23130 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
23140 73 35 50 75 74 55 31 36 28 26 70 42 75 66 2d 3e  s5PutU16(&pBuf->
23150 70 5b 30 5d 2c 20 28 75 31 36 29 70 42 75 66 2d  p[0], (u16)pBuf-
23160 3e 6e 29 3b 20 20 20 2f 2a 20 66 69 72 73 74 20  >n);   /* first 
23170 72 6f 77 69 64 20 6f 6e 20 70 61 67 65 20 2a 2f  rowid on page */
23180 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 42 75  .            pBu
23190 66 2d 3e 6e 20 2b 3d 20 73 71 6c 69 74 65 33 46  f->n += sqlite3F
231a0 74 73 35 50 75 74 56 61 72 69 6e 74 28 26 70 42  ts5PutVarint(&pB
231b0 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 2c 20  uf->p[pBuf->n], 
231c0 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
231d0 20 20 20 20 20 77 72 69 74 65 72 2e 62 46 69 72       writer.bFir
231e0 73 74 52 6f 77 69 64 49 6e 50 61 67 65 20 3d 20  stRowidInPage = 
231f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  0;.            f
23200 74 73 35 57 72 69 74 65 44 6c 69 64 78 41 70 70  ts5WriteDlidxApp
23210 65 6e 64 28 70 2c 20 26 77 72 69 74 65 72 2c 20  end(p, &writer, 
23220 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20  iRowid);.       
23230 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23240 20 20 20 20 20 20 70 42 75 66 2d 3e 6e 20 2b 3d        pBuf->n +=
23250 20 73 71 6c 69 74 65 33 46 74 73 35 50 75 74 56   sqlite3Fts5PutV
23260 61 72 69 6e 74 28 26 70 42 75 66 2d 3e 70 5b 70  arint(&pBuf->p[p
23270 42 75 66 2d 3e 6e 5d 2c 20 69 44 65 6c 74 61 29  Buf->n], iDelta)
23280 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
23290 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
232a0 70 42 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e  pBuf->n<=pBuf->n
232b0 53 70 61 63 65 20 29 3b 0a 0a 20 20 20 20 20 20  Space );..      
232c0 20 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d      if( eDetail=
232d0 3d 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e  =FTS5_DETAIL_NON
232e0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  E ){.           
232f0 20 69 66 28 20 69 4f 66 66 3c 6e 44 6f 63 6c 69   if( iOff<nDocli
23300 73 74 20 26 26 20 70 44 6f 63 6c 69 73 74 5b 69  st && pDoclist[i
23310 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Off]==0 ){.     
23320 20 20 20 20 20 20 20 20 20 70 42 75 66 2d 3e 70           pBuf->p
23330 5b 70 42 75 66 2d 3e 6e 2b 2b 5d 20 3d 20 30 3b  [pBuf->n++] = 0;
23340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
23350 4f 66 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Off++;.         
23360 20 20 20 20 20 69 66 28 20 69 4f 66 66 3c 6e 44       if( iOff<nD
23370 6f 63 6c 69 73 74 20 26 26 20 70 44 6f 63 6c 69  oclist && pDocli
23380 73 74 5b 69 4f 66 66 5d 3d 3d 30 20 29 7b 0a 20  st[iOff]==0 ){. 
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
233a0 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 2b 2b  Buf->p[pBuf->n++
233b0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  ] = 0;.         
233c0 20 20 20 20 20 20 20 69 4f 66 66 2b 2b 3b 0a 20         iOff++;. 
233d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
233e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
233f0 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 42           if( (pB
23400 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78 2d 3e  uf->n + pPgidx->
23410 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a 20 20 20 20  n)>=pgsz ){.    
23420 20 20 20 20 20 20 20 20 20 20 66 74 73 35 57 72            fts5Wr
23430 69 74 65 46 6c 75 73 68 4c 65 61 66 28 70 2c 20  iteFlushLeaf(p, 
23440 26 77 72 69 74 65 72 29 3b 0a 20 20 20 20 20 20  &writer);.      
23450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
23460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23470 20 20 20 20 20 69 6e 74 20 62 44 75 6d 6d 79 3b       int bDummy;
23480 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
23490 20 6e 50 6f 73 3b 0a 20 20 20 20 20 20 20 20 20   nPos;.         
234a0 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 66     int nCopy = f
234b0 74 73 35 47 65 74 50 6f 73 6c 69 73 74 53 69 7a  ts5GetPoslistSiz
234c0 65 28 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66  e(&pDoclist[iOff
234d0 5d 2c 20 26 6e 50 6f 73 2c 20 26 62 44 75 6d 6d  ], &nPos, &bDumm
234e0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y);.            
234f0 6e 43 6f 70 79 20 2b 3d 20 6e 50 6f 73 3b 0a 20  nCopy += nPos;. 
23500 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
23510 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69 64 78  pBuf->n + pPgidx
23520 2d 3e 6e 20 2b 20 6e 43 6f 70 79 29 20 3c 3d 20  ->n + nCopy) <= 
23530 70 67 73 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  pgsz ){.        
23540 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 6e 74        /* The ent
23550 69 72 65 20 70 6f 73 6c 69 73 74 20 77 69 6c 6c  ire poslist will
23560 20 66 69 74 20 6f 6e 20 74 68 65 20 63 75 72 72   fit on the curr
23570 65 6e 74 20 6c 65 61 66 2e 20 53 6f 20 63 6f 70  ent leaf. So cop
23580 79 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y.              
23590 2a 2a 20 69 74 20 69 6e 20 6f 6e 65 20 67 6f 2e  ** it in one go.
235a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
235b0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
235c0 41 70 70 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c  AppendBlob(pBuf,
235d0 20 26 70 44 6f 63 6c 69 73 74 5b 69 4f 66 66 5d   &pDoclist[iOff]
235e0 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
235f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23600 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
23610 65 20 65 6e 74 69 72 65 20 70 6f 73 6c 69 73 74  e entire poslist
23620 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e   will not fit on
23630 20 74 68 69 73 20 6c 65 61 66 2e 20 53 6f 20 69   this leaf. So i
23640 74 20 6e 65 65 64 73 0a 20 20 20 20 20 20 20 20  t needs.        
23650 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 62        ** to be b
23660 72 6f 6b 65 6e 20 69 6e 74 6f 20 73 65 63 74 69  roken into secti
23670 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 71 75  ons. The only qu
23680 61 6c 69 66 69 63 61 74 69 6f 6e 20 62 65 69 6e  alification bein
23690 67 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g.              
236a0 2a 2a 20 74 68 61 74 20 65 61 63 68 20 76 61 72  ** that each var
236b0 69 6e 74 20 6d 75 73 74 20 62 65 20 73 74 6f 72  int must be stor
236c0 65 64 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79 2e  ed contiguously.
236d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20    */.           
236e0 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 50 6f     const u8 *pPo
236f0 73 6c 69 73 74 20 3d 20 26 70 44 6f 63 6c 69 73  slist = &pDoclis
23700 74 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 20  t[iOff];.       
23710 20 20 20 20 20 20 20 69 6e 74 20 69 50 6f 73 20         int iPos 
23720 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 0;.           
23730 20 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d     while( p->rc=
23740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
23760 74 20 6e 53 70 61 63 65 20 3d 20 70 67 73 7a 20  t nSpace = pgsz 
23770 2d 20 70 42 75 66 2d 3e 6e 20 2d 20 70 50 67 69  - pBuf->n - pPgi
23780 64 78 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 20  dx->n;.         
23790 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 30         int n = 0
237a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
237b0 20 20 69 66 28 20 28 6e 43 6f 70 79 20 2d 20 69    if( (nCopy - i
237c0 50 6f 73 29 3c 3d 6e 53 70 61 63 65 20 29 7b 0a  Pos)<=nSpace ){.
237d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237e0 20 20 6e 20 3d 20 6e 43 6f 70 79 20 2d 20 69 50    n = nCopy - iP
237f0 6f 73 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  os;.            
23800 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23810 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
23820 20 66 74 73 35 50 6f 73 6c 69 73 74 50 72 65 66   fts5PoslistPref
23830 69 78 28 26 70 50 6f 73 6c 69 73 74 5b 69 50 6f  ix(&pPoslist[iPo
23840 73 5d 2c 20 6e 53 70 61 63 65 29 3b 0a 20 20 20  s], nSpace);.   
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
23870 73 73 65 72 74 28 20 6e 3e 30 20 29 3b 0a 20 20  ssert( n>0 );.  
23880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 74                ft
23890 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65  s5BufferSafeAppe
238a0 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 26 70 50  ndBlob(pBuf, &pP
238b0 6f 73 6c 69 73 74 5b 69 50 6f 73 5d 2c 20 6e 29  oslist[iPos], n)
238c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
238d0 20 20 69 50 6f 73 20 2b 3d 20 6e 3b 0a 20 20 20    iPos += n;.   
238e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
238f0 20 28 70 42 75 66 2d 3e 6e 20 2b 20 70 50 67 69   (pBuf->n + pPgi
23900 64 78 2d 3e 6e 29 3e 3d 70 67 73 7a 20 29 7b 0a  dx->n)>=pgsz ){.
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23920 20 20 66 74 73 35 57 72 69 74 65 46 6c 75 73 68    fts5WriteFlush
23930 4c 65 61 66 28 70 2c 20 26 77 72 69 74 65 72 29  Leaf(p, &writer)
23940 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
23950 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
23960 20 20 20 20 69 66 28 20 69 50 6f 73 3e 3d 6e 43      if( iPos>=nC
23970 6f 70 79 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  opy ) break;.   
23980 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23990 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
239a0 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e         iOff += n
239b0 43 6f 70 79 3b 0a 20 20 20 20 20 20 20 20 20 20  Copy;.          
239c0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
239d0 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 4f    }..      /* TO
239e0 44 4f 32 3a 20 44 6f 63 6c 69 73 74 20 74 65 72  DO2: Doclist ter
239f0 6d 69 6e 61 74 6f 72 20 77 72 69 74 74 65 6e 20  minator written 
23a00 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  here. */.      /
23a10 2a 20 70 42 75 66 2d 3e 70 5b 70 42 75 66 2d 3e  * pBuf->p[pBuf->
23a20 6e 2b 2b 5d 20 3d 20 27 5c 30 27 3b 20 2a 2f 0a  n++] = '\0'; */.
23a30 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
23a40 75 66 2d 3e 6e 3c 3d 70 42 75 66 2d 3e 6e 53 70  uf->n<=pBuf->nSp
23a50 61 63 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ace );.      if(
23a60 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
23a70 4b 20 29 20 73 71 6c 69 74 65 33 46 74 73 35 48  K ) sqlite3Fts5H
23a80 61 73 68 53 63 61 6e 4e 65 78 74 28 70 48 61 73  ashScanNext(pHas
23a90 68 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  h);.    }.    sq
23aa0 6c 69 74 65 33 46 74 73 35 48 61 73 68 43 6c 65  lite3Fts5HashCle
23ab0 61 72 28 70 48 61 73 68 29 3b 0a 20 20 20 20 66  ar(pHash);.    f
23ac0 74 73 35 57 72 69 74 65 46 69 6e 69 73 68 28 70  ts5WriteFinish(p
23ad0 2c 20 26 77 72 69 74 65 72 2c 20 26 70 67 6e 6f  , &writer, &pgno
23ae0 4c 61 73 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  Last);..    /* U
23af0 70 64 61 74 65 20 74 68 65 20 46 74 73 35 53 74  pdate the Fts5St
23b00 72 75 63 74 75 72 65 2e 20 49 74 20 69 73 20 77  ructure. It is w
23b10 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74  ritten back to t
23b20 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
23b30 68 65 0a 20 20 20 20 2a 2a 20 66 74 73 35 53 74  he.    ** fts5St
23b40 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 29  ructureRelease()
23b50 20 63 61 6c 6c 20 62 65 6c 6f 77 2e 20 20 2a 2f   call below.  */
23b60 0a 20 20 20 20 69 66 28 20 70 53 74 72 75 63 74  .    if( pStruct
23b70 2d 3e 6e 4c 65 76 65 6c 3d 3d 30 20 29 7b 0a 20  ->nLevel==0 ){. 
23b80 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
23b90 72 65 41 64 64 4c 65 76 65 6c 28 26 70 2d 3e 72  reAddLevel(&p->r
23ba0 63 2c 20 26 70 53 74 72 75 63 74 29 3b 0a 20 20  c, &pStruct);.  
23bb0 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74 72 75    }.    fts5Stru
23bc0 63 74 75 72 65 45 78 74 65 6e 64 4c 65 76 65 6c  ctureExtendLevel
23bd0 28 26 70 2d 3e 72 63 2c 20 70 53 74 72 75 63 74  (&p->rc, pStruct
23be0 2c 20 30 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  , 0, 1, 0);.    
23bf0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
23c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 53  E_OK ){.      pS
23c10 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e 61  eg = &pStruct->a
23c20 4c 65 76 65 6c 5b 30 5d 2e 61 53 65 67 5b 20 70  Level[0].aSeg[ p
23c30 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 30  Struct->aLevel[0
23c40 5d 2e 6e 53 65 67 2b 2b 20 5d 3b 0a 20 20 20 20  ].nSeg++ ];.    
23c50 20 20 70 53 65 67 2d 3e 69 53 65 67 69 64 20 3d    pSeg->iSegid =
23c60 20 69 53 65 67 69 64 3b 0a 20 20 20 20 20 20 70   iSegid;.      p
23c70 53 65 67 2d 3e 70 67 6e 6f 46 69 72 73 74 20 3d  Seg->pgnoFirst =
23c80 20 31 3b 0a 20 20 20 20 20 20 70 53 65 67 2d 3e   1;.      pSeg->
23c90 70 67 6e 6f 4c 61 73 74 20 3d 20 70 67 6e 6f 4c  pgnoLast = pgnoL
23ca0 61 73 74 3b 0a 20 20 20 20 20 20 70 53 74 72 75  ast;.      pStru
23cb0 63 74 2d 3e 6e 53 65 67 6d 65 6e 74 2b 2b 3b 0a  ct->nSegment++;.
23cc0 20 20 20 20 7d 0a 20 20 20 20 66 74 73 35 53 74      }.    fts5St
23cd0 72 75 63 74 75 72 65 50 72 6f 6d 6f 74 65 28 70  ructurePromote(p
23ce0 2c 20 30 2c 20 70 53 74 72 75 63 74 29 3b 0a 20  , 0, pStruct);. 
23cf0 20 7d 0a 0a 20 20 66 74 73 35 49 6e 64 65 78 41   }..  fts5IndexA
23d00 75 74 6f 6d 65 72 67 65 28 70 2c 20 26 70 53 74  utomerge(p, &pSt
23d10 72 75 63 74 2c 20 70 67 6e 6f 4c 61 73 74 29 3b  ruct, pgnoLast);
23d20 0a 20 20 66 74 73 35 49 6e 64 65 78 43 72 69 73  .  fts5IndexCris
23d30 69 73 6d 65 72 67 65 28 70 2c 20 26 70 53 74 72  ismerge(p, &pStr
23d40 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74 72 75  uct);.  fts5Stru
23d50 63 74 75 72 65 57 72 69 74 65 28 70 2c 20 70 53  ctureWrite(p, pS
23d60 74 72 75 63 74 29 3b 0a 20 20 66 74 73 35 53 74  truct);.  fts5St
23d70 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28 70  ructureRelease(p
23d80 53 74 72 75 63 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Struct);.}../*.*
23d90 2a 20 46 6c 75 73 68 20 61 6e 79 20 64 61 74 61  * Flush any data
23da0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 69   stored in the i
23db0 6e 2d 6d 65 6d 6f 72 79 20 68 61 73 68 20 74 61  n-memory hash ta
23dc0 62 6c 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  bles to the data
23dd0 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
23de0 76 6f 69 64 20 66 74 73 35 49 6e 64 65 78 46 6c  void fts5IndexFl
23df0 75 73 68 28 46 74 73 35 49 6e 64 65 78 20 2a 70  ush(Fts5Index *p
23e00 29 7b 0a 20 20 2f 2a 20 55 6e 6c 65 73 73 20 69  ){.  /* Unless i
23e10 74 20 69 73 20 65 6d 70 74 79 2c 20 66 6c 75 73  t is empty, flus
23e20 68 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  h the hash table
23e30 20 74 6f 20 64 69 73 6b 20 2a 2f 0a 20 20 69 66   to disk */.  if
23e40 28 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74  ( p->nPendingDat
23e50 61 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  a ){.    assert(
23e60 20 70 2d 3e 70 48 61 73 68 20 29 3b 0a 20 20 20   p->pHash );.   
23e70 20 70 2d 3e 6e 50 65 6e 64 69 6e 67 44 61 74 61   p->nPendingData
23e80 20 3d 20 30 3b 0a 20 20 20 20 66 74 73 35 46 6c   = 0;.    fts5Fl
23e90 75 73 68 4f 6e 65 48 61 73 68 28 70 29 3b 0a 20  ushOneHash(p);. 
23ea0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 46 74 73   }.}..static Fts
23eb0 35 53 74 72 75 63 74 75 72 65 20 2a 66 74 73 35  5Structure *fts5
23ec0 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72  IndexOptimizeStr
23ed0 75 63 74 28 0a 20 20 46 74 73 35 49 6e 64 65 78  uct(.  Fts5Index
23ee0 20 2a 70 2c 20 0a 20 20 46 74 73 35 53 74 72 75   *p, .  Fts5Stru
23ef0 63 74 75 72 65 20 2a 70 53 74 72 75 63 74 0a 29  cture *pStruct.)
23f00 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
23f10 65 20 2a 70 4e 65 77 20 3d 20 30 3b 0a 20 20 73  e *pNew = 0;.  s
23f20 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 42 79  qlite3_int64 nBy
23f30 74 65 20 3d 20 73 69 7a 65 6f 66 28 46 74 73 35  te = sizeof(Fts5
23f40 53 74 72 75 63 74 75 72 65 29 3b 0a 20 20 69 6e  Structure);.  in
23f50 74 20 6e 53 65 67 20 3d 20 70 53 74 72 75 63 74  t nSeg = pStruct
23f60 2d 3e 6e 53 65 67 6d 65 6e 74 3b 0a 20 20 69 6e  ->nSegment;.  in
23f70 74 20 69 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72  t i;..  /* Figur
23f80 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 73 74  e out if this st
23f90 72 75 63 74 75 72 65 20 72 65 71 75 69 72 65 73  ructure requires
23fa0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 41   optimization. A
23fb0 20 73 74 72 75 63 74 75 72 65 20 64 6f 65 73 0a   structure does.
23fc0 20 20 2a 2a 20 6e 6f 74 20 72 65 71 75 69 72 65    ** not require
23fd0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 66   optimization if
23fe0 20 65 69 74 68 65 72 3a 0a 20 20 2a 2a 0a 20 20   either:.  **.  
23ff0 2a 2a 20 20 2b 20 69 74 20 63 6f 6e 73 69 73 74  **  + it consist
24000 73 20 6f 66 20 66 65 77 65 72 20 74 68 61 6e 20  s of fewer than 
24010 74 77 6f 20 73 65 67 6d 65 6e 74 73 2c 20 6f 72  two segments, or
24020 20 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20 73 65   .  **  + all se
24030 67 6d 65 6e 74 73 20 61 72 65 20 6f 6e 20 74 68  gments are on th
24040 65 20 73 61 6d 65 20 6c 65 76 65 6c 2c 20 6f 72  e same level, or
24050 0a 20 20 2a 2a 20 20 2b 20 61 6c 6c 20 73 65 67  .  **  + all seg
24060 6d 65 6e 74 73 20 65 78 63 65 70 74 20 6f 6e 65  ments except one
24070 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
24080 6e 70 75 74 73 20 74 6f 20 61 20 6d 65 72 67 65  nputs to a merge
24090 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 2a 2a   operation..  **
240a0 0a 20 20 2a 2a 20 49 6e 20 74 68 65 20 66 69 72  .  ** In the fir
240b0 73 74 20 63 61 73 65 2c 20 72 65 74 75 72 6e 20  st case, return 
240c0 4e 55 4c 4c 2e 20 49 6e 20 74 68 65 20 73 65 63  NULL. In the sec
240d0 6f 6e 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74  ond, increment t
240e0 68 65 20 72 65 66 2d 63 6f 75 6e 74 0a 20 20 2a  he ref-count.  *
240f0 2a 20 6f 6e 20 2a 70 53 74 72 75 63 74 20 61 6e  * on *pStruct an
24100 64 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 20  d return a copy 
24110 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20 74  of the pointer t
24120 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
24130 20 6e 53 65 67 3c 32 20 29 20 72 65 74 75 72 6e   nSeg<2 ) return
24140 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
24150 3c 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c  <pStruct->nLevel
24160 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
24170 6e 54 68 69 73 20 3d 20 70 53 74 72 75 63 74 2d  nThis = pStruct-
24180 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 53 65 67 3b  >aLevel[i].nSeg;
24190 0a 20 20 20 20 69 66 28 20 6e 54 68 69 73 3d 3d  .    if( nThis==
241a0 6e 53 65 67 20 7c 7c 20 28 6e 54 68 69 73 3d 3d  nSeg || (nThis==
241b0 6e 53 65 67 2d 31 20 26 26 20 70 53 74 72 75 63  nSeg-1 && pStruc
241c0 74 2d 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65  t->aLevel[i].nMe
241d0 72 67 65 3d 3d 6e 54 68 69 73 29 20 29 7b 0a 20  rge==nThis) ){. 
241e0 20 20 20 20 20 66 74 73 35 53 74 72 75 63 74 75       fts5Structu
241f0 72 65 52 65 66 28 70 53 74 72 75 63 74 29 3b 0a  reRef(pStruct);.
24200 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 53 74        return pSt
24210 72 75 63 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ruct;.    }.    
24220 61 73 73 65 72 74 28 20 70 53 74 72 75 63 74 2d  assert( pStruct-
24230 3e 61 4c 65 76 65 6c 5b 69 5d 2e 6e 4d 65 72 67  >aLevel[i].nMerg
24240 65 3c 3d 6e 54 68 69 73 20 29 3b 0a 20 20 7d 0a  e<=nThis );.  }.
24250 0a 20 20 6e 42 79 74 65 20 2b 3d 20 28 70 53 74  .  nByte += (pSt
24260 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 29 20  ruct->nLevel+1) 
24270 2a 20 73 69 7a 65 6f 66 28 46 74 73 35 53 74 72  * sizeof(Fts5Str
24280 75 63 74 75 72 65 4c 65 76 65 6c 29 3b 0a 20 20  uctureLevel);.  
24290 70 4e 65 77 20 3d 20 28 46 74 73 35 53 74 72 75  pNew = (Fts5Stru
242a0 63 74 75 72 65 2a 29 73 71 6c 69 74 65 33 46 74  cture*)sqlite3Ft
242b0 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 70 2d  s5MallocZero(&p-
242c0 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a 0a 20 20  >rc, nByte);..  
242d0 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20  if( pNew ){.    
242e0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
242f0 65 6c 20 2a 70 4c 76 6c 3b 0a 20 20 20 20 6e 42  el *pLvl;.    nB
24300 79 74 65 20 3d 20 6e 53 65 67 20 2a 20 73 69 7a  yte = nSeg * siz
24310 65 6f 66 28 46 74 73 35 53 74 72 75 63 74 75 72  eof(Fts5Structur
24320 65 53 65 67 6d 65 6e 74 29 3b 0a 20 20 20 20 70  eSegment);.    p
24330 4e 65 77 2d 3e 6e 4c 65 76 65 6c 20 3d 20 70 53  New->nLevel = pS
24340 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2b 31 3b  truct->nLevel+1;
24350 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20  .    pNew->nRef 
24360 3d 20 31 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  = 1;.    pNew->n
24370 57 72 69 74 65 43 6f 75 6e 74 65 72 20 3d 20 70  WriteCounter = p
24380 53 74 72 75 63 74 2d 3e 6e 57 72 69 74 65 43 6f  Struct->nWriteCo
24390 75 6e 74 65 72 3b 0a 20 20 20 20 70 4c 76 6c 20  unter;.    pLvl 
243a0 3d 20 26 70 4e 65 77 2d 3e 61 4c 65 76 65 6c 5b  = &pNew->aLevel[
243b0 70 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 5d  pStruct->nLevel]
243c0 3b 0a 20 20 20 20 70 4c 76 6c 2d 3e 61 53 65 67  ;.    pLvl->aSeg
243d0 20 3d 20 28 46 74 73 35 53 74 72 75 63 74 75 72   = (Fts5Structur
243e0 65 53 65 67 6d 65 6e 74 2a 29 73 71 6c 69 74 65  eSegment*)sqlite
243f0 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
24400 26 70 2d 3e 72 63 2c 20 6e 42 79 74 65 29 3b 0a  &p->rc, nByte);.
24410 20 20 20 20 69 66 28 20 70 4c 76 6c 2d 3e 61 53      if( pLvl->aS
24420 65 67 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  eg ){.      int 
24430 69 4c 76 6c 2c 20 69 53 65 67 3b 0a 20 20 20 20  iLvl, iSeg;.    
24440 20 20 69 6e 74 20 69 53 65 67 4f 75 74 20 3d 20    int iSegOut = 
24450 30 3b 0a 20 20 20 20 20 20 2f 2a 20 49 74 65 72  0;.      /* Iter
24460 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  ate through all 
24470 73 65 67 6d 65 6e 74 73 2c 20 66 72 6f 6d 20 6f  segments, from o
24480 6c 64 65 73 74 20 74 6f 20 6e 65 77 65 73 74 2e  ldest to newest.
24490 20 41 64 64 20 74 68 65 6d 20 74 6f 0a 20 20 20   Add them to.   
244a0 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 46 74     ** the new Ft
244b0 73 35 4c 65 76 65 6c 20 6f 62 6a 65 63 74 20 73  s5Level object s
244c0 6f 20 74 68 61 74 20 70 4c 76 6c 2d 3e 61 53 65  o that pLvl->aSe
244d0 67 5b 30 5d 20 69 73 20 74 68 65 20 6f 6c 64 65  g[0] is the olde
244e0 73 74 0a 20 20 20 20 20 20 2a 2a 20 73 65 67 6d  st.      ** segm
244f0 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 20  ent in the data 
24500 73 74 72 75 63 74 75 72 65 2e 20 20 2a 2f 0a 20  structure.  */. 
24510 20 20 20 20 20 66 6f 72 28 69 4c 76 6c 3d 70 53       for(iLvl=pS
24520 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 2d 31 3b  truct->nLevel-1;
24530 20 69 4c 76 6c 3e 3d 30 3b 20 69 4c 76 6c 2d 2d   iLvl>=0; iLvl--
24540 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
24550 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
24560 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
24570 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
24580 0a 20 20 20 20 20 20 20 20 20 20 70 4c 76 6c 2d  .          pLvl-
24590 3e 61 53 65 67 5b 69 53 65 67 4f 75 74 5d 20 3d  >aSeg[iSegOut] =
245a0 20 70 53 74 72 75 63 74 2d 3e 61 4c 65 76 65 6c   pStruct->aLevel
245b0 5b 69 4c 76 6c 5d 2e 61 53 65 67 5b 69 53 65 67  [iLvl].aSeg[iSeg
245c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 53 65  ];.          iSe
245d0 67 4f 75 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20  gOut++;.        
245e0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
245f0 70 4e 65 77 2d 3e 6e 53 65 67 6d 65 6e 74 20 3d  pNew->nSegment =
24600 20 70 4c 76 6c 2d 3e 6e 53 65 67 20 3d 20 6e 53   pLvl->nSeg = nS
24610 65 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  eg;.    }else{. 
24620 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
24630 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 70  e(pNew);.      p
24640 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  New = 0;.    }. 
24650 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   }..  return pNe
24660 77 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65  w;.}..int sqlite
24670 33 46 74 73 35 49 6e 64 65 78 4f 70 74 69 6d 69  3Fts5IndexOptimi
24680 7a 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 29  ze(Fts5Index *p)
24690 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72  {.  Fts5Structur
246a0 65 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74  e *pStruct;.  Ft
246b0 73 35 53 74 72 75 63 74 75 72 65 20 2a 70 4e 65  s5Structure *pNe
246c0 77 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74  w = 0;..  assert
246d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
246e0 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49 6e 64 65  OK );.  fts5Inde
246f0 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 70 53 74  xFlush(p);.  pSt
24700 72 75 63 74 20 3d 20 66 74 73 35 53 74 72 75 63  ruct = fts5Struc
24710 74 75 72 65 52 65 61 64 28 70 29 3b 0a 20 20 66  tureRead(p);.  f
24720 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76 61  ts5StructureInva
24730 6c 69 64 61 74 65 28 70 29 3b 0a 0a 20 20 69 66  lidate(p);..  if
24740 28 20 70 53 74 72 75 63 74 20 29 7b 0a 20 20 20  ( pStruct ){.   
24750 20 70 4e 65 77 20 3d 20 66 74 73 35 49 6e 64 65   pNew = fts5Inde
24760 78 4f 70 74 69 6d 69 7a 65 53 74 72 75 63 74 28  xOptimizeStruct(
24770 70 2c 20 70 53 74 72 75 63 74 29 3b 0a 20 20 7d  p, pStruct);.  }
24780 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65  .  fts5Structure
24790 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
247a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
247b0 77 3d 3d 30 20 7c 7c 20 70 4e 65 77 2d 3e 6e 53  w==0 || pNew->nS
247c0 65 67 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 69 66  egment>0 );.  if
247d0 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  ( pNew ){.    in
247e0 74 20 69 4c 76 6c 3b 0a 20 20 20 20 66 6f 72 28  t iLvl;.    for(
247f0 69 4c 76 6c 3d 30 3b 20 70 4e 65 77 2d 3e 61 4c  iLvl=0; pNew->aL
24800 65 76 65 6c 5b 69 4c 76 6c 5d 2e 6e 53 65 67 3d  evel[iLvl].nSeg=
24810 3d 30 3b 20 69 4c 76 6c 2b 2b 29 7b 7d 0a 20 20  =0; iLvl++){}.  
24820 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d 3d    while( p->rc==
24830 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4e 65  SQLITE_OK && pNe
24840 77 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e  w->aLevel[iLvl].
24850 6e 53 65 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nSeg>0 ){.      
24860 69 6e 74 20 6e 52 65 6d 20 3d 20 46 54 53 35 5f  int nRem = FTS5_
24870 4f 50 54 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20  OPT_WORK_UNIT;. 
24880 20 20 20 20 20 66 74 73 35 49 6e 64 65 78 4d 65       fts5IndexMe
24890 72 67 65 4c 65 76 65 6c 28 70 2c 20 26 70 4e 65  rgeLevel(p, &pNe
248a0 77 2c 20 69 4c 76 6c 2c 20 26 6e 52 65 6d 29 3b  w, iLvl, &nRem);
248b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
248c0 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28 70  StructureWrite(p
248d0 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 66 74 73  , pNew);.    fts
248e0 35 53 74 72 75 63 74 75 72 65 52 65 6c 65 61 73  5StructureReleas
248f0 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 0a 20 20  e(pNew);.  }..  
24900 72 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78  return fts5Index
24910 52 65 74 75 72 6e 28 70 29 3b 20 0a 7d 0a 0a 2f  Return(p); .}../
24920 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 61 6c  *.** This is cal
24930 6c 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  led to implement
24940 20 74 68 65 20 73 70 65 63 69 61 6c 20 22 56 41   the special "VA
24950 4c 55 45 53 28 27 6d 65 72 67 65 27 2c 20 24 6e  LUES('merge', $n
24960 4d 65 72 67 65 29 22 0a 2a 2a 20 49 4e 53 45 52  Merge)".** INSER
24970 54 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 69 6e  T command..*/.in
24980 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
24990 65 78 4d 65 72 67 65 28 46 74 73 35 49 6e 64 65  exMerge(Fts5Inde
249a0 78 20 2a 70 2c 20 69 6e 74 20 6e 4d 65 72 67 65  x *p, int nMerge
249b0 29 7b 0a 20 20 46 74 73 35 53 74 72 75 63 74 75  ){.  Fts5Structu
249c0 72 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74  re *pStruct = ft
249d0 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28  s5StructureRead(
249e0 70 29 3b 0a 20 20 69 66 28 20 70 53 74 72 75 63  p);.  if( pStruc
249f0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4d 69  t ){.    int nMi
24a00 6e 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e  n = p->pConfig->
24a10 6e 55 73 65 72 6d 65 72 67 65 3b 0a 20 20 20 20  nUsermerge;.    
24a20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e 76  fts5StructureInv
24a30 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 20 20  alidate(p);.    
24a40 69 66 28 20 6e 4d 65 72 67 65 3c 30 20 29 7b 0a  if( nMerge<0 ){.
24a50 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63 74        Fts5Struct
24a60 75 72 65 20 2a 70 4e 65 77 20 3d 20 66 74 73 35  ure *pNew = fts5
24a70 49 6e 64 65 78 4f 70 74 69 6d 69 7a 65 53 74 72  IndexOptimizeStr
24a80 75 63 74 28 70 2c 20 70 53 74 72 75 63 74 29 3b  uct(p, pStruct);
24a90 0a 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63  .      fts5Struc
24aa0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
24ab0 75 63 74 29 3b 0a 20 20 20 20 20 20 70 53 74 72  uct);.      pStr
24ac0 75 63 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  uct = pNew;.    
24ad0 20 20 6e 4d 69 6e 20 3d 20 32 3b 0a 20 20 20 20    nMin = 2;.    
24ae0 20 20 6e 4d 65 72 67 65 20 3d 20 6e 4d 65 72 67    nMerge = nMerg
24af0 65 2a 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e*-1;.    }.    
24b00 69 66 28 20 70 53 74 72 75 63 74 20 26 26 20 70  if( pStruct && p
24b10 53 74 72 75 63 74 2d 3e 6e 4c 65 76 65 6c 20 29  Struct->nLevel )
24b20 7b 0a 20 20 20 20 20 20 69 66 28 20 66 74 73 35  {.      if( fts5
24b30 49 6e 64 65 78 4d 65 72 67 65 28 70 2c 20 26 70  IndexMerge(p, &p
24b40 53 74 72 75 63 74 2c 20 6e 4d 65 72 67 65 2c 20  Struct, nMerge, 
24b50 6e 4d 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  nMin) ){.       
24b60 20 66 74 73 35 53 74 72 75 63 74 75 72 65 57 72   fts5StructureWr
24b70 69 74 65 28 70 2c 20 70 53 74 72 75 63 74 29 3b  ite(p, pStruct);
24b80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24b90 20 20 20 66 74 73 35 53 74 72 75 63 74 75 72 65     fts5Structure
24ba0 52 65 6c 65 61 73 65 28 70 53 74 72 75 63 74 29  Release(pStruct)
24bb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  ;.  }.  return f
24bc0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
24bd0 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  );.}..static voi
24be0 64 20 66 74 73 35 41 70 70 65 6e 64 52 6f 77 69  d fts5AppendRowi
24bf0 64 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a  d(.  Fts5Index *
24c00 70 2c 0a 20 20 69 36 34 20 69 44 65 6c 74 61 2c  p,.  i64 iDelta,
24c10 0a 20 20 46 74 73 35 49 74 65 72 20 2a 70 55 6e  .  Fts5Iter *pUn
24c20 75 73 65 64 2c 0a 20 20 46 74 73 35 42 75 66 66  used,.  Fts5Buff
24c30 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20 20 55 4e  er *pBuf.){.  UN
24c40 55 53 45 44 5f 50 41 52 41 4d 28 70 55 6e 75 73  USED_PARAM(pUnus
24c50 65 64 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65  ed);.  fts5Buffe
24c60 72 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 70  rAppendVarint(&p
24c70 2d 3e 72 63 2c 20 70 42 75 66 2c 20 69 44 65 6c  ->rc, pBuf, iDel
24c80 74 61 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 76  ta);.}..static v
24c90 6f 69 64 20 66 74 73 35 41 70 70 65 6e 64 50 6f  oid fts5AppendPo
24ca0 73 6c 69 73 74 28 0a 20 20 46 74 73 35 49 6e 64  slist(.  Fts5Ind
24cb0 65 78 20 2a 70 2c 0a 20 20 69 36 34 20 69 44 65  ex *p,.  i64 iDe
24cc0 6c 74 61 2c 0a 20 20 46 74 73 35 49 74 65 72 20  lta,.  Fts5Iter 
24cd0 2a 70 4d 75 6c 74 69 2c 0a 20 20 46 74 73 35 42  *pMulti,.  Fts5B
24ce0 75 66 66 65 72 20 2a 70 42 75 66 0a 29 7b 0a 20  uffer *pBuf.){. 
24cf0 20 69 6e 74 20 6e 44 61 74 61 20 3d 20 70 4d 75   int nData = pMu
24d00 6c 74 69 2d 3e 62 61 73 65 2e 6e 44 61 74 61 3b  lti->base.nData;
24d10 0a 20 20 61 73 73 65 72 74 28 20 6e 44 61 74 61  .  assert( nData
24d20 3e 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 72  >0 );.  if( p->r
24d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
24d40 30 3d 3d 66 74 73 35 42 75 66 66 65 72 47 72 6f  0==fts5BufferGro
24d50 77 28 26 70 2d 3e 72 63 2c 20 70 42 75 66 2c 20  w(&p->rc, pBuf, 
24d60 6e 44 61 74 61 2b 39 2b 39 29 20 29 7b 0a 20 20  nData+9+9) ){.  
24d70 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
24d80 41 70 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75  AppendVarint(pBu
24d90 66 2c 20 69 44 65 6c 74 61 29 3b 0a 20 20 20 20  f, iDelta);.    
24da0 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70  fts5BufferSafeAp
24db0 70 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c  pendVarint(pBuf,
24dc0 20 6e 44 61 74 61 2a 32 29 3b 0a 20 20 20 20 66   nData*2);.    f
24dd0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
24de0 65 6e 64 42 6c 6f 62 28 70 42 75 66 2c 20 70 4d  endBlob(pBuf, pM
24df0 75 6c 74 69 2d 3e 62 61 73 65 2e 70 44 61 74 61  ulti->base.pData
24e00 2c 20 6e 44 61 74 61 29 3b 0a 20 20 7d 0a 7d 0a  , nData);.  }.}.
24e10 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  ..static void ft
24e20 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
24e30 74 28 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65  t(Fts5DoclistIte
24e40 72 20 2a 70 49 74 65 72 29 7b 0a 20 20 75 38 20  r *pIter){.  u8 
24e50 2a 70 20 3d 20 70 49 74 65 72 2d 3e 61 50 6f 73  *p = pIter->aPos
24e60 6c 69 73 74 20 2b 20 70 49 74 65 72 2d 3e 6e 53  list + pIter->nS
24e70 69 7a 65 20 2b 20 70 49 74 65 72 2d 3e 6e 50 6f  ize + pIter->nPo
24e80 73 6c 69 73 74 3b 0a 0a 20 20 61 73 73 65 72 74  slist;..  assert
24e90 28 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73  ( pIter->aPoslis
24ea0 74 20 29 3b 0a 20 20 69 66 28 20 70 3e 3d 70 49  t );.  if( p>=pI
24eb0 74 65 72 2d 3e 61 45 6f 66 20 29 7b 0a 20 20 20  ter->aEof ){.   
24ec0 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
24ed0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
24ee0 20 20 20 69 36 34 20 69 44 65 6c 74 61 3b 0a 0a     i64 iDelta;..
24ef0 20 20 20 20 70 20 2b 3d 20 66 74 73 35 47 65 74      p += fts5Get
24f00 56 61 72 69 6e 74 28 70 2c 20 28 75 36 34 2a 29  Varint(p, (u64*)
24f10 26 69 44 65 6c 74 61 29 3b 0a 20 20 20 20 70 49  &iDelta);.    pI
24f20 74 65 72 2d 3e 69 52 6f 77 69 64 20 2b 3d 20 69  ter->iRowid += i
24f30 44 65 6c 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 52  Delta;..    /* R
24f40 65 61 64 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73  ead position lis
24f50 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 66  t size */.    if
24f60 28 20 70 5b 30 5d 20 26 20 30 78 38 30 20 29 7b  ( p[0] & 0x80 ){
24f70 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 6f 73 3b  .      int nPos;
24f80 0a 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 53  .      pIter->nS
24f90 69 7a 65 20 3d 20 66 74 73 35 47 65 74 56 61 72  ize = fts5GetVar
24fa0 69 6e 74 33 32 28 70 2c 20 6e 50 6f 73 29 3b 0a  int32(p, nPos);.
24fb0 20 20 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f        pIter->nPo
24fc0 73 6c 69 73 74 20 3d 20 28 6e 50 6f 73 3e 3e 31  slist = (nPos>>1
24fd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
24fe0 20 20 20 20 70 49 74 65 72 2d 3e 6e 50 6f 73 6c      pIter->nPosl
24ff0 69 73 74 20 3d 20 28 28 69 6e 74 29 28 70 5b 30  ist = ((int)(p[0
25000 5d 29 29 20 3e 3e 20 31 3b 0a 20 20 20 20 20 20  ])) >> 1;.      
25010 70 49 74 65 72 2d 3e 6e 53 69 7a 65 20 3d 20 31  pIter->nSize = 1
25020 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 49 74  ;.    }..    pIt
25030 65 72 2d 3e 61 50 6f 73 6c 69 73 74 20 3d 20 70  er->aPoslist = p
25040 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  ;.  }.}..static 
25050 76 6f 69 64 20 66 74 73 35 44 6f 63 6c 69 73 74  void fts5Doclist
25060 49 74 65 72 49 6e 69 74 28 0a 20 20 46 74 73 35  IterInit(.  Fts5
25070 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 0a 20  Buffer *pBuf, . 
25080 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
25090 20 2a 70 49 74 65 72 0a 29 7b 0a 20 20 6d 65 6d   *pIter.){.  mem
250a0 73 65 74 28 70 49 74 65 72 2c 20 30 2c 20 73 69  set(pIter, 0, si
250b0 7a 65 6f 66 28 2a 70 49 74 65 72 29 29 3b 0a 20  zeof(*pIter));. 
250c0 20 70 49 74 65 72 2d 3e 61 50 6f 73 6c 69 73 74   pIter->aPoslist
250d0 20 3d 20 70 42 75 66 2d 3e 70 3b 0a 20 20 70 49   = pBuf->p;.  pI
250e0 74 65 72 2d 3e 61 45 6f 66 20 3d 20 26 70 42 75  ter->aEof = &pBu
250f0 66 2d 3e 70 5b 70 42 75 66 2d 3e 6e 5d 3b 0a 20  f->p[pBuf->n];. 
25100 20 66 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   fts5DoclistIter
25110 4e 65 78 74 28 70 49 74 65 72 29 3b 0a 7d 0a 0a  Next(pIter);.}..
25120 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 41 70 70 65  #if 0./*.** Appe
25130 6e 64 20 61 20 64 6f 63 6c 69 73 74 20 74 6f 20  nd a doclist to 
25140 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a  buffer pBuf..**.
25150 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
25160 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 73 70   assumes that sp
25170 61 63 65 20 77 69 74 68 69 6e 20 74 68 65 20 62  ace within the b
25180 75 66 66 65 72 20 68 61 73 20 61 6c 72 65 61 64  uffer has alread
25190 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  y been.** alloca
251a0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ted..*/.static v
251b0 6f 69 64 20 66 74 73 35 4d 65 72 67 65 41 70 70  oid fts5MergeApp
251c0 65 6e 64 44 6f 63 69 64 28 0a 20 20 46 74 73 35  endDocid(.  Fts5
251d0 42 75 66 66 65 72 20 2a 70 42 75 66 2c 20 20 20  Buffer *pBuf,   
251e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
251f0 75 66 66 65 72 20 74 6f 20 77 72 69 74 65 20 74  uffer to write t
25200 6f 20 2a 2f 0a 20 20 69 36 34 20 2a 70 69 4c 61  o */.  i64 *piLa
25210 73 74 52 6f 77 69 64 2c 20 20 20 20 20 20 20 20  stRowid,        
25220 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
25230 3a 20 50 72 65 76 69 6f 75 73 20 72 6f 77 69 64  : Previous rowid
25240 20 77 72 69 74 74 65 6e 20 28 69 66 20 61 6e 79   written (if any
25250 29 20 2a 2f 0a 20 20 69 36 34 20 69 52 6f 77 69  ) */.  i64 iRowi
25260 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d               
25270 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
25280 74 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  to append */.){.
25290 20 20 61 73 73 65 72 74 28 20 70 42 75 66 2d 3e    assert( pBuf->
252a0 6e 21 3d 30 20 7c 7c 20 28 2a 70 69 4c 61 73 74  n!=0 || (*piLast
252b0 52 6f 77 69 64 29 3d 3d 30 20 29 3b 0a 20 20 66  Rowid)==0 );.  f
252c0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
252d0 65 6e 64 56 61 72 69 6e 74 28 70 42 75 66 2c 20  endVarint(pBuf, 
252e0 69 52 6f 77 69 64 20 2d 20 2a 70 69 4c 61 73 74  iRowid - *piLast
252f0 52 6f 77 69 64 29 3b 0a 20 20 2a 70 69 4c 61 73  Rowid);.  *piLas
25300 74 52 6f 77 69 64 20 3d 20 69 52 6f 77 69 64 3b  tRowid = iRowid;
25310 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 64 65 66 69  .}.#endif..#defi
25320 6e 65 20 66 74 73 35 4d 65 72 67 65 41 70 70 65  ne fts5MergeAppe
25330 6e 64 44 6f 63 69 64 28 70 42 75 66 2c 20 69 4c  ndDocid(pBuf, iL
25340 61 73 74 52 6f 77 69 64 2c 20 69 52 6f 77 69 64  astRowid, iRowid
25350 29 20 7b 20 20 20 20 20 20 20 5c 0a 20 20 61 73  ) {       \.  as
25360 73 65 72 74 28 20 28 70 42 75 66 29 2d 3e 6e 21  sert( (pBuf)->n!
25370 3d 30 20 7c 7c 20 28 69 4c 61 73 74 52 6f 77 69  =0 || (iLastRowi
25380 64 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20  d)==0 );        
25390 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 66             \.  f
253a0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
253b0 65 6e 64 56 61 72 69 6e 74 28 28 70 42 75 66 29  endVarint((pBuf)
253c0 2c 20 28 69 52 6f 77 69 64 29 20 2d 20 28 69 4c  , (iRowid) - (iL
253d0 61 73 74 52 6f 77 69 64 29 29 3b 20 5c 0a 20 20  astRowid)); \.  
253e0 28 69 4c 61 73 74 52 6f 77 69 64 29 20 3d 20 28  (iLastRowid) = (
253f0 69 52 6f 77 69 64 29 3b 20 20 20 20 20 20 20 20  iRowid);        
25400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25410 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d               \.}
25420 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 70 20 74 68 65  ../*.** Swap the
25430 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 62 75 66   contents of buf
25440 66 65 72 20 2a 70 31 20 77 69 74 68 20 74 68 61  fer *p1 with tha
25450 74 20 6f 66 20 2a 70 32 2e 0a 2a 2f 0a 73 74 61  t of *p2..*/.sta
25460 74 69 63 20 76 6f 69 64 20 66 74 73 35 42 75 66  tic void fts5Buf
25470 66 65 72 53 77 61 70 28 46 74 73 35 42 75 66 66  ferSwap(Fts5Buff
25480 65 72 20 2a 70 31 2c 20 46 74 73 35 42 75 66 66  er *p1, Fts5Buff
25490 65 72 20 2a 70 32 29 7b 0a 20 20 46 74 73 35 42  er *p2){.  Fts5B
254a0 75 66 66 65 72 20 74 6d 70 20 3d 20 2a 70 31 3b  uffer tmp = *p1;
254b0 0a 20 20 2a 70 31 20 3d 20 2a 70 32 3b 0a 20 20  .  *p1 = *p2;.  
254c0 2a 70 32 20 3d 20 74 6d 70 3b 0a 7d 0a 0a 73 74  *p2 = tmp;.}..st
254d0 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 4e 65  atic void fts5Ne
254e0 78 74 52 6f 77 69 64 28 46 74 73 35 42 75 66 66  xtRowid(Fts5Buff
254f0 65 72 20 2a 70 42 75 66 2c 20 69 6e 74 20 2a 70  er *pBuf, int *p
25500 69 4f 66 66 2c 20 69 36 34 20 2a 70 69 52 6f 77  iOff, i64 *piRow
25510 69 64 29 7b 0a 20 20 69 6e 74 20 69 20 3d 20 2a  id){.  int i = *
25520 70 69 4f 66 66 3b 0a 20 20 69 66 28 20 69 3e 3d  piOff;.  if( i>=
25530 70 42 75 66 2d 3e 6e 20 29 7b 0a 20 20 20 20 2a  pBuf->n ){.    *
25540 70 69 4f 66 66 20 3d 20 2d 31 3b 0a 20 20 7d 65  piOff = -1;.  }e
25550 6c 73 65 7b 0a 20 20 20 20 75 36 34 20 69 56 61  lse{.    u64 iVa
25560 6c 3b 0a 20 20 20 20 2a 70 69 4f 66 66 20 3d 20  l;.    *piOff = 
25570 69 20 2b 20 73 71 6c 69 74 65 33 46 74 73 35 47  i + sqlite3Fts5G
25580 65 74 56 61 72 69 6e 74 28 26 70 42 75 66 2d 3e  etVarint(&pBuf->
25590 70 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20  p[i], &iVal);.  
255a0 20 20 2a 70 69 52 6f 77 69 64 20 2b 3d 20 69 56    *piRowid += iV
255b0 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
255c0 20 54 68 69 73 20 69 73 20 74 68 65 20 65 71 75   This is the equ
255d0 69 76 61 6c 65 6e 74 20 6f 66 20 66 74 73 35 4d  ivalent of fts5M
255e0 65 72 67 65 50 72 65 66 69 78 4c 69 73 74 73 28  ergePrefixLists(
255f0 29 20 66 6f 72 20 64 65 74 61 69 6c 3d 6e 6f 6e  ) for detail=non
25600 65 20 6d 6f 64 65 2e 0a 2a 2a 20 49 6e 20 74 68  e mode..** In th
25610 69 73 20 63 61 73 65 20 74 68 65 20 62 75 66 66  is case the buff
25620 65 72 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 61  ers consist of a
25630 20 64 65 6c 74 61 2d 65 6e 63 6f 64 65 64 20 6c   delta-encoded l
25640 69 73 74 20 6f 66 20 72 6f 77 69 64 73 20 6f 6e  ist of rowids on
25650 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
25660 69 64 20 66 74 73 35 4d 65 72 67 65 52 6f 77 69  id fts5MergeRowi
25670 64 4c 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e  dLists(.  Fts5In
25680 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dex *p,         
25690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53            /* FTS
256a0 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74  5 backend object
256b0 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72   */.  Fts5Buffer
256c0 20 2a 70 31 2c 20 20 20 20 20 20 20 20 20 20 20   *p1,           
256d0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c        /* First l
256e0 69 73 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a  ist to merge */.
256f0 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 32    Fts5Buffer *p2
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25710 20 20 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74    /* Second list
25720 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a   to merge */.){.
25730 20 20 69 6e 74 20 69 31 20 3d 20 30 3b 0a 20 20    int i1 = 0;.  
25740 69 6e 74 20 69 32 20 3d 20 30 3b 0a 20 20 69 36  int i2 = 0;.  i6
25750 34 20 69 52 6f 77 69 64 31 20 3d 20 30 3b 0a 20  4 iRowid1 = 0;. 
25760 20 69 36 34 20 69 52 6f 77 69 64 32 20 3d 20 30   i64 iRowid2 = 0
25770 3b 0a 20 20 69 36 34 20 69 4f 75 74 20 3d 20 30  ;.  i64 iOut = 0
25780 3b 0a 0a 20 20 46 74 73 35 42 75 66 66 65 72 20  ;..  Fts5Buffer 
25790 6f 75 74 3b 0a 20 20 6d 65 6d 73 65 74 28 26 6f  out;.  memset(&o
257a0 75 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6f 75  ut, 0, sizeof(ou
257b0 74 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74  t));.  sqlite3Ft
257c0 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d  s5BufferSize(&p-
257d0 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e 6e  >rc, &out, p1->n
257e0 20 2b 20 70 32 2d 3e 6e 29 3b 0a 20 20 69 66 28   + p2->n);.  if(
257f0 20 70 2d 3e 72 63 20 29 20 72 65 74 75 72 6e 3b   p->rc ) return;
25800 0a 0a 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69  ..  fts5NextRowi
25810 64 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77  d(p1, &i1, &iRow
25820 69 64 31 29 3b 0a 20 20 66 74 73 35 4e 65 78 74  id1);.  fts5Next
25830 52 6f 77 69 64 28 70 32 2c 20 26 69 32 2c 20 26  Rowid(p2, &i2, &
25840 69 52 6f 77 69 64 32 29 3b 0a 20 20 77 68 69 6c  iRowid2);.  whil
25850 65 28 20 69 31 3e 3d 30 20 7c 7c 20 69 32 3e 3d  e( i1>=0 || i2>=
25860 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69 31 3e  0 ){.    if( i1>
25870 3d 30 20 26 26 20 28 69 32 3c 30 20 7c 7c 20 69  =0 && (i2<0 || i
25880 52 6f 77 69 64 31 3c 69 52 6f 77 69 64 32 29 20  Rowid1<iRowid2) 
25890 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
258a0 20 69 4f 75 74 3d 3d 30 20 7c 7c 20 69 52 6f 77   iOut==0 || iRow
258b0 69 64 31 3e 69 4f 75 74 20 29 3b 0a 20 20 20 20  id1>iOut );.    
258c0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
258d0 41 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75  AppendVarint(&ou
258e0 74 2c 20 69 52 6f 77 69 64 31 20 2d 20 69 4f 75  t, iRowid1 - iOu
258f0 74 29 3b 0a 20 20 20 20 20 20 69 4f 75 74 20 3d  t);.      iOut =
25900 20 69 52 6f 77 69 64 31 3b 0a 20 20 20 20 20 20   iRowid1;.      
25910 66 74 73 35 4e 65 78 74 52 6f 77 69 64 28 70 31  fts5NextRowid(p1
25920 2c 20 26 69 31 2c 20 26 69 52 6f 77 69 64 31 29  , &i1, &iRowid1)
25930 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
25940 20 20 20 61 73 73 65 72 74 28 20 69 4f 75 74 3d     assert( iOut=
25950 3d 30 20 7c 7c 20 69 52 6f 77 69 64 32 3e 69 4f  =0 || iRowid2>iO
25960 75 74 20 29 3b 0a 20 20 20 20 20 20 66 74 73 35  ut );.      fts5
25970 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e 64  BufferSafeAppend
25980 56 61 72 69 6e 74 28 26 6f 75 74 2c 20 69 52 6f  Varint(&out, iRo
25990 77 69 64 32 20 2d 20 69 4f 75 74 29 3b 0a 20 20  wid2 - iOut);.  
259a0 20 20 20 20 69 4f 75 74 20 3d 20 69 52 6f 77 69      iOut = iRowi
259b0 64 32 3b 0a 20 20 20 20 20 20 69 66 28 20 69 31  d2;.      if( i1
259c0 3e 3d 30 20 26 26 20 69 52 6f 77 69 64 31 3d 3d  >=0 && iRowid1==
259d0 69 52 6f 77 69 64 32 20 29 7b 0a 20 20 20 20 20  iRowid2 ){.     
259e0 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64     fts5NextRowid
259f0 28 70 31 2c 20 26 69 31 2c 20 26 69 52 6f 77 69  (p1, &i1, &iRowi
25a00 64 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d1);.      }.   
25a10 20 20 20 66 74 73 35 4e 65 78 74 52 6f 77 69 64     fts5NextRowid
25a20 28 70 32 2c 20 26 69 32 2c 20 26 69 52 6f 77 69  (p2, &i2, &iRowi
25a30 64 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  d2);.    }.  }..
25a40 20 20 66 74 73 35 42 75 66 66 65 72 53 77 61 70    fts5BufferSwap
25a50 28 26 6f 75 74 2c 20 70 31 29 3b 0a 20 20 66 74  (&out, p1);.  ft
25a60 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
25a70 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66  t);.}../*.** Buf
25a80 66 65 72 73 20 70 31 20 61 6e 64 20 70 32 20 63  fers p1 and p2 c
25a90 6f 6e 74 61 69 6e 20 64 6f 63 6c 69 73 74 73 2e  ontain doclists.
25aa0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   This function m
25ab0 65 72 67 65 73 20 74 68 65 20 63 6f 6e 74 65 6e  erges the conten
25ac0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 74 77 6f 20  t.** of the two 
25ad0 64 6f 63 6c 69 73 74 73 20 74 6f 67 65 74 68 65  doclists togethe
25ae0 72 20 61 6e 64 20 73 65 74 73 20 62 75 66 66 65  r and sets buffe
25af0 72 20 70 31 20 74 6f 20 74 68 65 20 72 65 73 75  r p1 to the resu
25b00 6c 74 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74  lt before.** ret
25b10 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
25b20 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
25b30 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
25b40 69 73 20 6c 65 66 74 20 69 6e 20 70 2d 3e 72 63  is left in p->rc
25b50 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 68 61  . If an error ha
25b60 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 63 63  s.** already occ
25b70 75 72 72 65 64 2c 20 74 68 69 73 20 66 75 6e 63  urred, this func
25b80 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
25b90 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25ba0 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78 4c  fts5MergePrefixL
25bb0 69 73 74 73 28 0a 20 20 46 74 73 35 49 6e 64 65  ists(.  Fts5Inde
25bc0 78 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  x *p,           
25bd0 20 20 20 20 20 20 20 20 2f 2a 20 46 54 53 35 20          /* FTS5 
25be0 62 61 63 6b 65 6e 64 20 6f 62 6a 65 63 74 20 2a  backend object *
25bf0 2f 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a  /.  Fts5Buffer *
25c00 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
25c10 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 73      /* First lis
25c20 74 20 74 6f 20 6d 65 72 67 65 20 2a 2f 0a 20 20  t to merge */.  
25c30 46 74 73 35 42 75 66 66 65 72 20 2a 70 32 20 20  Fts5Buffer *p2  
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 2f 2a 20 53 65 63 6f 6e 64 20 6c 69 73 74 20 74  /* Second list t
25c60 6f 20 6d 65 72 67 65 20 2a 2f 0a 29 7b 0a 20 20  o merge */.){.  
25c70 69 66 28 20 70 32 2d 3e 6e 20 29 7b 0a 20 20 20  if( p2->n ){.   
25c80 20 69 36 34 20 69 4c 61 73 74 52 6f 77 69 64 20   i64 iLastRowid 
25c90 3d 20 30 3b 0a 20 20 20 20 46 74 73 35 44 6f 63  = 0;.    Fts5Doc
25ca0 6c 69 73 74 49 74 65 72 20 69 31 3b 0a 20 20 20  listIter i1;.   
25cb0 20 46 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72   Fts5DoclistIter
25cc0 20 69 32 3b 0a 20 20 20 20 46 74 73 35 42 75 66   i2;.    Fts5Buf
25cd0 66 65 72 20 6f 75 74 20 3d 20 7b 30 2c 20 30 2c  fer out = {0, 0,
25ce0 20 30 7d 3b 0a 20 20 20 20 46 74 73 35 42 75 66   0};.    Fts5Buf
25cf0 66 65 72 20 74 6d 70 20 3d 20 7b 30 2c 20 30 2c  fer tmp = {0, 0,
25d00 20 30 7d 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65   0};..    /* The
25d10 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66   maximum size of
25d20 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 65   the output is e
25d30 71 75 61 6c 20 74 6f 20 74 68 65 20 73 75 6d 20  qual to the sum 
25d40 6f 66 20 74 68 65 20 74 77 6f 20 0a 20 20 20 20  of the two .    
25d50 2a 2a 20 69 6e 70 75 74 20 73 69 7a 65 73 20 2b  ** input sizes +
25d60 20 31 20 76 61 72 69 6e 74 20 28 39 20 62 79 74   1 varint (9 byt
25d70 65 73 29 2e 20 54 68 65 20 65 78 74 72 61 20 76  es). The extra v
25d80 61 72 69 6e 74 20 69 73 20 62 65 63 61 75 73 65  arint is because
25d90 20 69 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   if the.    ** f
25da0 69 72 73 74 20 72 6f 77 69 64 20 69 6e 20 6f 6e  irst rowid in on
25db0 65 20 69 6e 70 75 74 20 69 73 20 61 20 6c 61 72  e input is a lar
25dc0 67 65 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62  ge negative numb
25dd0 65 72 2c 20 61 6e 64 20 74 68 65 20 66 69 72 73  er, and the firs
25de0 74 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  t in.    ** the 
25df0 6f 74 68 65 72 20 61 20 6e 6f 6e 2d 6e 65 67 61  other a non-nega
25e00 74 69 76 65 20 6e 75 6d 62 65 72 2c 20 74 68 65  tive number, the
25e10 20 64 65 6c 74 61 20 66 6f 72 20 74 68 65 20 6e   delta for the n
25e20 6f 6e 2d 6e 65 67 61 74 69 76 65 0a 20 20 20 20  on-negative.    
25e30 2a 2a 20 6e 75 6d 62 65 72 20 77 69 6c 6c 20 62  ** number will b
25e40 65 20 6c 61 72 67 65 72 20 6f 6e 20 64 69 73 6b  e larger on disk
25e50 20 74 68 61 6e 20 74 68 65 20 6c 69 74 65 72 61   than the litera
25e60 6c 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a  l integer value.
25e70 20 20 20 20 2a 2a 20 77 61 73 2e 20 20 2a 2f 0a      ** was.  */.
25e80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 46      if( sqlite3F
25e90 74 73 35 42 75 66 66 65 72 53 69 7a 65 28 26 70  ts5BufferSize(&p
25ea0 2d 3e 72 63 2c 20 26 6f 75 74 2c 20 70 31 2d 3e  ->rc, &out, p1->
25eb0 6e 20 2b 20 70 32 2d 3e 6e 20 2b 20 39 29 20 29  n + p2->n + 9) )
25ec0 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 66 74 73   return;.    fts
25ed0 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e 69 74  5DoclistIterInit
25ee0 28 70 31 2c 20 26 69 31 29 3b 0a 20 20 20 20 66  (p1, &i1);.    f
25ef0 74 73 35 44 6f 63 6c 69 73 74 49 74 65 72 49 6e  ts5DoclistIterIn
25f00 69 74 28 70 32 2c 20 26 69 32 29 3b 0a 0a 20 20  it(p2, &i2);..  
25f10 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20    while( 1 ){.  
25f20 20 20 20 20 69 66 28 20 69 31 2e 69 52 6f 77 69      if( i1.iRowi
25f30 64 3c 69 32 2e 69 52 6f 77 69 64 20 29 7b 0a 20  d<i2.iRowid ){. 
25f40 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 65         /* Copy e
25f50 6e 74 72 79 20 66 72 6f 6d 20 69 31 20 2a 2f 0a  ntry from i1 */.
25f60 20 20 20 20 20 20 20 20 66 74 73 35 4d 65 72 67          fts5Merg
25f70 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f 75  eAppendDocid(&ou
25f80 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20 69  t, iLastRowid, i
25f90 31 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20 20  1.iRowid);.     
25fa0 20 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66     fts5BufferSaf
25fb0 65 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74  eAppendBlob(&out
25fc0 2c 20 69 31 2e 61 50 6f 73 6c 69 73 74 2c 20 69  , i1.aPoslist, i
25fd0 31 2e 6e 50 6f 73 6c 69 73 74 2b 69 31 2e 6e 53  1.nPoslist+i1.nS
25fe0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 66 74  ize);.        ft
25ff0 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
26000 74 28 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20  t(&i1);.        
26010 69 66 28 20 69 31 2e 61 50 6f 73 6c 69 73 74 3d  if( i1.aPoslist=
26020 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
26030 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69    }.      else i
26040 66 28 20 69 32 2e 69 52 6f 77 69 64 21 3d 69 31  f( i2.iRowid!=i1
26050 2e 69 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 20  .iRowid ){.     
26060 20 20 20 2f 2a 20 43 6f 70 79 20 65 6e 74 72 79     /* Copy entry
26070 20 66 72 6f 6d 20 69 32 20 2a 2f 0a 20 20 20 20   from i2 */.    
26080 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
26090 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
260a0 4c 61 73 74 52 6f 77 69 64 2c 20 69 32 2e 69 52  LastRowid, i2.iR
260b0 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 20 20 66  owid);.        f
260c0 74 73 35 42 75 66 66 65 72 53 61 66 65 41 70 70  ts5BufferSafeApp
260d0 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 32  endBlob(&out, i2
260e0 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32 2e 6e 50  .aPoslist, i2.nP
260f0 6f 73 6c 69 73 74 2b 69 32 2e 6e 53 69 7a 65 29  oslist+i2.nSize)
26100 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35 44 6f  ;.        fts5Do
26110 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28 26 69  clistIterNext(&i
26120 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  2);.        if( 
26130 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29  i2.aPoslist==0 )
26140 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26150 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20        else{.    
26160 20 20 20 20 2f 2a 20 4d 65 72 67 65 20 74 68 65      /* Merge the
26170 20 74 77 6f 20 70 6f 73 69 74 69 6f 6e 20 6c 69   two position li
26180 73 74 73 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20  sts. */ .       
26190 20 69 36 34 20 69 50 6f 73 31 20 3d 20 30 3b 0a   i64 iPos1 = 0;.
261a0 20 20 20 20 20 20 20 20 69 36 34 20 69 50 6f 73          i64 iPos
261b0 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  2 = 0;.        i
261c0 6e 74 20 69 4f 66 66 31 20 3d 20 30 3b 0a 20 20  nt iOff1 = 0;.  
261d0 20 20 20 20 20 20 69 6e 74 20 69 4f 66 66 32 20        int iOff2 
261e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 75 38 20  = 0;.        u8 
261f0 2a 61 31 20 3d 20 26 69 31 2e 61 50 6f 73 6c 69  *a1 = &i1.aPosli
26200 73 74 5b 69 31 2e 6e 53 69 7a 65 5d 3b 0a 20 20  st[i1.nSize];.  
26210 20 20 20 20 20 20 75 38 20 2a 61 32 20 3d 20 26        u8 *a2 = &
26220 69 32 2e 61 50 6f 73 6c 69 73 74 5b 69 32 2e 6e  i2.aPoslist[i2.n
26230 53 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 69  Size];.        i
26240 6e 74 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  nt nCopy;.      
26250 20 20 75 38 20 2a 61 43 6f 70 79 3b 0a 0a 20 20    u8 *aCopy;..  
26260 20 20 20 20 20 20 69 36 34 20 69 50 72 65 76 20        i64 iPrev 
26270 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 46 74 73  = 0;.        Fts
26280 35 50 6f 73 6c 69 73 74 57 72 69 74 65 72 20 77  5PoslistWriter w
26290 72 69 74 65 72 3b 0a 20 20 20 20 20 20 20 20 6d  riter;.        m
262a0 65 6d 73 65 74 28 26 77 72 69 74 65 72 2c 20 30  emset(&writer, 0
262b0 2c 20 73 69 7a 65 6f 66 28 77 72 69 74 65 72 29  , sizeof(writer)
262c0 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 74 73 35  );..        fts5
262d0 4d 65 72 67 65 41 70 70 65 6e 64 44 6f 63 69 64  MergeAppendDocid
262e0 28 26 6f 75 74 2c 20 69 4c 61 73 74 52 6f 77 69  (&out, iLastRowi
262f0 64 2c 20 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20  d, i2.iRowid);. 
26300 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
26310 72 5a 65 72 6f 28 26 74 6d 70 29 3b 0a 20 20 20  rZero(&tmp);.   
26320 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26330 42 75 66 66 65 72 53 69 7a 65 28 26 70 2d 3e 72  BufferSize(&p->r
26340 63 2c 20 26 74 6d 70 2c 20 69 31 2e 6e 50 6f 73  c, &tmp, i1.nPos
26350 6c 69 73 74 20 2b 20 69 32 2e 6e 50 6f 73 6c 69  list + i2.nPosli
26360 73 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  st);.        if(
26370 20 70 2d 3e 72 63 20 29 20 62 72 65 61 6b 3b 0a   p->rc ) break;.
26380 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26390 46 74 73 35 50 6f 73 6c 69 73 74 4e 65 78 74 36  Fts5PoslistNext6
263a0 34 28 61 31 2c 20 69 31 2e 6e 50 6f 73 6c 69 73  4(a1, i1.nPoslis
263b0 74 2c 20 26 69 4f 66 66 31 2c 20 26 69 50 6f 73  t, &iOff1, &iPos
263c0 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
263d0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 4e 65  te3Fts5PoslistNe
263e0 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50 6f 73  xt64(a2, i2.nPos
263f0 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20 26 69  list, &iOff2, &i
26400 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20 20 61  Pos2);.        a
26410 73 73 65 72 74 28 20 69 50 6f 73 31 3e 3d 30 20  ssert( iPos1>=0 
26420 26 26 20 69 50 6f 73 32 3e 3d 30 20 29 3b 0a 0a  && iPos2>=0 );..
26430 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73          if( iPos
26440 31 3c 69 50 6f 73 32 20 29 7b 0a 20 20 20 20 20  1<iPos2 ){.     
26450 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26460 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e  PoslistSafeAppen
26470 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20  d(&tmp, &iPrev, 
26480 69 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20  iPos1);.        
26490 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73    sqlite3Fts5Pos
264a0 6c 69 73 74 4e 65 78 74 36 34 28 61 31 2c 20 69  listNext64(a1, i
264b0 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f 66  1.nPoslist, &iOf
264c0 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a 20 20 20  f1, &iPos1);.   
264d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
264e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
264f0 35 50 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65  5PoslistSafeAppe
26500 6e 64 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c  nd(&tmp, &iPrev,
26510 20 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20   iPos2);.       
26520 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26530 73 6c 69 73 74 4e 65 78 74 36 34 28 61 32 2c 20  slistNext64(a2, 
26540 69 32 2e 6e 50 6f 73 6c 69 73 74 2c 20 26 69 4f  i2.nPoslist, &iO
26550 66 66 32 2c 20 26 69 50 6f 73 32 29 3b 0a 20 20  ff2, &iPos2);.  
26560 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
26570 20 69 66 28 20 69 50 6f 73 31 3e 3d 30 20 26 26   if( iPos1>=0 &&
26580 20 69 50 6f 73 32 3e 3d 30 20 29 7b 0a 20 20 20   iPos2>=0 ){.   
26590 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 31 20         while( 1 
265a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
265b0 66 28 20 69 50 6f 73 31 3c 69 50 6f 73 32 20 29  f( iPos1<iPos2 )
265c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
265d0 69 66 28 20 69 50 6f 73 31 21 3d 69 50 72 65 76  if( iPos1!=iPrev
265e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
265f0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50      sqlite3Fts5P
26600 6f 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64  oslistSafeAppend
26610 28 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69  (&tmp, &iPrev, i
26620 50 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20  Pos1);.         
26630 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26640 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
26650 50 6f 73 6c 69 73 74 4e 65 78 74 36 34 28 61 31  PoslistNext64(a1
26660 2c 20 69 31 2e 6e 50 6f 73 6c 69 73 74 2c 20 26  , i1.nPoslist, &
26670 69 4f 66 66 31 2c 20 26 69 50 6f 73 31 29 3b 0a  iOff1, &iPos1);.
26680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
26690 28 20 69 50 6f 73 31 3c 30 20 29 20 62 72 65 61  ( iPos1<0 ) brea
266a0 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  k;.            }
266b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
266c0 20 20 20 20 61 73 73 65 72 74 5f 6e 63 28 20 69      assert_nc( i
266d0 50 6f 73 32 21 3d 69 50 72 65 76 20 29 3b 0a 20  Pos2!=iPrev );. 
266e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
266f0 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 53  ite3Fts5PoslistS
26700 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c 20  afeAppend(&tmp, 
26710 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b 0a  &iPrev, iPos2);.
26720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
26730 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
26740 4e 65 78 74 36 34 28 61 32 2c 20 69 32 2e 6e 50  Next64(a2, i2.nP
26750 6f 73 6c 69 73 74 2c 20 26 69 4f 66 66 32 2c 20  oslist, &iOff2, 
26760 26 69 50 6f 73 32 29 3b 0a 20 20 20 20 20 20 20  &iPos2);.       
26770 20 20 20 20 20 20 20 69 66 28 20 69 50 6f 73 32         if( iPos2
26780 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  <0 ) break;.    
26790 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
267a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
267b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 50 6f  .        if( iPo
267c0 73 31 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  s1>=0 ){.       
267d0 20 20 20 69 66 28 20 69 50 6f 73 31 21 3d 69 50     if( iPos1!=iP
267e0 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rev ){.         
267f0 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 50 6f     sqlite3Fts5Po
26800 73 6c 69 73 74 53 61 66 65 41 70 70 65 6e 64 28  slistSafeAppend(
26810 26 74 6d 70 2c 20 26 69 50 72 65 76 2c 20 69 50  &tmp, &iPrev, iP
26820 6f 73 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  os1);.          
26830 7d 0a 20 20 20 20 20 20 20 20 20 20 61 43 6f 70  }.          aCop
26840 79 20 3d 20 26 61 31 5b 69 4f 66 66 31 5d 3b 0a  y = &a1[iOff1];.
26850 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
26860 3d 20 69 31 2e 6e 50 6f 73 6c 69 73 74 20 2d 20  = i1.nPoslist - 
26870 69 4f 66 66 31 3b 0a 20 20 20 20 20 20 20 20 7d  iOff1;.        }
26880 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26890 61 73 73 65 72 74 28 20 69 50 6f 73 32 3e 3d 30  assert( iPos2>=0
268a0 20 26 26 20 69 50 6f 73 32 21 3d 69 50 72 65 76   && iPos2!=iPrev
268b0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
268c0 6c 69 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74  lite3Fts5Poslist
268d0 53 61 66 65 41 70 70 65 6e 64 28 26 74 6d 70 2c  SafeAppend(&tmp,
268e0 20 26 69 50 72 65 76 2c 20 69 50 6f 73 32 29 3b   &iPrev, iPos2);
268f0 0a 20 20 20 20 20 20 20 20 20 20 61 43 6f 70 79  .          aCopy
26900 20 3d 20 26 61 32 5b 69 4f 66 66 32 5d 3b 0a 20   = &a2[iOff2];. 
26910 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20 3d           nCopy =
26920 20 69 32 2e 6e 50 6f 73 6c 69 73 74 20 2d 20 69   i2.nPoslist - i
26930 4f 66 66 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Off2;.        }.
26940 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 6f 70          if( nCop
26950 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  y>0 ){.         
26960 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
26970 70 70 65 6e 64 42 6c 6f 62 28 26 74 6d 70 2c 20  ppendBlob(&tmp, 
26980 61 43 6f 70 79 2c 20 6e 43 6f 70 79 29 3b 0a 20  aCopy, nCopy);. 
26990 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
269a0 20 20 2f 2a 20 57 52 49 54 45 50 4f 53 4c 49 53    /* WRITEPOSLIS
269b0 54 53 49 5a 45 20 2a 2f 0a 20 20 20 20 20 20 20  TSIZE */.       
269c0 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65 41   fts5BufferSafeA
269d0 70 70 65 6e 64 56 61 72 69 6e 74 28 26 6f 75 74  ppendVarint(&out
269e0 2c 20 74 6d 70 2e 6e 20 2a 20 32 29 3b 0a 20 20  , tmp.n * 2);.  
269f0 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72        fts5Buffer
26a00 53 61 66 65 41 70 70 65 6e 64 42 6c 6f 62 28 26  SafeAppendBlob(&
26a10 6f 75 74 2c 20 74 6d 70 2e 70 2c 20 74 6d 70 2e  out, tmp.p, tmp.
26a20 6e 29 3b 0a 20 20 20 20 20 20 20 20 66 74 73 35  n);.        fts5
26a30 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78 74 28  DoclistIterNext(
26a40 26 69 31 29 3b 0a 20 20 20 20 20 20 20 20 66 74  &i1);.        ft
26a50 73 35 44 6f 63 6c 69 73 74 49 74 65 72 4e 65 78  s5DoclistIterNex
26a60 74 28 26 69 32 29 3b 0a 20 20 20 20 20 20 20 20  t(&i2);.        
26a70 61 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28  assert( out.n<=(
26a80 70 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29  p1->n+p2->n+9) )
26a90 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 31  ;.        if( i1
26aa0 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 7c 7c 20  .aPoslist==0 || 
26ab0 69 32 2e 61 50 6f 73 6c 69 73 74 3d 3d 30 20 29  i2.aPoslist==0 )
26ac0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26ad0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
26ae0 31 2e 61 50 6f 73 6c 69 73 74 20 29 7b 0a 20 20  1.aPoslist ){.  
26af0 20 20 20 20 66 74 73 35 4d 65 72 67 65 41 70 70      fts5MergeApp
26b00 65 6e 64 44 6f 63 69 64 28 26 6f 75 74 2c 20 69  endDocid(&out, i
26b10 4c 61 73 74 52 6f 77 69 64 2c 20 69 31 2e 69 52  LastRowid, i1.iR
26b20 6f 77 69 64 29 3b 0a 20 20 20 20 20 20 66 74 73  owid);.      fts
26b30 35 42 75 66 66 65 72 53 61 66 65 41 70 70 65 6e  5BufferSafeAppen
26b40 64 42 6c 6f 62 28 26 6f 75 74 2c 20 69 31 2e 61  dBlob(&out, i1.a
26b50 50 6f 73 6c 69 73 74 2c 20 69 31 2e 61 45 6f 66  Poslist, i1.aEof
26b60 20 2d 20 69 31 2e 61 50 6f 73 6c 69 73 74 29 3b   - i1.aPoslist);
26b70 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
26b80 69 66 28 20 69 32 2e 61 50 6f 73 6c 69 73 74 20  if( i2.aPoslist 
26b90 29 7b 0a 20 20 20 20 20 20 66 74 73 35 4d 65 72  ){.      fts5Mer
26ba0 67 65 41 70 70 65 6e 64 44 6f 63 69 64 28 26 6f  geAppendDocid(&o
26bb0 75 74 2c 20 69 4c 61 73 74 52 6f 77 69 64 2c 20  ut, iLastRowid, 
26bc0 69 32 2e 69 52 6f 77 69 64 29 3b 0a 20 20 20 20  i2.iRowid);.    
26bd0 20 20 66 74 73 35 42 75 66 66 65 72 53 61 66 65    fts5BufferSafe
26be0 41 70 70 65 6e 64 42 6c 6f 62 28 26 6f 75 74 2c  AppendBlob(&out,
26bf0 20 69 32 2e 61 50 6f 73 6c 69 73 74 2c 20 69 32   i2.aPoslist, i2
26c00 2e 61 45 6f 66 20 2d 20 69 32 2e 61 50 6f 73 6c  .aEof - i2.aPosl
26c10 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
26c20 61 73 73 65 72 74 28 20 6f 75 74 2e 6e 3c 3d 28  assert( out.n<=(
26c30 70 31 2d 3e 6e 2b 70 32 2d 3e 6e 2b 39 29 20 29  p1->n+p2->n+9) )
26c40 3b 0a 0a 20 20 20 20 66 74 73 35 42 75 66 66 65  ;..    fts5Buffe
26c50 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 70 31 2c  rSet(&p->rc, p1,
26c60 20 6f 75 74 2e 6e 2c 20 6f 75 74 2e 70 29 3b 0a   out.n, out.p);.
26c70 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46 72      fts5BufferFr
26c80 65 65 28 26 74 6d 70 29 3b 0a 20 20 20 20 66 74  ee(&tmp);.    ft
26c90 73 35 42 75 66 66 65 72 46 72 65 65 28 26 6f 75  s5BufferFree(&ou
26ca0 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  t);.  }.}..stati
26cb0 63 20 76 6f 69 64 20 66 74 73 35 53 65 74 75 70  c void fts5Setup
26cc0 50 72 65 66 69 78 49 74 65 72 28 0a 20 20 46 74  PrefixIter(.  Ft
26cd0 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20  s5Index *p,     
26ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26cf0 20 49 6e 64 65 78 20 74 6f 20 72 65 61 64 20 66   Index to read f
26d00 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 62 44 65  rom */.  int bDe
26d10 73 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  sc,             
26d20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
26d30 20 66 6f 72 20 22 4f 52 44 45 52 20 42 59 20 72   for "ORDER BY r
26d40 6f 77 69 64 20 44 45 53 43 22 20 2a 2f 0a 20 20  owid DESC" */.  
26d50 63 6f 6e 73 74 20 75 38 20 2a 70 54 6f 6b 65 6e  const u8 *pToken
26d60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
26d70 2f 2a 20 42 75 66 66 65 72 20 63 6f 6e 74 61 69  /* Buffer contai
26d80 6e 69 6e 67 20 70 72 65 66 69 78 20 74 6f 20 6d  ning prefix to m
26d90 61 74 63 68 20 2a 2f 0a 20 20 69 6e 74 20 6e 54  atch */.  int nT
26da0 6f 6b 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20  oken,           
26db0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
26dc0 65 20 6f 66 20 62 75 66 66 65 72 20 70 54 6f 6b  e of buffer pTok
26dd0 65 6e 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  en in bytes */. 
26de0 20 46 74 73 35 43 6f 6c 73 65 74 20 2a 70 43 6f   Fts5Colset *pCo
26df0 6c 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 20  lset,           
26e00 20 2f 2a 20 52 65 73 74 72 69 63 74 20 6d 61 74   /* Restrict mat
26e10 63 68 65 73 20 74 6f 20 74 68 65 73 65 20 63 6f  ches to these co
26e20 6c 75 6d 6e 73 20 2a 2f 0a 20 20 46 74 73 35 49  lumns */.  Fts5I
26e30 74 65 72 20 2a 2a 70 70 49 74 65 72 20 20 20 20  ter **ppIter    
26e40 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65        /* OUT: Ne
26e50 77 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 29 7b  w iterator */.){
26e60 0a 20 20 46 74 73 35 53 74 72 75 63 74 75 72 65  .  Fts5Structure
26e70 20 2a 70 53 74 72 75 63 74 3b 0a 20 20 46 74 73   *pStruct;.  Fts
26e80 35 42 75 66 66 65 72 20 2a 61 42 75 66 3b 0a 20  5Buffer *aBuf;. 
26e90 20 63 6f 6e 73 74 20 69 6e 74 20 6e 42 75 66 20   const int nBuf 
26ea0 3d 20 33 32 3b 0a 0a 20 20 76 6f 69 64 20 28 2a  = 32;..  void (*
26eb0 78 4d 65 72 67 65 29 28 46 74 73 35 49 6e 64 65  xMerge)(Fts5Inde
26ec0 78 2a 2c 20 46 74 73 35 42 75 66 66 65 72 2a 2c  x*, Fts5Buffer*,
26ed0 20 46 74 73 35 42 75 66 66 65 72 2a 29 3b 0a 20   Fts5Buffer*);. 
26ee0 20 76 6f 69 64 20 28 2a 78 41 70 70 65 6e 64 29   void (*xAppend)
26ef0 28 46 74 73 35 49 6e 64 65 78 2a 2c 20 69 36 34  (Fts5Index*, i64
26f00 2c 20 46 74 73 35 49 74 65 72 2a 2c 20 46 74 73  , Fts5Iter*, Fts
26f10 35 42 75 66 66 65 72 2a 29 3b 0a 20 20 69 66 28  5Buffer*);.  if(
26f20 20 70 2d 3e 70 43 6f 6e 66 69 67 2d 3e 65 44 65   p->pConfig->eDe
26f30 74 61 69 6c 3d 3d 46 54 53 35 5f 44 45 54 41 49  tail==FTS5_DETAI
26f40 4c 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 78 4d  L_NONE ){.    xM
26f50 65 72 67 65 20 3d 20 66 74 73 35 4d 65 72 67 65  erge = fts5Merge
26f60 52 6f 77 69 64 4c 69 73 74 73 3b 0a 20 20 20 20  RowidLists;.    
26f70 78 41 70 70 65 6e 64 20 3d 20 66 74 73 35 41 70  xAppend = fts5Ap
26f80 70 65 6e 64 52 6f 77 69 64 3b 0a 20 20 7d 65 6c  pendRowid;.  }el
26f90 73 65 7b 0a 20 20 20 20 78 4d 65 72 67 65 20 3d  se{.    xMerge =
26fa0 20 66 74 73 35 4d 65 72 67 65 50 72 65 66 69 78   fts5MergePrefix
26fb0 4c 69 73 74 73 3b 0a 20 20 20 20 78 41 70 70 65  Lists;.    xAppe
26fc0 6e 64 20 3d 20 66 74 73 35 41 70 70 65 6e 64 50  nd = fts5AppendP
26fd0 6f 73 6c 69 73 74 3b 0a 20 20 7d 0a 0a 20 20 61  oslist;.  }..  a
26fe0 42 75 66 20 3d 20 28 46 74 73 35 42 75 66 66 65  Buf = (Fts5Buffe
26ff0 72 2a 29 66 74 73 35 49 64 78 4d 61 6c 6c 6f 63  r*)fts5IdxMalloc
27000 28 70 2c 20 73 69 7a 65 6f 66 28 46 74 73 35 42  (p, sizeof(Fts5B
27010 75 66 66 65 72 29 2a 6e 42 75 66 29 3b 0a 20 20  uffer)*nBuf);.  
27020 70 53 74 72 75 63 74 20 3d 20 66 74 73 35 53 74  pStruct = fts5St
27030 72 75 63 74 75 72 65 52 65 61 64 28 70 29 3b 0a  ructureRead(p);.
27040 0a 20 20 69 66 28 20 61 42 75 66 20 26 26 20 70  .  if( aBuf && p
27050 53 74 72 75 63 74 20 29 7b 0a 20 20 20 20 63 6f  Struct ){.    co
27060 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  nst int flags = 
27070 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f  FTS5INDEX_QUERY_
27080 53 43 41 4e 20 0a 20 20 20 20 20 20 20 20 20 20  SCAN .          
27090 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53 35            | FTS5
270a0 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 4b 49 50  INDEX_QUERY_SKIP
270b0 45 4d 50 54 59 20 0a 20 20 20 20 20 20 20 20 20  EMPTY .         
270c0 20 20 20 20 20 20 20 20 20 20 20 7c 20 46 54 53             | FTS
270d0 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 4e 4f 4f  5INDEX_QUERY_NOO
270e0 55 54 50 55 54 3b 0a 20 20 20 20 69 6e 74 20 69  UTPUT;.    int i
270f0 3b 0a 20 20 20 20 69 36 34 20 69 4c 61 73 74 52  ;.    i64 iLastR
27100 6f 77 69 64 20 3d 20 30 3b 0a 20 20 20 20 46 74  owid = 0;.    Ft
27110 73 35 49 74 65 72 20 2a 70 31 20 3d 20 30 3b 20  s5Iter *p1 = 0; 
27120 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
27130 75 73 65 64 20 74 6f 20 67 61 74 68 65 72 20 64  used to gather d
27140 61 74 61 20 66 72 6f 6d 20 69 6e 64 65 78 20 2a  ata from index *
27150 2f 0a 20 20 20 20 46 74 73 35 44 61 74 61 20 2a  /.    Fts5Data *
27160 70 44 61 74 61 3b 0a 20 20 20 20 46 74 73 35 42  pData;.    Fts5B
27170 75 66 66 65 72 20 64 6f 63 6c 69 73 74 3b 0a 20  uffer doclist;. 
27180 20 20 20 69 6e 74 20 62 4e 65 77 54 65 72 6d 20     int bNewTerm 
27190 3d 20 31 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  = 1;..    memset
271a0 28 26 64 6f 63 6c 69 73 74 2c 20 30 2c 20 73 69  (&doclist, 0, si
271b0 7a 65 6f 66 28 64 6f 63 6c 69 73 74 29 29 3b 0a  zeof(doclist));.
271c0 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65      fts5MultiIte
271d0 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
271e0 20 66 6c 61 67 73 2c 20 70 43 6f 6c 73 65 74 2c   flags, pColset,
271f0 20 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c   pToken, nToken,
27200 20 2d 31 2c 20 30 2c 20 26 70 31 29 3b 0a 20 20   -1, 0, &p1);.  
27210 20 20 66 74 73 35 49 74 65 72 53 65 74 4f 75 74    fts5IterSetOut
27220 70 75 74 43 62 28 26 70 2d 3e 72 63 2c 20 70 31  putCb(&p->rc, p1
27230 29 3b 0a 20 20 20 20 66 6f 72 28 20 2f 2a 20 6e  );.    for( /* n
27240 6f 2d 6f 70 20 2a 2f 20 3b 0a 20 20 20 20 20 20  o-op */ ;.      
27250 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 45    fts5MultiIterE
27260 6f 66 28 70 2c 20 70 31 29 3d 3d 30 3b 0a 20 20  of(p, p1)==0;.  
27270 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69 49        fts5MultiI
27280 74 65 72 4e 65 78 74 32 28 70 2c 20 70 31 2c 20  terNext2(p, p1, 
27290 26 62 4e 65 77 54 65 72 6d 29 0a 20 20 20 20 29  &bNewTerm).    )
272a0 7b 0a 20 20 20 20 20 20 46 74 73 35 53 65 67 49  {.      Fts5SegI
272b0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 31 2d  ter *pSeg = &p1-
272c0 3e 61 53 65 67 5b 20 70 31 2d 3e 61 46 69 72 73  >aSeg[ p1->aFirs
272d0 74 5b 31 5d 2e 69 46 69 72 73 74 20 5d 3b 0a 20  t[1].iFirst ];. 
272e0 20 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20 3d       int nTerm =
272f0 20 70 53 65 67 2d 3e 74 65 72 6d 2e 6e 3b 0a 20   pSeg->term.n;. 
27300 20 20 20 20 20 63 6f 6e 73 74 20 75 38 20 2a 70       const u8 *p
27310 54 65 72 6d 20 3d 20 70 53 65 67 2d 3e 74 65 72  Term = pSeg->ter
27320 6d 2e 70 3b 0a 20 20 20 20 20 20 70 31 2d 3e 78  m.p;.      p1->x
27330 53 65 74 4f 75 74 70 75 74 73 28 70 31 2c 20 70  SetOutputs(p1, p
27340 53 65 67 29 3b 0a 0a 20 20 20 20 20 20 61 73 73  Seg);..      ass
27350 65 72 74 5f 6e 63 28 20 6d 65 6d 63 6d 70 28 70  ert_nc( memcmp(p
27360 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20 4d 49  Token, pTerm, MI
27370 4e 28 6e 54 6f 6b 65 6e 2c 20 6e 54 65 72 6d 29  N(nToken, nTerm)
27380 29 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  )<=0 );.      if
27390 28 20 62 4e 65 77 54 65 72 6d 20 29 7b 0a 20 20  ( bNewTerm ){.  
273a0 20 20 20 20 20 20 69 66 28 20 6e 54 65 72 6d 3c        if( nTerm<
273b0 6e 54 6f 6b 65 6e 20 7c 7c 20 6d 65 6d 63 6d 70  nToken || memcmp
273c0 28 70 54 6f 6b 65 6e 2c 20 70 54 65 72 6d 2c 20  (pToken, pTerm, 
273d0 6e 54 6f 6b 65 6e 29 20 29 20 62 72 65 61 6b 3b  nToken) ) break;
273e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
273f0 69 66 28 20 70 31 2d 3e 62 61 73 65 2e 6e 44 61  if( p1->base.nDa
27400 74 61 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ta==0 ) continue
27410 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 31 2d  ;..      if( p1-
27420 3e 62 61 73 65 2e 69 52 6f 77 69 64 3c 3d 69 4c  >base.iRowid<=iL
27430 61 73 74 52 6f 77 69 64 20 26 26 20 64 6f 63 6c  astRowid && docl
27440 69 73 74 2e 6e 3e 30 20 29 7b 0a 20 20 20 20 20  ist.n>0 ){.     
27450 20 20 20 66 6f 72 28 69 3d 30 3b 20 70 2d 3e 72     for(i=0; p->r
27460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
27470 64 6f 63 6c 69 73 74 2e 6e 3b 20 69 2b 2b 29 7b  doclist.n; i++){
27480 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
27490 74 28 20 69 3c 6e 42 75 66 20 29 3b 0a 20 20 20  t( i<nBuf );.   
274a0 20 20 20 20 20 20 20 69 66 28 20 61 42 75 66 5b         if( aBuf[
274b0 69 5d 2e 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  i].n==0 ){.     
274c0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
274d0 72 53 77 61 70 28 26 64 6f 63 6c 69 73 74 2c 20  rSwap(&doclist, 
274e0 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 20  &aBuf[i]);.     
274f0 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
27500 72 5a 65 72 6f 28 26 64 6f 63 6c 69 73 74 29 3b  rZero(&doclist);
27510 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
27520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 4d  {.            xM
27530 65 72 67 65 28 70 2c 20 26 64 6f 63 6c 69 73 74  erge(p, &doclist
27540 2c 20 26 61 42 75 66 5b 69 5d 29 3b 0a 20 20 20  , &aBuf[i]);.   
27550 20 20 20 20 20 20 20 20 20 66 74 73 35 42 75 66           fts5Buf
27560 66 65 72 5a 65 72 6f 28 26 61 42 75 66 5b 69 5d  ferZero(&aBuf[i]
27570 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
27580 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27590 20 69 4c 61 73 74 52 6f 77 69 64 20 3d 20 30 3b   iLastRowid = 0;
275a0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
275b0 78 41 70 70 65 6e 64 28 70 2c 20 70 31 2d 3e 62  xAppend(p, p1->b
275c0 61 73 65 2e 69 52 6f 77 69 64 2d 69 4c 61 73 74  ase.iRowid-iLast
275d0 52 6f 77 69 64 2c 20 70 31 2c 20 26 64 6f 63 6c  Rowid, p1, &docl
275e0 69 73 74 29 3b 0a 20 20 20 20 20 20 69 4c 61 73  ist);.      iLas
275f0 74 52 6f 77 69 64 20 3d 20 70 31 2d 3e 62 61 73  tRowid = p1->bas
27600 65 2e 69 52 6f 77 69 64 3b 0a 20 20 20 20 7d 0a  e.iRowid;.    }.
27610 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27620 6e 42 75 66 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nBuf; i++){.    
27630 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
27640 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27650 20 20 78 4d 65 72 67 65 28 70 2c 20 26 64 6f 63    xMerge(p, &doc
27660 6c 69 73 74 2c 20 26 61 42 75 66 5b 69 5d 29 3b  list, &aBuf[i]);
27670 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
27680 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26 61  ts5BufferFree(&a
27690 42 75 66 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Buf[i]);.    }. 
276a0 20 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72     fts5MultiIter
276b0 46 72 65 65 28 70 31 29 3b 0a 0a 20 20 20 20 70  Free(p1);..    p
276c0 44 61 74 61 20 3d 20 66 74 73 35 49 64 78 4d 61  Data = fts5IdxMa
276d0 6c 6c 6f 63 28 70 2c 20 73 69 7a 65 6f 66 28 46  lloc(p, sizeof(F
276e0 74 73 35 44 61 74 61 29 2b 64 6f 63 6c 69 73 74  ts5Data)+doclist
276f0 2e 6e 2b 46 54 53 35 5f 44 41 54 41 5f 5a 45 52  .n+FTS5_DATA_ZER
27700 4f 5f 50 41 44 44 49 4e 47 29 3b 0a 20 20 20 20  O_PADDING);.    
27710 69 66 28 20 70 44 61 74 61 20 29 7b 0a 20 20 20  if( pData ){.   
27720 20 20 20 70 44 61 74 61 2d 3e 70 20 3d 20 28 75     pData->p = (u
27730 38 2a 29 26 70 44 61 74 61 5b 31 5d 3b 0a 20 20  8*)&pData[1];.  
27740 20 20 20 20 70 44 61 74 61 2d 3e 6e 6e 20 3d 20      pData->nn = 
27750 70 44 61 74 61 2d 3e 73 7a 4c 65 61 66 20 3d 20  pData->szLeaf = 
27760 64 6f 63 6c 69 73 74 2e 6e 3b 0a 20 20 20 20 20  doclist.n;.     
27770 20 69 66 28 20 64 6f 63 6c 69 73 74 2e 6e 20 29   if( doclist.n )
27780 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2d 3e 70   memcpy(pData->p
27790 2c 20 64 6f 63 6c 69 73 74 2e 70 2c 20 64 6f 63  , doclist.p, doc
277a0 6c 69 73 74 2e 6e 29 3b 0a 20 20 20 20 20 20 66  list.n);.      f
277b0 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77 32  ts5MultiIterNew2
277c0 28 70 2c 20 70 44 61 74 61 2c 20 62 44 65 73 63  (p, pData, bDesc
277d0 2c 20 70 70 49 74 65 72 29 3b 0a 20 20 20 20 7d  , ppIter);.    }
277e0 0a 20 20 20 20 66 74 73 35 42 75 66 66 65 72 46  .    fts5BufferF
277f0 72 65 65 28 26 64 6f 63 6c 69 73 74 29 3b 0a 20  ree(&doclist);. 
27800 20 7d 0a 0a 20 20 66 74 73 35 53 74 72 75 63 74   }..  fts5Struct
27810 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72 75  ureRelease(pStru
27820 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ct);.  sqlite3_f
27830 72 65 65 28 61 42 75 66 29 3b 0a 7d 0a 0a 0a 2f  ree(aBuf);.}.../
27840 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68  *.** Indicate th
27850 61 74 20 61 6c 6c 20 73 75 62 73 65 71 75 65 6e  at all subsequen
27860 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
27870 65 33 46 74 73 35 49 6e 64 65 78 57 72 69 74 65  e3Fts5IndexWrite
27880 28 29 20 70 65 72 74 61 69 6e 0a 2a 2a 20 74 6f  () pertain.** to
27890 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 20 77 69   the document wi
278a0 74 68 20 72 6f 77 69 64 20 69 52 6f 77 69 64 2e  th rowid iRowid.
278b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46  .*/.int sqlite3F
278c0 74 73 35 49 6e 64 65 78 42 65 67 69 6e 57 72 69  ts5IndexBeginWri
278d0 74 65 28 46 74 73 35 49 6e 64 65 78 20 2a 70 2c  te(Fts5Index *p,
278e0 20 69 6e 74 20 62 44 65 6c 65 74 65 2c 20 69 36   int bDelete, i6
278f0 34 20 69 52 6f 77 69 64 29 7b 0a 20 20 61 73 73  4 iRowid){.  ass
27900 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
27910 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 2f 2a 20 41  TE_OK );..  /* A
27920 6c 6c 6f 63 61 74 65 20 74 68 65 20 68 61 73 68  llocate the hash
27930 20 74 61 62 6c 65 20 69 66 20 69 74 20 68 61 73   table if it has
27940 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
27950 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
27960 20 69 66 28 20 70 2d 3e 70 48 61 73 68 3d 3d 30   if( p->pHash==0
27970 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
27980 73 71 6c 69 74 65 33 46 74 73 35 48 61 73 68 4e  sqlite3Fts5HashN
27990 65 77 28 70 2d 3e 70 43 6f 6e 66 69 67 2c 20 26  ew(p->pConfig, &
279a0 70 2d 3e 70 48 61 73 68 2c 20 26 70 2d 3e 6e 50  p->pHash, &p->nP
279b0 65 6e 64 69 6e 67 44 61 74 61 29 3b 0a 20 20 7d  endingData);.  }
279c0 0a 0a 20 20 2f 2a 20 46 6c 75 73 68 20 74 68 65  ..  /* Flush the
279d0 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 64   hash table to d
279e0 69 73 6b 20 69 66 20 72 65 71 75 69 72 65 64 20  isk if required 
279f0 2a 2f 0a 20 20 69 66 28 20 69 52 6f 77 69 64 3c  */.  if( iRowid<
27a00 70 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 0a  p->iWriteRowid .
27a10 20 20 20 7c 7c 20 28 69 52 6f 77 69 64 3d 3d 70     || (iRowid==p
27a20 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 20 26 26  ->iWriteRowid &&
27a30 20 70 2d 3e 62 44 65 6c 65 74 65 3d 3d 30 29 0a   p->bDelete==0).
27a40 20 20 20 7c 7c 20 28 70 2d 3e 6e 50 65 6e 64 69     || (p->nPendi
27a50 6e 67 44 61 74 61 20 3e 20 70 2d 3e 70 43 6f 6e  ngData > p->pCon
27a60 66 69 67 2d 3e 6e 48 61 73 68 53 69 7a 65 29 20  fig->nHashSize) 
27a70 0a 20 20 29 7b 0a 20 20 20 20 66 74 73 35 49 6e  .  ){.    fts5In
27a80 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20 7d  dexFlush(p);.  }
27a90 0a 0a 20 20 70 2d 3e 69 57 72 69 74 65 52 6f 77  ..  p->iWriteRow
27aa0 69 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 70  id = iRowid;.  p
27ab0 2d 3e 62 44 65 6c 65 74 65 20 3d 20 62 44 65 6c  ->bDelete = bDel
27ac0 65 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 66 74  ete;.  return ft
27ad0 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29  s5IndexReturn(p)
27ae0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
27af0 74 20 64 61 74 61 20 74 6f 20 64 69 73 6b 2e 0a  t data to disk..
27b00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
27b10 73 35 49 6e 64 65 78 53 79 6e 63 28 46 74 73 35  s5IndexSync(Fts5
27b20 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20 61 73 73  Index *p){.  ass
27b30 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
27b40 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74 73 35 49  TE_OK );.  fts5I
27b50 6e 64 65 78 46 6c 75 73 68 28 70 29 3b 0a 20 20  ndexFlush(p);.  
27b60 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
27b70 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73  p);.  return fts
27b80 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b  5IndexReturn(p);
27b90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 61 72  .}../*.** Discar
27ba0 64 20 61 6e 79 20 64 61 74 61 20 73 74 6f 72 65  d any data store
27bb0 64 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  d in the in-memo
27bc0 72 79 20 68 61 73 68 20 74 61 62 6c 65 73 2e 20  ry hash tables. 
27bd0 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 69 74 0a  Do not write it.
27be0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
27bf0 73 65 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  se. Additionally
27c00 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  , assume that th
27c10 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
27c20 65 20 25 5f 64 61 74 61 0a 2a 2a 20 74 61 62 6c  e %_data.** tabl
27c30 65 20 6d 61 79 20 68 61 76 65 20 63 68 61 6e 67  e may have chang
27c40 65 64 20 6f 6e 20 64 69 73 6b 2e 20 53 6f 20 61  ed on disk. So a
27c50 6e 79 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ny in-memory cac
27c60 68 65 73 20 6f 66 20 25 5f 64 61 74 61 20 0a 2a  hes of %_data .*
27c70 2a 20 72 65 63 6f 72 64 73 20 6d 75 73 74 20 62  * records must b
27c80 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a  e invalidated..*
27c90 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
27ca0 35 49 6e 64 65 78 52 6f 6c 6c 62 61 63 6b 28 46  5IndexRollback(F
27cb0 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
27cc0 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
27cd0 70 29 3b 0a 20 20 66 74 73 35 49 6e 64 65 78 44  p);.  fts5IndexD
27ce0 69 73 63 61 72 64 44 61 74 61 28 70 29 3b 0a 20  iscardData(p);. 
27cf0 20 66 74 73 35 53 74 72 75 63 74 75 72 65 49 6e   fts5StructureIn
27d00 76 61 6c 69 64 61 74 65 28 70 29 3b 0a 20 20 2f  validate(p);.  /
27d10 2a 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d  * assert( p->rc=
27d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 2a 2f  =SQLITE_OK ); */
27d30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27d40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
27d50 65 20 25 5f 64 61 74 61 20 74 61 62 6c 65 20 69  e %_data table i
27d60 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  s completely emp
27d70 74 79 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ty when this fun
27d80 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
27d90 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
27da0 6e 20 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77  n populates it w
27db0 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ith the initial 
27dc0 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74  structure object
27dd0 73 20 66 6f 72 20 65 61 63 68 20 69 6e 64 65 78  s for each index
27de0 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 69 6e 69  ,.** and the ini
27df0 74 69 61 6c 20 76 65 72 73 69 6f 6e 20 6f 66 20  tial version of 
27e00 74 68 65 20 22 61 76 65 72 61 67 65 73 22 20 72  the "averages" r
27e10 65 63 6f 72 64 20 28 61 20 7a 65 72 6f 2d 62 79  ecord (a zero-by
27e20 74 65 20 62 6c 6f 62 29 2e 0a 2a 2f 0a 69 6e 74  te blob)..*/.int
27e30 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
27e40 78 52 65 69 6e 69 74 28 46 74 73 35 49 6e 64 65  xReinit(Fts5Inde
27e50 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53 74 72  x *p){.  Fts5Str
27e60 75 63 74 75 72 65 20 73 3b 0a 20 20 66 74 73 35  ucture s;.  fts5
27e70 53 74 72 75 63 74 75 72 65 49 6e 76 61 6c 69 64  StructureInvalid
27e80 61 74 65 28 70 29 3b 0a 20 20 6d 65 6d 73 65 74  ate(p);.  memset
27e90 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 46  (&s, 0, sizeof(F
27ea0 74 73 35 53 74 72 75 63 74 75 72 65 29 29 3b 0a  ts5Structure));.
27eb0 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
27ec0 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
27ed0 5f 52 4f 57 49 44 2c 20 28 63 6f 6e 73 74 20 75  _ROWID, (const u
27ee0 38 2a 29 22 22 2c 20 30 29 3b 0a 20 20 66 74 73  8*)"", 0);.  fts
27ef0 35 53 74 72 75 63 74 75 72 65 57 72 69 74 65 28  5StructureWrite(
27f00 70 2c 20 26 73 29 3b 0a 20 20 72 65 74 75 72 6e  p, &s);.  return
27f10 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e   fts5IndexReturn
27f20 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  (p);.}../*.** Op
27f30 65 6e 20 61 20 6e 65 77 20 46 74 73 35 49 6e 64  en a new Fts5Ind
27f40 65 78 20 68 61 6e 64 6c 65 2e 20 49 66 20 74 68  ex handle. If th
27f50 65 20 62 43 72 65 61 74 65 20 61 72 67 75 6d 65  e bCreate argume
27f60 6e 74 20 69 73 20 74 72 75 65 2c 20 63 72 65 61  nt is true, crea
27f70 74 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69 61  te.** and initia
27f80 6c 69 7a 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lize the underly
27f90 69 6e 67 20 25 5f 64 61 74 61 20 74 61 62 6c 65  ing %_data table
27fa0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
27fb0 73 73 66 75 6c 2c 20 73 65 74 20 2a 70 70 20 74  ssful, set *pp t
27fc0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  o point to the n
27fd0 65 77 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  ew object and re
27fe0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
27ff0 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 65  ** Otherwise, se
28000 74 20 2a 70 70 20 74 6f 20 4e 55 4c 4c 20 61 6e  t *pp to NULL an
28010 64 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69  d return an SQLi
28020 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  te error code..*
28030 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
28040 35 49 6e 64 65 78 4f 70 65 6e 28 0a 20 20 46 74  5IndexOpen(.  Ft
28050 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
28060 67 2c 20 0a 20 20 69 6e 74 20 62 43 72 65 61 74  g, .  int bCreat
28070 65 2c 20 0a 20 20 46 74 73 35 49 6e 64 65 78 20  e, .  Fts5Index 
28080 2a 2a 70 70 2c 0a 20 20 63 68 61 72 20 2a 2a 70  **pp,.  char **p
28090 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63  zErr.){.  int rc
280a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
280b0 46 74 73 35 49 6e 64 65 78 20 2a 70 3b 20 20 20  Fts5Index *p;   
280c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280d0 2f 2a 20 4e 65 77 20 6f 62 6a 65 63 74 20 2a 2f  /* New object */
280e0 0a 0a 20 20 2a 70 70 20 3d 20 70 20 3d 20 28 46  ..  *pp = p = (F
280f0 74 73 35 49 6e 64 65 78 2a 29 73 71 6c 69 74 65  ts5Index*)sqlite
28100 33 46 74 73 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28  3Fts5MallocZero(
28110 26 72 63 2c 20 73 69 7a 65 6f 66 28 46 74 73 35  &rc, sizeof(Fts5
28120 49 6e 64 65 78 29 29 3b 0a 20 20 69 66 28 20 72  Index));.  if( r
28130 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28140 20 20 20 20 70 2d 3e 70 43 6f 6e 66 69 67 20 3d      p->pConfig =
28150 20 70 43 6f 6e 66 69 67 3b 0a 20 20 20 20 70 2d   pConfig;.    p-
28160 3e 6e 57 6f 72 6b 55 6e 69 74 20 3d 20 46 54 53  >nWorkUnit = FTS
28170 35 5f 57 4f 52 4b 5f 55 4e 49 54 3b 0a 20 20 20  5_WORK_UNIT;.   
28180 20 70 2d 3e 7a 44 61 74 61 54 62 6c 20 3d 20 73   p->zDataTbl = s
28190 71 6c 69 74 65 33 46 74 73 35 4d 70 72 69 6e 74  qlite3Fts5Mprint
281a0 66 28 26 72 63 2c 20 22 25 73 5f 64 61 74 61 22  f(&rc, "%s_data"
281b0 2c 20 70 43 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65  , pConfig->zName
281c0 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 44  );.    if( p->zD
281d0 61 74 61 54 62 6c 20 26 26 20 62 43 72 65 61 74  ataTbl && bCreat
281e0 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  e ){.      rc = 
281f0 73 71 6c 69 74 65 33 46 74 73 35 43 72 65 61 74  sqlite3Fts5Creat
28200 65 54 61 62 6c 65 28 0a 20 20 20 20 20 20 20 20  eTable(.        
28210 20 20 70 43 6f 6e 66 69 67 2c 20 22 64 61 74 61    pConfig, "data
28220 22 2c 20 22 69 64 20 49 4e 54 45 47 45 52 20 50  ", "id INTEGER P
28230 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63  RIMARY KEY, bloc
28240 6b 20 42 4c 4f 42 22 2c 20 30 2c 20 70 7a 45 72  k BLOB", 0, pzEr
28250 72 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  r.      );.     
28260 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
28270 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
28280 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35 43 72   = sqlite3Fts5Cr
28290 65 61 74 65 54 61 62 6c 65 28 70 43 6f 6e 66 69  eateTable(pConfi
282a0 67 2c 20 22 69 64 78 22 2c 20 0a 20 20 20 20 20  g, "idx", .     
282b0 20 20 20 20 20 20 20 22 73 65 67 69 64 2c 20 74         "segid, t
282c0 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d 41  erm, pgno, PRIMA
282d0 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 65  RY KEY(segid, te
282e0 72 6d 29 22 2c 20 0a 20 20 20 20 20 20 20 20 20  rm)", .         
282f0 20 20 20 31 2c 20 70 7a 45 72 72 0a 20 20 20 20     1, pzErr.    
28300 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
28310 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
28320 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
28340 73 35 49 6e 64 65 78 52 65 69 6e 69 74 28 70 29  s5IndexReinit(p)
28350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28360 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 72    }..  assert( r
28370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
28380 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
28390 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
283a0 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 49      sqlite3Fts5I
283b0 6e 64 65 78 43 6c 6f 73 65 28 70 29 3b 0a 20 20  ndexClose(p);.  
283c0 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20    *pp = 0;.  }. 
283d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
283e0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 68 61 6e  *.** Close a han
283f0 64 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 61 6e  dle opened by an
28400 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74 6f   earlier call to
28410 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
28420 78 4f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  xOpen()..*/.int 
28430 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28440 43 6c 6f 73 65 28 46 74 73 35 49 6e 64 65 78 20  Close(Fts5Index 
28450 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
28460 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
28470 20 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74   p ){.    assert
28480 28 20 70 2d 3e 70 52 65 61 64 65 72 3d 3d 30 20  ( p->pReader==0 
28490 29 3b 0a 20 20 20 20 66 74 73 35 53 74 72 75 63  );.    fts5Struc
284a0 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65 28 70  tureInvalidate(p
284b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
284c0 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 57 72 69 74  inalize(p->pWrit
284d0 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  er);.    sqlite3
284e0 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 44 65  _finalize(p->pDe
284f0 6c 65 74 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  leter);.    sqli
28500 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
28510 70 49 64 78 57 72 69 74 65 72 29 3b 0a 20 20 20  pIdxWriter);.   
28520 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
28530 65 28 70 2d 3e 70 49 64 78 44 65 6c 65 74 65 72  e(p->pIdxDeleter
28540 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28550 69 6e 61 6c 69 7a 65 28 70 2d 3e 70 49 64 78 53  inalize(p->pIdxS
28560 65 6c 65 63 74 29 3b 0a 20 20 20 20 73 71 6c 69  elect);.    sqli
28570 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 2d 3e  te3_finalize(p->
28580 70 44 61 74 61 56 65 72 73 69 6f 6e 29 3b 0a 20  pDataVersion);. 
28590 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 48 61     sqlite3Fts5Ha
285a0 73 68 46 72 65 65 28 70 2d 3e 70 48 61 73 68 29  shFree(p->pHash)
285b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
285c0 65 65 28 70 2d 3e 7a 44 61 74 61 54 62 6c 29 3b  ee(p->zDataTbl);
285d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
285e0 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  e(p);.  }.  retu
285f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28600 41 72 67 75 6d 65 6e 74 20 70 20 70 6f 69 6e 74  Argument p point
28610 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
28620 6e 74 61 69 6e 69 6e 67 20 75 74 66 2d 38 20 74  ntaining utf-8 t
28630 65 78 74 20 74 68 61 74 20 69 73 20 6e 20 62 79  ext that is n by
28640 74 65 73 20 69 6e 20 0a 2a 2a 20 73 69 7a 65 2e  tes in .** size.
28650 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
28660 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
28670 68 65 20 6e 43 68 61 72 20 63 68 61 72 61 63 74  he nChar charact
28680 65 72 20 70 72 65 66 69 78 20 6f 66 20 74 68 65  er prefix of the
28690 0a 2a 2a 20 62 75 66 66 65 72 2c 20 6f 72 20 30  .** buffer, or 0
286a0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6c 65   if there are le
286b0 73 73 20 74 68 61 6e 20 6e 43 68 61 72 20 63 68  ss than nChar ch
286c0 61 72 61 63 74 65 72 73 20 69 6e 20 74 6f 74 61  aracters in tota
286d0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
286e0 33 46 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65  3Fts5IndexCharle
286f0 6e 54 6f 42 79 74 65 6c 65 6e 28 0a 20 20 63 6f  nToBytelen(.  co
28700 6e 73 74 20 63 68 61 72 20 2a 70 2c 20 0a 20 20  nst char *p, .  
28710 69 6e 74 20 6e 42 79 74 65 2c 20 0a 20 20 69 6e  int nByte, .  in
28720 74 20 6e 43 68 61 72 0a 29 7b 0a 20 20 69 6e 74  t nChar.){.  int
28730 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b   n = 0;.  int i;
28740 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
28750 68 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  har; i++){.    i
28760 66 28 20 6e 3e 3d 6e 42 79 74 65 20 29 20 72 65  f( n>=nByte ) re
28770 74 75 72 6e 20 30 3b 20 20 20 20 20 20 2f 2a 20  turn 0;      /* 
28780 49 6e 70 75 74 20 63 6f 6e 74 61 69 6e 73 20 66  Input contains f
28790 65 77 65 72 20 74 68 61 6e 20 6e 43 68 61 72 20  ewer than nChar 
287a0 63 68 61 72 73 20 2a 2f 0a 20 20 20 20 69 66 28  chars */.    if(
287b0 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
287c0 70 5b 6e 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b 0a  p[n++]>=0xc0 ){.
287d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 70 5b        while( (p[
287e0 6e 5d 20 26 20 30 78 63 30 29 3d 3d 30 78 38 30  n] & 0xc0)==0x80
287f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b   ){.        n++;
28800 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 3d  .        if( n>=
28810 6e 42 79 74 65 20 29 20 62 72 65 61 6b 3b 0a 20  nByte ) break;. 
28820 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
28830 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
28840 2f 2a 0a 2a 2a 20 70 49 6e 20 69 73 20 61 20 55  /*.** pIn is a U
28850 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 73 74 72  TF-8 encoded str
28860 69 6e 67 2c 20 6e 49 6e 20 62 79 74 65 73 20 69  ing, nIn bytes i
28870 6e 20 73 69 7a 65 2e 20 52 65 74 75 72 6e 20 74  n size. Return t
28880 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
28890 75 6e 69 63 6f 64 65 20 63 68 61 72 61 63 74 65  unicode characte
288a0 72 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67  rs in the string
288b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
288c0 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65 6e  fts5IndexCharlen
288d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 49 6e  (const char *pIn
288e0 2c 20 69 6e 74 20 6e 49 6e 29 7b 0a 20 20 69 6e  , int nIn){.  in
288f0 74 20 6e 43 68 61 72 20 3d 20 30 3b 20 20 20 20  t nChar = 0;    
28900 20 20 20 20 20 20 20 20 0a 20 20 69 6e 74 20 69          .  int i
28910 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
28920 3c 6e 49 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  <nIn ){.    if( 
28930 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 70  (unsigned char)p
28940 49 6e 5b 69 2b 2b 5d 3e 3d 30 78 63 30 20 29 7b  In[i++]>=0xc0 ){
28950 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c  .      while( i<
28960 6e 49 6e 20 26 26 20 28 70 49 6e 5b 69 5d 20 26  nIn && (pIn[i] &
28970 20 30 78 63 30 29 3d 3d 30 78 38 30 20 29 20 69   0xc0)==0x80 ) i
28980 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43  ++;.    }.    nC
28990 68 61 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  har++;.  }.  ret
289a0 75 72 6e 20 6e 43 68 61 72 3b 0a 7d 0a 0a 2f 2a  urn nChar;.}../*
289b0 0a 2a 2a 20 49 6e 73 65 72 74 20 6f 72 20 72 65  .** Insert or re
289c0 6d 6f 76 65 20 64 61 74 61 20 74 6f 20 6f 72 20  move data to or 
289d0 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2e 20  from the index. 
289e0 45 61 63 68 20 74 69 6d 65 20 61 20 64 6f 63 75  Each time a docu
289f0 6d 65 6e 74 20 69 73 20 0a 2a 2a 20 61 64 64 65  ment is .** adde
28a00 64 20 74 6f 20 6f 72 20 72 65 6d 6f 76 65 64 20  d to or removed 
28a10 66 72 6f 6d 20 74 68 65 20 69 6e 64 65 78 2c 20  from the index, 
28a20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
28a30 20 63 61 6c 6c 65 64 20 6f 6e 65 20 6f 72 20 6d   called one or m
28a40 6f 72 65 0a 2a 2a 20 74 69 6d 65 73 2e 0a 2a 2a  ore.** times..**
28a50 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 73 65 72  .** For an inser
28a60 74 2c 20 69 74 20 6d 75 73 74 20 62 65 20 63 61  t, it must be ca
28a70 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
28a80 63 68 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65 20  ch token in the 
28a90 6e 65 77 20 64 6f 63 75 6d 65 6e 74 2e 0a 2a 2a  new document..**
28aa0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
28ab0 6e 20 69 73 20 61 20 64 65 6c 65 74 65 2c 20 69  n is a delete, i
28ac0 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
28ad0 20 28 61 74 20 6c 65 61 73 74 29 20 6f 6e 63 65   (at least) once
28ae0 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 75 6e 69   for each.** uni
28af0 71 75 65 20 74 6f 6b 65 6e 20 69 6e 20 74 68 65  que token in the
28b00 20 64 6f 63 75 6d 65 6e 74 20 77 69 74 68 20 61   document with a
28b10 6e 20 69 43 6f 6c 20 76 61 6c 75 65 20 6c 65 73  n iCol value les
28b20 73 20 74 68 61 6e 20 7a 65 72 6f 2e 20 54 68 65  s than zero. The
28b30 20 69 50 6f 73 0a 2a 2a 20 61 72 67 75 6d 65 6e   iPos.** argumen
28b40 74 20 69 73 20 69 67 6e 6f 72 65 64 20 66 6f 72  t is ignored for
28b50 20 61 20 64 65 6c 65 74 65 2e 0a 2a 2f 0a 69 6e   a delete..*/.in
28b60 74 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64  t sqlite3Fts5Ind
28b70 65 78 57 72 69 74 65 28 0a 20 20 46 74 73 35 49  exWrite(.  Fts5I
28b80 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20 20 20  ndex *p,        
28b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28ba0 64 65 78 20 74 6f 20 77 72 69 74 65 20 74 6f 20  dex to write to 
28bb0 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20  */.  int iCol,  
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28bd0 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74       /* Column t
28be0 6f 6b 65 6e 20 61 70 70 65 61 72 73 20 69 6e 20  oken appears in 
28bf0 28 2d 76 65 20 2d 3e 20 64 65 6c 65 74 65 29 20  (-ve -> delete) 
28c00 2a 2f 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 20  */.  int iPos,  
28c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c20 20 20 20 20 20 2f 2a 20 50 6f 73 69 74 69 6f 6e       /* Position
28c30 20 6f 66 20 74 6f 6b 65 6e 20 77 69 74 68 69 6e   of token within
28c40 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 6f 6e   column */.  con
28c50 73 74 20 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c  st char *pToken,
28c60 20 69 6e 74 20 6e 54 6f 6b 65 6e 20 20 2f 2a 20   int nToken  /* 
28c70 54 6f 6b 65 6e 20 74 6f 20 61 64 64 20 6f 72 20  Token to add or 
28c80 72 65 6d 6f 76 65 20 74 6f 20 6f 72 20 66 72 6f  remove to or fro
28c90 6d 20 69 6e 64 65 78 20 2a 2f 0a 29 7b 0a 20 20  m index */.){.  
28ca0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
28cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28cc0 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
28cd0 74 65 20 74 68 72 6f 75 67 68 20 69 6e 64 65 78  te through index
28ce0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
28cf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
28d00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
28d10 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74 73 35  n code */.  Fts5
28d20 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20  Config *pConfig 
28d30 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 0a 20  = p->pConfig;.. 
28d40 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d   assert( p->rc==
28d50 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 61  SQLITE_OK );.  a
28d60 73 73 65 72 74 28 20 28 69 43 6f 6c 3c 30 29 3d  ssert( (iCol<0)=
28d70 3d 70 2d 3e 62 44 65 6c 65 74 65 20 29 3b 0a 0a  =p->bDelete );..
28d80 20 20 2f 2a 20 41 64 64 20 74 68 65 20 65 6e 74    /* Add the ent
28d90 72 79 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 74  ry to the main t
28da0 65 72 6d 73 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  erms index. */. 
28db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
28dc0 35 48 61 73 68 57 72 69 74 65 28 0a 20 20 20 20  5HashWrite(.    
28dd0 20 20 70 2d 3e 70 48 61 73 68 2c 20 70 2d 3e 69    p->pHash, p->i
28de0 57 72 69 74 65 52 6f 77 69 64 2c 20 69 43 6f 6c  WriteRowid, iCol
28df0 2c 20 69 50 6f 73 2c 20 46 54 53 35 5f 4d 41 49  , iPos, FTS5_MAI
28e00 4e 5f 50 52 45 46 49 58 2c 20 70 54 6f 6b 65 6e  N_PREFIX, pToken
28e10 2c 20 6e 54 6f 6b 65 6e 0a 20 20 29 3b 0a 0a 20  , nToken.  );.. 
28e20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 6f 6e   for(i=0; i<pCon
28e30 66 69 67 2d 3e 6e 50 72 65 66 69 78 20 26 26 20  fig->nPrefix && 
28e40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
28e50 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  ++){.    const i
28e60 6e 74 20 6e 43 68 61 72 20 3d 20 70 43 6f 6e 66  nt nChar = pConf
28e70 69 67 2d 3e 61 50 72 65 66 69 78 5b 69 5d 3b 0a  ig->aPrefix[i];.
28e80 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
28e90 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
28ea0 43 68 61 72 6c 65 6e 54 6f 42 79 74 65 6c 65 6e  CharlenToBytelen
28eb0 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 2c  (pToken, nToken,
28ec0 20 6e 43 68 61 72 29 3b 0a 20 20 20 20 69 66 28   nChar);.    if(
28ed0 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20   nByte ){.      
28ee0 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 35  rc = sqlite3Fts5
28ef0 48 61 73 68 57 72 69 74 65 28 70 2d 3e 70 48 61  HashWrite(p->pHa
28f00 73 68 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70  sh, .          p
28f10 2d 3e 69 57 72 69 74 65 52 6f 77 69 64 2c 20 69  ->iWriteRowid, i
28f20 43 6f 6c 2c 20 69 50 6f 73 2c 20 28 63 68 61 72  Col, iPos, (char
28f30 29 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46  )(FTS5_MAIN_PREF
28f40 49 58 2b 69 2b 31 29 2c 20 70 54 6f 6b 65 6e 2c  IX+i+1), pToken,
28f50 0a 20 20 20 20 20 20 20 20 20 20 6e 42 79 74 65  .          nByte
28f60 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
28f70 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
28f80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
28f90 61 20 6e 65 77 20 69 74 65 72 61 74 6f 72 20 74  a new iterator t
28fa0 6f 20 69 74 65 72 61 74 65 20 74 68 6f 75 67 68  o iterate though
28fb0 20 61 6c 6c 20 72 6f 77 69 64 20 74 68 61 74 20   all rowid that 
28fc0 6d 61 74 63 68 20 74 68 65 20 0a 2a 2a 20 73 70  match the .** sp
28fd0 65 63 69 66 69 65 64 20 74 6f 6b 65 6e 20 6f 72  ecified token or
28fe0 20 74 6f 6b 65 6e 20 70 72 65 66 69 78 2e 0a 2a   token prefix..*
28ff0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
29000 35 49 6e 64 65 78 51 75 65 72 79 28 0a 20 20 46  5IndexQuery(.  F
29010 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20  ts5Index *p,    
29020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29030 2a 20 46 54 53 20 69 6e 64 65 78 20 74 6f 20 71  * FTS index to q
29040 75 65 72 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  uery */.  const 
29050 63 68 61 72 20 2a 70 54 6f 6b 65 6e 2c 20 69 6e  char *pToken, in
29060 74 20 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 54 6f 6b  t nToken, /* Tok
29070 65 6e 20 28 6f 72 20 70 72 65 66 69 78 29 20 74  en (or prefix) t
29080 6f 20 71 75 65 72 79 20 66 6f 72 20 2a 2f 0a 20  o query for */. 
29090 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
290a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290b0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 46 54 53 35   /* Mask of FTS5
290c0 49 4e 44 45 58 5f 51 55 45 52 59 5f 58 20 66 6c  INDEX_QUERY_X fl
290d0 61 67 73 20 2a 2f 0a 20 20 46 74 73 35 43 6f 6c  ags */.  Fts5Col
290e0 73 65 74 20 2a 70 43 6f 6c 73 65 74 2c 20 20 20  set *pColset,   
290f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63           /* Matc
29100 68 20 74 68 65 73 65 20 63 6f 6c 75 6d 6e 73 20  h these columns 
29110 6f 6e 6c 79 20 2a 2f 0a 20 20 46 74 73 35 49 6e  only */.  Fts5In
29120 64 65 78 49 74 65 72 20 2a 2a 70 70 49 74 65 72  dexIter **ppIter
29130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
29140 3a 20 4e 65 77 20 69 74 65 72 61 74 6f 72 20 6f  : New iterator o
29150 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 46 74  bject */.){.  Ft
29160 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
29170 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a  g = p->pConfig;.
29180 20 20 46 74 73 35 49 74 65 72 20 2a 70 52 65 74    Fts5Iter *pRet
29190 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66 66   = 0;.  Fts5Buff
291a0 65 72 20 62 75 66 20 3d 20 7b 30 2c 20 30 2c 20  er buf = {0, 0, 
291b0 30 7d 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  0};..  /* If the
291c0 20 51 55 45 52 59 5f 53 43 41 4e 20 66 6c 61 67   QUERY_SCAN flag
291d0 20 69 73 20 73 65 74 2c 20 61 6c 6c 20 6f 74 68   is set, all oth
291e0 65 72 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65  er flags must be
291f0 20 63 6c 65 61 72 2e 20 2a 2f 0a 20 20 61 73 73   clear. */.  ass
29200 65 72 74 28 20 28 66 6c 61 67 73 20 26 20 46 54  ert( (flags & FT
29210 53 35 49 4e 44 45 58 5f 51 55 45 52 59 5f 53 43  S5INDEX_QUERY_SC
29220 41 4e 29 3d 3d 30 20 7c 7c 20 66 6c 61 67 73 3d  AN)==0 || flags=
29230 3d 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  =FTS5INDEX_QUERY
29240 5f 53 43 41 4e 20 29 3b 0a 0a 20 20 69 66 28 20  _SCAN );..  if( 
29250 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65  sqlite3Fts5Buffe
29260 72 53 69 7a 65 28 26 70 2d 3e 72 63 2c 20 26 62  rSize(&p->rc, &b
29270 75 66 2c 20 6e 54 6f 6b 65 6e 2b 31 29 3d 3d 30  uf, nToken+1)==0
29280 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 49 64 78   ){.    int iIdx
29290 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
292a0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 74        /* Index t
292b0 6f 20 73 65 61 72 63 68 20 2a 2f 0a 20 20 20 20  o search */.    
292c0 69 66 28 20 6e 54 6f 6b 65 6e 20 29 20 6d 65 6d  if( nToken ) mem
292d0 63 70 79 28 26 62 75 66 2e 70 5b 31 5d 2c 20 70  cpy(&buf.p[1], p
292e0 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29 3b 0a  Token, nToken);.
292f0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
29300 75 74 20 77 68 69 63 68 20 69 6e 64 65 78 20 74  ut which index t
29310 6f 20 73 65 61 72 63 68 20 61 6e 64 20 73 65 74  o search and set
29320 20 69 49 64 78 20 61 63 63 6f 72 64 69 6e 67 6c   iIdx accordingl
29330 79 2e 20 49 66 20 74 68 69 73 0a 20 20 20 20 2a  y. If this.    *
29340 2a 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75  * is a prefix qu
29350 65 72 79 20 66 6f 72 20 77 68 69 63 68 20 74 68  ery for which th
29360 65 72 65 20 69 73 20 6e 6f 20 70 72 65 66 69 78  ere is no prefix
29370 20 69 6e 64 65 78 2c 20 73 65 74 20 69 49 64 78   index, set iIdx
29380 20 74 6f 0a 20 20 20 20 2a 2a 20 67 72 65 61 74   to.    ** great
29390 65 72 20 74 68 61 6e 20 70 43 6f 6e 66 69 67 2d  er than pConfig-
293a0 3e 6e 50 72 65 66 69 78 20 74 6f 20 69 6e 64 69  >nPrefix to indi
293b0 63 61 74 65 20 74 68 61 74 20 74 68 65 20 71 75  cate that the qu
293c0 65 72 79 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ery will be.    
293d0 2a 2a 20 73 61 74 69 73 66 69 65 64 20 62 79 20  ** satisfied by 
293e0 73 63 61 6e 6e 69 6e 67 20 6d 75 6c 74 69 70 6c  scanning multipl
293f0 65 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d  e terms in the m
29400 61 69 6e 20 69 6e 64 65 78 2e 0a 20 20 20 20 2a  ain index..    *
29410 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
29420 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58  QUERY_TEST_NOIDX
29430 20 66 6c 61 67 20 77 61 73 20 73 70 65 63 69 66   flag was specif
29440 69 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  ied, then this m
29450 75 73 74 20 62 65 20 61 0a 20 20 20 20 2a 2a 20  ust be a.    ** 
29460 70 72 65 66 69 78 2d 71 75 65 72 79 2e 20 49 6e  prefix-query. In
29470 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 61  stead of using a
29480 20 70 72 65 66 69 78 2d 69 6e 64 65 78 20 28 69   prefix-index (i
29490 66 20 6f 6e 65 20 65 78 69 73 74 73 29 2c 20 0a  f one exists), .
294a0 20 20 20 20 2a 2a 20 65 76 61 6c 75 61 74 65 20      ** evaluate 
294b0 74 68 65 20 70 72 65 66 69 78 20 71 75 65 72 79  the prefix query
294c0 20 75 73 69 6e 67 20 74 68 65 20 6d 61 69 6e 20   using the main 
294d0 46 54 53 20 69 6e 64 65 78 2e 20 54 68 69 73 20  FTS index. This 
294e0 69 73 20 75 73 65 64 0a 20 20 20 20 2a 2a 20 66  is used.    ** f
294f0 6f 72 20 69 6e 74 65 72 6e 61 6c 20 73 61 6e 69  or internal sani
29500 74 79 20 63 68 65 63 6b 69 6e 67 20 62 79 20 74  ty checking by t
29510 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
29520 63 6b 20 69 6e 20 64 65 62 75 67 20 0a 20 20 20  ck in debug .   
29530 20 2a 2a 20 6d 6f 64 65 20 6f 6e 6c 79 2e 20 20   ** mode only.  
29540 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
29550 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70  _DEBUG.    if( p
29560 43 6f 6e 66 69 67 2d 3e 62 50 72 65 66 69 78 49  Config->bPrefixI
29570 6e 64 65 78 3d 3d 30 20 7c 7c 20 28 66 6c 61 67  ndex==0 || (flag
29580 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51 55  s & FTS5INDEX_QU
29590 45 52 59 5f 54 45 53 54 5f 4e 4f 49 44 58 29 20  ERY_TEST_NOIDX) 
295a0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
295b0 20 66 6c 61 67 73 20 26 20 46 54 53 35 49 4e 44   flags & FTS5IND
295c0 45 58 5f 51 55 45 52 59 5f 50 52 45 46 49 58 20  EX_QUERY_PREFIX 
295d0 29 3b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20  );.      iIdx = 
295e0 31 2b 70 43 6f 6e 66 69 67 2d 3e 6e 50 72 65 66  1+pConfig->nPref
295f0 69 78 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65  ix;.    }else.#e
29600 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 6c 61  ndif.    if( fla
29610 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f 51  gs & FTS5INDEX_Q
29620 55 45 52 59 5f 50 52 45 46 49 58 20 29 7b 0a 20  UERY_PREFIX ){. 
29630 20 20 20 20 20 69 6e 74 20 6e 43 68 61 72 20 3d       int nChar =
29640 20 66 74 73 35 49 6e 64 65 78 43 68 61 72 6c 65   fts5IndexCharle
29650 6e 28 70 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e  n(pToken, nToken
29660 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 49 64  );.      for(iId
29670 78 3d 31 3b 20 69 49 64 78 3c 3d 70 43 6f 6e 66  x=1; iIdx<=pConf
29680 69 67 2d 3e 6e 50 72 65 66 69 78 3b 20 69 49 64  ig->nPrefix; iId
29690 78 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  x++){.        if
296a0 28 20 70 43 6f 6e 66 69 67 2d 3e 61 50 72 65 66  ( pConfig->aPref
296b0 69 78 5b 69 49 64 78 2d 31 5d 3d 3d 6e 43 68 61  ix[iIdx-1]==nCha
296c0 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  r ) break;.     
296d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66   }.    }..    if
296e0 28 20 69 49 64 78 3c 3d 70 43 6f 6e 66 69 67 2d  ( iIdx<=pConfig-
296f0 3e 6e 50 72 65 66 69 78 20 29 7b 0a 20 20 20 20  >nPrefix ){.    
29700 20 20 2f 2a 20 53 74 72 61 69 67 68 74 20 69 6e    /* Straight in
29710 64 65 78 20 6c 6f 6f 6b 75 70 20 2a 2f 0a 20 20  dex lookup */.  
29720 20 20 20 20 46 74 73 35 53 74 72 75 63 74 75 72      Fts5Structur
29730 65 20 2a 70 53 74 72 75 63 74 20 3d 20 66 74 73  e *pStruct = fts
29740 35 53 74 72 75 63 74 75 72 65 52 65 61 64 28 70  5StructureRead(p
29750 29 3b 0a 20 20 20 20 20 20 62 75 66 2e 70 5b 30  );.      buf.p[0
29760 5d 20 3d 20 28 75 38 29 28 46 54 53 35 5f 4d 41  ] = (u8)(FTS5_MA
29770 49 4e 5f 50 52 45 46 49 58 20 2b 20 69 49 64 78  IN_PREFIX + iIdx
29780 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 74  );.      if( pSt
29790 72 75 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ruct ){.        
297a0 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 77  fts5MultiIterNew
297b0 28 70 2c 20 70 53 74 72 75 63 74 2c 20 66 6c 61  (p, pStruct, fla
297c0 67 73 20 7c 20 46 54 53 35 49 4e 44 45 58 5f 51  gs | FTS5INDEX_Q
297d0 55 45 52 59 5f 53 4b 49 50 45 4d 50 54 59 2c 20  UERY_SKIPEMPTY, 
297e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f  .            pCo
297f0 6c 73 65 74 2c 20 62 75 66 2e 70 2c 20 6e 54 6f  lset, buf.p, nTo
29800 6b 65 6e 2b 31 2c 20 2d 31 2c 20 30 2c 20 26 70  ken+1, -1, 0, &p
29810 52 65 74 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  Ret.        );. 
29820 20 20 20 20 20 20 20 66 74 73 35 53 74 72 75 63         fts5Struc
29830 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
29840 75 63 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uct);.      }.  
29850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
29860 2a 20 53 63 61 6e 20 6d 75 6c 74 69 70 6c 65 20  * Scan multiple 
29870 74 65 72 6d 73 20 69 6e 20 74 68 65 20 6d 61 69  terms in the mai
29880 6e 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 20  n index */.     
29890 20 69 6e 74 20 62 44 65 73 63 20 3d 20 28 66 6c   int bDesc = (fl
298a0 61 67 73 20 26 20 46 54 53 35 49 4e 44 45 58 5f  ags & FTS5INDEX_
298b0 51 55 45 52 59 5f 44 45 53 43 29 21 3d 30 3b 0a  QUERY_DESC)!=0;.
298c0 20 20 20 20 20 20 62 75 66 2e 70 5b 30 5d 20 3d        buf.p[0] =
298d0 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46 49   FTS5_MAIN_PREFI
298e0 58 3b 0a 20 20 20 20 20 20 66 74 73 35 53 65 74  X;.      fts5Set
298f0 75 70 50 72 65 66 69 78 49 74 65 72 28 70 2c 20  upPrefixIter(p, 
29900 62 44 65 73 63 2c 20 62 75 66 2e 70 2c 20 6e 54  bDesc, buf.p, nT
29910 6f 6b 65 6e 2b 31 2c 20 70 43 6f 6c 73 65 74 2c  oken+1, pColset,
29920 20 26 70 52 65 74 29 3b 0a 20 20 20 20 20 20 61   &pRet);.      a
29930 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51  ssert( p->rc!=SQ
29940 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 52 65 74 2d  LITE_OK || pRet-
29950 3e 70 43 6f 6c 73 65 74 3d 3d 30 20 29 3b 0a 20  >pColset==0 );. 
29960 20 20 20 20 20 66 74 73 35 49 74 65 72 53 65 74       fts5IterSet
29970 4f 75 74 70 75 74 43 62 28 26 70 2d 3e 72 63 2c  OutputCb(&p->rc,
29980 20 70 52 65 74 29 3b 0a 20 20 20 20 20 20 69 66   pRet);.      if
29990 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
299a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 46 74  OK ){.        Ft
299b0 73 35 53 65 67 49 74 65 72 20 2a 70 53 65 67 20  s5SegIter *pSeg 
299c0 3d 20 26 70 52 65 74 2d 3e 61 53 65 67 5b 70 52  = &pRet->aSeg[pR
299d0 65 74 2d 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46  et->aFirst[1].iF
299e0 69 72 73 74 5d 3b 0a 20 20 20 20 20 20 20 20 69  irst];.        i
299f0 66 28 20 70 53 65 67 2d 3e 70 4c 65 61 66 20 29  f( pSeg->pLeaf )
29a00 20 70 52 65 74 2d 3e 78 53 65 74 4f 75 74 70 75   pRet->xSetOutpu
29a10 74 73 28 70 52 65 74 2c 20 70 53 65 67 29 3b 0a  ts(pRet, pSeg);.
29a20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
29a30 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a     if( p->rc ){.
29a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73        sqlite3Fts
29a50 35 49 74 65 72 43 6c 6f 73 65 28 28 46 74 73 35  5IterClose((Fts5
29a60 49 6e 64 65 78 49 74 65 72 2a 29 70 52 65 74 29  IndexIter*)pRet)
29a70 3b 0a 20 20 20 20 20 20 70 52 65 74 20 3d 20 30  ;.      pRet = 0
29a80 3b 0a 20 20 20 20 20 20 66 74 73 35 43 6c 6f 73  ;.      fts5Clos
29a90 65 52 65 61 64 65 72 28 70 29 3b 0a 20 20 20 20  eReader(p);.    
29aa0 7d 0a 0a 20 20 20 20 2a 70 70 49 74 65 72 20 3d  }..    *ppIter =
29ab0 20 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 2a   (Fts5IndexIter*
29ac0 29 70 52 65 74 3b 0a 20 20 20 20 73 71 6c 69 74  )pRet;.    sqlit
29ad0 65 33 46 74 73 35 42 75 66 66 65 72 46 72 65 65  e3Fts5BufferFree
29ae0 28 26 62 75 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (&buf);.  }.  re
29af0 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65  turn fts5IndexRe
29b00 74 75 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn(p);.}../*.*
29b10 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
29b20 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 70 61   the iterator pa
29b30 73 73 65 64 20 61 73 20 74 68 65 20 6f 6e 6c 79  ssed as the only
29b40 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 74 20   argument is at 
29b50 45 4f 46 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 4d 6f  EOF..*/./*.** Mo
29b60 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  ve to the next m
29b70 61 74 63 68 69 6e 67 20 72 6f 77 69 64 2e 20 0a  atching rowid. .
29b80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74  */.int sqlite3Ft
29b90 73 35 49 74 65 72 4e 65 78 74 28 46 74 73 35 49  s5IterNext(Fts5I
29ba0 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78  ndexIter *pIndex
29bb0 49 74 65 72 29 7b 0a 20 20 46 74 73 35 49 74 65  Iter){.  Fts5Ite
29bc0 72 20 2a 70 49 74 65 72 20 3d 20 28 46 74 73 35  r *pIter = (Fts5
29bd0 49 74 65 72 2a 29 70 49 6e 64 65 78 49 74 65 72  Iter*)pIndexIter
29be0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 74 65  ;.  assert( pIte
29bf0 72 2d 3e 70 49 6e 64 65 78 2d 3e 72 63 3d 3d 53  r->pIndex->rc==S
29c00 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 66 74  QLITE_OK );.  ft
29c10 73 35 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28  s5MultiIterNext(
29c20 70 49 74 65 72 2d 3e 70 49 6e 64 65 78 2c 20 70  pIter->pIndex, p
29c30 49 74 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Iter, 0, 0);.  r
29c40 65 74 75 72 6e 20 66 74 73 35 49 6e 64 65 78 52  eturn fts5IndexR
29c50 65 74 75 72 6e 28 70 49 74 65 72 2d 3e 70 49 6e  eturn(pIter->pIn
29c60 64 65 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  dex);.}../*.** M
29c70 6f 76 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ove to the next 
29c80 6d 61 74 63 68 69 6e 67 20 74 65 72 6d 2f 72 6f  matching term/ro
29c90 77 69 64 2e 20 55 73 65 64 20 62 79 20 74 68 65  wid. Used by the
29ca0 20 66 74 73 35 76 6f 63 61 62 20 6d 6f 64 75 6c   fts5vocab modul
29cb0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
29cc0 33 46 74 73 35 49 74 65 72 4e 65 78 74 53 63 61  3Fts5IterNextSca
29cd0 6e 28 46 74 73 35 49 6e 64 65 78 49 74 65 72 20  n(Fts5IndexIter 
29ce0 2a 70 49 6e 64 65 78 49 74 65 72 29 7b 0a 20 20  *pIndexIter){.  
29cf0 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 20  Fts5Iter *pIter 
29d00 3d 20 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e  = (Fts5Iter*)pIn
29d10 64 65 78 49 74 65 72 3b 0a 20 20 46 74 73 35 49  dexIter;.  Fts5I
29d20 6e 64 65 78 20 2a 70 20 3d 20 70 49 74 65 72 2d  ndex *p = pIter-
29d30 3e 70 49 6e 64 65 78 3b 0a 0a 20 20 61 73 73 65  >pIndex;..  asse
29d40 72 74 28 20 70 49 74 65 72 2d 3e 70 49 6e 64 65  rt( pIter->pInde
29d50 78 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  x->rc==SQLITE_OK
29d60 20 29 3b 0a 0a 20 20 66 74 73 35 4d 75 6c 74 69   );..  fts5Multi
29d70 49 74 65 72 4e 65 78 74 28 70 2c 20 70 49 74 65  IterNext(p, pIte
29d80 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  r, 0, 0);.  if( 
29d90 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
29da0 20 29 7b 0a 20 20 20 20 46 74 73 35 53 65 67 49   ){.    Fts5SegI
29db0 74 65 72 20 2a 70 53 65 67 20 3d 20 26 70 49 74  ter *pSeg = &pIt
29dc0 65 72 2d 3e 61 53 65 67 5b 20 70 49 74 65 72 2d  er->aSeg[ pIter-
29dd0 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
29de0 74 20 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 65  t ];.    if( pSe
29df0 67 2d 3e 70 4c 65 61 66 20 26 26 20 70 53 65 67  g->pLeaf && pSeg
29e00 2d 3e 74 65 72 6d 2e 70 5b 30 5d 21 3d 46 54 53  ->term.p[0]!=FTS
29e10 35 5f 4d 41 49 4e 5f 50 52 45 46 49 58 20 29 7b  5_MAIN_PREFIX ){
29e20 0a 20 20 20 20 20 20 66 74 73 35 44 61 74 61 52  .      fts5DataR
29e30 65 6c 65 61 73 65 28 70 53 65 67 2d 3e 70 4c 65  elease(pSeg->pLe
29e40 61 66 29 3b 0a 20 20 20 20 20 20 70 53 65 67 2d  af);.      pSeg-
29e50 3e 70 4c 65 61 66 20 3d 20 30 3b 0a 20 20 20 20  >pLeaf = 0;.    
29e60 20 20 70 49 74 65 72 2d 3e 62 61 73 65 2e 62 45    pIter->base.bE
29e70 6f 66 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  of = 1;.    }.  
29e80 7d 0a 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  }..  return fts5
29e90 49 6e 64 65 78 52 65 74 75 72 6e 28 70 49 74 65  IndexReturn(pIte
29ea0 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d 0a 0a 2f  r->pIndex);.}../
29eb0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 6f 20 74 68 65  *.** Move to the
29ec0 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 72   next matching r
29ed0 6f 77 69 64 20 74 68 61 74 20 6f 63 63 75 72 73  owid that occurs
29ee0 20 61 74 20 6f 72 20 61 66 74 65 72 20 69 4d 61   at or after iMa
29ef0 74 63 68 2e 20 54 68 65 0a 2a 2a 20 64 65 66 69  tch. The.** defi
29f00 6e 69 74 69 6f 6e 20 6f 66 20 22 61 74 20 6f 72  nition of "at or
29f10 20 61 66 74 65 72 22 20 64 65 70 65 6e 64 73 20   after" depends 
29f20 6f 6e 20 77 68 65 74 68 65 72 20 74 68 69 73 20  on whether this 
29f30 69 74 65 72 61 74 6f 72 20 69 74 65 72 61 74 65  iterator iterate
29f40 73 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  s.** in ascendin
29f50 67 20 6f 72 20 64 65 73 63 65 6e 64 69 6e 67 20  g or descending 
29f60 72 6f 77 69 64 20 6f 72 64 65 72 2e 0a 2a 2f 0a  rowid order..*/.
29f70 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 35 49  int sqlite3Fts5I
29f80 74 65 72 4e 65 78 74 46 72 6f 6d 28 46 74 73 35  terNextFrom(Fts5
29f90 49 6e 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65  IndexIter *pInde
29fa0 78 49 74 65 72 2c 20 69 36 34 20 69 4d 61 74 63  xIter, i64 iMatc
29fb0 68 29 7b 0a 20 20 46 74 73 35 49 74 65 72 20 2a  h){.  Fts5Iter *
29fc0 70 49 74 65 72 20 3d 20 28 46 74 73 35 49 74 65  pIter = (Fts5Ite
29fd0 72 2a 29 70 49 6e 64 65 78 49 74 65 72 3b 0a 20  r*)pIndexIter;. 
29fe0 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 4e 65   fts5MultiIterNe
29ff0 78 74 46 72 6f 6d 28 70 49 74 65 72 2d 3e 70 49  xtFrom(pIter->pI
2a000 6e 64 65 78 2c 20 70 49 74 65 72 2c 20 69 4d 61  ndex, pIter, iMa
2a010 74 63 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  tch);.  return f
2a020 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
2a030 49 74 65 72 2d 3e 70 49 6e 64 65 78 29 3b 0a 7d  Iter->pIndex);.}
2a040 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2a050 68 65 20 63 75 72 72 65 6e 74 20 74 65 72 6d 2e  he current term.
2a060 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
2a070 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 54  sqlite3Fts5IterT
2a080 65 72 6d 28 46 74 73 35 49 6e 64 65 78 49 74 65  erm(Fts5IndexIte
2a090 72 20 2a 70 49 6e 64 65 78 49 74 65 72 2c 20 69  r *pIndexIter, i
2a0a0 6e 74 20 2a 70 6e 29 7b 0a 20 20 69 6e 74 20 6e  nt *pn){.  int n
2a0b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2a0c0 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  z = (const char*
2a0d0 29 66 74 73 35 4d 75 6c 74 69 49 74 65 72 54 65  )fts5MultiIterTe
2a0e0 72 6d 28 28 46 74 73 35 49 74 65 72 2a 29 70 49  rm((Fts5Iter*)pI
2a0f0 6e 64 65 78 49 74 65 72 2c 20 26 6e 29 3b 0a 20  ndexIter, &n);. 
2a100 20 2a 70 6e 20 3d 20 6e 2d 31 3b 0a 20 20 72 65   *pn = n-1;.  re
2a110 74 75 72 6e 20 26 7a 5b 31 5d 3b 0a 7d 0a 0a 2f  turn &z[1];.}../
2a120 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 69 74  *.** Close an it
2a130 65 72 61 74 6f 72 20 6f 70 65 6e 65 64 20 62 79  erator opened by
2a140 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
2a150 20 74 6f 20 73 71 6c 69 74 65 33 46 74 73 35 49   to sqlite3Fts5I
2a160 6e 64 65 78 51 75 65 72 79 28 29 2e 0a 2a 2f 0a  ndexQuery()..*/.
2a170 76 6f 69 64 20 73 71 6c 69 74 65 33 46 74 73 35  void sqlite3Fts5
2a180 49 74 65 72 43 6c 6f 73 65 28 46 74 73 35 49 6e  IterClose(Fts5In
2a190 64 65 78 49 74 65 72 20 2a 70 49 6e 64 65 78 49  dexIter *pIndexI
2a1a0 74 65 72 29 7b 0a 20 20 69 66 28 20 70 49 6e 64  ter){.  if( pInd
2a1b0 65 78 49 74 65 72 20 29 7b 0a 20 20 20 20 46 74  exIter ){.    Ft
2a1c0 73 35 49 74 65 72 20 2a 70 49 74 65 72 20 3d 20  s5Iter *pIter = 
2a1d0 28 46 74 73 35 49 74 65 72 2a 29 70 49 6e 64 65  (Fts5Iter*)pInde
2a1e0 78 49 74 65 72 3b 0a 20 20 20 20 46 74 73 35 49  xIter;.    Fts5I
2a1f0 6e 64 65 78 20 2a 70 49 6e 64 65 78 20 3d 20 70  ndex *pIndex = p
2a200 49 74 65 72 2d 3e 70 49 6e 64 65 78 3b 0a 20 20  Iter->pIndex;.  
2a210 20 20 66 74 73 35 4d 75 6c 74 69 49 74 65 72 46    fts5MultiIterF
2a220 72 65 65 28 70 49 74 65 72 29 3b 0a 20 20 20 20  ree(pIter);.    
2a230 66 74 73 35 43 6c 6f 73 65 52 65 61 64 65 72 28  fts5CloseReader(
2a240 70 49 6e 64 65 78 29 3b 0a 20 20 7d 0a 7d 0a 0a  pIndex);.  }.}..
2a250 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 6e 64 20 64  /*.** Read and d
2a260 65 63 6f 64 65 20 74 68 65 20 22 61 76 65 72 61  ecode the "avera
2a270 67 65 73 22 20 72 65 63 6f 72 64 20 66 72 6f 6d  ges" record from
2a280 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 0a   the database. .
2a290 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
2a2a0 61 6e 53 69 7a 65 20 6d 75 73 74 20 70 6f 69 6e  anSize must poin
2a2b0 74 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66  t to an array of
2a2c0 20 73 69 7a 65 20 6e 43 6f 6c 2c 20 77 68 65 72   size nCol, wher
2a2d0 65 20 6e 43 6f 6c 20 69 73 0a 2a 2a 20 74 68 65  e nCol is.** the
2a2e0 20 6e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 20   number of user 
2a2f0 64 65 66 69 6e 65 64 20 63 6f 6c 75 6d 6e 73 20  defined columns 
2a300 69 6e 20 74 68 65 20 46 54 53 20 74 61 62 6c 65  in the FTS table
2a310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2a320 46 74 73 35 49 6e 64 65 78 47 65 74 41 76 65 72  Fts5IndexGetAver
2a330 61 67 65 73 28 46 74 73 35 49 6e 64 65 78 20 2a  ages(Fts5Index *
2a340 70 2c 20 69 36 34 20 2a 70 6e 52 6f 77 2c 20 69  p, i64 *pnRow, i
2a350 36 34 20 2a 61 6e 53 69 7a 65 29 7b 0a 20 20 69  64 *anSize){.  i
2a360 6e 74 20 6e 43 6f 6c 20 3d 20 70 2d 3e 70 43 6f  nt nCol = p->pCo
2a370 6e 66 69 67 2d 3e 6e 43 6f 6c 3b 0a 20 20 46 74  nfig->nCol;.  Ft
2a380 73 35 44 61 74 61 20 2a 70 44 61 74 61 3b 0a 0a  s5Data *pData;..
2a390 20 20 2a 70 6e 52 6f 77 20 3d 20 30 3b 0a 20 20    *pnRow = 0;.  
2a3a0 6d 65 6d 73 65 74 28 61 6e 53 69 7a 65 2c 20 30  memset(anSize, 0
2a3b0 2c 20 73 69 7a 65 6f 66 28 69 36 34 29 20 2a 20  , sizeof(i64) * 
2a3c0 6e 43 6f 6c 29 3b 0a 20 20 70 44 61 74 61 20 3d  nCol);.  pData =
2a3d0 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
2a3e0 20 46 54 53 35 5f 41 56 45 52 41 47 45 53 5f 52   FTS5_AVERAGES_R
2a3f0 4f 57 49 44 29 3b 0a 20 20 69 66 28 20 70 2d 3e  OWID);.  if( p->
2a400 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2a410 20 70 44 61 74 61 2d 3e 6e 6e 20 29 7b 0a 20 20   pData->nn ){.  
2a420 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
2a430 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 69   int iCol;.    i
2a440 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2a450 74 28 26 70 44 61 74 61 2d 3e 70 5b 69 5d 2c 20  t(&pData->p[i], 
2a460 28 75 36 34 2a 29 70 6e 52 6f 77 29 3b 0a 20 20  (u64*)pnRow);.  
2a470 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 3c    for(iCol=0; i<
2a480 70 44 61 74 61 2d 3e 6e 6e 20 26 26 20 69 43 6f  pData->nn && iCo
2a490 6c 3c 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29 7b  l<nCol; iCol++){
2a4a0 0a 20 20 20 20 20 20 69 20 2b 3d 20 66 74 73 35  .      i += fts5
2a4b0 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
2a4c0 2d 3e 70 5b 69 5d 2c 20 28 75 36 34 2a 29 26 61  ->p[i], (u64*)&a
2a4d0 6e 53 69 7a 65 5b 69 43 6f 6c 5d 29 3b 0a 20 20  nSize[iCol]);.  
2a4e0 20 20 7d 0a 20 20 7d 0a 0a 20 20 66 74 73 35 44    }.  }..  fts5D
2a4f0 61 74 61 52 65 6c 65 61 73 65 28 70 44 61 74 61  ataRelease(pData
2a500 29 3b 0a 20 20 72 65 74 75 72 6e 20 66 74 73 35  );.  return fts5
2a510 49 6e 64 65 78 52 65 74 75 72 6e 28 70 29 3b 0a  IndexReturn(p);.
2a520 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  }../*.** Replace
2a530 20 74 68 65 20 63 75 72 72 65 6e 74 20 22 61 76   the current "av
2a540 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 20 77  erages" record w
2a550 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
2a560 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 0a   of the buffer .
2a570 2a 2a 20 73 75 70 70 6c 69 65 64 20 61 73 20 74  ** supplied as t
2a580 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a590 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
2a5a0 65 33 46 74 73 35 49 6e 64 65 78 53 65 74 41 76  e3Fts5IndexSetAv
2a5b0 65 72 61 67 65 73 28 46 74 73 35 49 6e 64 65 78  erages(Fts5Index
2a5c0 20 2a 70 2c 20 63 6f 6e 73 74 20 75 38 20 2a 70   *p, const u8 *p
2a5d0 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 29  Data, int nData)
2a5e0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72  {.  assert( p->r
2a5f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
2a600 20 20 66 74 73 35 44 61 74 61 57 72 69 74 65 28    fts5DataWrite(
2a610 70 2c 20 46 54 53 35 5f 41 56 45 52 41 47 45 53  p, FTS5_AVERAGES
2a620 5f 52 4f 57 49 44 2c 20 70 44 61 74 61 2c 20 6e  _ROWID, pData, n
2a630 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
2a640 66 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28  fts5IndexReturn(
2a650 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  p);.}../*.** Ret
2a660 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
2a670 6d 62 65 72 20 6f 66 20 62 6c 6f 63 6b 73 20 74  mber of blocks t
2a680 68 69 73 20 6d 6f 64 75 6c 65 20 68 61 73 20 72  his module has r
2a690 65 61 64 20 66 72 6f 6d 20 74 68 65 20 25 5f 64  ead from the %_d
2a6a0 61 74 61 0a 2a 2a 20 74 61 62 6c 65 20 73 69 6e  ata.** table sin
2a6b0 63 65 20 69 74 20 77 61 73 20 63 72 65 61 74 65  ce it was create
2a6c0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2a6d0 33 46 74 73 35 49 6e 64 65 78 52 65 61 64 73 28  3Fts5IndexReads(
2a6e0 46 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20  Fts5Index *p){. 
2a6f0 20 72 65 74 75 72 6e 20 70 2d 3e 6e 52 65 61 64   return p->nRead
2a700 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2a710 68 65 20 33 32 2d 62 69 74 20 63 6f 6f 6b 69 65  he 32-bit cookie
2a720 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 61 74   value stored at
2a730 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 6c   the start of al
2a740 6c 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20  l structure .** 
2a750 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 76  records to the v
2a760 61 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74  alue passed as t
2a770 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2a780 6e 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  nt..**.** Return
2a790 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75   SQLITE_OK if su
2a7a0 63 63 65 73 73 66 75 6c 2c 20 6f 72 20 61 6e 20  ccessful, or an 
2a7b0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2a7c0 65 20 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a  e if an error.**
2a7d0 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20   occurs..*/.int 
2a7e0 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2a7f0 53 65 74 43 6f 6f 6b 69 65 28 46 74 73 35 49 6e  SetCookie(Fts5In
2a800 64 65 78 20 2a 70 2c 20 69 6e 74 20 69 4e 65 77  dex *p, int iNew
2a810 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
2a820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
2a840 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  urn code */.  Ft
2a850 73 35 43 6f 6e 66 69 67 20 2a 70 43 6f 6e 66 69  s5Config *pConfi
2a860 67 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 3b 20  g = p->pConfig; 
2a870 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74     /* Configurat
2a880 69 6f 6e 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ion object */.  
2a890 75 38 20 61 43 6f 6f 6b 69 65 5b 34 5d 3b 20 20  u8 aCookie[4];  
2a8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a8b0 20 20 20 20 20 2f 2a 20 42 69 6e 61 72 79 20 72       /* Binary r
2a8c0 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
2a8d0 20 69 4e 65 77 20 2a 2f 0a 20 20 73 71 6c 69 74   iNew */.  sqlit
2a8e0 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d  e3_blob *pBlob =
2a8f0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
2a900 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
2a910 29 3b 0a 20 20 73 71 6c 69 74 65 33 46 74 73 35  );.  sqlite3Fts5
2a920 50 75 74 33 32 28 61 43 6f 6f 6b 69 65 2c 20 69  Put32(aCookie, i
2a930 4e 65 77 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  New);..  rc = sq
2a940 6c 69 74 65 33 5f 62 6c 6f 62 5f 6f 70 65 6e 28  lite3_blob_open(
2a950 70 43 6f 6e 66 69 67 2d 3e 64 62 2c 20 70 43 6f  pConfig->db, pCo
2a960 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 2d 3e 7a 44  nfig->zDb, p->zD
2a970 61 74 61 54 62 6c 2c 20 0a 20 20 20 20 20 20 22  ataTbl, .      "
2a980 62 6c 6f 63 6b 22 2c 20 46 54 53 35 5f 53 54 52  block", FTS5_STR
2a990 55 43 54 55 52 45 5f 52 4f 57 49 44 2c 20 31 2c  UCTURE_ROWID, 1,
2a9a0 20 26 70 42 6c 6f 62 0a 20 20 29 3b 0a 20 20 69   &pBlob.  );.  i
2a9b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a9c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a9d0 62 6c 6f 62 5f 77 72 69 74 65 28 70 42 6c 6f 62  blob_write(pBlob
2a9e0 2c 20 61 43 6f 6f 6b 69 65 2c 20 34 2c 20 30 29  , aCookie, 4, 0)
2a9f0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2aa00 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28 70 42  e3_blob_close(pB
2aa10 6c 6f 62 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  lob);.  }..  ret
2aa20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 69 6e 74 20 73  urn rc;.}..int s
2aa30 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78 4c  qlite3Fts5IndexL
2aa40 6f 61 64 43 6f 6e 66 69 67 28 46 74 73 35 49 6e  oadConfig(Fts5In
2aa50 64 65 78 20 2a 70 29 7b 0a 20 20 46 74 73 35 53  dex *p){.  Fts5S
2aa60 74 72 75 63 74 75 72 65 20 2a 70 53 74 72 75 63  tructure *pStruc
2aa70 74 3b 0a 20 20 70 53 74 72 75 63 74 20 3d 20 66  t;.  pStruct = f
2aa80 74 73 35 53 74 72 75 63 74 75 72 65 52 65 61 64  ts5StructureRead
2aa90 28 70 29 3b 0a 20 20 66 74 73 35 53 74 72 75 63  (p);.  fts5Struc
2aaa0 74 75 72 65 52 65 6c 65 61 73 65 28 70 53 74 72  tureRelease(pStr
2aab0 75 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 66  uct);.  return f
2aac0 74 73 35 49 6e 64 65 78 52 65 74 75 72 6e 28 70  ts5IndexReturn(p
2aad0 29 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  );.}.../********
2aae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2aaf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab20 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
2ab30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ab60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20  ************.** 
2ab70 42 65 6c 6f 77 20 74 68 69 73 20 70 6f 69 6e 74  Below this point
2ab80 20 69 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e   is the implemen
2ab90 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 69 6e  tation of the in
2aba0 74 65 67 72 69 74 79 2d 63 68 65 63 6b 20 0a 2a  tegrity-check .*
2abb0 2a 20 66 75 6e 63 74 69 6f 6e 61 6c 69 74 79 2e  * functionality.
2abc0 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .*/../*.** Retur
2abd0 6e 20 61 20 73 69 6d 70 6c 65 20 63 68 65 63 6b  n a simple check
2abe0 73 75 6d 20 76 61 6c 75 65 20 62 61 73 65 64 20  sum value based 
2abf0 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73  on the arguments
2ac00 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65 33  ..*/.u64 sqlite3
2ac10 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43 6b  Fts5IndexEntryCk
2ac20 73 75 6d 28 0a 20 20 69 36 34 20 69 52 6f 77 69  sum(.  i64 iRowi
2ac30 64 2c 20 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20  d, .  int iCol, 
2ac40 0a 20 20 69 6e 74 20 69 50 6f 73 2c 20 0a 20 20  .  int iPos, .  
2ac50 69 6e 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73  int iIdx,.  cons
2ac60 74 20 63 68 61 72 20 2a 70 54 65 72 6d 2c 0a 20  t char *pTerm,. 
2ac70 20 69 6e 74 20 6e 54 65 72 6d 0a 29 7b 0a 20 20   int nTerm.){.  
2ac80 69 6e 74 20 69 3b 0a 20 20 75 36 34 20 72 65 74  int i;.  u64 ret
2ac90 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 72 65 74   = iRowid;.  ret
2aca0 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b 20 69   += (ret<<3) + i
2acb0 43 6f 6c 3b 0a 20 20 72 65 74 20 2b 3d 20 28 72  Col;.  ret += (r
2acc0 65 74 3c 3c 33 29 20 2b 20 69 50 6f 73 3b 0a 20  et<<3) + iPos;. 
2acd0 20 69 66 28 20 69 49 64 78 3e 3d 30 20 29 20 72   if( iIdx>=0 ) r
2ace0 65 74 20 2b 3d 20 28 72 65 74 3c 3c 33 29 20 2b  et += (ret<<3) +
2acf0 20 28 46 54 53 35 5f 4d 41 49 4e 5f 50 52 45 46   (FTS5_MAIN_PREF
2ad00 49 58 20 2b 20 69 49 64 78 29 3b 0a 20 20 66 6f  IX + iIdx);.  fo
2ad10 72 28 69 3d 30 3b 20 69 3c 6e 54 65 72 6d 3b 20  r(i=0; i<nTerm; 
2ad20 69 2b 2b 29 20 72 65 74 20 2b 3d 20 28 72 65 74  i++) ret += (ret
2ad30 3c 3c 33 29 20 2b 20 70 54 65 72 6d 5b 69 5d 3b  <<3) + pTerm[i];
2ad40 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d  .  return ret;.}
2ad50 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2ad60 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73  DEBUG./*.** This
2ad70 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 70 75 72   function is pur
2ad80 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  ely an internal 
2ad90 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f  test. It does no
2ada0 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20  t contribute to 
2adb0 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e  .** FTS function
2adc0 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74  ality, or even t
2add0 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
2ade0 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  ck, in any way..
2adf0 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69  **.** Instead, i
2ae00 74 20 74 65 73 74 73 20 74 68 61 74 20 74 68 65  t tests that the
2ae10 20 73 61 6d 65 20 73 65 74 20 6f 66 20 70 67 6e   same set of pgn
2ae20 6f 2f 72 6f 77 69 64 20 63 6f 6d 62 69 6e 61 74  o/rowid combinat
2ae30 69 6f 6e 73 20 61 72 65 20 0a 2a 2a 20 76 69 73  ions are .** vis
2ae40 69 74 65 64 20 72 65 67 61 72 64 6c 65 73 73 20  ited regardless 
2ae50 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 64  of whether the d
2ae60 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 69 64 65  oclist-index ide
2ae70 6e 74 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ntified by param
2ae80 65 74 65 72 73 0a 2a 2a 20 69 53 65 67 69 64 2f  eters.** iSegid/
2ae90 69 4c 65 61 66 20 69 73 20 69 74 65 72 61 74 65  iLeaf is iterate
2aea0 64 20 69 6e 20 66 6f 72 77 61 72 64 73 20 6f 72  d in forwards or
2aeb0 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 0a   reverse order..
2aec0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2aed0 74 73 35 54 65 73 74 44 6c 69 64 78 52 65 76 65  ts5TestDlidxReve
2aee0 72 73 65 28 0a 20 20 46 74 73 35 49 6e 64 65 78  rse(.  Fts5Index
2aef0 20 2a 70 2c 20 0a 20 20 69 6e 74 20 69 53 65 67   *p, .  int iSeg
2af00 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
2af10 20 20 20 20 20 20 20 20 2f 2a 20 53 65 67 6d 65          /* Segme
2af20 6e 74 20 69 64 20 74 6f 20 6c 6f 61 64 20 66 72  nt id to load fr
2af30 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 65 61  om */.  int iLea
2af40 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f               
2af50 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 61 64 20          /* Load 
2af60 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 20 66 6f  doclist-index fo
2af70 72 20 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 29  r this leaf */.)
2af80 7b 0a 20 20 46 74 73 35 44 6c 69 64 78 49 74 65  {.  Fts5DlidxIte
2af90 72 20 2a 70 44 6c 69 64 78 20 3d 20 30 3b 0a 20  r *pDlidx = 0;. 
2afa0 20 75 36 34 20 63 6b 73 75 6d 31 20 3d 20 31 33   u64 cksum1 = 13
2afb0 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 32 20 3d  ;.  u64 cksum2 =
2afc0 20 31 33 3b 0a 0a 20 20 66 6f 72 28 70 44 6c 69   13;..  for(pDli
2afd0 64 78 3d 66 74 73 35 44 6c 69 64 78 49 74 65 72  dx=fts5DlidxIter
2afe0 49 6e 69 74 28 70 2c 20 30 2c 20 69 53 65 67 69  Init(p, 0, iSegi
2aff0 64 2c 20 69 4c 65 61 66 29 3b 0a 20 20 20 20 20  d, iLeaf);.     
2b000 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 45 6f   fts5DlidxIterEo
2b010 66 28 70 2c 20 70 44 6c 69 64 78 29 3d 3d 30 3b  f(p, pDlidx)==0;
2b020 0a 20 20 20 20 20 20 66 74 73 35 44 6c 69 64 78  .      fts5Dlidx
2b030 49 74 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69  IterNext(p, pDli
2b040 64 78 29 0a 20 20 29 7b 0a 20 20 20 20 69 36 34  dx).  ){.    i64
2b050 20 69 52 6f 77 69 64 20 3d 20 66 74 73 35 44 6c   iRowid = fts5Dl
2b060 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
2b070 69 64 78 29 3b 0a 20 20 20 20 69 6e 74 20 70 67  idx);.    int pg
2b080 6e 6f 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  no = fts5DlidxIt
2b090 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
2b0a0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2b0b0 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63 6b  >iLeaf );.    ck
2b0c0 73 75 6d 31 20 2b 3d 20 69 52 6f 77 69 64 20 2b  sum1 += iRowid +
2b0d0 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32 29   ((i64)pgno<<32)
2b0e0 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69 64  ;.  }.  fts5Dlid
2b0f0 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64 78  xIterFree(pDlidx
2b100 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30 3b  );.  pDlidx = 0;
2b110 0a 0a 20 20 66 6f 72 28 70 44 6c 69 64 78 3d 66  ..  for(pDlidx=f
2b120 74 73 35 44 6c 69 64 78 49 74 65 72 49 6e 69 74  ts5DlidxIterInit
2b130 28 70 2c 20 31 2c 20 69 53 65 67 69 64 2c 20 69  (p, 1, iSegid, i
2b140 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 66 74 73  Leaf);.      fts
2b150 35 44 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c  5DlidxIterEof(p,
2b160 20 70 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20   pDlidx)==0;.   
2b170 20 20 20 66 74 73 35 44 6c 69 64 78 49 74 65 72     fts5DlidxIter
2b180 50 72 65 76 28 70 2c 20 70 44 6c 69 64 78 29 0a  Prev(p, pDlidx).
2b190 20 20 29 7b 0a 20 20 20 20 69 36 34 20 69 52 6f    ){.    i64 iRo
2b1a0 77 69 64 20 3d 20 66 74 73 35 44 6c 69 64 78 49  wid = fts5DlidxI
2b1b0 74 65 72 52 6f 77 69 64 28 70 44 6c 69 64 78 29  terRowid(pDlidx)
2b1c0 3b 0a 20 20 20 20 69 6e 74 20 70 67 6e 6f 20 3d  ;.    int pgno =
2b1d0 20 66 74 73 35 44 6c 69 64 78 49 74 65 72 50 67   fts5DlidxIterPg
2b1e0 6e 6f 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20  no(pDlidx);.    
2b1f0 61 73 73 65 72 74 28 20 66 74 73 35 44 6c 69 64  assert( fts5Dlid
2b200 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69 64 78  xIterPgno(pDlidx
2b210 29 3e 69 4c 65 61 66 20 29 3b 0a 20 20 20 20 63  )>iLeaf );.    c
2b220 6b 73 75 6d 32 20 2b 3d 20 69 52 6f 77 69 64 20  ksum2 += iRowid 
2b230 2b 20 28 28 69 36 34 29 70 67 6e 6f 3c 3c 33 32  + ((i64)pgno<<32
2b240 29 3b 0a 20 20 7d 0a 20 20 66 74 73 35 44 6c 69  );.  }.  fts5Dli
2b250 64 78 49 74 65 72 46 72 65 65 28 70 44 6c 69 64  dxIterFree(pDlid
2b260 78 29 3b 0a 20 20 70 44 6c 69 64 78 20 3d 20 30  x);.  pDlidx = 0
2b270 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
2b280 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 73  SQLITE_OK && cks
2b290 75 6d 31 21 3d 63 6b 73 75 6d 32 20 29 20 70 2d  um1!=cksum2 ) p-
2b2a0 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2b2b0 50 54 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  PT;.}..static in
2b2c0 74 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  t fts5QueryCksum
2b2d0 28 0a 20 20 46 74 73 35 49 6e 64 65 78 20 2a 70  (.  Fts5Index *p
2b2e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b2f0 20 20 20 20 2f 2a 20 46 74 73 35 20 69 6e 64 65      /* Fts5 inde
2b300 78 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e  x object */.  in
2b310 74 20 69 49 64 78 2c 0a 20 20 63 6f 6e 73 74 20  t iIdx,.  const 
2b320 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20 20  char *z,        
2b330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
2b340 65 78 20 6b 65 79 20 74 6f 20 71 75 65 72 79 20  ex key to query 
2b350 66 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  for */.  int n, 
2b360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b370 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2b380 20 6f 66 20 69 6e 64 65 78 20 6b 65 79 20 69 6e   of index key in
2b390 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
2b3a0 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
2b3b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
2b3c0 6c 61 67 73 20 66 6f 72 20 46 74 73 35 49 6e 64  lags for Fts5Ind
2b3d0 65 78 51 75 65 72 79 20 2a 2f 0a 20 20 75 36 34  exQuery */.  u64
2b3e0 20 2a 70 43 6b 73 75 6d 20 20 20 20 20 20 20 20   *pCksum        
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b400 49 4e 2f 4f 55 54 3a 20 43 68 65 63 6b 73 75 6d  IN/OUT: Checksum
2b410 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20 69   value */.){.  i
2b420 6e 74 20 65 44 65 74 61 69 6c 20 3d 20 70 2d 3e  nt eDetail = p->
2b430 70 43 6f 6e 66 69 67 2d 3e 65 44 65 74 61 69 6c  pConfig->eDetail
2b440 3b 0a 20 20 75 36 34 20 63 6b 73 75 6d 20 3d 20  ;.  u64 cksum = 
2b450 2a 70 43 6b 73 75 6d 3b 0a 20 20 46 74 73 35 49  *pCksum;.  Fts5I
2b460 6e 64 65 78 49 74 65 72 20 2a 70 49 74 65 72 20  ndexIter *pIter 
2b470 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
2b480 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65 78  sqlite3Fts5Index
2b490 51 75 65 72 79 28 70 2c 20 7a 2c 20 6e 2c 20 66  Query(p, z, n, f
2b4a0 6c 61 67 73 2c 20 30 2c 20 26 70 49 74 65 72 29  lags, 0, &pIter)
2b4b0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  ;..  while( rc==
2b4c0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
2b4d0 73 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 45  sqlite3Fts5IterE
2b4e0 6f 66 28 70 49 74 65 72 29 20 29 7b 0a 20 20 20  of(pIter) ){.   
2b4f0 20 69 36 34 20 72 6f 77 69 64 20 3d 20 70 49 74   i64 rowid = pIt
2b500 65 72 2d 3e 69 52 6f 77 69 64 3b 0a 0a 20 20 20  er->iRowid;..   
2b510 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d 46 54   if( eDetail==FT
2b520 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45 20 29  S5_DETAIL_NONE )
2b530 7b 0a 20 20 20 20 20 20 63 6b 73 75 6d 20 5e 3d  {.      cksum ^=
2b540 20 73 71 6c 69 74 65 33 46 74 73 35 49 6e 64 65   sqlite3Fts5Inde
2b550 78 45 6e 74 72 79 43 6b 73 75 6d 28 72 6f 77 69  xEntryCksum(rowi
2b560 64 2c 20 30 2c 20 30 2c 20 69 49 64 78 2c 20 7a  d, 0, 0, iIdx, z
2b570 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
2b580 0a 20 20 20 20 20 20 46 74 73 35 50 6f 73 6c 69  .      Fts5Posli
2b590 73 74 52 65 61 64 65 72 20 73 52 65 61 64 65 72  stReader sReader
2b5a0 3b 0a 20 20 20 20 20 20 66 6f 72 28 73 71 6c 69  ;.      for(sqli
2b5b0 74 65 33 46 74 73 35 50 6f 73 6c 69 73 74 52 65  te3Fts5PoslistRe
2b5c0 61 64 65 72 49 6e 69 74 28 70 49 74 65 72 2d 3e  aderInit(pIter->
2b5d0 70 44 61 74 61 2c 20 70 49 74 65 72 2d 3e 6e 44  pData, pIter->nD
2b5e0 61 74 61 2c 20 26 73 52 65 61 64 65 72 29 3b 0a  ata, &sReader);.
2b5f0 20 20 20 20 20 20 20 20 20 20 73 52 65 61 64 65            sReade
2b600 72 2e 62 45 6f 66 3d 3d 30 3b 0a 20 20 20 20 20  r.bEof==0;.     
2b610 20 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35       sqlite3Fts5
2b620 50 6f 73 6c 69 73 74 52 65 61 64 65 72 4e 65 78  PoslistReaderNex
2b630 74 28 26 73 52 65 61 64 65 72 29 0a 20 20 20 20  t(&sReader).    
2b640 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74    ){.        int
2b650 20 69 43 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53   iCol = FTS5_POS
2b660 32 43 4f 4c 55 4d 4e 28 73 52 65 61 64 65 72 2e  2COLUMN(sReader.
2b670 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20 20 69  iPos);.        i
2b680 6e 74 20 69 4f 66 66 20 3d 20 46 54 53 35 5f 50  nt iOff = FTS5_P
2b690 4f 53 32 4f 46 46 53 45 54 28 73 52 65 61 64 65  OS2OFFSET(sReade
2b6a0 72 2e 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  r.iPos);.       
2b6b0 20 63 6b 73 75 6d 20 5e 3d 20 73 71 6c 69 74 65   cksum ^= sqlite
2b6c0 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79 43  3Fts5IndexEntryC
2b6d0 6b 73 75 6d 28 72 6f 77 69 64 2c 20 69 43 6f 6c  ksum(rowid, iCol
2b6e0 2c 20 69 4f 66 66 2c 20 69 49 64 78 2c 20 7a 2c  , iOff, iIdx, z,
2b6f0 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   n);.      }.   
2b700 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2b710 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
2b730 73 35 49 74 65 72 4e 65 78 74 28 70 49 74 65 72  s5IterNext(pIter
2b740 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
2b750 71 6c 69 74 65 33 46 74 73 35 49 74 65 72 43 6c  qlite3Fts5IterCl
2b760 6f 73 65 28 70 49 74 65 72 29 3b 0a 0a 20 20 2a  ose(pIter);..  *
2b770 70 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 3b 0a  pCksum = cksum;.
2b780 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b790 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
2b7a0 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 70 75 72  tion is also pur
2b7b0 65 6c 79 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20  ely an internal 
2b7c0 74 65 73 74 2e 20 49 74 20 64 6f 65 73 20 6e 6f  test. It does no
2b7d0 74 20 63 6f 6e 74 72 69 62 75 74 65 20 74 6f 20  t contribute to 
2b7e0 0a 2a 2a 20 46 54 53 20 66 75 6e 63 74 69 6f 6e  .** FTS function
2b7f0 61 6c 69 74 79 2c 20 6f 72 20 65 76 65 6e 20 74  ality, or even t
2b800 68 65 20 69 6e 74 65 67 72 69 74 79 2d 63 68 65  he integrity-che
2b810 63 6b 2c 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  ck, in any way..
2b820 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2b830 74 73 35 54 65 73 74 54 65 72 6d 28 0a 20 20 46  ts5TestTerm(.  F
2b840 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 0a 20 20  ts5Index *p, .  
2b850 46 74 73 35 42 75 66 66 65 72 20 2a 70 50 72 65  Fts5Buffer *pPre
2b860 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v,              
2b870 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 65 72 6d  /* Previous term
2b880 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
2b890 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 20 20 20 20   *z, int n,     
2b8a0 20 20 20 20 20 20 2f 2a 20 50 6f 73 73 69 62 6c        /* Possibl
2b8b0 79 20 6e 65 77 20 74 65 72 6d 20 74 6f 20 74 65  y new term to te
2b8c0 73 74 20 2a 2f 0a 20 20 75 36 34 20 65 78 70 65  st */.  u64 expe
2b8d0 63 74 65 64 2c 0a 20 20 75 36 34 20 2a 70 43 6b  cted,.  u64 *pCk
2b8e0 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  sum.){.  int rc 
2b8f0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
2b900 50 72 65 76 2d 3e 6e 3d 3d 30 20 29 7b 0a 20 20  Prev->n==0 ){.  
2b910 20 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28    fts5BufferSet(
2b920 26 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28  &rc, pPrev, n, (
2b930 63 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 20 20  const u8*)z);.  
2b940 7d 65 6c 73 65 0a 20 20 69 66 28 20 72 63 3d 3d  }else.  if( rc==
2b950 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 70 50  SQLITE_OK && (pP
2b960 72 65 76 2d 3e 6e 21 3d 6e 20 7c 7c 20 6d 65 6d  rev->n!=n || mem
2b970 63 6d 70 28 70 50 72 65 76 2d 3e 70 2c 20 7a 2c  cmp(pPrev->p, z,
2b980 20 6e 29 29 20 29 7b 0a 20 20 20 20 75 36 34 20   n)) ){.    u64 
2b990 63 6b 73 75 6d 33 20 3d 20 2a 70 43 6b 73 75 6d  cksum3 = *pCksum
2b9a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
2b9b0 20 2a 7a 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74   *zTerm = (const
2b9c0 20 63 68 61 72 2a 29 26 70 50 72 65 76 2d 3e 70   char*)&pPrev->p
2b9d0 5b 31 5d 3b 20 20 2f 2a 20 74 65 72 6d 20 73 61  [1];  /* term sa
2b9e0 6e 73 20 70 72 65 66 69 78 2d 62 79 74 65 20 2a  ns prefix-byte *
2b9f0 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 72 6d 20  /.    int nTerm 
2ba00 3d 20 70 50 72 65 76 2d 3e 6e 2d 31 3b 20 20 20  = pPrev->n-1;   
2ba10 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
2ba20 20 6f 66 20 7a 54 65 72 6d 20 69 6e 20 62 79 74   of zTerm in byt
2ba30 65 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49  es */.    int iI
2ba40 64 78 20 3d 20 28 70 50 72 65 76 2d 3e 70 5b 30  dx = (pPrev->p[0
2ba50 5d 20 2d 20 46 54 53 35 5f 4d 41 49 4e 5f 50 52  ] - FTS5_MAIN_PR
2ba60 45 46 49 58 29 3b 0a 20 20 20 20 69 6e 74 20 66  EFIX);.    int f
2ba70 6c 61 67 73 20 3d 20 28 69 49 64 78 3d 3d 30 20  lags = (iIdx==0 
2ba80 3f 20 30 20 3a 20 46 54 53 35 49 4e 44 45 58 5f  ? 0 : FTS5INDEX_
2ba90 51 55 45 52 59 5f 50 52 45 46 49 58 29 3b 0a 20  QUERY_PREFIX);. 
2baa0 20 20 20 75 36 34 20 63 6b 31 20 3d 20 30 3b 0a     u64 ck1 = 0;.
2bab0 20 20 20 20 75 36 34 20 63 6b 32 20 3d 20 30 3b      u64 ck2 = 0;
2bac0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74  ..    /* Check t
2bad0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
2bae0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 41 53 43  returned for ASC
2baf0 20 61 6e 64 20 44 45 53 43 20 71 75 65 72 69 65   and DESC querie
2bb00 73 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  s are.    ** the
2bb10 20 73 61 6d 65 2e 20 49 66 20 6e 6f 74 2c 20 63   same. If not, c
2bb20 61 6c 6c 20 74 68 69 73 20 63 6f 72 72 75 70 74  all this corrupt
2bb30 69 6f 6e 2e 20 20 2a 2f 0a 20 20 20 20 72 63 20  ion.  */.    rc 
2bb40 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d  = fts5QueryCksum
2bb50 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c  (p, iIdx, zTerm,
2bb60 20 6e 54 65 72 6d 2c 20 66 6c 61 67 73 2c 20 26   nTerm, flags, &
2bb70 63 6b 31 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ck1);.    if( rc
2bb80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2bb90 20 20 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61       int f = fla
2bba0 67 73 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45  gs|FTS5INDEX_QUE
2bbb0 52 59 5f 44 45 53 43 3b 0a 20 20 20 20 20 20 72  RY_DESC;.      r
2bbc0 63 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73  c = fts5QueryCks
2bbd0 75 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72  um(p, iIdx, zTer
2bbe0 6d 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b  m, nTerm, f, &ck
2bbf0 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  2);.    }.    if
2bc00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2bc10 26 26 20 63 6b 31 21 3d 63 6b 32 20 29 20 72 63  && ck1!=ck2 ) rc
2bc20 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2bc30 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
2bc40 20 69 73 20 61 20 70 72 65 66 69 78 20 71 75 65   is a prefix que
2bc50 72 79 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  ry, check that t
2bc60 68 65 20 72 65 73 75 6c 74 73 20 72 65 74 75 72  he results retur
2bc70 6e 65 64 20 69 66 20 74 68 65 0a 20 20 20 20 2a  ned if the.    *
2bc80 2a 20 74 68 65 20 69 6e 64 65 78 20 69 73 20 64  * the index is d
2bc90 69 73 61 62 6c 65 64 20 61 72 65 20 74 68 65 20  isabled are the 
2bca0 73 61 6d 65 2e 20 49 6e 20 62 6f 74 68 20 41 53  same. In both AS
2bcb0 43 20 61 6e 64 20 44 45 53 43 20 6f 72 64 65 72  C and DESC order
2bcc0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
2bcd0 20 54 68 69 73 20 63 68 65 63 6b 20 6d 61 79 20   This check may 
2bce0 6f 6e 6c 79 20 62 65 20 70 65 72 66 6f 72 6d 65  only be performe
2bcf0 64 20 69 66 20 74 68 65 20 68 61 73 68 20 74 61  d if the hash ta
2bd00 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 20 54 68  ble is empty. Th
2bd10 69 73 0a 20 20 20 20 2a 2a 20 69 73 20 62 65 63  is.    ** is bec
2bd20 61 75 73 65 20 74 68 65 20 68 61 73 68 20 74 61  ause the hash ta
2bd30 62 6c 65 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74  ble only support
2bd40 73 20 61 20 73 69 6e 67 6c 65 20 73 63 61 6e 20  s a single scan 
2bd50 71 75 65 72 79 20 61 74 0a 20 20 20 20 2a 2a 20  query at.    ** 
2bd60 61 20 74 69 6d 65 2c 20 61 6e 64 20 74 68 65 20  a time, and the 
2bd70 6d 75 6c 74 69 2d 69 74 65 72 20 6c 6f 6f 70 20  multi-iter loop 
2bd80 66 72 6f 6d 20 77 68 69 63 68 20 74 68 69 73 20  from which this 
2bd90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
2bda0 65 64 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 72  ed.    ** is alr
2bdb0 65 61 64 79 20 70 65 72 66 6f 72 6d 69 6e 67 20  eady performing 
2bdc0 73 75 63 68 20 61 20 73 63 61 6e 2e 20 2a 2f 0a  such a scan. */.
2bdd0 20 20 20 20 69 66 28 20 70 2d 3e 6e 50 65 6e 64      if( p->nPend
2bde0 69 6e 67 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20  ingData==0 ){.  
2bdf0 20 20 20 20 69 66 28 20 69 49 64 78 3e 30 20 26      if( iIdx>0 &
2be00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
2be10 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66  ){.        int f
2be20 20 3d 20 66 6c 61 67 73 7c 46 54 53 35 49 4e 44   = flags|FTS5IND
2be30 45 58 5f 51 55 45 52 59 5f 54 45 53 54 5f 4e 4f  EX_QUERY_TEST_NO
2be40 49 44 58 3b 0a 20 20 20 20 20 20 20 20 63 6b 32  IDX;.        ck2
2be50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
2be60 20 3d 20 66 74 73 35 51 75 65 72 79 43 6b 73 75   = fts5QueryCksu
2be70 6d 28 70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d  m(p, iIdx, zTerm
2be80 2c 20 6e 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32  , nTerm, f, &ck2
2be90 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2bea0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
2beb0 63 6b 31 21 3d 63 6b 32 20 29 20 72 63 20 3d 20  ck1!=ck2 ) rc = 
2bec0 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20  FTS5_CORRUPT;.  
2bed0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2bee0 69 49 64 78 3e 30 20 26 26 20 72 63 3d 3d 53 51  iIdx>0 && rc==SQ
2bef0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2bf00 20 20 20 69 6e 74 20 66 20 3d 20 66 6c 61 67 73     int f = flags
2bf10 7c 46 54 53 35 49 4e 44 45 58 5f 51 55 45 52 59  |FTS5INDEX_QUERY
2bf20 5f 54 45 53 54 5f 4e 4f 49 44 58 7c 46 54 53 35  _TEST_NOIDX|FTS5
2bf30 49 4e 44 45 58 5f 51 55 45 52 59 5f 44 45 53 43  INDEX_QUERY_DESC
2bf40 3b 0a 20 20 20 20 20 20 20 20 63 6b 32 20 3d 20  ;.        ck2 = 
2bf50 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  0;.        rc = 
2bf60 66 74 73 35 51 75 65 72 79 43 6b 73 75 6d 28 70  fts5QueryCksum(p
2bf70 2c 20 69 49 64 78 2c 20 7a 54 65 72 6d 2c 20 6e  , iIdx, zTerm, n
2bf80 54 65 72 6d 2c 20 66 2c 20 26 63 6b 32 29 3b 0a  Term, f, &ck2);.
2bf90 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
2bfa0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 6b 31  SQLITE_OK && ck1
2bfb0 21 3d 63 6b 32 20 29 20 72 63 20 3d 20 46 54 53  !=ck2 ) rc = FTS
2bfc0 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20  5_CORRUPT;.     
2bfd0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6b   }.    }..    ck
2bfe0 73 75 6d 33 20 5e 3d 20 63 6b 31 3b 0a 20 20 20  sum3 ^= ck1;.   
2bff0 20 66 74 73 35 42 75 66 66 65 72 53 65 74 28 26   fts5BufferSet(&
2c000 72 63 2c 20 70 50 72 65 76 2c 20 6e 2c 20 28 63  rc, pPrev, n, (c
2c010 6f 6e 73 74 20 75 38 2a 29 7a 29 3b 0a 0a 20 20  onst u8*)z);..  
2c020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c030 5f 4f 4b 20 26 26 20 63 6b 73 75 6d 33 21 3d 65  _OK && cksum3!=e
2c040 78 70 65 63 74 65 64 20 29 7b 0a 20 20 20 20 20  xpected ){.     
2c050 20 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55   rc = FTS5_CORRU
2c060 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70  PT;.    }.    *p
2c070 43 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 33 3b 0a  Cksum = cksum3;.
2c080 20 20 7d 0a 20 20 70 2d 3e 72 63 20 3d 20 72 63    }.  p->rc = rc
2c090 3b 0a 7d 0a 20 0a 23 65 6c 73 65 0a 23 20 64 65  ;.}. .#else.# de
2c0a0 66 69 6e 65 20 66 74 73 35 54 65 73 74 44 6c 69  fine fts5TestDli
2c0b0 64 78 52 65 76 65 72 73 65 28 78 2c 79 2c 7a 29  dxReverse(x,y,z)
2c0c0 0a 23 20 64 65 66 69 6e 65 20 66 74 73 35 54 65  .# define fts5Te
2c0d0 73 74 54 65 72 6d 28 75 2c 76 2c 77 2c 78 2c 79  stTerm(u,v,w,x,y
2c0e0 2c 7a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ,z).#endif../*.*
2c0f0 2a 20 43 68 65 63 6b 20 74 68 61 74 3a 0a 2a 2a  * Check that:.**
2c100 0a 2a 2a 20 20 20 31 29 20 41 6c 6c 20 6c 65 61  .**   1) All lea
2c110 76 65 73 20 6f 66 20 70 53 65 67 20 62 65 74 77  ves of pSeg betw
2c120 65 65 6e 20 69 46 69 72 73 74 20 61 6e 64 20 69  een iFirst and i
2c130 4c 61 73 74 20 28 69 6e 63 6c 75 73 69 76 65 29  Last (inclusive)
2c140 20 65 78 69 73 74 20 61 6e 64 0a 2a 2a 20 20 20   exist and.**   
2c150 20 20 20 63 6f 6e 74 61 69 6e 20 7a 65 72 6f 20     contain zero 
2c160 74 65 72 6d 73 2e 0a 2a 2a 20 20 20 32 29 20 41  terms..**   2) A
2c170 6c 6c 20 6c 65 61 76 65 73 20 6f 66 20 70 53 65  ll leaves of pSe
2c180 67 20 62 65 74 77 65 65 6e 20 69 4e 6f 52 6f 77  g between iNoRow
2c190 69 64 20 61 6e 64 20 69 4c 61 73 74 20 28 69 6e  id and iLast (in
2c1a0 63 6c 75 73 69 76 65 29 20 65 78 69 73 74 20 61  clusive) exist a
2c1b0 6e 64 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 74 61  nd.**      conta
2c1c0 69 6e 20 7a 65 72 6f 20 72 6f 77 69 64 73 2e 0a  in zero rowids..
2c1d0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
2c1e0 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72 69 74  ts5IndexIntegrit
2c1f0 79 43 68 65 63 6b 45 6d 70 74 79 28 0a 20 20 46  yCheckEmpty(.  F
2c200 74 73 35 49 6e 64 65 78 20 2a 70 2c 0a 20 20 46  ts5Index *p,.  F
2c210 74 73 35 53 74 72 75 63 74 75 72 65 53 65 67 6d  ts5StructureSegm
2c220 65 6e 74 20 2a 70 53 65 67 2c 20 20 20 20 20 2f  ent *pSeg,     /
2c230 2a 20 53 65 67 6d 65 6e 74 20 74 6f 20 63 68 65  * Segment to che
2c240 63 6b 20 69 6e 74 65 72 6e 61 6c 20 63 6f 6e 73  ck internal cons
2c250 69 73 74 65 6e 63 79 20 2a 2f 0a 20 20 69 6e 74  istency */.  int
2c260 20 69 46 69 72 73 74 2c 0a 20 20 69 6e 74 20 69   iFirst,.  int i
2c270 4e 6f 52 6f 77 69 64 2c 0a 20 20 69 6e 74 20 69  NoRowid,.  int i
2c280 4c 61 73 74 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Last.){.  int i;
2c290 0a 0a 20 20 2f 2a 20 4e 6f 77 20 63 68 65 63 6b  ..  /* Now check
2c2a0 20 74 68 61 74 20 74 68 65 20 69 74 65 72 2e 6e   that the iter.n
2c2b0 45 6d 70 74 79 20 6c 65 61 76 65 73 20 66 6f 6c  Empty leaves fol
2c2c0 6c 6f 77 69 6e 67 20 74 68 65 20 63 75 72 72 65  lowing the curre
2c2d0 6e 74 20 6c 65 61 66 0a 20 20 2a 2a 20 28 61 29  nt leaf.  ** (a)
2c2e0 20 65 78 69 73 74 20 61 6e 64 20 28 62 29 20 63   exist and (b) c
2c2f0 6f 6e 74 61 69 6e 20 6e 6f 20 74 65 72 6d 73 2e  ontain no terms.
2c300 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 69 46 69 72   */.  for(i=iFir
2c310 73 74 3b 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  st; p->rc==SQLIT
2c320 45 5f 4f 4b 20 26 26 20 69 3c 3d 69 4c 61 73 74  E_OK && i<=iLast
2c330 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 46 74 73 35  ; i++){.    Fts5
2c340 44 61 74 61 20 2a 70 4c 65 61 66 20 3d 20 66 74  Data *pLeaf = ft
2c350 73 35 44 61 74 61 52 65 61 64 28 70 2c 20 46 54  s5DataRead(p, FT
2c360 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2c370 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69  (pSeg->iSegid, i
2c380 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 61  ));.    if( pLea
2c390 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  f ){.      if( !
2c3a0 66 74 73 35 4c 65 61 66 49 73 54 65 72 6d 6c 65  fts5LeafIsTermle
2c3b0 73 73 28 70 4c 65 61 66 29 20 29 20 70 2d 3e 72  ss(pLeaf) ) p->r
2c3c0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2c3d0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 69  ;.      if( i>=i
2c3e0 4e 6f 52 6f 77 69 64 20 26 26 20 30 21 3d 66 74  NoRowid && 0!=ft
2c3f0 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69 64  s5LeafFirstRowid
2c400 4f 66 66 28 70 4c 65 61 66 29 20 29 20 70 2d 3e  Off(pLeaf) ) p->
2c410 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50  rc = FTS5_CORRUP
2c420 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 74 73  T;.    }.    fts
2c430 35 44 61 74 61 52 65 6c 65 61 73 65 28 70 4c 65  5DataRelease(pLe
2c440 61 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  af);.  }.}..stat
2c450 69 63 20 76 6f 69 64 20 66 74 73 35 49 6e 74 65  ic void fts5Inte
2c460 67 72 69 74 79 43 68 65 63 6b 50 67 69 64 78 28  grityCheckPgidx(
2c470 46 74 73 35 49 6e 64 65 78 20 2a 70 2c 20 46 74  Fts5Index *p, Ft
2c480 73 35 44 61 74 61 20 2a 70 4c 65 61 66 29 7b 0a  s5Data *pLeaf){.
2c490 20 20 69 6e 74 20 69 54 65 72 6d 4f 66 66 20 3d    int iTermOff =
2c4a0 20 30 3b 0a 20 20 69 6e 74 20 69 69 3b 0a 0a 20   0;.  int ii;.. 
2c4b0 20 46 74 73 35 42 75 66 66 65 72 20 62 75 66 31   Fts5Buffer buf1
2c4c0 20 3d 20 7b 30 2c 30 2c 30 7d 3b 0a 20 20 46 74   = {0,0,0};.  Ft
2c4d0 73 35 42 75 66 66 65 72 20 62 75 66 32 20 3d 20  s5Buffer buf2 = 
2c4e0 7b 30 2c 30 2c 30 7d 3b 0a 0a 20 20 69 69 20 3d  {0,0,0};..  ii =
2c4f0 20 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 3b 0a   pLeaf->szLeaf;.
2c500 20 20 77 68 69 6c 65 28 20 69 69 3c 70 4c 65 61    while( ii<pLea
2c510 66 2d 3e 6e 6e 20 26 26 20 70 2d 3e 72 63 3d 3d  f->nn && p->rc==
2c520 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2c530 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e   int res;.    in
2c540 74 20 69 4f 66 66 3b 0a 20 20 20 20 69 6e 74 20  t iOff;.    int 
2c550 6e 49 6e 63 72 3b 0a 0a 20 20 20 20 69 69 20 2b  nIncr;..    ii +
2c560 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
2c570 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 69 5d 2c  2(&pLeaf->p[ii],
2c580 20 6e 49 6e 63 72 29 3b 0a 20 20 20 20 69 54 65   nIncr);.    iTe
2c590 72 6d 4f 66 66 20 2b 3d 20 6e 49 6e 63 72 3b 0a  rmOff += nIncr;.
2c5a0 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72 6d      iOff = iTerm
2c5b0 4f 66 66 3b 0a 0a 20 20 20 20 69 66 28 20 69 4f  Off;..    if( iO
2c5c0 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65 61  ff>=pLeaf->szLea
2c5d0 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63  f ){.      p->rc
2c5e0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2c5f0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69  .    }else if( i
2c600 54 65 72 6d 4f 66 66 3d 3d 6e 49 6e 63 72 20 29  TermOff==nIncr )
2c610 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
2c620 65 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  e;.      iOff +=
2c630 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2c640 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
2c650 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20  , nByte);.      
2c660 69 66 28 20 28 69 4f 66 66 2b 6e 42 79 74 65 29  if( (iOff+nByte)
2c670 3e 70 4c 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29  >pLeaf->szLeaf )
2c680 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20  {.        p->rc 
2c690 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a  = FTS5_CORRUPT;.
2c6a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c6b0 20 20 20 20 20 66 74 73 35 42 75 66 66 65 72 53       fts5BufferS
2c6c0 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75 66 31  et(&p->rc, &buf1
2c6d0 2c 20 6e 42 79 74 65 2c 20 26 70 4c 65 61 66 2d  , nByte, &pLeaf-
2c6e0 3e 70 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  >p[iOff]);.     
2c6f0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2c700 20 20 20 20 69 6e 74 20 6e 4b 65 65 70 2c 20 6e      int nKeep, n
2c710 42 79 74 65 3b 0a 20 20 20 20 20 20 69 4f 66 66  Byte;.      iOff
2c720 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e   += fts5GetVarin
2c730 74 33 32 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f  t32(&pLeaf->p[iO
2c740 66 66 5d 2c 20 6e 4b 65 65 70 29 3b 0a 20 20 20  ff], nKeep);.   
2c750 20 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47     iOff += fts5G
2c760 65 74 56 61 72 69 6e 74 33 32 28 26 70 4c 65 61  etVarint32(&pLea
2c770 66 2d 3e 70 5b 69 4f 66 66 5d 2c 20 6e 42 79 74  f->p[iOff], nByt
2c780 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4b  e);.      if( nK
2c790 65 65 70 3e 62 75 66 31 2e 6e 20 7c 7c 20 28 69  eep>buf1.n || (i
2c7a0 4f 66 66 2b 6e 42 79 74 65 29 3e 70 4c 65 61 66  Off+nByte)>pLeaf
2c7b0 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  ->szLeaf ){.    
2c7c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 46 54 53 35      p->rc = FTS5
2c7d0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20  _CORRUPT;.      
2c7e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 62  }else{.        b
2c7f0 75 66 31 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20  uf1.n = nKeep;. 
2c800 20 20 20 20 20 20 20 66 74 73 35 42 75 66 66 65         fts5Buffe
2c810 72 41 70 70 65 6e 64 42 6c 6f 62 28 26 70 2d 3e  rAppendBlob(&p->
2c820 72 63 2c 20 26 62 75 66 31 2c 20 6e 42 79 74 65  rc, &buf1, nByte
2c830 2c 20 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66  , &pLeaf->p[iOff
2c840 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ]);.      }..   
2c850 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
2c860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c870 20 20 20 72 65 73 20 3d 20 66 74 73 35 42 75 66     res = fts5Buf
2c880 66 65 72 43 6f 6d 70 61 72 65 28 26 62 75 66 31  ferCompare(&buf1
2c890 2c 20 26 62 75 66 32 29 3b 0a 20 20 20 20 20 20  , &buf2);.      
2c8a0 20 20 69 66 28 20 72 65 73 3c 3d 30 20 29 20 70    if( res<=0 ) p
2c8b0 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52  ->rc = FTS5_CORR
2c8c0 55 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  UPT;.      }.   
2c8d0 20 7d 0a 20 20 20 20 66 74 73 35 42 75 66 66 65   }.    fts5Buffe
2c8e0 72 53 65 74 28 26 70 2d 3e 72 63 2c 20 26 62 75  rSet(&p->rc, &bu
2c8f0 66 32 2c 20 62 75 66 31 2e 6e 2c 20 62 75 66 31  f2, buf1.n, buf1
2c900 2e 70 29 3b 0a 20 20 7d 0a 0a 20 20 66 74 73 35  .p);.  }..  fts5
2c910 42 75 66 66 65 72 46 72 65 65 28 26 62 75 66 31  BufferFree(&buf1
2c920 29 3b 0a 20 20 66 74 73 35 42 75 66 66 65 72 46  );.  fts5BufferF
2c930 72 65 65 28 26 62 75 66 32 29 3b 0a 7d 0a 0a 73  ree(&buf2);.}..s
2c940 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35 49  tatic void fts5I
2c950 6e 64 65 78 49 6e 74 65 67 72 69 74 79 43 68 65  ndexIntegrityChe
2c960 63 6b 53 65 67 6d 65 6e 74 28 0a 20 20 46 74 73  ckSegment(.  Fts
2c970 35 49 6e 64 65 78 20 2a 70 2c 20 20 20 20 20 20  5Index *p,      
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c990 46 54 53 35 20 62 61 63 6b 65 6e 64 20 6f 62 6a  FTS5 backend obj
2c9a0 65 63 74 20 2a 2f 0a 20 20 46 74 73 35 53 74 72  ect */.  Fts5Str
2c9b0 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2c9c0 53 65 67 20 20 20 20 20 20 2f 2a 20 53 65 67 6d  Seg      /* Segm
2c9d0 65 6e 74 20 74 6f 20 63 68 65 63 6b 20 69 6e 74  ent to check int
2c9e0 65 72 6e 61 6c 20 63 6f 6e 73 69 73 74 65 6e 63  ernal consistenc
2c9f0 79 20 2a 2f 0a 29 7b 0a 20 20 46 74 73 35 43 6f  y */.){.  Fts5Co
2ca00 6e 66 69 67 20 2a 70 43 6f 6e 66 69 67 20 3d 20  nfig *pConfig = 
2ca10 70 2d 3e 70 43 6f 6e 66 69 67 3b 0a 20 20 73 71  p->pConfig;.  sq
2ca20 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2ca30 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 32  t = 0;.  int rc2
2ca40 3b 0a 20 20 69 6e 74 20 69 49 64 78 50 72 65 76  ;.  int iIdxPrev
2ca50 4c 65 61 66 20 3d 20 70 53 65 67 2d 3e 70 67 6e  Leaf = pSeg->pgn
2ca60 6f 46 69 72 73 74 2d 31 3b 0a 20 20 69 6e 74 20  oFirst-1;.  int 
2ca70 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 20 3d  iDlidxPrevLeaf =
2ca80 20 70 53 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b   pSeg->pgnoLast;
2ca90 0a 0a 20 20 69 66 28 20 70 53 65 67 2d 3e 70 67  ..  if( pSeg->pg
2caa0 6e 6f 46 69 72 73 74 3d 3d 30 20 29 20 72 65 74  noFirst==0 ) ret
2cab0 75 72 6e 3b 0a 0a 20 20 66 74 73 35 49 6e 64 65  urn;..  fts5Inde
2cac0 78 50 72 65 70 61 72 65 53 74 6d 74 28 70 2c 20  xPrepareStmt(p, 
2cad0 26 70 53 74 6d 74 2c 20 73 71 6c 69 74 65 33 5f  &pStmt, sqlite3_
2cae0 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 22  mprintf(.      "
2caf0 53 45 4c 45 43 54 20 73 65 67 69 64 2c 20 74 65  SELECT segid, te
2cb00 72 6d 2c 20 28 70 67 6e 6f 3e 3e 31 29 2c 20 28  rm, (pgno>>1), (
2cb10 70 67 6e 6f 26 31 29 20 46 52 4f 4d 20 25 51 2e  pgno&1) FROM %Q.
2cb20 27 25 71 5f 69 64 78 27 20 57 48 45 52 45 20 73  '%q_idx' WHERE s
2cb30 65 67 69 64 3d 25 64 22 2c 0a 20 20 20 20 20 20  egid=%d",.      
2cb40 70 43 6f 6e 66 69 67 2d 3e 7a 44 62 2c 20 70 43  pConfig->zDb, pC
2cb50 6f 6e 66 69 67 2d 3e 7a 4e 61 6d 65 2c 20 70 53  onfig->zName, pS
2cb60 65 67 2d 3e 69 53 65 67 69 64 0a 20 20 29 29 3b  eg->iSegid.  ));
2cb70 0a 0a 20 20 2f 2a 20 49 74 65 72 61 74 65 20 74  ..  /* Iterate t
2cb80 68 72 6f 75 67 68 20 74 68 65 20 62 2d 74 72 65  hrough the b-tre
2cb90 65 20 68 69 65 72 61 72 63 68 79 2e 20 20 2a 2f  e hierarchy.  */
2cba0 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 72 63 3d  .  while( p->rc=
2cbb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51  =SQLITE_OK && SQ
2cbc0 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
2cbd0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b  3_step(pStmt) ){
2cbe0 0a 20 20 20 20 69 36 34 20 69 52 6f 77 3b 20 20  .    i64 iRow;  
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cc00 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
2cc10 74 68 69 73 20 6c 65 61 66 20 2a 2f 0a 20 20 20  this leaf */.   
2cc20 20 46 74 73 35 44 61 74 61 20 2a 70 4c 65 61 66   Fts5Data *pLeaf
2cc30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2cc40 2a 20 44 61 74 61 20 66 6f 72 20 74 68 69 73 20  * Data for this 
2cc50 6c 65 61 66 20 2a 2f 0a 0a 20 20 20 20 69 6e 74  leaf */..    int
2cc60 20 6e 49 64 78 54 65 72 6d 20 3d 20 73 71 6c 69   nIdxTerm = sqli
2cc70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
2cc80 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
2cc90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
2cca0 54 65 72 6d 20 3d 20 28 63 6f 6e 73 74 20 63 68  Term = (const ch
2ccb0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
2ccc0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
2ccd0 29 3b 0a 20 20 20 20 69 6e 74 20 69 49 64 78 4c  );.    int iIdxL
2cce0 65 61 66 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  eaf = sqlite3_co
2ccf0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
2cd00 32 29 3b 0a 20 20 20 20 69 6e 74 20 62 49 64 78  2);.    int bIdx
2cd10 44 6c 69 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  Dlidx = sqlite3_
2cd20 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
2cd30 2c 20 33 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  , 3);..    /* If
2cd40 20 74 68 65 20 6c 65 61 66 20 69 6e 20 71 75 65   the leaf in que
2cd50 73 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  stion has alread
2cd60 79 20 62 65 65 6e 20 74 72 69 6d 6d 65 64 20 66  y been trimmed f
2cd70 72 6f 6d 20 74 68 65 20 73 65 67 6d 65 6e 74 2c  rom the segment,
2cd80 20 0a 20 20 20 20 2a 2a 20 69 67 6e 6f 72 65 20   .    ** ignore 
2cd90 74 68 69 73 20 62 2d 74 72 65 65 20 65 6e 74 72  this b-tree entr
2cda0 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 6c 6f  y. Otherwise, lo
2cdb0 61 64 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72  ad it into memor
2cdc0 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 49  y. */.    if( iI
2cdd0 64 78 4c 65 61 66 3c 70 53 65 67 2d 3e 70 67 6e  dxLeaf<pSeg->pgn
2cde0 6f 46 69 72 73 74 20 29 20 63 6f 6e 74 69 6e 75  oFirst ) continu
2cdf0 65 3b 0a 20 20 20 20 69 52 6f 77 20 3d 20 46 54  e;.    iRow = FT
2ce00 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2ce10 28 70 53 65 67 2d 3e 69 53 65 67 69 64 2c 20 69  (pSeg->iSegid, i
2ce20 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20 70 4c  IdxLeaf);.    pL
2ce30 65 61 66 20 3d 20 66 74 73 35 4c 65 61 66 52 65  eaf = fts5LeafRe
2ce40 61 64 28 70 2c 20 69 52 6f 77 29 3b 0a 20 20 20  ad(p, iRow);.   
2ce50 20 69 66 28 20 70 4c 65 61 66 3d 3d 30 20 29 20   if( pLeaf==0 ) 
2ce60 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 43  break;..    /* C
2ce70 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c 65  heck that the le
2ce80 61 66 20 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c  af contains at l
2ce90 65 61 73 74 20 6f 6e 65 20 74 65 72 6d 2c 20 61  east one term, a
2cea0 6e 64 20 74 68 61 74 20 69 74 20 69 73 20 65 71  nd that it is eq
2ceb0 75 61 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 6f 72  ual.    ** to or
2cec0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
2ced0 20 73 70 6c 69 74 2d 6b 65 79 20 69 6e 20 7a 49   split-key in zI
2cee0 64 78 54 65 72 6d 2e 20 20 41 6c 73 6f 20 63 68  dxTerm.  Also ch
2cef0 65 63 6b 20 74 68 61 74 20 69 66 20 74 68 65 72  eck that if ther
2cf00 65 0a 20 20 20 20 2a 2a 20 69 73 20 61 6c 73 6f  e.    ** is also
2cf10 20 61 20 72 6f 77 69 64 20 70 6f 69 6e 74 65 72   a rowid pointer
2cf20 20 77 69 74 68 69 6e 20 74 68 65 20 6c 65 61 66   within the leaf
2cf30 20 70 61 67 65 20 68 65 61 64 65 72 2c 20 69 74   page header, it
2cf40 20 70 6f 69 6e 74 73 20 74 6f 20 61 0a 20 20 20   points to a.   
2cf50 20 2a 2a 20 6c 6f 63 61 74 69 6f 6e 20 62 65 66   ** location bef
2cf60 6f 72 65 20 74 68 65 20 74 65 72 6d 2e 20 20 2a  ore the term.  *
2cf70 2f 0a 20 20 20 20 69 66 28 20 70 4c 65 61 66 2d  /.    if( pLeaf-
2cf80 3e 6e 6e 3c 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  >nn<=pLeaf->szLe
2cf90 61 66 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  af ){.      p->r
2cfa0 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54  c = FTS5_CORRUPT
2cfb0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2cfc0 20 20 20 69 6e 74 20 69 4f 66 66 3b 20 20 20 20     int iOff;    
2cfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cfe0 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
2cff0 74 20 74 65 72 6d 20 6f 6e 20 6c 65 61 66 20 2a  t term on leaf *
2d000 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 52 6f 77  /.      int iRow
2d010 69 64 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  idOff;          
2d020 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
2d030 20 66 69 72 73 74 20 72 6f 77 69 64 20 6f 6e 20   first rowid on 
2d040 6c 65 61 66 20 2a 2f 0a 20 20 20 20 20 20 69 6e  leaf */.      in
2d050 74 20 6e 54 65 72 6d 3b 20 20 20 20 20 20 20 20  t nTerm;        
2d060 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2d070 65 20 6f 66 20 74 65 72 6d 20 6f 6e 20 6c 65 61  e of term on lea
2d080 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
2d090 20 20 20 20 69 6e 74 20 72 65 73 3b 20 20 20 20      int res;    
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0b0 2f 2a 20 43 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  /* Comparison of
2d0c0 20 74 65 72 6d 20 61 6e 64 20 73 70 6c 69 74 2d   term and split-
2d0d0 6b 65 79 20 2a 2f 0a 0a 20 20 20 20 20 20 69 4f  key */..      iO
2d0e0 66 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72  ff = fts5LeafFir
2d0f0 73 74 54 65 72 6d 4f 66 66 28 70 4c 65 61 66 29  stTermOff(pLeaf)
2d100 3b 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66  ;.      iRowidOf
2d110 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
2d120 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
2d130 3b 0a 20 20 20 20 20 20 69 66 28 20 69 52 6f 77  ;.      if( iRow
2d140 69 64 4f 66 66 3e 3d 69 4f 66 66 20 7c 7c 20 69  idOff>=iOff || i
2d150 4f 66 66 3e 3d 70 4c 65 61 66 2d 3e 73 7a 4c 65  Off>=pLeaf->szLe
2d160 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  af ){.        p-
2d170 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2d180 50 54 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  PT;.      }else{
2d190 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
2d1a0 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32   fts5GetVarint32
2d1b0 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66 66 5d  (&pLeaf->p[iOff]
2d1c0 2c 20 6e 54 65 72 6d 29 3b 0a 20 20 20 20 20 20  , nTerm);.      
2d1d0 20 20 72 65 73 20 3d 20 66 74 73 35 4d 65 6d 63    res = fts5Memc
2d1e0 6d 70 28 26 70 4c 65 61 66 2d 3e 70 5b 69 4f 66  mp(&pLeaf->p[iOf
2d1f0 66 5d 2c 20 7a 49 64 78 54 65 72 6d 2c 20 4d 49  f], zIdxTerm, MI
2d200 4e 28 6e 54 65 72 6d 2c 20 6e 49 64 78 54 65 72  N(nTerm, nIdxTer
2d210 6d 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m));.        if(
2d220 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d 20   res==0 ) res = 
2d230 6e 54 65 72 6d 20 2d 20 6e 49 64 78 54 65 72 6d  nTerm - nIdxTerm
2d240 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65  ;.        if( re
2d250 73 3c 30 20 29 20 70 2d 3e 72 63 20 3d 20 46 54  s<0 ) p->rc = FT
2d260 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  S5_CORRUPT;.    
2d270 20 20 7d 0a 0a 20 20 20 20 20 20 66 74 73 35 49    }..      fts5I
2d280 6e 74 65 67 72 69 74 79 43 68 65 63 6b 50 67 69  ntegrityCheckPgi
2d290 64 78 28 70 2c 20 70 4c 65 61 66 29 3b 0a 20 20  dx(p, pLeaf);.  
2d2a0 20 20 7d 0a 20 20 20 20 66 74 73 35 44 61 74 61    }.    fts5Data
2d2b0 52 65 6c 65 61 73 65 28 70 4c 65 61 66 29 3b 0a  Release(pLeaf);.
2d2c0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 20 29 20      if( p->rc ) 
2d2d0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 4e  break;..    /* N
2d2e0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
2d2f0 65 20 69 74 65 72 2e 6e 45 6d 70 74 79 20 6c 65  e iter.nEmpty le
2d300 61 76 65 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  aves following t
2d310 68 65 20 63 75 72 72 65 6e 74 20 6c 65 61 66 0a  he current leaf.
2d320 20 20 20 20 2a 2a 20 28 61 29 20 65 78 69 73 74      ** (a) exist
2d330 20 61 6e 64 20 28 62 29 20 63 6f 6e 74 61 69 6e   and (b) contain
2d340 20 6e 6f 20 74 65 72 6d 73 2e 20 2a 2f 0a 20 20   no terms. */.  
2d350 20 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67    fts5IndexInteg
2d360 72 69 74 79 43 68 65 63 6b 45 6d 70 74 79 28 0a  rityCheckEmpty(.
2d370 20 20 20 20 20 20 20 20 70 2c 20 70 53 65 67 2c          p, pSeg,
2d380 20 69 49 64 78 50 72 65 76 4c 65 61 66 2b 31 2c   iIdxPrevLeaf+1,
2d390 20 69 44 6c 69 64 78 50 72 65 76 4c 65 61 66 2b   iDlidxPrevLeaf+
2d3a0 31 2c 20 69 49 64 78 4c 65 61 66 2d 31 0a 20 20  1, iIdxLeaf-1.  
2d3b0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e    );.    if( p->
2d3c0 72 63 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  rc ) break;..   
2d3d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   /* If there is 
2d3e0 61 20 64 6f 63 6c 69 73 74 2d 69 6e 64 65 78 2c  a doclist-index,
2d3f0 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 6c   check that it l
2d400 6f 6f 6b 73 20 72 69 67 68 74 2e 20 2a 2f 0a 20  ooks right. */. 
2d410 20 20 20 69 66 28 20 62 49 64 78 44 6c 69 64 78     if( bIdxDlidx
2d420 20 29 7b 0a 20 20 20 20 20 20 46 74 73 35 44 6c   ){.      Fts5Dl
2d430 69 64 78 49 74 65 72 20 2a 70 44 6c 69 64 78 20  idxIter *pDlidx 
2d440 3d 20 30 3b 20 20 2f 2a 20 46 6f 72 20 69 74 65  = 0;  /* For ite
2d450 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 64  rating through d
2d460 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
2d470 20 20 20 20 20 20 69 6e 74 20 69 50 72 65 76 4c        int iPrevL
2d480 65 61 66 20 3d 20 69 49 64 78 4c 65 61 66 3b 0a  eaf = iIdxLeaf;.
2d490 20 20 20 20 20 20 69 6e 74 20 69 53 65 67 69 64        int iSegid
2d4a0 20 3d 20 70 53 65 67 2d 3e 69 53 65 67 69 64 3b   = pSeg->iSegid;
2d4b0 0a 20 20 20 20 20 20 69 6e 74 20 69 50 67 20 3d  .      int iPg =
2d4c0 20 30 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4b   0;.      i64 iK
2d4d0 65 79 3b 0a 0a 20 20 20 20 20 20 66 6f 72 28 70  ey;..      for(p
2d4e0 44 6c 69 64 78 3d 66 74 73 35 44 6c 69 64 78 49  Dlidx=fts5DlidxI
2d4f0 74 65 72 49 6e 69 74 28 70 2c 20 30 2c 20 69 53  terInit(p, 0, iS
2d500 65 67 69 64 2c 20 69 49 64 78 4c 65 61 66 29 3b  egid, iIdxLeaf);
2d510 0a 20 20 20 20 20 20 20 20 20 20 66 74 73 35 44  .          fts5D
2d520 6c 69 64 78 49 74 65 72 45 6f 66 28 70 2c 20 70  lidxIterEof(p, p
2d530 44 6c 69 64 78 29 3d 3d 30 3b 0a 20 20 20 20 20  Dlidx)==0;.     
2d540 20 20 20 20 20 66 74 73 35 44 6c 69 64 78 49 74       fts5DlidxIt
2d550 65 72 4e 65 78 74 28 70 2c 20 70 44 6c 69 64 78  erNext(p, pDlidx
2d560 29 0a 20 20 20 20 20 20 29 7b 0a 0a 20 20 20 20  ).      ){..    
2d570 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 61 6e 79      /* Check any
2d580 20 72 6f 77 69 64 2d 6c 65 73 73 20 70 61 67 65   rowid-less page
2d590 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65 66  s that occur bef
2d5a0 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
2d5b0 6c 65 61 66 2e 20 2a 2f 0a 20 20 20 20 20 20 20  leaf. */.       
2d5c0 20 66 6f 72 28 69 50 67 3d 69 50 72 65 76 4c 65   for(iPg=iPrevLe
2d5d0 61 66 2b 31 3b 20 69 50 67 3c 66 74 73 35 44 6c  af+1; iPg<fts5Dl
2d5e0 69 64 78 49 74 65 72 50 67 6e 6f 28 70 44 6c 69  idxIterPgno(pDli
2d5f0 64 78 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  dx); iPg++){.   
2d600 20 20 20 20 20 20 20 69 4b 65 79 20 3d 20 46 54         iKey = FT
2d610 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49 44  S5_SEGMENT_ROWID
2d620 28 69 53 65 67 69 64 2c 20 69 50 67 29 3b 0a 20  (iSegid, iPg);. 
2d630 20 20 20 20 20 20 20 20 20 70 4c 65 61 66 20 3d           pLeaf =
2d640 20 66 74 73 35 44 61 74 61 52 65 61 64 28 70 2c   fts5DataRead(p,
2d650 20 69 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20   iKey);.        
2d660 20 20 69 66 28 20 70 4c 65 61 66 20 29 7b 0a 20    if( pLeaf ){. 
2d670 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 66             if( f
2d680 74 73 35 4c 65 61 66 46 69 72 73 74 52 6f 77 69  ts5LeafFirstRowi
2d690 64 4f 66 66 28 70 4c 65 61 66 29 21 3d 30 20 29  dOff(pLeaf)!=0 )
2d6a0 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f   p->rc = FTS5_CO
2d6b0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 20  RRUPT;.         
2d6c0 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
2d6d0 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
2d6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2d6f0 0a 20 20 20 20 20 20 20 20 69 50 72 65 76 4c 65  .        iPrevLe
2d700 61 66 20 3d 20 66 74 73 35 44 6c 69 64 78 49 74  af = fts5DlidxIt
2d710 65 72 50 67 6e 6f 28 70 44 6c 69 64 78 29 3b 0a  erPgno(pDlidx);.
2d720 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63  .        /* Chec
2d730 6b 20 74 68 61 74 20 74 68 65 20 6c 65 61 66 20  k that the leaf 
2d740 70 61 67 65 20 69 6e 64 69 63 61 74 65 64 20 62  page indicated b
2d750 79 20 74 68 65 20 69 74 65 72 61 74 6f 72 20 72  y the iterator r
2d760 65 61 6c 6c 79 20 64 6f 65 73 0a 20 20 20 20 20  eally does.     
2d770 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 74 68     ** contain th
2d780 65 20 72 6f 77 69 64 20 73 75 67 67 65 73 74 65  e rowid suggeste
2d790 64 20 62 79 20 74 68 65 20 73 61 6d 65 2e 20 2a  d by the same. *
2d7a0 2f 0a 20 20 20 20 20 20 20 20 69 4b 65 79 20 3d  /.        iKey =
2d7b0 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f   FTS5_SEGMENT_RO
2d7c0 57 49 44 28 69 53 65 67 69 64 2c 20 69 50 72 65  WID(iSegid, iPre
2d7d0 76 4c 65 61 66 29 3b 0a 20 20 20 20 20 20 20 20  vLeaf);.        
2d7e0 70 4c 65 61 66 20 3d 20 66 74 73 35 44 61 74 61  pLeaf = fts5Data
2d7f0 52 65 61 64 28 70 2c 20 69 4b 65 79 29 3b 0a 20  Read(p, iKey);. 
2d800 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 61 66         if( pLeaf
2d810 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 36   ){.          i6
2d820 34 20 69 52 6f 77 69 64 3b 0a 20 20 20 20 20 20  4 iRowid;.      
2d830 20 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66      int iRowidOf
2d840 66 20 3d 20 66 74 73 35 4c 65 61 66 46 69 72 73  f = fts5LeafFirs
2d850 74 52 6f 77 69 64 4f 66 66 28 70 4c 65 61 66 29  tRowidOff(pLeaf)
2d860 3b 0a 20 20 20 20 20 20 20 20 20 20 41 53 53 45  ;.          ASSE
2d870 52 54 5f 53 5a 4c 45 41 46 5f 4f 4b 28 70 4c 65  RT_SZLEAF_OK(pLe
2d880 61 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  af);.          i
2d890 66 28 20 69 52 6f 77 69 64 4f 66 66 3e 3d 70 4c  f( iRowidOff>=pL
2d8a0 65 61 66 2d 3e 73 7a 4c 65 61 66 20 29 7b 0a 20  eaf->szLeaf ){. 
2d8b0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63             p->rc
2d8c0 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
2d8d0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2d8e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 74  {.            ft
2d8f0 73 35 47 65 74 56 61 72 69 6e 74 28 26 70 4c 65  s5GetVarint(&pLe
2d900 61 66 2d 3e 70 5b 69 52 6f 77 69 64 4f 66 66 5d  af->p[iRowidOff]
2d910 2c 20 28 75 36 34 2a 29 26 69 52 6f 77 69 64 29  , (u64*)&iRowid)
2d920 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2d930 28 20 69 52 6f 77 69 64 21 3d 66 74 73 35 44 6c  ( iRowid!=fts5Dl
2d940 69 64 78 49 74 65 72 52 6f 77 69 64 28 70 44 6c  idxIterRowid(pDl
2d950 69 64 78 29 20 29 20 70 2d 3e 72 63 20 3d 20 46  idx) ) p->rc = F
2d960 54 53 35 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  TS5_CORRUPT;.   
2d970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d980 20 20 20 66 74 73 35 44 61 74 61 52 65 6c 65 61     fts5DataRelea
2d990 73 65 28 70 4c 65 61 66 29 3b 0a 20 20 20 20 20  se(pLeaf);.     
2d9a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
2d9b0 20 20 20 20 69 44 6c 69 64 78 50 72 65 76 4c 65      iDlidxPrevLe
2d9c0 61 66 20 3d 20 69 50 67 3b 0a 20 20 20 20 20 20  af = iPg;.      
2d9d0 66 74 73 35 44 6c 69 64 78 49 74 65 72 46 72 65  fts5DlidxIterFre
2d9e0 65 28 70 44 6c 69 64 78 29 3b 0a 20 20 20 20 20  e(pDlidx);.     
2d9f0 20 66 74 73 35 54 65 73 74 44 6c 69 64 78 52 65   fts5TestDlidxRe
2da00 76 65 72 73 65 28 70 2c 20 69 53 65 67 69 64 2c  verse(p, iSegid,
2da10 20 69 49 64 78 4c 65 61 66 29 3b 0a 20 20 20 20   iIdxLeaf);.    
2da20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 44 6c  }else{.      iDl
2da30 69 64 78 50 72 65 76 4c 65 61 66 20 3d 20 70 53  idxPrevLeaf = pS
2da40 65 67 2d 3e 70 67 6e 6f 4c 61 73 74 3b 0a 20 20  eg->pgnoLast;.  
2da50 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 43 68 65      /* TODO: Che
2da60 63 6b 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ck there is no d
2da70 6f 63 6c 69 73 74 20 69 6e 64 65 78 20 2a 2f 0a  oclist index */.
2da80 20 20 20 20 7d 0a 0a 20 20 20 20 69 49 64 78 50      }..    iIdxP
2da90 72 65 76 4c 65 61 66 20 3d 20 69 49 64 78 4c 65  revLeaf = iIdxLe
2daa0 61 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 32 20 3d  af;.  }..  rc2 =
2dab0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2dac0 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
2dad0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
2dae0 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 32 3b 0a   ) p->rc = rc2;.
2daf0 0a 20 20 2f 2a 20 50 61 67 65 20 69 74 65 72 2e  .  /* Page iter.
2db00 69 4c 65 61 66 20 6d 75 73 74 20 6e 6f 77 20 62  iLeaf must now b
2db10 65 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20  e the rightmost 
2db20 6c 65 61 66 2d 70 61 67 65 20 69 6e 20 74 68 65  leaf-page in the
2db30 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 23 69 66 20   segment */.#if 
2db40 30 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  0.  if( p->rc==S
2db50 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 74 65 72  QLITE_OK && iter
2db60 2e 69 4c 65 61 66 21 3d 70 53 65 67 2d 3e 70 67  .iLeaf!=pSeg->pg
2db70 6e 6f 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d  noLast ){.    p-
2db80 3e 72 63 20 3d 20 46 54 53 35 5f 43 4f 52 52 55  >rc = FTS5_CORRU
2db90 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  PT;.  }.#endif.}
2dba0 0a 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 69 6e 74  .../*.** Run int
2dbb0 65 72 6e 61 6c 20 63 68 65 63 6b 73 20 74 6f 20  ernal checks to 
2dbc0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2dbd0 46 54 53 20 69 6e 64 65 78 20 28 61 29 20 69 73  FTS index (a) is
2dbe0 20 69 6e 74 65 72 6e 61 6c 6c 79 20 0a 2a 2a 20   internally .** 
2dbf0 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 28  consistent and (
2dc00 62 29 20 63 6f 6e 74 61 69 6e 73 20 65 6e 74 72  b) contains entr
2dc10 69 65 73 20 66 6f 72 20 77 68 69 63 68 20 74 68  ies for which th
2dc20 65 20 58 4f 52 20 6f 66 20 74 68 65 20 63 68 65  e XOR of the che
2dc30 63 6b 73 75 6d 73 0a 2a 2a 20 61 73 20 63 61 6c  cksums.** as cal
2dc40 63 75 6c 61 74 65 64 20 62 79 20 73 71 6c 69 74  culated by sqlit
2dc50 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2dc60 43 6b 73 75 6d 28 29 20 69 73 20 63 6b 73 75 6d  Cksum() is cksum
2dc70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
2dc80 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
2dc90 20 61 6e 79 20 6f 66 20 74 68 65 20 69 6e 74 65   any of the inte
2dca0 72 6e 61 6c 20 63 68 65 63 6b 73 20 66 61 69 6c  rnal checks fail
2dcb0 2c 20 6f 72 20 69 66 20 74 68 65 0a 2a 2a 20 63  , or if the.** c
2dcc0 68 65 63 6b 73 75 6d 20 64 6f 65 73 20 6e 6f 74  hecksum does not
2dcd0 20 6d 61 74 63 68 2e 20 52 65 74 75 72 6e 20 53   match. Return S
2dce0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 20  QLITE_OK if all 
2dcf0 63 68 65 63 6b 73 20 70 61 73 73 20 77 69 74 68  checks pass with
2dd00 6f 75 74 0a 2a 2a 20 65 72 72 6f 72 2c 20 6f 72  out.** error, or
2dd10 20 73 6f 6d 65 20 6f 74 68 65 72 20 53 51 4c 69   some other SQLi
2dd20 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  te error code if
2dd30 20 61 6e 6f 74 68 65 72 20 65 72 72 6f 72 20 28   another error (
2dd40 65 2e 67 2e 20 4f 4f 4d 29 0a 2a 2a 20 6f 63 63  e.g. OOM).** occ
2dd50 75 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  urs..*/.int sqli
2dd60 74 65 33 46 74 73 35 49 6e 64 65 78 49 6e 74 65  te3Fts5IndexInte
2dd70 67 72 69 74 79 43 68 65 63 6b 28 46 74 73 35 49  grityCheck(Fts5I
2dd80 6e 64 65 78 20 2a 70 2c 20 75 36 34 20 63 6b 73  ndex *p, u64 cks
2dd90 75 6d 29 7b 0a 20 20 69 6e 74 20 65 44 65 74 61  um){.  int eDeta
2dda0 69 6c 20 3d 20 70 2d 3e 70 43 6f 6e 66 69 67 2d  il = p->pConfig-
2ddb0 3e 65 44 65 74 61 69 6c 3b 0a 20 20 75 36 34 20  >eDetail;.  u64 
2ddc0 63 6b 73 75 6d 32 20 3d 20 30 3b 20 20 20 20 20  cksum2 = 0;     
2ddd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
2dde0 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
2ddf0 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 69 6e 64   contents of ind
2de00 65 78 65 73 20 2a 2f 0a 20 20 46 74 73 35 42 75  exes */.  Fts5Bu
2de10 66 66 65 72 20 70 6f 73 6c 69 73 74 20 3d 20 7b  ffer poslist = {
2de20 30 2c 30 2c 30 7d 3b 20 20 20 2f 2a 20 42 75 66  0,0,0};   /* Buf
2de30 66 65 72 20 75 73 65 64 20 74 6f 20 68 6f 6c 64  fer used to hold
2de40 20 61 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20   a poslist */.  
2de50 46 74 73 35 49 74 65 72 20 2a 70 49 74 65 72 3b  Fts5Iter *pIter;
2de60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de70 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72 61  /* Used to itera
2de80 74 65 20 74 68 72 6f 75 67 68 20 65 6e 74 69 72  te through entir
2de90 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 46 74 73  e index */.  Fts
2dea0 35 53 74 72 75 63 74 75 72 65 20 2a 70 53 74 72  5Structure *pStr
2deb0 75 63 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  uct;         /* 
2dec0 49 6e 64 65 78 20 73 74 72 75 63 74 75 72 65 20  Index structure 
2ded0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
2dee0 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 55 73 65  E_DEBUG.  /* Use
2def0 64 20 62 79 20 65 78 74 72 61 20 69 6e 74 65 72  d by extra inter
2df00 6e 61 6c 20 74 65 73 74 73 20 6f 6e 6c 79 20 72  nal tests only r
2df10 75 6e 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  un if NDEBUG is 
2df20 6e 6f 74 20 64 65 66 69 6e 65 64 20 2a 2f 0a 20  not defined */. 
2df30 20 75 36 34 20 63 6b 73 75 6d 33 20 3d 20 30 3b   u64 cksum3 = 0;
2df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df50 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 62 61 73   /* Checksum bas
2df60 65 64 20 6f 6e 20 63 6f 6e 74 65 6e 74 73 20 6f  ed on contents o
2df70 66 20 69 6e 64 65 78 65 73 20 2a 2f 0a 20 20 46  f indexes */.  F
2df80 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 20 3d  ts5Buffer term =
2df90 20 7b 30 2c 30 2c 30 7d 3b 20 20 20 20 20 20 2f   {0,0,0};      /
2dfa0 2a 20 42 75 66 66 65 72 20 75 73 65 64 20 74 6f  * Buffer used to
2dfb0 20 68 6f 6c 64 20 6d 6f 73 74 20 72 65 63 65 6e   hold most recen
2dfc0 74 20 74 65 72 6d 20 2a 2f 0a 23 65 6e 64 69 66  t term */.#endif
2dfd0 0a 20 20 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61  .  const int fla
2dfe0 67 73 20 3d 20 46 54 53 35 49 4e 44 45 58 5f 51  gs = FTS5INDEX_Q
2dff0 55 45 52 59 5f 4e 4f 4f 55 54 50 55 54 3b 0a 20  UERY_NOOUTPUT;. 
2e000 20 0a 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20   .  /* Load the 
2e010 46 54 53 20 69 6e 64 65 78 20 73 74 72 75 63 74  FTS index struct
2e020 75 72 65 20 2a 2f 0a 20 20 70 53 74 72 75 63 74  ure */.  pStruct
2e030 20 3d 20 66 74 73 35 53 74 72 75 63 74 75 72 65   = fts5Structure
2e040 52 65 61 64 28 70 29 3b 0a 0a 20 20 2f 2a 20 43  Read(p);..  /* C
2e050 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 69 6e  heck that the in
2e060 74 65 72 6e 61 6c 20 6e 6f 64 65 73 20 6f 66 20  ternal nodes of 
2e070 65 61 63 68 20 73 65 67 6d 65 6e 74 20 6d 61 74  each segment mat
2e080 63 68 20 74 68 65 20 6c 65 61 76 65 73 20 2a 2f  ch the leaves */
2e090 0a 20 20 69 66 28 20 70 53 74 72 75 63 74 20 29  .  if( pStruct )
2e0a0 7b 0a 20 20 20 20 69 6e 74 20 69 4c 76 6c 2c 20  {.    int iLvl, 
2e0b0 69 53 65 67 3b 0a 20 20 20 20 66 6f 72 28 69 4c  iSeg;.    for(iL
2e0c0 76 6c 3d 30 3b 20 69 4c 76 6c 3c 70 53 74 72 75  vl=0; iLvl<pStru
2e0d0 63 74 2d 3e 6e 4c 65 76 65 6c 3b 20 69 4c 76 6c  ct->nLevel; iLvl
2e0e0 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
2e0f0 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 53 74 72  Seg=0; iSeg<pStr
2e100 75 63 74 2d 3e 61 4c 65 76 65 6c 5b 69 4c 76 6c  uct->aLevel[iLvl
2e110 5d 2e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ].nSeg; iSeg++){
2e120 0a 20 20 20 20 20 20 20 20 46 74 73 35 53 74 72  .        Fts5Str
2e130 75 63 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70  uctureSegment *p
2e140 53 65 67 20 3d 20 26 70 53 74 72 75 63 74 2d 3e  Seg = &pStruct->
2e150 61 4c 65 76 65 6c 5b 69 4c 76 6c 5d 2e 61 53 65  aLevel[iLvl].aSe
2e160 67 5b 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 20  g[iSeg];.       
2e170 20 66 74 73 35 49 6e 64 65 78 49 6e 74 65 67 72   fts5IndexIntegr
2e180 69 74 79 43 68 65 63 6b 53 65 67 6d 65 6e 74 28  ityCheckSegment(
2e190 70 2c 20 70 53 65 67 29 3b 0a 20 20 20 20 20 20  p, pSeg);.      
2e1a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2e1b0 2a 20 54 68 65 20 63 6b 73 75 6d 20 61 72 67 75  * The cksum argu
2e1c0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
2e1d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2e1e0 61 20 63 68 65 63 6b 73 75 6d 20 63 61 6c 63 75  a checksum calcu
2e1f0 6c 61 74 65 64 0a 20 20 2a 2a 20 62 61 73 65 64  lated.  ** based
2e200 20 6f 6e 20 61 6c 6c 20 65 78 70 65 63 74 65 64   on all expected
2e210 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
2e220 46 54 53 20 69 6e 64 65 78 20 28 69 6e 63 6c 75  FTS index (inclu
2e230 64 69 6e 67 20 70 72 65 66 69 78 20 69 6e 64 65  ding prefix inde
2e240 78 0a 20 20 2a 2a 20 65 6e 74 72 69 65 73 29 2e  x.  ** entries).
2e250 20 54 68 69 73 20 62 6c 6f 63 6b 20 63 68 65 63   This block chec
2e260 6b 73 20 74 68 61 74 20 61 20 63 68 65 63 6b 73  ks that a checks
2e270 75 6d 20 63 61 6c 63 75 6c 61 74 65 64 20 62 61  um calculated ba
2e280 73 65 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  sed on the.  ** 
2e290 61 63 74 75 61 6c 20 63 6f 6e 74 65 6e 74 73 20  actual contents 
2e2a0 6f 66 20 46 54 53 20 69 6e 64 65 78 20 69 73 20  of FTS index is 
2e2b0 69 64 65 6e 74 69 63 61 6c 2e 0a 20 20 2a 2a 0a  identical..  **.
2e2c0 20 20 2a 2a 20 54 77 6f 20 76 65 72 73 69 6f 6e    ** Two version
2e2d0 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 63 68  s of the same ch
2e2e0 65 63 6b 73 75 6d 20 61 72 65 20 63 61 6c 63 75  ecksum are calcu
2e2f0 6c 61 74 65 64 2e 20 54 68 65 20 66 69 72 73 74  lated. The first
2e300 20 28 73 74 61 63 6b 0a 20 20 2a 2a 20 76 61 72   (stack.  ** var
2e310 69 61 62 6c 65 20 63 6b 73 75 6d 32 29 20 62 61  iable cksum2) ba
2e320 73 65 64 20 6f 6e 20 65 6e 74 72 69 65 73 20 65  sed on entries e
2e330 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 74 68  xtracted from th
2e340 65 20 66 75 6c 6c 2d 74 65 78 74 20 69 6e 64 65  e full-text inde
2e350 78 0a 20 20 2a 2a 20 77 68 69 6c 65 20 64 6f 69  x.  ** while doi
2e360 6e 67 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e  ng a linear scan
2e370 20 6f 66 20 65 61 63 68 20 69 6e 64 69 76 69 64   of each individ
2e380 75 61 6c 20 69 6e 64 65 78 20 69 6e 20 74 75 72  ual index in tur
2e390 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 73  n. .  **.  ** As
2e3a0 20 65 61 63 68 20 74 65 72 6d 20 76 69 73 69 74   each term visit
2e3b0 65 64 20 62 79 20 74 68 65 20 6c 69 6e 65 61 72  ed by the linear
2e3c0 20 73 63 61 6e 73 2c 20 61 20 73 65 70 61 72 61   scans, a separa
2e3d0 74 65 20 71 75 65 72 79 20 66 6f 72 20 74 68 65  te query for the
2e3e0 0a 20 20 2a 2a 20 73 61 6d 65 20 74 65 72 6d 20  .  ** same term 
2e3f0 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20 63 6b  is performed. ck
2e400 73 75 6d 33 20 69 73 20 63 61 6c 63 75 6c 61 74  sum3 is calculat
2e410 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
2e420 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 65 78 74  entries.  ** ext
2e430 72 61 63 74 65 64 20 62 79 20 74 68 65 73 65 20  racted by these 
2e440 71 75 65 72 69 65 73 2e 0a 20 20 2a 2f 0a 20 20  queries..  */.  
2e450 66 6f 72 28 66 74 73 35 4d 75 6c 74 69 49 74 65  for(fts5MultiIte
2e460 72 4e 65 77 28 70 2c 20 70 53 74 72 75 63 74 2c  rNew(p, pStruct,
2e470 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 30 2c   flags, 0, 0, 0,
2e480 20 2d 31 2c 20 30 2c 20 26 70 49 74 65 72 29 3b   -1, 0, &pIter);
2e490 0a 20 20 20 20 20 20 66 74 73 35 4d 75 6c 74 69  .      fts5Multi
2e4a0 49 74 65 72 45 6f 66 28 70 2c 20 70 49 74 65 72  IterEof(p, pIter
2e4b0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 66 74 73 35  )==0;.      fts5
2e4c0 4d 75 6c 74 69 49 74 65 72 4e 65 78 74 28 70 2c  MultiIterNext(p,
2e4d0 20 70 49 74 65 72 2c 20 30 2c 20 30 29 0a 20 20   pIter, 0, 0).  
2e4e0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 20 20 20  ){.    int n;   
2e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e500 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 65     /* Size of te
2e510 72 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  rm in bytes */. 
2e520 20 20 20 69 36 34 20 69 50 6f 73 20 3d 20 30 3b     i64 iPos = 0;
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e540 2a 20 50 6f 73 69 74 69 6f 6e 20 72 65 61 64 20  * Position read 
2e550 66 72 6f 6d 20 70 6f 73 6c 69 73 74 20 2a 2f 0a  from poslist */.
2e560 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30      int iOff = 0
2e570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e580 2f 2a 20 4f 66 66 73 65 74 20 77 69 74 68 69 6e  /* Offset within
2e590 20 70 6f 73 6c 69 73 74 20 2a 2f 0a 20 20 20 20   poslist */.    
2e5a0 69 36 34 20 69 52 6f 77 69 64 20 3d 20 66 74 73  i64 iRowid = fts
2e5b0 35 4d 75 6c 74 69 49 74 65 72 52 6f 77 69 64 28  5MultiIterRowid(
2e5c0 70 49 74 65 72 29 3b 0a 20 20 20 20 63 68 61 72  pIter);.    char
2e5d0 20 2a 7a 20 3d 20 28 63 68 61 72 2a 29 66 74 73   *z = (char*)fts
2e5e0 35 4d 75 6c 74 69 49 74 65 72 54 65 72 6d 28 70  5MultiIterTerm(p
2e5f0 49 74 65 72 2c 20 26 6e 29 3b 0a 0a 20 20 20 20  Iter, &n);..    
2e600 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2e610 6e 65 77 20 74 65 72 6d 2c 20 71 75 65 72 79 20  new term, query 
2e620 66 6f 72 20 69 74 2e 20 55 70 64 61 74 65 20 63  for it. Update c
2e630 6b 73 75 6d 33 20 77 69 74 68 20 74 68 65 20 72  ksum3 with the r
2e640 65 73 75 6c 74 73 2e 20 2a 2f 0a 20 20 20 20 66  esults. */.    f
2e650 74 73 35 54 65 73 74 54 65 72 6d 28 70 2c 20 26  ts5TestTerm(p, &
2e660 74 65 72 6d 2c 20 7a 2c 20 6e 2c 20 63 6b 73 75  term, z, n, cksu
2e670 6d 32 2c 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20  m2, &cksum3);.. 
2e680 20 20 20 69 66 28 20 65 44 65 74 61 69 6c 3d 3d     if( eDetail==
2e690 46 54 53 35 5f 44 45 54 41 49 4c 5f 4e 4f 4e 45  FTS5_DETAIL_NONE
2e6a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d   ){.      if( 0=
2e6b0 3d 66 74 73 35 4d 75 6c 74 69 49 74 65 72 49 73  =fts5MultiIterIs
2e6c0 45 6d 70 74 79 28 70 2c 20 70 49 74 65 72 29 20  Empty(p, pIter) 
2e6d0 29 7b 0a 20 20 20 20 20 20 20 20 63 6b 73 75 6d  ){.        cksum
2e6e0 32 20 5e 3d 20 73 71 6c 69 74 65 33 46 74 73 35  2 ^= sqlite3Fts5
2e6f0 49 6e 64 65 78 45 6e 74 72 79 43 6b 73 75 6d 28  IndexEntryCksum(
2e700 69 52 6f 77 69 64 2c 20 30 2c 20 30 2c 20 2d 31  iRowid, 0, 0, -1
2e710 2c 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d  , z, n);.      }
2e720 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e730 20 20 70 6f 73 6c 69 73 74 2e 6e 20 3d 20 30 3b    poslist.n = 0;
2e740 0a 20 20 20 20 20 20 66 74 73 35 53 65 67 69 74  .      fts5Segit
2e750 65 72 50 6f 73 6c 69 73 74 28 70 2c 20 26 70 49  erPoslist(p, &pI
2e760 74 65 72 2d 3e 61 53 65 67 5b 70 49 74 65 72 2d  ter->aSeg[pIter-
2e770 3e 61 46 69 72 73 74 5b 31 5d 2e 69 46 69 72 73  >aFirst[1].iFirs
2e780 74 5d 2c 20 30 2c 20 26 70 6f 73 6c 69 73 74 29  t], 0, &poslist)
2e790 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 30  ;.      while( 0
2e7a0 3d 3d 73 71 6c 69 74 65 33 46 74 73 35 50 6f 73  ==sqlite3Fts5Pos
2e7b0 6c 69 73 74 4e 65 78 74 36 34 28 70 6f 73 6c 69  listNext64(posli
2e7c0 73 74 2e 70 2c 20 70 6f 73 6c 69 73 74 2e 6e 2c  st.p, poslist.n,
2e7d0 20 26 69 4f 66 66 2c 20 26 69 50 6f 73 29 20 29   &iOff, &iPos) )
2e7e0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 43  {.        int iC
2e7f0 6f 6c 20 3d 20 46 54 53 35 5f 50 4f 53 32 43 4f  ol = FTS5_POS2CO
2e800 4c 55 4d 4e 28 69 50 6f 73 29 3b 0a 20 20 20 20  LUMN(iPos);.    
2e810 20 20 20 20 69 6e 74 20 69 54 6f 6b 4f 66 66 20      int iTokOff 
2e820 3d 20 46 54 53 35 5f 50 4f 53 32 4f 46 46 53 45  = FTS5_POS2OFFSE
2e830 54 28 69 50 6f 73 29 3b 0a 20 20 20 20 20 20 20  T(iPos);.       
2e840 20 63 6b 73 75 6d 32 20 5e 3d 20 73 71 6c 69 74   cksum2 ^= sqlit
2e850 65 33 46 74 73 35 49 6e 64 65 78 45 6e 74 72 79  e3Fts5IndexEntry
2e860 43 6b 73 75 6d 28 69 52 6f 77 69 64 2c 20 69 43  Cksum(iRowid, iC
2e870 6f 6c 2c 20 69 54 6f 6b 4f 66 66 2c 20 2d 31 2c  ol, iTokOff, -1,
2e880 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 0a   z, n);.      }.
2e890 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 74 73 35      }.  }.  fts5
2e8a0 54 65 73 74 54 65 72 6d 28 70 2c 20 26 74 65 72  TestTerm(p, &ter
2e8b0 6d 2c 20 30 2c 20 30 2c 20 63 6b 73 75 6d 32 2c  m, 0, 0, cksum2,
2e8c0 20 26 63 6b 73 75 6d 33 29 3b 0a 0a 20 20 66 74   &cksum3);..  ft
2e8d0 73 35 4d 75 6c 74 69 49 74 65 72 46 72 65 65 28  s5MultiIterFree(
2e8e0 70 49 74 65 72 29 3b 0a 20 20 69 66 28 20 70 2d  pIter);.  if( p-
2e8f0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
2e900 26 20 63 6b 73 75 6d 21 3d 63 6b 73 75 6d 32 20  & cksum!=cksum2 
2e910 29 20 70 2d 3e 72 63 20 3d 20 46 54 53 35 5f 43  ) p->rc = FTS5_C
2e920 4f 52 52 55 50 54 3b 0a 0a 20 20 66 74 73 35 53  ORRUPT;..  fts5S
2e930 74 72 75 63 74 75 72 65 52 65 6c 65 61 73 65 28  tructureRelease(
2e940 70 53 74 72 75 63 74 29 3b 0a 23 69 66 64 65 66  pStruct);.#ifdef
2e950 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2e960 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
2e970 74 65 72 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  term);.#endif.  
2e980 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28 26  fts5BufferFree(&
2e990 70 6f 73 6c 69 73 74 29 3b 0a 20 20 72 65 74 75  poslist);.  retu
2e9a0 72 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75  rn fts5IndexRetu
2e9b0 72 6e 28 70 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn(p);.}../*****
2e9c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2e9f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea00 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
2ea10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ea40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
2ea50 2a 2a 20 42 65 6c 6f 77 20 74 68 69 73 20 70 6f  ** Below this po
2ea60 69 6e 74 20 69 73 20 74 68 65 20 69 6d 70 6c 65  int is the imple
2ea70 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
2ea80 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 73   fts5_decode() s
2ea90 63 61 6c 61 72 0a 2a 2a 20 66 75 6e 63 74 69 6f  calar.** functio
2eaa0 6e 20 6f 6e 6c 79 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  n only..*/../*.*
2eab0 2a 20 44 65 63 6f 64 65 20 61 20 73 65 67 6d 65  * Decode a segme
2eac0 6e 74 2d 64 61 74 61 20 72 6f 77 69 64 20 66 72  nt-data rowid fr
2ead0 6f 6d 20 74 68 65 20 25 5f 64 61 74 61 20 74 61  om the %_data ta
2eae0 62 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ble. This functi
2eaf0 6f 6e 20 69 73 0a 2a 2a 20 74 68 65 20 6f 70 70  on is.** the opp
2eb00 6f 73 69 74 65 20 6f 66 20 6d 61 63 72 6f 20 46  osite of macro F
2eb10 54 53 35 5f 53 45 47 4d 45 4e 54 5f 52 4f 57 49  TS5_SEGMENT_ROWI
2eb20 44 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  D()..*/.static v
2eb30 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65 52 6f  oid fts5DecodeRo
2eb40 77 69 64 28 0a 20 20 69 36 34 20 69 52 6f 77 69  wid(.  i64 iRowi
2eb50 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
2eb60 20 20 20 20 20 20 20 2f 2a 20 52 6f 77 69 64 20         /* Rowid 
2eb70 66 72 6f 6d 20 25 5f 64 61 74 61 20 74 61 62 6c  from %_data tabl
2eb80 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 53 65  e */.  int *piSe
2eb90 67 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  gid,            
2eba0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
2ebb0 65 67 6d 65 6e 74 20 69 64 20 2a 2f 0a 20 20 69  egment id */.  i
2ebc0 6e 74 20 2a 70 62 44 6c 69 64 78 2c 20 20 20 20  nt *pbDlidx,    
2ebd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ebe0 2a 20 4f 55 54 3a 20 44 6c 69 64 78 20 66 6c 61  * OUT: Dlidx fla
2ebf0 67 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 48 65  g */.  int *piHe
2ec00 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 20 20  ight,           
2ec10 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 48         /* OUT: H
2ec20 65 69 67 68 74 20 2a 2f 0a 20 20 69 6e 74 20 2a  eight */.  int *
2ec30 70 69 50 67 6e 6f 20 20 20 20 20 20 20 20 20 20  piPgno          
2ec40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2ec50 54 3a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 2a  T: Page number *
2ec60 2f 0a 29 7b 0a 20 20 2a 70 69 50 67 6e 6f 20 3d  /.){.  *piPgno =
2ec70 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20 26 20   (int)(iRowid & 
2ec80 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54 53 35  (((i64)1 << FTS5
2ec90 5f 44 41 54 41 5f 50 41 47 45 5f 42 29 20 2d 20  _DATA_PAGE_B) - 
2eca0 31 29 29 3b 0a 20 20 69 52 6f 77 69 64 20 3e 3e  1));.  iRowid >>
2ecb0 3d 20 46 54 53 35 5f 44 41 54 41 5f 50 41 47 45  = FTS5_DATA_PAGE
2ecc0 5f 42 3b 0a 0a 20 20 2a 70 69 48 65 69 67 68 74  _B;..  *piHeight
2ecd0 20 3d 20 28 69 6e 74 29 28 69 52 6f 77 69 64 20   = (int)(iRowid 
2ece0 26 20 28 28 28 69 36 34 29 31 20 3c 3c 20 46 54  & (((i64)1 << FT
2ecf0 53 35 5f 44 41 54 41 5f 48 45 49 47 48 54 5f 42  S5_DATA_HEIGHT_B
2ed00 29 20 2d 20 31 29 29 3b 0a 20 20 69 52 6f 77 69  ) - 1));.  iRowi
2ed10 64 20 3e 3e 3d 20 46 54 53 35 5f 44 41 54 41 5f  d >>= FTS5_DATA_
2ed20 48 45 49 47 48 54 5f 42 3b 0a 0a 20 20 2a 70 62  HEIGHT_B;..  *pb
2ed30 44 6c 69 64 78 20 3d 20 28 69 6e 74 29 28 69 52  Dlidx = (int)(iR
2ed40 6f 77 69 64 20 26 20 30 78 30 30 30 31 29 3b 0a  owid & 0x0001);.
2ed50 20 20 69 52 6f 77 69 64 20 3e 3e 3d 20 46 54 53    iRowid >>= FTS
2ed60 35 5f 44 41 54 41 5f 44 4c 49 5f 42 3b 0a 0a 20  5_DATA_DLI_B;.. 
2ed70 20 2a 70 69 53 65 67 69 64 20 3d 20 28 69 6e 74   *piSegid = (int
2ed80 29 28 69 52 6f 77 69 64 20 26 20 28 28 28 69 36  )(iRowid & (((i6
2ed90 34 29 31 20 3c 3c 20 46 54 53 35 5f 44 41 54 41  4)1 << FTS5_DATA
2eda0 5f 49 44 5f 42 29 20 2d 20 31 29 29 3b 0a 7d 0a  _ID_B) - 1));.}.
2edb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73  .static void fts
2edc0 35 44 65 62 75 67 52 6f 77 69 64 28 69 6e 74 20  5DebugRowid(int 
2edd0 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
2ede0 20 2a 70 42 75 66 2c 20 69 36 34 20 69 4b 65 79   *pBuf, i64 iKey
2edf0 29 7b 0a 20 20 69 6e 74 20 69 53 65 67 69 64 2c  ){.  int iSegid,
2ee00 20 69 48 65 69 67 68 74 2c 20 69 50 67 6e 6f 2c   iHeight, iPgno,
2ee10 20 62 44 6c 69 64 78 3b 20 20 20 20 20 20 20 2f   bDlidx;       /
2ee20 2a 20 52 6f 77 69 64 20 63 6f 6d 70 65 6e 65 6e  * Rowid compenen
2ee30 74 73 20 2a 2f 0a 20 20 66 74 73 35 44 65 63 6f  ts */.  fts5Deco
2ee40 64 65 52 6f 77 69 64 28 69 4b 65 79 2c 20 26 69  deRowid(iKey, &i
2ee50 53 65 67 69 64 2c 20 26 62 44 6c 69 64 78 2c 20  Segid, &bDlidx, 
2ee60 26 69 48 65 69 67 68 74 2c 20 26 69 50 67 6e 6f  &iHeight, &iPgno
2ee70 29 3b 0a 0a 20 20 69 66 28 20 69 53 65 67 69 64  );..  if( iSegid
2ee80 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ==0 ){.    if( i
2ee90 4b 65 79 3d 3d 46 54 53 35 5f 41 56 45 52 41 47  Key==FTS5_AVERAG
2eea0 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20 20 20 20  ES_ROWID ){.    
2eeb0 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2eec0 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2eed0 70 52 63 2c 20 70 42 75 66 2c 20 22 7b 61 76 65  pRc, pBuf, "{ave
2eee0 72 61 67 65 73 7d 20 22 29 3b 0a 20 20 20 20 7d  rages} ");.    }
2eef0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2ef00 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2ef10 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2ef20 42 75 66 2c 20 22 7b 73 74 72 75 63 74 75 72 65  Buf, "{structure
2ef30 7d 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  }");.    }.  }. 
2ef40 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
2ef50 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70 65  e3Fts5BufferAppe
2ef60 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42  ndPrintf(pRc, pB
2ef70 75 66 2c 20 22 7b 25 73 73 65 67 69 64 3d 25 64  uf, "{%ssegid=%d
2ef80 20 68 3d 25 64 20 70 67 6e 6f 3d 25 64 7d 22 2c   h=%d pgno=%d}",
2ef90 0a 20 20 20 20 20 20 20 20 62 44 6c 69 64 78 20  .        bDlidx 
2efa0 3f 20 22 64 6c 69 64 78 20 22 20 3a 20 22 22 2c  ? "dlidx " : "",
2efb0 20 69 53 65 67 69 64 2c 20 69 48 65 69 67 68 74   iSegid, iHeight
2efc0 2c 20 69 50 67 6e 6f 0a 20 20 20 20 29 3b 0a 20  , iPgno.    );. 
2efd0 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69   }.}..static voi
2efe0 64 20 66 74 73 35 44 65 62 75 67 53 74 72 75 63  d fts5DebugStruc
2eff0 74 75 72 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  ture(.  int *pRc
2f000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f010 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55          /* IN/OU
2f020 54 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  T: error code */
2f030 0a 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70  .  Fts5Buffer *p
2f040 42 75 66 2c 0a 20 20 46 74 73 35 53 74 72 75 63  Buf,.  Fts5Struc
2f050 74 75 72 65 20 2a 70 0a 29 7b 0a 20 20 69 6e 74  ture *p.){.  int
2f060 20 69 4c 76 6c 2c 20 69 53 65 67 3b 20 20 20 20   iLvl, iSeg;    
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f080 49 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  Iterate through 
2f090 6c 65 76 65 6c 73 2c 20 73 65 67 6d 65 6e 74 73  levels, segments
2f0a0 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 4c 76 6c 3d   */..  for(iLvl=
2f0b0 30 3b 20 69 4c 76 6c 3c 70 2d 3e 6e 4c 65 76 65  0; iLvl<p->nLeve
2f0c0 6c 3b 20 69 4c 76 6c 2b 2b 29 7b 0a 20 20 20 20  l; iLvl++){.    
2f0d0 46 74 73 35 53 74 72 75 63 74 75 72 65 4c 65 76  Fts5StructureLev
2f0e0 65 6c 20 2a 70 4c 76 6c 20 3d 20 26 70 2d 3e 61  el *pLvl = &p->a
2f0f0 4c 65 76 65 6c 5b 69 4c 76 6c 5d 3b 0a 20 20 20  Level[iLvl];.   
2f100 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66 66   sqlite3Fts5Buff
2f110 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70  erAppendPrintf(p
2f120 52 63 2c 20 70 42 75 66 2c 20 0a 20 20 20 20 20  Rc, pBuf, .     
2f130 20 20 20 22 20 7b 6c 76 6c 3d 25 64 20 6e 4d 65     " {lvl=%d nMe
2f140 72 67 65 3d 25 64 20 6e 53 65 67 3d 25 64 22 2c  rge=%d nSeg=%d",
2f150 20 69 4c 76 6c 2c 20 70 4c 76 6c 2d 3e 6e 4d 65   iLvl, pLvl->nMe
2f160 72 67 65 2c 20 70 4c 76 6c 2d 3e 6e 53 65 67 0a  rge, pLvl->nSeg.
2f170 20 20 20 20 29 3b 0a 20 20 20 20 66 6f 72 28 69      );.    for(i
2f180 53 65 67 3d 30 3b 20 69 53 65 67 3c 70 4c 76 6c  Seg=0; iSeg<pLvl
2f190 2d 3e 6e 53 65 67 3b 20 69 53 65 67 2b 2b 29 7b  ->nSeg; iSeg++){
2f1a0 0a 20 20 20 20 20 20 46 74 73 35 53 74 72 75 63  .      Fts5Struc
2f1b0 74 75 72 65 53 65 67 6d 65 6e 74 20 2a 70 53 65  tureSegment *pSe
2f1c0 67 20 3d 20 26 70 4c 76 6c 2d 3e 61 53 65 67 5b  g = &pLvl->aSeg[
2f1d0 69 53 65 67 5d 3b 0a 20 20 20 20 20 20 73 71 6c  iSeg];.      sql
2f1e0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
2f1f0 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20  pendPrintf(pRc, 
2f200 70 42 75 66 2c 20 22 20 7b 69 64 3d 25 64 20 6c  pBuf, " {id=%d l
2f210 65 61 76 65 73 3d 25 64 2e 2e 25 64 7d 22 2c 20  eaves=%d..%d}", 
2f220 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 67 2d  .          pSeg-
2f230 3e 69 53 65 67 69 64 2c 20 70 53 65 67 2d 3e 70  >iSegid, pSeg->p
2f240 67 6e 6f 46 69 72 73 74 2c 20 70 53 65 67 2d 3e  gnoFirst, pSeg->
2f250 70 67 6e 6f 4c 61 73 74 0a 20 20 20 20 20 20 29  pgnoLast.      )
2f260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2f270 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70 70  te3Fts5BufferApp
2f280 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c 20 70  endPrintf(pRc, p
2f290 42 75 66 2c 20 22 7d 22 29 3b 0a 20 20 7d 0a 7d  Buf, "}");.  }.}
2f2a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
2f2b0 70 61 72 74 20 6f 66 20 74 68 65 20 66 74 73 35  part of the fts5
2f2c0 5f 64 65 63 6f 64 65 28 29 20 64 65 62 75 67 67  _decode() debugg
2f2d0 69 6e 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41  ing aid..**.** A
2f2e0 72 67 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e  rguments pBlob/n
2f2f0 42 6c 6f 62 20 63 6f 6e 74 61 69 6e 20 61 20 73  Blob contain a s
2f300 65 72 69 61 6c 69 7a 65 64 20 46 74 73 35 53 74  erialized Fts5St
2f310 72 75 63 74 75 72 65 20 6f 62 6a 65 63 74 2e 20  ructure object. 
2f320 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  This.** function
2f330 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d 61 6e   appends a human
2f340 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72 65 73  -readable repres
2f350 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
2f360 73 61 6d 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 74  same object.** t
2f370 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 61 73  o the buffer pas
2f380 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2f390 64 20 61 72 67 75 6d 65 6e 74 2e 20 0a 2a 2f 0a  d argument. .*/.
2f3a0 73 74 61 74 69 63 20 76 6f 69 64 20 66 74 73 35  static void fts5
2f3b0 44 65 63 6f 64 65 53 74 72 75 63 74 75 72 65 28  DecodeStructure(
2f3c0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 20 20 20  .  int *pRc,    
2f3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3e0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 65 72     /* IN/OUT: er
2f3f0 72 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 46 74  ror code */.  Ft
2f400 73 35 42 75 66 66 65 72 20 2a 70 42 75 66 2c 0a  s5Buffer *pBuf,.
2f410 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 42 6c 6f    const u8 *pBlo
2f420 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 0a 29 7b 0a  b, int nBlob.){.
2f430 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f450 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2f460 20 2a 2f 0a 20 20 46 74 73 35 53 74 72 75 63 74   */.  Fts5Struct
2f470 75 72 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  ure *p = 0;     
2f480 20 20 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 64        /* Decoded
2f490 20 73 74 72 75 63 74 75 72 65 20 6f 62 6a 65 63   structure objec
2f4a0 74 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 66 74 73  t */..  rc = fts
2f4b0 35 53 74 72 75 63 74 75 72 65 44 65 63 6f 64 65  5StructureDecode
2f4c0 28 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 2c 20 30  (pBlob, nBlob, 0
2f4d0 2c 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21  , &p);.  if( rc!
2f4e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f4f0 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20    *pRc = rc;.   
2f500 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
2f510 66 74 73 35 44 65 62 75 67 53 74 72 75 63 74 75  fts5DebugStructu
2f520 72 65 28 70 52 63 2c 20 70 42 75 66 2c 20 70 29  re(pRc, pBuf, p)
2f530 3b 0a 20 20 66 74 73 35 53 74 72 75 63 74 75 72  ;.  fts5Structur
2f540 65 52 65 6c 65 61 73 65 28 70 29 3b 0a 7d 0a 0a  eRelease(p);.}..
2f550 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 70 61  /*.** This is pa
2f560 72 74 20 6f 66 20 74 68 65 20 66 74 73 35 5f 64  rt of the fts5_d
2f570 65 63 6f 64 65 28 29 20 64 65 62 75 67 67 69 6e  ecode() debuggin
2f580 67 20 61 69 64 2e 0a 2a 2a 0a 2a 2a 20 41 72 67  g aid..**.** Arg
2f590 75 6d 65 6e 74 73 20 70 42 6c 6f 62 2f 6e 42 6c  uments pBlob/nBl
2f5a0 6f 62 20 63 6f 6e 74 61 69 6e 20 61 6e 20 22 61  ob contain an "a
2f5b0 76 65 72 61 67 65 73 22 20 72 65 63 6f 72 64 2e  verages" record.
2f5c0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a   This function .
2f5d0 2a 2a 20 61 70 70 65 6e 64 73 20 61 20 68 75 6d  ** appends a hum
2f5e0 61 6e 2d 72 65 61 64 61 62 6c 65 20 72 65 70 72  an-readable repr
2f5f0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 72 65  esentation of re
2f600 63 6f 72 64 20 74 6f 20 74 68 65 20 62 75 66 66  cord to the buff
2f610 65 72 20 70 61 73 73 65 64 20 0a 2a 2a 20 61 73  er passed .** as
2f620 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
2f630 6d 65 6e 74 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ment. .*/.static
2f640 20 76 6f 69 64 20 66 74 73 35 44 65 63 6f 64 65   void fts5Decode
2f650 41 76 65 72 61 67 65 73 28 0a 20 20 69 6e 74 20  Averages(.  int 
2f660 2a 70 52 63 2c 20 20 20 20 20 20 20 20 20 20 20  *pRc,           
2f670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2f680 4e 2f 4f 55 54 3a 20 65 72 72 6f 72 20 63 6f 64  N/OUT: error cod
2f690 65 20 2a 2f 0a 20 20 46 74 73 35 42 75 66 66 65  e */.  Fts5Buffe
2f6a0 72 20 2a 70 42 75 66 2c 0a 20 20 63 6f 6e 73 74  r *pBuf,.  const
2f6b0 20 75 38 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20   u8 *pBlob, int 
2f6c0 6e 42 6c 6f 62 0a 29 7b 0a 20 20 69 6e 74 20 69  nBlob.){.  int i
2f6d0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68   = 0;.  const ch
2f6e0 61 72 20 2a 7a 53 70 61 63 65 20 3d 20 22 22 3b  ar *zSpace = "";
2f6f0 0a 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 42 6c  ..  while( i<nBl
2f700 6f 62 20 29 7b 0a 20 20 20 20 75 36 34 20 69 56  ob ){.    u64 iV
2f710 61 6c 3b 0a 20 20 20 20 69 20 2b 3d 20 73 71 6c  al;.    i += sql
2f720 69 74 65 33 46 74 73 35 47 65 74 56 61 72 69 6e  ite3Fts5GetVarin
2f730 74 28 26 70 42 6c 6f 62 5b 69 5d 2c 20 26 69 56  t(&pBlob[i], &iV
2f740 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  al);.    sqlite3
2f750 46 74 73 35 42 75 66 66 65 72 41 70 70 65 6e 64  Fts5BufferAppend
2f760 50 72 69 6e 74 66 28 70 52 63 2c 20 70 42 75 66  Printf(pRc, pBuf
2f770 2c 20 22 25 73 25 64 22 2c 20 7a 53 70 61 63 65  , "%s%d", zSpace
2f780 2c 20 28 69 6e 74 29 69 56 61 6c 29 3b 0a 20 20  , (int)iVal);.  
2f790 20 20 7a 53 70 61 63 65 20 3d 20 22 20 22 3b 0a    zSpace = " ";.
2f7a0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 66    }.}../*.** Buf
2f7b0 66 65 72 20 28 61 2f 6e 29 20 69 73 20 61 73 73  fer (a/n) is ass
2f7c0 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
2f7d0 61 20 6c 69 73 74 20 6f 66 20 73 65 72 69 61 6c  a list of serial
2f7e0 69 7a 65 64 20 76 61 72 69 6e 74 73 2e 20 52 65  ized varints. Re
2f7f0 61 64 0a 2a 2a 20 65 61 63 68 20 76 61 72 69 6e  ad.** each varin
2f800 74 20 61 6e 64 20 61 70 70 65 6e 64 20 69 74 73  t and append its
2f810 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
2f820 74 61 74 69 6f 6e 20 74 6f 20 62 75 66 66 65 72  tation to buffer
2f830 20 70 42 75 66 2e 20 52 65 74 75 72 6e 0a 2a 2a   pBuf. Return.**
2f840 20 61 66 74 65 72 20 65 69 74 68 65 72 20 74 68   after either th
2f850 65 20 69 6e 70 75 74 20 62 75 66 66 65 72 20 69  e input buffer i
2f860 73 20 65 78 68 61 75 73 74 65 64 20 6f 72 20 61  s exhausted or a
2f870 20 30 20 76 61 6c 75 65 20 69 73 20 72 65 61 64   0 value is read
2f880 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
2f890 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20  rn value is the 
2f8a0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
2f8b0 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69 6e  read from the in
2f8c0 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73  put buffer..*/.s
2f8d0 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44 65  tatic int fts5De
2f8e0 63 6f 64 65 50 6f 73 6c 69 73 74 28 69 6e 74 20  codePoslist(int 
2f8f0 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65 72  *pRc, Fts5Buffer
2f900 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75 38   *pBuf, const u8
2f910 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *a, int n){.  i
2f920 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 77  nt iOff = 0;.  w
2f930 68 69 6c 65 28 20 69 4f 66 66 3c 6e 20 29 7b 0a  hile( iOff<n ){.
2f940 20 20 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20 20      int iVal;.  
2f950 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
2f960 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
2f970 66 5d 2c 20 69 56 61 6c 29 3b 0a 20 20 20 20 73  f], iVal);.    s
2f980 71 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72  qlite3Fts5Buffer
2f990 41 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63  AppendPrintf(pRc
2f9a0 2c 20 70 42 75 66 2c 20 22 20 25 64 22 2c 20 69  , pBuf, " %d", i
2f9b0 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Val);.  }.  retu
2f9c0 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn iOff;.}../*.*
2f9d0 2a 20 54 68 65 20 73 74 61 72 74 20 6f 66 20 62  * The start of b
2f9e0 75 66 66 65 72 20 28 61 2f 6e 29 20 63 6f 6e 74  uffer (a/n) cont
2f9f0 61 69 6e 73 20 74 68 65 20 73 74 61 72 74 20 6f  ains the start o
2fa00 66 20 61 20 64 6f 63 6c 69 73 74 2e 20 54 68 65  f a doclist. The
2fa10 20 64 6f 63 6c 69 73 74 0a 2a 2a 20 6d 61 79 20   doclist.** may 
2fa20 6f 72 20 6d 61 79 20 6e 6f 74 20 66 69 6e 69 73  or may not finis
2fa30 68 20 77 69 74 68 69 6e 20 74 68 65 20 62 75 66  h within the buf
2fa40 66 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69  fer. This functi
2fa50 6f 6e 20 61 70 70 65 6e 64 73 20 61 20 74 65 78  on appends a tex
2fa60 74 0a 2a 2a 20 72 65 70 72 65 73 65 6e 74 61 74  t.** representat
2fa70 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 72 74 20  ion of the part 
2fa80 6f 66 20 74 68 65 20 64 6f 63 6c 69 73 74 20 74  of the doclist t
2fa90 68 61 74 20 69 73 20 70 72 65 73 65 6e 74 20 74  hat is present t
2faa0 6f 20 62 75 66 66 65 72 0a 2a 2a 20 70 42 75 66  o buffer.** pBuf
2fab0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  . .**.** The ret
2fac0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
2fad0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
2fae0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 69   read from the i
2faf0 6e 70 75 74 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  nput buffer..*/.
2fb00 73 74 61 74 69 63 20 69 6e 74 20 66 74 73 35 44  static int fts5D
2fb10 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 69 6e 74  ecodeDoclist(int
2fb20 20 2a 70 52 63 2c 20 46 74 73 35 42 75 66 66 65   *pRc, Fts5Buffe
2fb30 72 20 2a 70 42 75 66 2c 20 63 6f 6e 73 74 20 75  r *pBuf, const u
2fb40 38 20 2a 61 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  8 *a, int n){.  
2fb50 69 36 34 20 69 44 6f 63 69 64 20 3d 20 30 3b 0a  i64 iDocid = 0;.
2fb60 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 30 3b 0a    int iOff = 0;.
2fb70 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20 20  .  if( n>0 ){.  
2fb80 20 20 69 4f 66 66 20 3d 20 73 71 6c 69 74 65 33    iOff = sqlite3
2fb90 46 74 73 35 47 65 74 56 61 72 69 6e 74 28 61 2c  Fts5GetVarint(a,
2fba0 20 28 75 36 34 2a 29 26 69 44 6f 63 69 64 29 3b   (u64*)&iDocid);
2fbb0 0a 20 20 20 20 73 71 6c 69 74 65 33 46 74 73 35  .    sqlite3Fts5
2fbc0 42 75 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e  BufferAppendPrin
2fbd0 74 66 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20  tf(pRc, pBuf, " 
2fbe0 69 64 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64  id=%lld", iDocid
2fbf0 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  );.  }.  while( 
2fc00 69 4f 66 66 3c 6e 20 29 7b 0a 20 20 20 20 69 6e  iOff<n ){.    in
2fc10 74 20 6e 50 6f 73 3b 0a 20 20 20 20 69 6e 74 20  t nPos;.    int 
2fc20 62 44 65 6c 3b 0a 20 20 20 20 69 4f 66 66 20 2b  bDel;.    iOff +
2fc30 3d 20 66 74 73 35 47 65 74 50 6f 73 6c 69 73 74  = fts5GetPoslist
2fc40 53 69 7a 65 28 26 61 5b 69 4f 66 66 5d 2c 20 26  Size(&a[iOff], &
2fc50 6e 50 6f 73 2c 20 26 62 44 65 6c 29 3b 0a 20 20  nPos, &bDel);.  
2fc60 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75 66    sqlite3Fts5Buf
2fc70 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66 28  ferAppendPrintf(
2fc80 70 52 63 2c 20 70 42 75 66 2c 20 22 20 6e 50 6f  pRc, pBuf, " nPo
2fc90 73 3d 25 64 25 73 22 2c 20 6e 50 6f 73 2c 20 62  s=%d%s", nPos, b
2fca0 44 65 6c 3f 22 2a 22 3a 22 22 29 3b 0a 20 20 20  Del?"*":"");.   
2fcb0 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 44 65 63   iOff += fts5Dec
2fcc0 6f 64 65 50 6f 73 6c 69 73 74 28 70 52 63 2c 20  odePoslist(pRc, 
2fcd0 70 42 75 66 2c 20 26 61 5b 69 4f 66 66 5d 2c 20  pBuf, &a[iOff], 
2fce0 4d 49 4e 28 6e 2d 69 4f 66 66 2c 20 6e 50 6f 73  MIN(n-iOff, nPos
2fcf0 29 29 3b 0a 20 20 20 20 69 66 28 20 69 4f 66 66  ));.    if( iOff
2fd00 3c 6e 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20  <n ){.      i64 
2fd10 69 44 65 6c 74 61 3b 0a 20 20 20 20 20 20 69 4f  iDelta;.      iO
2fd20 66 66 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73  ff += sqlite3Fts
2fd30 35 47 65 74 56 61 72 69 6e 74 28 26 61 5b 69 4f  5GetVarint(&a[iO
2fd40 66 66 5d 2c 20 28 75 36 34 2a 29 26 69 44 65 6c  ff], (u64*)&iDel
2fd50 74 61 29 3b 0a 20 20 20 20 20 20 69 44 6f 63 69  ta);.      iDoci
2fd60 64 20 2b 3d 20 69 44 65 6c 74 61 3b 0a 20 20 20  d += iDelta;.   
2fd70 20 20 20 73 71 6c 69 74 65 33 46 74 73 35 42 75     sqlite3Fts5Bu
2fd80 66 66 65 72 41 70 70 65 6e 64 50 72 69 6e 74 66  fferAppendPrintf
2fd90 28 70 52 63 2c 20 70 42 75 66 2c 20 22 20 69 64  (pRc, pBuf, " id
2fda0 3d 25 6c 6c 64 22 2c 20 69 44 6f 63 69 64 29 3b  =%lld", iDocid);
2fdb0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
2fdc0 74 75 72 6e 20 69 4f 66 66 3b 0a 7d 0a 0a 2f 2a  turn iOff;.}../*
2fdd0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
2fde0 6e 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  n is part of the
2fdf0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 20 64   fts5_decode() d
2fe00 65 62 75 67 67 69 6e 67 20 66 75 6e 63 74 69 6f  ebugging functio
2fe10 6e 2e 20 49 74 20 69 73 20 0a 2a 2a 20 6f 6e 6c  n. It is .** onl
2fe20 79 20 65 76 65 72 20 75 73 65 64 20 77 69 74 68  y ever used with
2fe30 20 64 65 74 61 69 6c 3d 6e 6f 6e 65 20 74 61 62   detail=none tab
2fe40 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 42 75 66 66 65  les..**.** Buffe
2fe50 72 20 28 70 44 61 74 61 2f 6e 44 61 74 61 29 20  r (pData/nData) 
2fe60 63 6f 6e 74 61 69 6e 73 20 61 20 64 6f 63 6c 69  contains a docli
2fe70 73 74 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74  st in the format
2fe80 20 75 73 65 64 20 62 79 20 64 65 74 61 69 6c 3d   used by detail=
2fe90 6e 6f 6e 65 0a 2a 2a 20 74 61 62 6c 65 73 2e 20  none.** tables. 
2fea0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 70  This function ap
2feb0 70 65 6e 64 73 20 61 20 68 75 6d 61 6e 2d 72 65  pends a human-re
2fec0 61 64 61 62 6c 65 20 76 65 72 73 69 6f 6e 20 6f  adable version o
2fed0 66 20 74 68 61 74 20 6c 69 73 74 20 74 6f 0a 2a  f that list to.*
2fee0 2a 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  * buffer pBuf..*
2fef0 2a 0a 2a 2a 20 49 66 20 2a 70 52 63 20 69 73 20  *.** If *pRc is 
2ff00 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
2ff10 45 5f 4f 4b 20 77 68 65 6e 20 74 68 69 73 20 66  E_OK when this f
2ff20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
2ff30 64 2c 20 69 74 20 69 73 20 61 0a 2a 2a 20 6e 6f  d, it is a.** no
2ff40 2d 6f 70 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 6f  -op. If an OOM o
2ff50 72 20 6f 74 68 65 72 20 65 72 72 6f 72 20 6f 63  r other error oc
2ff60 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 69 73  curs within this
2ff70 20 66 75 6e 63 74 69 6f 6e 2c 20 2a 70 52 63 20   function, *pRc 
2ff80 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 61 6e 20  is.** set to an 
2ff90 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
2ffa0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
2ffb0 6e 67 2e 20 54 68 65 20 66 69 6e 61 6c 20 73 74  ng. The final st
2ffc0 61 74 65 20 6f 66 20 62 75 66 66 65 72 0a 2a 2a  ate of buffer.**
2ffd0 20 70 42 75 66 20 69 73 20 75 6e 64 65 66 69 6e   pBuf is undefin
2ffe0 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ed in this case.
2fff0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
30000 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c  fts5DecodeRowidL
30010 69 73 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  ist(.  int *pRc,
30020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30030 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
30040 3a 20 45 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  : Error code */.
30050 20 20 46 74 73 35 42 75 66 66 65 72 20 2a 70 42    Fts5Buffer *pB
30060 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
30070 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 61    /* Buffer to a
30080 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 2a 2f  ppend text to */
30090 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 44 61  .  const u8 *pDa
300a0 74 61 2c 20 69 6e 74 20 6e 44 61 74 61 20 20 20  ta, int nData   
300b0 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20 64 65     /* Data to de
300c0 63 6f 64 65 20 6c 69 73 74 2d 6f 66 2d 72 6f 77  code list-of-row
300d0 69 64 73 20 66 72 6f 6d 20 2a 2f 0a 29 7b 0a 20  ids from */.){. 
300e0 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 36   int i = 0;.  i6
300f0 34 20 69 52 6f 77 69 64 20 3d 20 30 3b 0a 0a 20  4 iRowid = 0;.. 
30100 20 77 68 69 6c 65 28 20 69 3c 6e 44 61 74 61 20   while( i<nData 
30110 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
30120 72 20 2a 7a 41 70 70 20 3d 20 22 22 3b 0a 20 20  r *zApp = "";.  
30130 20 20 75 36 34 20 69 56 61 6c 3b 0a 20 20 20 20    u64 iVal;.    
30140 69 20 2b 3d 20 73 71 6c 69 74 65 33 46 74 73 35  i += sqlite3Fts5
30150 47 65 74 56 61 72 69 6e 74 28 26 70 44 61 74 61  GetVarint(&pData
30160 5b 69 5d 2c 20 26 69 56 61 6c 29 3b 0a 20 20 20  [i], &iVal);.   
30170 20 69 52 6f 77 69 64 20 2b 3d 20 69 56 61 6c 3b   iRowid += iVal;
30180 0a 0a 20 20 20 20 69 66 28 20 69 3c 6e 44 61 74  ..    if( i<nDat
30190 61 20 26 26 20 70 44 61 74 61 5b 69 5d 3d 3d 30  a && pData[i]==0
301a0 78 30 30 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b  x00 ){.      i++
301b0 3b 0a 20 20 20 20 20 20 69 66 28 20 69 3c 6e 44  ;.      if( i<nD
301c0 61 74 61 20 26 26 20 70 44 61 74 61 5b 69 5d 3d  ata && pData[i]=
301d0 3d 30 78 30 30 20 29 7b 0a 20 20 20 20 20 20 20  =0x00 ){.       
301e0 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7a 41   i++;.        zA
301f0 70 70 20 3d 20 22 2b 22 3b 0a 20 20 20 20 20 20  pp = "+";.      
30200 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
30210 41 70 70 20 3d 20 22 2a 22 3b 0a 20 20 20 20 20  App = "*";.     
30220 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 71   }.    }..    sq
30230 6c 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41  lite3Fts5BufferA
30240 70 70 65 6e 64 50 72 69 6e 74 66 28 70 52 63 2c  ppendPrintf(pRc,
30250 20 70 42 75 66 2c 20 22 20 25 6c 6c 64 25 73 22   pBuf, " %lld%s"
30260 2c 20 69 52 6f 77 69 64 2c 20 7a 41 70 70 29 3b  , iRowid, zApp);
30270 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
30280 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
30290 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
302a0 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
302b0 20 66 74 73 35 5f 64 65 63 6f 64 65 28 29 2e 0a   fts5_decode()..
302c0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
302d0 74 73 35 44 65 63 6f 64 65 46 75 6e 63 74 69 6f  ts5DecodeFunctio
302e0 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
302f0 74 65 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20  text *pCtx,     
30300 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
30310 20 63 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f   call context */
30320 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
30330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30340 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
30350 61 72 67 73 20 28 61 6c 77 61 79 73 20 32 29 20  args (always 2) 
30360 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  */.  sqlite3_val
30370 75 65 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20  ue **apVal      
30380 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
30390 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
303a0 0a 20 20 69 36 34 20 69 52 6f 77 69 64 3b 20 20  .  i64 iRowid;  
303b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
303c0 20 20 20 2f 2a 20 52 6f 77 69 64 20 66 6f 72 20     /* Rowid for 
303d0 72 65 63 6f 72 64 20 62 65 69 6e 67 20 64 65 63  record being dec
303e0 6f 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 53  oded */.  int iS
303f0 65 67 69 64 2c 69 48 65 69 67 68 74 2c 69 50 67  egid,iHeight,iPg
30400 6e 6f 2c 62 44 6c 69 64 78 3b 2f 2a 20 52 6f 77  no,bDlidx;/* Row
30410 69 64 20 63 6f 6d 70 6f 6e 65 6e 74 73 20 2a 2f  id components */
30420 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 42 6c  .  const u8 *aBl
30430 6f 62 3b 20 69 6e 74 20 6e 3b 20 20 20 20 20 20  ob; int n;      
30440 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 74 6f 20     /* Record to 
30450 64 65 63 6f 64 65 20 2a 2f 0a 20 20 75 38 20 2a  decode */.  u8 *
30460 61 20 3d 20 30 3b 0a 20 20 46 74 73 35 42 75 66  a = 0;.  Fts5Buf
30470 66 65 72 20 73 3b 20 20 20 20 20 20 20 20 20 20  fer s;          
30480 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 69 6c           /* Buil
30490 64 20 75 70 20 74 65 78 74 20 74 6f 20 72 65 74  d up text to ret
304a0 75 72 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  urn here */.  in
304b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
304c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
304d0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
304e0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
304f0 6e 53 70 61 63 65 20 3d 20 30 3b 0a 20 20 69 6e  nSpace = 0;.  in
30500 74 20 65 44 65 74 61 69 6c 4e 6f 6e 65 20 3d 20  t eDetailNone = 
30510 28 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  (sqlite3_user_da
30520 74 61 28 70 43 74 78 29 21 3d 30 29 3b 0a 0a 20  ta(pCtx)!=0);.. 
30530 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d 32   assert( nArg==2
30540 20 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   );.  UNUSED_PAR
30550 41 4d 28 6e 41 72 67 29 3b 0a 20 20 6d 65 6d 73  AM(nArg);.  mems
30560 65 74 28 26 73 2c 20 30 2c 20 73 69 7a 65 6f 66  et(&s, 0, sizeof
30570 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a 20  (Fts5Buffer));. 
30580 20 69 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65   iRowid = sqlite
30590 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 70  3_value_int64(ap
305a0 56 61 6c 5b 30 5d 29 3b 0a 0a 20 20 2f 2a 20 4d  Val[0]);..  /* M
305b0 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
305c0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
305d0 74 20 28 61 20 62 6c 6f 62 29 20 69 6e 20 61 42  t (a blob) in aB
305e0 6c 6f 62 5b 5d 2e 20 54 68 65 20 61 42 6c 6f 62  lob[]. The aBlob
305f0 5b 5d 0a 20 20 2a 2a 20 63 6f 70 79 20 69 73 20  [].  ** copy is 
30600 66 6f 6c 6c 6f 77 65 64 20 62 79 20 46 54 53 35  followed by FTS5
30610 5f 44 41 54 41 5f 5a 45 52 4f 5f 50 41 44 44 49  _DATA_ZERO_PADDI
30620 4e 47 20 30 78 30 30 20 62 79 74 65 73 2c 20 77  NG 0x00 bytes, w
30630 68 69 63 68 20 70 72 65 76 65 6e 74 73 0a 20 20  hich prevents.  
30640 2a 2a 20 62 75 66 66 65 72 20 6f 76 65 72 72 65  ** buffer overre
30650 61 64 73 20 65 76 65 6e 20 69 66 20 74 68 65 20  ads even if the 
30660 72 65 63 6f 72 64 20 69 73 20 63 6f 72 72 75 70  record is corrup
30670 74 2e 20 20 2a 2f 0a 20 20 6e 20 3d 20 73 71 6c  t.  */.  n = sql
30680 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
30690 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 61 42  (apVal[1]);.  aB
306a0 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 76 61  lob = sqlite3_va
306b0 6c 75 65 5f 62 6c 6f 62 28 61 70 56 61 6c 5b 31  lue_blob(apVal[1
306c0 5d 29 3b 0a 20 20 6e 53 70 61 63 65 20 3d 20 6e  ]);.  nSpace = n
306d0 20 2b 20 46 54 53 35 5f 44 41 54 41 5f 5a 45 52   + FTS5_DATA_ZER
306e0 4f 5f 50 41 44 44 49 4e 47 3b 0a 20 20 61 20 3d  O_PADDING;.  a =
306f0 20 28 75 38 2a 29 73 71 6c 69 74 65 33 46 74 73   (u8*)sqlite3Fts
30700 35 4d 61 6c 6c 6f 63 5a 65 72 6f 28 26 72 63 2c  5MallocZero(&rc,
30710 20 6e 53 70 61 63 65 29 3b 0a 20 20 69 66 28 20   nSpace);.  if( 
30720 61 3d 3d 30 20 29 20 67 6f 74 6f 20 64 65 63 6f  a==0 ) goto deco
30730 64 65 5f 6f 75 74 3b 0a 20 20 69 66 28 20 6e 3e  de_out;.  if( n>
30740 30 20 29 20 6d 65 6d 63 70 79 28 61 2c 20 61 42  0 ) memcpy(a, aB
30750 6c 6f 62 2c 20 6e 29 3b 0a 0a 20 20 66 74 73 35  lob, n);..  fts5
30760 44 65 63 6f 64 65 52 6f 77 69 64 28 69 52 6f 77  DecodeRowid(iRow
30770 69 64 2c 20 26 69 53 65 67 69 64 2c 20 26 62 44  id, &iSegid, &bD
30780 6c 69 64 78 2c 20 26 69 48 65 69 67 68 74 2c 20  lidx, &iHeight, 
30790 26 69 50 67 6e 6f 29 3b 0a 0a 20 20 66 74 73 35  &iPgno);..  fts5
307a0 44 65 62 75 67 52 6f 77 69 64 28 26 72 63 2c 20  DebugRowid(&rc, 
307b0 26 73 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69  &s, iRowid);.  i
307c0 66 28 20 62 44 6c 69 64 78 20 29 7b 0a 20 20 20  f( bDlidx ){.   
307d0 20 46 74 73 35 44 61 74 61 20 64 6c 69 64 78 3b   Fts5Data dlidx;
307e0 0a 20 20 20 20 46 74 73 35 44 6c 69 64 78 4c 76  .    Fts5DlidxLv
307f0 6c 20 6c 76 6c 3b 0a 0a 20 20 20 20 64 6c 69 64  l lvl;..    dlid
30800 78 2e 70 20 3d 20 61 3b 0a 20 20 20 20 64 6c 69  x.p = a;.    dli
30810 64 78 2e 6e 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20  dx.nn = n;..    
30820 6d 65 6d 73 65 74 28 26 6c 76 6c 2c 20 30 2c 20  memset(&lvl, 0, 
30830 73 69 7a 65 6f 66 28 46 74 73 35 44 6c 69 64 78  sizeof(Fts5Dlidx
30840 4c 76 6c 29 29 3b 0a 20 20 20 20 6c 76 6c 2e 70  Lvl));.    lvl.p
30850 44 61 74 61 20 3d 20 26 64 6c 69 64 78 3b 0a 20  Data = &dlidx;. 
30860 20 20 20 6c 76 6c 2e 69 4c 65 61 66 50 67 6e 6f     lvl.iLeafPgno
30870 20 3d 20 69 50 67 6e 6f 3b 0a 0a 20 20 20 20 66   = iPgno;..    f
30880 6f 72 28 66 74 73 35 44 6c 69 64 78 4c 76 6c 4e  or(fts5DlidxLvlN
30890 65 78 74 28 26 6c 76 6c 29 3b 20 6c 76 6c 2e 62  ext(&lvl); lvl.b
308a0 45 6f 66 3d 3d 30 3b 20 66 74 73 35 44 6c 69 64  Eof==0; fts5Dlid
308b0 78 4c 76 6c 4e 65 78 74 28 26 6c 76 6c 29 29 7b  xLvlNext(&lvl)){
308c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
308d0 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 50 72  s5BufferAppendPr
308e0 69 6e 74 66 28 26 72 63 2c 20 26 73 2c 20 0a 20  intf(&rc, &s, . 
308f0 20 20 20 20 20 20 20 20 20 22 20 25 64 28 25 6c           " %d(%l
30900 6c 64 29 22 2c 20 6c 76 6c 2e 69 4c 65 61 66 50  ld)", lvl.iLeafP
30910 67 6e 6f 2c 20 6c 76 6c 2e 69 52 6f 77 69 64 0a  gno, lvl.iRowid.
30920 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
30930 20 7d 65 6c 73 65 20 69 66 28 20 69 53 65 67 69   }else if( iSegi
30940 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d==0 ){.    if( 
30950 69 52 6f 77 69 64 3d 3d 46 54 53 35 5f 41 56 45  iRowid==FTS5_AVE
30960 52 41 47 45 53 5f 52 4f 57 49 44 20 29 7b 0a 20  RAGES_ROWID ){. 
30970 20 20 20 20 20 66 74 73 35 44 65 63 6f 64 65 41       fts5DecodeA
30980 76 65 72 61 67 65 73 28 26 72 63 2c 20 26 73 2c  verages(&rc, &s,
30990 20 61 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73   a, n);.    }els
309a0 65 7b 0a 20 20 20 20 20 20 66 74 73 35 44 65 63  e{.      fts5Dec
309b0 6f 64 65 53 74 72 75 63 74 75 72 65 28 26 72 63  odeStructure(&rc
309c0 2c 20 26 73 2c 20 61 2c 20 6e 29 3b 0a 20 20 20  , &s, a, n);.   
309d0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
309e0 44 65 74 61 69 6c 4e 6f 6e 65 20 29 7b 0a 20 20  DetailNone ){.  
309f0 20 20 46 74 73 35 42 75 66 66 65 72 20 74 65 72    Fts5Buffer ter
30a00 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
30a10 2f 2a 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20  /* Current term 
30a20 72 65 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a  read from page *
30a30 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66  /.    int szLeaf
30a40 3b 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78  ;.    int iPgidx
30a50 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d 20 66  Off = szLeaf = f
30a60 74 73 35 47 65 74 55 31 36 28 26 61 5b 32 5d 29  ts5GetU16(&a[2])
30a70 3b 0a 20 20 20 20 69 6e 74 20 69 54 65 72 6d 4f  ;.    int iTermO
30a80 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 4b 65 65  ff;.    int nKee
30a90 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69  p = 0;.    int i
30aa0 4f 66 66 3b 0a 0a 20 20 20 20 6d 65 6d 73 65 74  Off;..    memset
30ab0 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65 6f  (&term, 0, sizeo
30ac0 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b 0a  f(Fts5Buffer));.
30ad0 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 61  .    /* Decode a
30ae0 6e 79 20 65 6e 74 72 69 65 73 20 74 68 61 74 20  ny entries that 
30af0 6f 63 63 75 72 20 62 65 66 6f 72 65 20 74 68 65  occur before the
30b00 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a 2f 0a   first term. */.
30b10 20 20 20 20 69 66 28 20 73 7a 4c 65 61 66 3c 6e      if( szLeaf<n
30b20 20 29 7b 0a 20 20 20 20 20 20 69 50 67 69 64 78   ){.      iPgidx
30b30 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
30b40 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
30b50 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b  Off], iTermOff);
30b60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
30b70 20 20 69 54 65 72 6d 4f 66 66 20 3d 20 73 7a 4c    iTermOff = szL
30b80 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  eaf;.    }.    f
30b90 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c 69  ts5DecodeRowidLi
30ba0 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 34  st(&rc, &s, &a[4
30bb0 5d 2c 20 69 54 65 72 6d 4f 66 66 2d 34 29 3b 0a  ], iTermOff-4);.
30bc0 0a 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72  .    iOff = iTer
30bd0 6d 4f 66 66 3b 0a 20 20 20 20 77 68 69 6c 65 28  mOff;.    while(
30be0 20 69 4f 66 66 3c 73 7a 4c 65 61 66 20 29 7b 0a   iOff<szLeaf ){.
30bf0 20 20 20 20 20 20 69 6e 74 20 6e 41 70 70 65 6e        int nAppen
30c00 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 61  d;..      /* Rea
30c10 64 20 74 68 65 20 74 65 72 6d 20 64 61 74 61 20  d the term data 
30c20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 74 65 72  for the next ter
30c30 6d 2a 2f 0a 20 20 20 20 20 20 69 4f 66 66 20 2b  m*/.      iOff +
30c40 3d 20 66 74 73 35 47 65 74 56 61 72 69 6e 74 33  = fts5GetVarint3
30c50 32 28 26 61 5b 69 4f 66 66 5d 2c 20 6e 41 70 70  2(&a[iOff], nApp
30c60 65 6e 64 29 3b 0a 20 20 20 20 20 20 74 65 72 6d  end);.      term
30c70 2e 6e 20 3d 20 6e 4b 65 65 70 3b 0a 20 20 20 20  .n = nKeep;.    
30c80 20 20 66 74 73 35 42 75 66 66 65 72 41 70 70 65    fts5BufferAppe
30c90 6e 64 42 6c 6f 62 28 26 72 63 2c 20 26 74 65 72  ndBlob(&rc, &ter
30ca0 6d 2c 20 6e 41 70 70 65 6e 64 2c 20 26 61 5b 69  m, nAppend, &a[i
30cb0 4f 66 66 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c  Off]);.      sql
30cc0 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
30cd0 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
30ce0 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
30cf0 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
30d00 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
30d10 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
30d20 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
30d30 6e 41 70 70 65 6e 64 3b 0a 0a 20 20 20 20 20 20  nAppend;..      
30d40 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68  /* Figure out wh
30d50 65 72 65 20 74 68 65 20 64 6f 63 6c 69 73 74 20  ere the doclist 
30d60 66 6f 72 20 74 68 69 73 20 74 65 72 6d 20 65 6e  for this term en
30d70 64 73 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ds */.      if( 
30d80 69 50 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20  iPgidxOff<n ){. 
30d90 20 20 20 20 20 20 20 69 6e 74 20 6e 49 6e 63 72         int nIncr
30da0 3b 0a 20 20 20 20 20 20 20 20 69 50 67 69 64 78  ;.        iPgidx
30db0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
30dc0 72 69 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78  rint32(&a[iPgidx
30dd0 4f 66 66 5d 2c 20 6e 49 6e 63 72 29 3b 0a 20 20  Off], nIncr);.  
30de0 20 20 20 20 20 20 69 54 65 72 6d 4f 66 66 20 2b        iTermOff +
30df0 3d 20 6e 49 6e 63 72 3b 0a 20 20 20 20 20 20 7d  = nIncr;.      }
30e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54  else{.        iT
30e10 65 72 6d 4f 66 66 20 3d 20 73 7a 4c 65 61 66 3b  ermOff = szLeaf;
30e20 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
30e30 66 74 73 35 44 65 63 6f 64 65 52 6f 77 69 64 4c  fts5DecodeRowidL
30e40 69 73 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b  ist(&rc, &s, &a[
30e50 69 4f 66 66 5d 2c 20 69 54 65 72 6d 4f 66 66 2d  iOff], iTermOff-
30e60 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 69 4f 66  iOff);.      iOf
30e70 66 20 3d 20 69 54 65 72 6d 4f 66 66 3b 0a 20 20  f = iTermOff;.  
30e80 20 20 20 20 69 66 28 20 69 4f 66 66 3c 73 7a 4c      if( iOff<szL
30e90 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 69  eaf ){.        i
30ea0 4f 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61  Off += fts5GetVa
30eb0 72 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c  rint32(&a[iOff],
30ec0 20 6e 4b 65 65 70 29 3b 0a 20 20 20 20 20 20 7d   nKeep);.      }
30ed0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
30ee0 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
30ef0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
30f00 46 74 73 35 42 75 66 66 65 72 20 74 65 72 6d 3b  Fts5Buffer term;
30f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30f20 20 43 75 72 72 65 6e 74 20 74 65 72 6d 20 72 65   Current term re
30f30 61 64 20 66 72 6f 6d 20 70 61 67 65 20 2a 2f 0a  ad from page */.
30f40 20 20 20 20 69 6e 74 20 73 7a 4c 65 61 66 3b 20      int szLeaf; 
30f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30f60 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 70    /* Offset of p
30f70 67 69 64 78 20 69 6e 20 61 5b 5d 20 2a 2f 0a 20  gidx in a[] */. 
30f80 20 20 20 69 6e 74 20 69 50 67 69 64 78 4f 66 66     int iPgidxOff
30f90 3b 0a 20 20 20 20 69 6e 74 20 69 50 67 69 64 78  ;.    int iPgidx
30fa0 50 72 65 76 20 3d 20 30 3b 20 20 20 20 20 20 20  Prev = 0;       
30fb0 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20      /* Previous 
30fc0 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
30fd0 70 67 69 64 78 20 2a 2f 0a 20 20 20 20 69 6e 74  pgidx */.    int
30fe0 20 69 54 65 72 6d 4f 66 66 20 3d 20 30 3b 0a 20   iTermOff = 0;. 
30ff0 20 20 20 69 6e 74 20 69 52 6f 77 69 64 4f 66 66     int iRowidOff
31000 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 4f   = 0;.    int iO
31010 66 66 3b 0a 20 20 20 20 69 6e 74 20 6e 44 6f 63  ff;.    int nDoc
31020 6c 69 73 74 3b 0a 0a 20 20 20 20 6d 65 6d 73 65  list;..    memse
31030 74 28 26 74 65 72 6d 2c 20 30 2c 20 73 69 7a 65  t(&term, 0, size
31040 6f 66 28 46 74 73 35 42 75 66 66 65 72 29 29 3b  of(Fts5Buffer));
31050 0a 0a 20 20 20 20 69 66 28 20 6e 3c 34 20 29 7b  ..    if( n<4 ){
31060 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 74  .      sqlite3Ft
31070 73 35 42 75 66 66 65 72 53 65 74 28 26 72 63 2c  s5BufferSet(&rc,
31080 20 26 73 2c 20 37 2c 20 28 63 6f 6e 73 74 20 75   &s, 7, (const u
31090 38 2a 29 22 63 6f 72 72 75 70 74 22 29 3b 0a 20  8*)"corrupt");. 
310a0 20 20 20 20 20 67 6f 74 6f 20 64 65 63 6f 64 65       goto decode
310b0 5f 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _out;.    }else{
310c0 0a 20 20 20 20 20 20 69 52 6f 77 69 64 4f 66 66  .      iRowidOff
310d0 20 3d 20 66 74 73 35 47 65 74 55 31 36 28 26 61   = fts5GetU16(&a
310e0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 50 67 69  [0]);.      iPgi
310f0 64 78 4f 66 66 20 3d 20 73 7a 4c 65 61 66 20 3d  dxOff = szLeaf =
31100 20 66 74 73 35 47 65 74 55 31 36 28 26 61 5b 32   fts5GetU16(&a[2
31110 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 50  ]);.      if( iP
31120 67 69 64 78 4f 66 66 3c 6e 20 29 7b 0a 20 20 20  gidxOff<n ){.   
31130 20 20 20 20 20 66 74 73 35 47 65 74 56 61 72 69       fts5GetVari
31140 6e 74 33 32 28 26 61 5b 69 50 67 69 64 78 4f 66  nt32(&a[iPgidxOf
31150 66 5d 2c 20 69 54 65 72 6d 4f 66 66 29 3b 0a 20  f], iTermOff);. 
31160 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
31170 50 67 69 64 78 4f 66 66 3e 6e 20 29 7b 0a 20 20  PgidxOff>n ){.  
31180 20 20 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f        rc = FTS5_
31190 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20  CORRUPT;.       
311a0 20 67 6f 74 6f 20 64 65 63 6f 64 65 5f 6f 75 74   goto decode_out
311b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
311c0 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74  .    /* Decode t
311d0 68 65 20 70 6f 73 69 74 69 6f 6e 20 6c 69 73 74  he position list
311e0 20 74 61 69 6c 20 61 74 20 74 68 65 20 73 74 61   tail at the sta
311f0 72 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  rt of the page *
31200 2f 0a 20 20 20 20 69 66 28 20 69 52 6f 77 69 64  /.    if( iRowid
31210 4f 66 66 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Off!=0 ){.      
31220 69 4f 66 66 20 3d 20 69 52 6f 77 69 64 4f 66 66  iOff = iRowidOff
31230 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
31240 69 54 65 72 6d 4f 66 66 21 3d 30 20 29 7b 0a 20  iTermOff!=0 ){. 
31250 20 20 20 20 20 69 4f 66 66 20 3d 20 69 54 65 72       iOff = iTer
31260 6d 4f 66 66 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  mOff;.    }else{
31270 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 73 7a  .      iOff = sz
31280 4c 65 61 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Leaf;.    }.    
31290 69 66 28 20 69 4f 66 66 3e 6e 20 29 7b 0a 20 20  if( iOff>n ){.  
312a0 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
312b0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  RRUPT;.      got
312c0 6f 20 64 65 63 6f 64 65 5f 6f 75 74 3b 0a 20 20  o decode_out;.  
312d0 20 20 7d 0a 20 20 20 20 66 74 73 35 44 65 63 6f    }.    fts5Deco
312e0 64 65 50 6f 73 6c 69 73 74 28 26 72 63 2c 20 26  dePoslist(&rc, &
312f0 73 2c 20 26 61 5b 34 5d 2c 20 69 4f 66 66 2d 34  s, &a[4], iOff-4
31300 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64  );..    /* Decod
31310 65 20 61 6e 79 20 6d 6f 72 65 20 64 6f 63 6c 69  e any more docli
31320 73 74 20 64 61 74 61 20 74 68 61 74 20 61 70 70  st data that app
31330 65 61 72 73 20 6f 6e 20 74 68 65 20 70 61 67 65  ears on the page
31340 20 62 65 66 6f 72 65 20 74 68 65 0a 20 20 20 20   before the.    
31350 2a 2a 20 66 69 72 73 74 20 74 65 72 6d 2e 20 2a  ** first term. *
31360 2f 0a 20 20 20 20 6e 44 6f 63 6c 69 73 74 20 3d  /.    nDoclist =
31370 20 28 69 54 65 72 6d 4f 66 66 20 3f 20 69 54 65   (iTermOff ? iTe
31380 72 6d 4f 66 66 20 3a 20 73 7a 4c 65 61 66 29 20  rmOff : szLeaf) 
31390 2d 20 69 4f 66 66 3b 0a 20 20 20 20 66 74 73 35  - iOff;.    fts5
313a0 44 65 63 6f 64 65 44 6f 63 6c 69 73 74 28 26 72  DecodeDoclist(&r
313b0 63 2c 20 26 73 2c 20 26 61 5b 69 4f 66 66 5d 2c  c, &s, &a[iOff],
313c0 20 6e 44 6f 63 6c 69 73 74 29 3b 0a 0a 20 20 20   nDoclist);..   
313d0 20 77 68 69 6c 65 28 20 69 50 67 69 64 78 4f 66   while( iPgidxOf
313e0 66 3c 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  f<n && rc==SQLIT
313f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
31400 74 20 62 46 69 72 73 74 20 3d 20 28 69 50 67 69  t bFirst = (iPgi
31410 64 78 4f 66 66 3d 3d 73 7a 4c 65 61 66 29 3b 20  dxOff==szLeaf); 
31420 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
31430 66 69 72 73 74 20 74 65 72 6d 20 6f 6e 20 70 61  first term on pa
31440 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ge */.      int 
31450 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31470 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 64 61    /* Bytes of da
31480 74 61 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ta */.      int 
31490 69 45 6e 64 3b 0a 20 20 20 20 20 20 0a 20 20 20  iEnd;.      .   
314a0 20 20 20 69 50 67 69 64 78 4f 66 66 20 2b 3d 20     iPgidxOff += 
314b0 66 74 73 35 47 65 74 56 61 72 69 6e 74 33 32 28  fts5GetVarint32(
314c0 26 61 5b 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e  &a[iPgidxOff], n
314d0 42 79 74 65 29 3b 0a 20 20 20 20 20 20 69 50 67  Byte);.      iPg
314e0 69 64 78 50 72 65 76 20 2b 3d 20 6e 42 79 74 65  idxPrev += nByte
314f0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 3d 20 69  ;.      iOff = i
31500 50 67 69 64 78 50 72 65 76 3b 0a 0a 20 20 20 20  PgidxPrev;..    
31510 20 20 69 66 28 20 69 50 67 69 64 78 4f 66 66 3c    if( iPgidxOff<
31520 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 74 73  n ){.        fts
31530 35 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 5b  5GetVarint32(&a[
31540 69 50 67 69 64 78 4f 66 66 5d 2c 20 6e 42 79 74  iPgidxOff], nByt
31550 65 29 3b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  e);.        iEnd
31560 20 3d 20 69 50 67 69 64 78 50 72 65 76 20 2b 20   = iPgidxPrev + 
31570 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 7d 65 6c  nByte;.      }el
31580 73 65 7b 0a 20 20 20 20 20 20 20 20 69 45 6e 64  se{.        iEnd
31590 20 3d 20 73 7a 4c 65 61 66 3b 0a 20 20 20 20 20   = szLeaf;.     
315a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 45 6e   }.      if( iEn
315b0 64 3e 73 7a 4c 65 61 66 20 29 7b 0a 20 20 20 20  d>szLeaf ){.    
315c0 20 20 20 20 72 63 20 3d 20 46 54 53 35 5f 43 4f      rc = FTS5_CO
315d0 52 52 55 50 54 3b 0a 20 20 20 20 20 20 20 20 62  RRUPT;.        b
315e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  reak;.      }.. 
315f0 20 20 20 20 20 69 66 28 20 62 46 69 72 73 74 3d       if( bFirst=
31600 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 4f  =0 ){.        iO
31610 66 66 20 2b 3d 20 66 74 73 35 47 65 74 56 61 72  ff += fts5GetVar
31620 69 6e 74 33 32 28 26 61 5b 69 4f 66 66 5d 2c 20  int32(&a[iOff], 
31630 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
31640 69 66 28 20 6e 42 79 74 65 3e 74 65 72 6d 2e 6e  if( nByte>term.n
31650 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
31660 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
31670 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
31680 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31690 20 20 20 20 74 65 72 6d 2e 6e 20 3d 20 6e 42 79      term.n = nBy
316a0 74 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  te;.      }.    
316b0 20 20 69 4f 66 66 20 2b 3d 20 66 74 73 35 47 65    iOff += fts5Ge
316c0 74 56 61 72 69 6e 74 33 32 28 26 61 5b 69 4f 66  tVarint32(&a[iOf
316d0 66 5d 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  f], nByte);.    
316e0 20 20 69 66 28 20 69 4f 66 66 2b 6e 42 79 74 65    if( iOff+nByte
316f0 3e 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  >n ){.        rc
31700 20 3d 20 46 54 53 35 5f 43 4f 52 52 55 50 54 3b   = FTS5_CORRUPT;
31710 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
31720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 74        }.      ft
31730 73 35 42 75 66 66 65 72 41 70 70 65 6e 64 42 6c  s5BufferAppendBl
31740 6f 62 28 26 72 63 2c 20 26 74 65 72 6d 2c 20 6e  ob(&rc, &term, n
31750 42 79 74 65 2c 20 26 61 5b 69 4f 66 66 5d 29 3b  Byte, &a[iOff]);
31760 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e  .      iOff += n
31770 42 79 74 65 3b 0a 0a 20 20 20 20 20 20 73 71 6c  Byte;..      sql
31780 69 74 65 33 46 74 73 35 42 75 66 66 65 72 41 70  ite3Fts5BufferAp
31790 70 65 6e 64 50 72 69 6e 74 66 28 0a 20 20 20 20  pendPrintf(.    
317a0 20 20 20 20 20 20 26 72 63 2c 20 26 73 2c 20 22        &rc, &s, "
317b0 20 74 65 72 6d 3d 25 2e 2a 73 22 2c 20 74 65 72   term=%.*s", ter
317c0 6d 2e 6e 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  m.n, (const char
317d0 2a 29 74 65 72 6d 2e 70 0a 20 20 20 20 20 20 29  *)term.p.      )
317e0 3b 0a 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20  ;.      iOff += 
317f0 66 74 73 35 44 65 63 6f 64 65 44 6f 63 6c 69 73  fts5DecodeDoclis
31800 74 28 26 72 63 2c 20 26 73 2c 20 26 61 5b 69 4f  t(&rc, &s, &a[iO
31810 66 66 5d 2c 20 69 45 6e 64 2d 69 4f 66 66 29 3b  ff], iEnd-iOff);
31820 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 74 73 35  .    }..    fts5
31830 42 75 66 66 65 72 46 72 65 65 28 26 74 65 72 6d  BufferFree(&term
31840 29 3b 0a 20 20 7d 0a 20 20 0a 20 64 65 63 6f 64  );.  }.  . decod
31850 65 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33  e_out:.  sqlite3
31860 5f 66 72 65 65 28 61 29 3b 0a 20 20 69 66 28 20  _free(a);.  if( 
31870 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31880 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
31890 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 28  ult_text(pCtx, (
318a0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 2e 70 2c  const char*)s.p,
318b0 20 73 2e 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41   s.n, SQLITE_TRA
318c0 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65  NSIENT);.  }else
318d0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
318e0 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65 28  sult_error_code(
318f0 70 43 74 78 2c 20 72 63 29 3b 0a 20 20 7d 0a 20  pCtx, rc);.  }. 
31900 20 66 74 73 35 42 75 66 66 65 72 46 72 65 65 28   fts5BufferFree(
31910 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  &s);.}../*.** Th
31920 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
31930 20 6f 66 20 75 73 65 72 2d 64 65 66 69 6e 65 64   of user-defined
31940 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
31950 20 66 74 73 35 5f 72 6f 77 69 64 28 29 2e 0a 2a   fts5_rowid()..*
31960 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 74  /.static void ft
31970 73 35 52 6f 77 69 64 46 75 6e 63 74 69 6f 6e 28  s5RowidFunction(
31980 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
31990 78 74 20 2a 70 43 74 78 2c 20 20 20 20 20 20 20  xt *pCtx,       
319a0 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 63     /* Function c
319b0 61 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  all context */. 
319c0 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
319f0 67 73 20 28 61 6c 77 61 79 73 20 32 29 20 2a 2f  gs (always 2) */
31a00 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
31a10 20 2a 2a 61 70 56 61 6c 20 20 20 20 20 20 20 20   **apVal        
31a20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 61     /* Function a
31a30 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
31a40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
31a50 67 3b 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30  g;.  if( nArg==0
31a60 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
31a70 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43 74  result_error(pCt
31a80 78 2c 20 22 73 68 6f 75 6c 64 20 62 65 3a 20 66  x, "should be: f
31a90 74 73 35 5f 72 6f 77 69 64 28 73 75 62 6a 65 63  ts5_rowid(subjec
31aa0 74 2c 20 2e 2e 2e 2e 29 22 2c 20 2d 31 29 3b 0a  t, ....)", -1);.
31ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 41 72    }else{.    zAr
31ac0 67 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  g = (const char*
31ad0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
31ae0 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
31af0 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
31b00 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
31b10 22 73 65 67 6d 65 6e 74 22 29 20 29 7b 0a 20 20  "segment") ){.  
31b20 20 20 20 20 69 36 34 20 69 52 6f 77 69 64 3b 0a      i64 iRowid;.
31b30 20 20 20 20 20 20 69 6e 74 20 73 65 67 69 64 2c        int segid,
31b40 20 70 67 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28   pgno;.      if(
31b50 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20   nArg!=3 ){.    
31b60 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31b70 6c 74 5f 65 72 72 6f 72 28 70 43 74 78 2c 20 0a  lt_error(pCtx, .
31b80 20 20 20 20 20 20 20 20 20 20 20 20 22 73 68 6f              "sho
31b90 75 6c 64 20 62 65 3a 20 66 74 73 35 5f 72 6f 77  uld be: fts5_row
31ba0 69 64 28 27 73 65 67 6d 65 6e 74 27 2c 20 73 65  id('segment', se
31bb0 67 69 64 2c 20 70 67 6e 6f 29 29 22 2c 20 2d 31  gid, pgno))", -1
31bc0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
31bd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31be0 20 73 65 67 69 64 20 3d 20 73 71 6c 69 74 65 33   segid = sqlite3
31bf0 5f 76 61 6c 75 65 5f 69 6e 74 28 61 70 56 61 6c  _value_int(apVal
31c00 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 70 67  [1]);.        pg
31c10 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  no = sqlite3_val
31c20 75 65 5f 69 6e 74 28 61 70 56 61 6c 5b 32 5d 29  ue_int(apVal[2])
31c30 3b 0a 20 20 20 20 20 20 20 20 69 52 6f 77 69 64  ;.        iRowid
31c40 20 3d 20 46 54 53 35 5f 53 45 47 4d 45 4e 54 5f   = FTS5_SEGMENT_
31c50 52 4f 57 49 44 28 73 65 67 69 64 2c 20 70 67 6e  ROWID(segid, pgn
31c60 6f 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  o);.        sqli
31c70 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
31c80 28 70 43 74 78 2c 20 69 52 6f 77 69 64 29 3b 0a  (pCtx, iRowid);.
31c90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
31ca0 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
31cb0 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 70 43  _result_error(pC
31cc0 74 78 2c 20 0a 20 20 20 20 20 20 20 20 22 66 69  tx, .        "fi
31cd0 72 73 74 20 61 72 67 20 74 6f 20 66 74 73 35 5f  rst arg to fts5_
31ce0 72 6f 77 69 64 28 29 20 6d 75 73 74 20 62 65 20  rowid() must be 
31cf0 27 73 65 67 6d 65 6e 74 27 22 20 2c 20 2d 31 0a  'segment'" , -1.
31d00 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
31d10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
31d20 20 69 73 20 63 61 6c 6c 65 64 20 61 73 20 70 61   is called as pa
31d30 72 74 20 6f 66 20 72 65 67 69 73 74 65 72 69 6e  rt of registerin
31d40 67 20 74 68 65 20 46 54 53 35 20 6d 6f 64 75 6c  g the FTS5 modul
31d50 65 20 77 69 74 68 20 64 61 74 61 62 61 73 65 0a  e with database.
31d60 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  ** connection db
31d70 2e 20 49 74 20 72 65 67 69 73 74 65 72 73 20 73  . It registers s
31d80 65 76 65 72 61 6c 20 75 73 65 72 2d 64 65 66 69  everal user-defi
31d90 6e 65 64 20 73 63 61 6c 61 72 20 66 75 6e 63 74  ned scalar funct
31da0 69 6f 6e 73 20 75 73 65 66 75 6c 0a 2a 2a 20 77  ions useful.** w
31db0 69 74 68 20 46 54 53 35 2e 0a 2a 2a 0a 2a 2a 20  ith FTS5..**.** 
31dc0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
31dd0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
31de0 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  rned. If an erro
31df0 72 20 6f 63 63 75 72 73 2c 20 73 6f 6d 65 20 6f  r occurs, some o
31e00 74 68 65 72 0a 2a 2a 20 53 51 4c 69 74 65 20 65  ther.** SQLite e
31e10 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
31e20 75 72 6e 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  urned instead..*
31e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  /.int sqlite3Fts
31e40 35 49 6e 64 65 78 49 6e 69 74 28 73 71 6c 69 74  5IndexInit(sqlit
31e50 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72  e3 *db){.  int r
31e60 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
31e70 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 20  te_function(.   
31e80 20 20 20 64 62 2c 20 22 66 74 73 35 5f 64 65 63     db, "fts5_dec
31e90 6f 64 65 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  ode", 2, SQLITE_
31ea0 55 54 46 38 2c 20 30 2c 20 66 74 73 35 44 65 63  UTF8, 0, fts5Dec
31eb0 6f 64 65 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  odeFunction, 0, 
31ec0 30 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  0.  );..  if( rc
31ed0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31ee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
31ef0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
31f00 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22 66 74  .        db, "ft
31f10 73 35 5f 64 65 63 6f 64 65 5f 6e 6f 6e 65 22 2c  s5_decode_none",
31f20 20 32 2c 20 0a 20 20 20 20 20 20 20 20 53 51 4c   2, .        SQL
31f30 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
31f40 29 64 62 2c 20 66 74 73 35 44 65 63 6f 64 65 46  )db, fts5DecodeF
31f50 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 0a 20 20  unction, 0, 0.  
31f60 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20    );.  }..  if( 
31f70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
31f80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
31f90 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
31fa0 6e 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  n(.        db, "
31fb0 66 74 73 35 5f 72 6f 77 69 64 22 2c 20 2d 31 2c  fts5_rowid", -1,
31fc0 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
31fd0 20 66 74 73 35 52 6f 77 69 64 46 75 6e 63 74 69   fts5RowidFuncti
31fe0 6f 6e 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a  on, 0, 0.    );.
31ff0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
32000 0a 7d 0a 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  .}...int sqlite3
32010 46 74 73 35 49 6e 64 65 78 52 65 73 65 74 28 46  Fts5IndexReset(F
32020 74 73 35 49 6e 64 65 78 20 2a 70 29 7b 0a 20 20  ts5Index *p){.  
32030 61 73 73 65 72 74 28 20 70 2d 3e 70 53 74 72 75  assert( p->pStru
32040 63 74 3d 3d 30 20 7c 7c 20 70 2d 3e 69 53 74 72  ct==0 || p->iStr
32050 75 63 74 56 65 72 73 69 6f 6e 21 3d 30 20 29 3b  uctVersion!=0 );
32060 0a 20 20 69 66 28 20 66 74 73 35 49 6e 64 65 78  .  if( fts5Index
32070 44 61 74 61 56 65 72 73 69 6f 6e 28 70 29 21 3d  DataVersion(p)!=
32080 70 2d 3e 69 53 74 72 75 63 74 56 65 72 73 69 6f  p->iStructVersio
32090 6e 20 29 7b 0a 20 20 20 20 66 74 73 35 53 74 72  n ){.    fts5Str
320a0 75 63 74 75 72 65 49 6e 76 61 6c 69 64 61 74 65  uctureInvalidate
320b0 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
320c0 6e 20 66 74 73 35 49 6e 64 65 78 52 65 74 75 72  n fts5IndexRetur
320d0 6e 28 70 29 3b 0a 7d 0a                          n(p);.}.